模型优化路径
Prompt Engineering / RAG / Fine-tuning — 何时用哪个?成本、复杂度、效果对比。
三条路径总览
1 2 3 4 5 6 7 8 9 10 11 12
| 你的需求 │ ├── 简单任务 / 快速验证 │ → Prompt Engineering(提示词工程) │ ├── 需要外部知识 / 私有数据 / 动态信息 │ → RAG(检索增强生成) │ ├── 任务/风格固定 / 需要模型"记住"某种行为 │ → Fine-tuning(微调) │ └── 效果要求极高
|
1. Prompt Engineering(提示词工程)
什么时候用?
- 任务能通过描述说清楚
- 任务不需要模型”记住”新知识
- 需要快速验证想法
- 任务变化频繁
方法清单
| 方法 | 说明 | 适用场景 |
|---|
| Zero-shot | 直接下命令 | 简单任务 |
| Few-shot | 给示例 | 格式/风格要求 |
| Chain-of-Thought (CoT) | 引导模型一步步推理 | 数学/逻辑 |
| Tree-of-Thought (ToT) | 探索多路径推理 | 复杂决策 |
| Role Prompting | 指定角色身份 | 专业问答 |
| Structured Output | 要求特定格式 | 机器可读输出 |
成本
- Token 消耗:每次调用都带入 Prompt(额外开销)
- API 费用:无额外成本
- 开发时间:分钟级
示例
1 2 3 4 5 6 7 8 9 10 11
| llm.invoke("把以下JSON转为Python对象:{...}")
llm.invoke(""" 示例: {"name": "张三", "age": 25} → Person(name="张三", age=25) {"name": "李四", "age": 30} → Person(name="李四", age=30) 现在转换: {"name": "王五", "age": 35} """)
|
2. RAG(检索增强生成)
什么时候用?
- 需要模型”知道”私有知识(文档、数据库、代码库)
- 知识会动态更新(不能微调)
- 需要可解释性(能看检索到了什么)
- 避免幻觉(答案能溯源)
不适合的场景
- 任务不需要具体知识(如纯数学推导)
- 领域通用知识已存在于模型中
- 数据量极小(< 10 篇文档)— 直接放 Prompt 即可
RAG 成本构成
| 阶段 | 成本 |
|---|
| Embedding(一次性) | 每文档一次 |
| 向量存储 | 存储成本 |
| 检索 | 几乎为零 |
| LLM 生成 | 每次调用 |
实现复杂度
1 2 3
| ⭐☆☆☆☆ 基础 RAG(LangChain 内置) ⭐⭐⭐☆☆ 高级 RAG(混合检索 + 重排序) ⭐⭐⭐⭐☆ 复杂 RAG(多跳推理 + 知识图谱)
|
RAG + Fine-tuning 混合
1 2 3 4 5
| def answer(question): context = vector_db.similarity_search(question) prompt = f"你是一个{角色}。\n\n参考信息:\n{context}\n\n问题:{question}" return llm.invoke(prompt)
|
3. Fine-tuning(微调)
什么时候用?
- 需要模型固定行为模式(特定语气、专业术语)
- 需要加速推理(微调后的模型可以用小模型达到大模型效果)
- 有大量标注数据(> 1000 条高质量问答对)
- 需要在特定任务上超越 Prompt Engineering 的极限
不适合的场景
- 没有足够数据(< 500 条)
- 知识需要频繁更新(不如 RAG)
- 任务简单(Prompt Engineering 更便宜更快)
- 需要快速迭代(微调周期长)
微调类型
| 类型 | 更新内容 | 成本 | 适用场景 |
|---|
| SFT(全量微调) | 所有参数 | 💰💰💰💰 | 任务特定优化 |
| LoRA(高效微调) | 低秩矩阵 | 💰💰 | 成本敏感场景 |
| QLoRA | 4-bit 量化 + LoRA | 💰 | 消费级 GPU |
微调成本(参考)
1 2 3 4 5 6 7 8
| OpenAI Fine-tuning: - 训练:$0.008 / 1K Token - 使用:$0.03 / 1M Token(GPT-4o mini 微调后)
自己训练(开源模型): - A100 GPU 小时 × 云厂商报价 - Llama 3.2 7B:约 8 GPU 小时 - Llama 3.2 70B:约 40 GPU 小时
|
何时选 Fine-tuning 而非 RAG?
| 判断问题 | 回答”是”→ 微调 | 回答”否”→ RAG |
|---|
| 任务是否需要固定的输出风格/格式? | ✅ | |
| 是否有 > 1000 条高质量训练数据? | ✅ | |
| 知识是否长期不变? | ✅ | |
| 是否需要模型推理速度更快(小模型)? | ✅ | |
| 知识是否经常变化? | | ❌ RAG |
| 是否需要溯源和可解释性? | | ❌ 微调 |
三者成本与复杂度对比
| 维度 | Prompt Engineering | RAG | Fine-tuning |
|---|
| 初始成本 | 极低 | 低 | 高 |
| 每次调用成本 | 基准 | 基准 + 检索 | 可能更低(小模型) |
| 开发时间 | 分钟 | 小时~天 | 天~周 |
| 数据需求 | 无 | 文档集合 | 标注数据 |
| 知识更新 | 改 Prompt | 更新文档库 | 重新训练 |
| 可解释性 | 低 | 高 | 低 |
| 幻觉风险 | 中 | 低 | 中 |
| 适用数据量 | 0 | 10 篇 ~ 1000 万 | 1000 条 ~ 100 万 |
决策流程图
1 2 3 4 5 6 7 8 9 10 11 12 13
| 需要模型知道新知识? │ ├── NO → 知识是否需要固定行为/风格? │ ├── YES → 有足量标注数据? │ │ ├── YES → Fine-tuning │ │ └── NO → Prompt Engineering │ └── NO → Prompt Engineering │ └── YES → 知识是否频繁更新? ├── YES → RAG └── NO → 知识量大? ├── YES → RAG └── NO → 直接放 Prompt(10篇以内)或 RAG
|