模型优化路径

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
# Zero-shot
llm.invoke("把以下JSON转为Python对象:{...}")

# Few-shot(更精准)
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
# 最佳实践:用 RAG 获取知识,用 Fine-tuning 调整风格/行为
def answer(question):
context = vector_db.similarity_search(question) # RAG 获取知识
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(高效微调)低秩矩阵💰💰成本敏感场景
QLoRA4-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 EngineeringRAGFine-tuning
初始成本极低
每次调用成本基准基准 + 检索可能更低(小模型)
开发时间分钟小时~天天~周
数据需求文档集合标注数据
知识更新改 Prompt更新文档库重新训练
可解释性
幻觉风险
适用数据量010 篇 ~ 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