核心差异:外部知识 vs 内化知识

RAG 和微调本质上是两种不同的知识注入方式。RAG 通过检索外部知识库为模型提供上下文,模型在推理时"查阅资料"回答问题;微调则通过梯度更新将知识"内化"到模型参数中。

# RAG:推理时检索
def rag_inference(query):
    docs = vector_store.search(query, k=5)
    prompt = f"基于以下文档回答:\n{docs}\n\n问题:{query}"
    return llm.generate(prompt)

# 微调:知识已内化在参数中
def finetuned_inference(query):
    return finetuned_llm.generate(query)  # 无需外部检索

RAG 的核心优势

1. 实时性

RAG 的知识库可以实时更新。当文档变更时,只需更新向量数据库,无需重新训练模型:

# 知识更新:只需重新嵌入文档
new_doc = load_document("updated_policy.pdf")
embedding = embed_model.encode(new_doc)
vector_store.upsert(embedding, metadata={"source": "policy_v2"})

# 微调更新知识:需要重新训练
# 数据准备 → 训练 → 评估 → 部署(数小时到数天)

2. 可追溯性

RAG 的每个回答都能追溯到具体文档来源,这对企业合规和审计至关重要:

response = rag_pipeline.query("公司的退款政策是什么?")
print(response.answer)        # "退款政策规定..."
print(response.sources)       # [{"doc": "policy.pdf", "page": 3, "score": 0.92}]

3. 低成本

维度RAG微调
初始成本向量数据库 + 嵌入模型GPU 训练 + 数据标注
更新成本重新嵌入变更文档重新训练(全量或增量)
推理成本增加检索延迟 + Token 消耗与基座模型持平
人力成本文档维护数据工程 + 训练调优

微调的核心优势

1. 风格与格式控制

微调能改变模型的输出风格、语气和格式,RAG 做不到这点:

# 微调可以让模型学会特定风格
# 例如:法律文书的严谨表述、客服话术的统一格式
{"input": "用户说想退货", "output": "尊敬的客户您好,请您提供订单编号..."}

2. 领域深度

对于高度专业化的领域(医学、法律、金融),微调能让模型理解术语和推理模式:

# 医学微调数据示例
{
    "instruction": "分析以下病历,给出鉴别诊断",
    "input": "患者女,45岁,间歇性头痛3个月...",
    "output": "鉴别诊断考虑:1. 偏头痛 2. 紧张性头痛..."
}

3. 低推理延迟

微调模型无需检索步骤,单次前向传播即出结果,延迟显著低于 RAG:

RAG 延迟 = 检索(50-200ms) + 上下文构建 + LLM 推理(500-2000ms)
微调延迟 = LLM 推理(500-2000ms)

决策矩阵

场景特征推荐方案理由
知识频繁更新RAG只需更新向量库
知识稳定不变微调内化后推理更快
需要来源追溯RAG检索结果可引用
需要特定输出风格微调RAG 无法改变模型风格
领域术语密集微调+RAG先微调理解力,再RAG供知识
低延迟要求微调无检索开销
长尾知识覆盖RAG扩展知识库即可
少样本快速启动RAG无需训练数据
高频重复问答微调避免每次检索相同内容
多语言/跨语言RAG知识库可多语言

混合方案:RAG + 微调

生产环境中,纯 RAG 或纯微调往往不够,混合方案才是最优解:

┌─────────────────────────────────────────────┐
│              混合架构                         │
│                                              │
│  ┌──────────┐     ┌──────────────────────┐  │
│  │ 微调模型  │────▶│ RAG 检索增强          │  │
│  │ (领域理解) │     │ (实时知识)            │  │
│  └──────────┘     └──────────────────────┘  │
│       │                      │               │
│       └──────────┬───────────┘               │
│                  ▼                            │
│          ┌──────────────┐                    │
│          │  最终回答      │                    │
│          └──────────────┘                    │
└─────────────────────────────────────────────┘
class HybridPipeline:
    def __init__(self):
        self.model = FineTunedModel("domain_model_v2")  # 领域微调
        self.rag = RAGPipeline(vector_store)            # RAG 检索
    
    def query(self, question: str):
        # 1. 用微调模型理解问题(领域术语映射)
        rewritten = self.model.rewrite_query(question)
        
        # 2. RAG 检索相关知识
        docs = self.rag.retrieve(rewritten, k=5)
        
        # 3. 微调模型 + 检索上下文生成回答
        answer = self.model.generate(
            question, context=docs, style="professional"
        )
        
        return {"answer": answer, "sources": docs}

成本对比实例

以 10 万份文档的企业知识库为例:

项目RAG 方案微调方案混合方案
数据准备文档分块+嵌入(1天)SFT 数据构建(2-4周)两者都需要
训练成本¥0GPU ¥5,000-20,000GPU ¥5,000-20,000
基础设施向量数据库 ¥500/月无额外向量数据库 + 模型部署
知识更新重新嵌入变更文档(分钟级)重新训练(小时-天级)RAG 部分实时更新
推理延迟600-2200ms500-2000ms600-2200ms
回答准确率75-85%(取决于检索质量)70-80%(取决于训练数据)85-92%

实战建议

  1. 从 RAG 开始:成本低、见效快、可追溯。90% 的企业知识问答场景 RAG 就够了
  2. 遇到瓶颈再加微调:当 RAG 的领域理解不足或输出风格不可控时,引入微调
  3. 微调数据从 RAG 日志来:RAG 系统积累的用户问题和好回答是最好的微调数据
  4. 定期评估:用 RAGAS 等框架持续评估系统质量,决定何时切换方案
# 从 RAG 日志构建微调数据的最佳实践
def build_sft_data_from_rag_logs(logs):
    sft_data = []
    for log in logs:
        if log.user_feedback == "positive" and log.retrieval_score > 0.85:
            sft_data.append({
                "instruction": log.query,
                "output": log.answer,
                # 不包含检索文档,让模型内化知识
            })
    return sft_data

结论

RAG 和微调不是非此即彼的选择。大多数生产系统的演进路径是:Prompt Engineering → RAG → RAG + 轻量微调 → 持续迭代。关键在于理解每种方法的边界,根据业务场景的约束(成本、延迟、准确率、可维护性)做出合理选择。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。