不是非此即彼

RAG和微调不是互斥的选择,而是互补的技术。很多场景下,两者结合使用效果最佳。关键在于理解各自的优势和局限,根据具体需求做出合理选择。

决策矩阵

                    ┌──────────────────────────────────┐
                    │     知识更新频率                   │
                    │  低          中          高        │
         ┌──────────┼──────────┬──────────┬────────────┤
  知识   │ 私有     │  微调     │  RAG     │  RAG       │
  特有性 │ 公开     │  微调     │  RAG     │  Prompt    │
  量     │ 大量     │  RAG      │  RAG     │  RAG       │
         │ 少量     │  微调     │  微调    │  Prompt    │
         └──────────┴──────────┴──────────┴────────────┘

何时用RAG

适合场景:

  • 知识库频繁更新(如产品文档、新闻)
  • 需要精确引用来源
  • 大量私有文档(数千篇以上)
  • 需要多跳推理
# RAG的典型应用:企业知识库问答
class EnterpriseQABot:
    def __init__(self):
        self.retriever = VectorRetriever(documents=company_docs)
        self.llm = LLM(model="qwen3-32b")
    
    async def answer(self, question):
        docs = await self.retriever.search(question, top_k=5)
        context = "\n".join(d.content for d in docs)
        
        prompt = f"""基于以下参考资料回答问题。
        
参考资料:
{context}

问题:{question}

要求标注引用来源。"""
        
        return await self.llm.generate(prompt)

RAG优势:

  • 知识实时更新(只需更新文档库)
  • 可溯源、可审计
  • 无需训练
  • 支持海量知识

RAG劣势:

  • 检索质量影响最终效果
  • 增加推理延迟
  • 上下文窗口限制
  • 需要向量数据库等基础设施

何时用微调

适合场景:

  • 需要改变模型行为模式(如输出风格、格式)
  • 特定领域的推理能力提升
  • 少量但高频的私有知识
  • 降低推理成本(用小模型替代大模型+RAG)
# 微调的典型应用:领域专家模型
# 用领域数据微调7B模型,替代通用70B模型

# 训练数据示例
training_data = [
    {
        "input": "分析这段代码的潜在安全漏洞",
        "output": "经分析,以下代码存在SQL注入风险...",
        "context": "代码安全分析领域专家"
    }
]

# 微调后的模型直接具备领域知识,无需检索

微调优势:

  • 改变模型深层次行为
  • 推理速度快(无检索步骤)
  • 可以优化输出风格和格式
  • 小模型可以替代大模型+RAG

微调劣势:

  • 知识更新需要重新训练
  • 训练成本高
  • 可能遗忘原有能力
  • 难以溯源

何时两者结合

class HybridSystem:
    """微调+RAG的混合系统"""
    
    def __init__(self):
        # 微调模型:具备领域推理能力和输出风格
        self.model = FineTunedModel("my-domain-model")
        # RAG:提供最新知识
        self.retriever = VectorRetriever(documents=knowledge_base)
    
    async def answer(self, question):
        # 1. RAG检索最新知识
        docs = await self.retriever.search(question, top_k=3)
        context = "\n".join(d.content for d in docs)
        
        # 2. 微调模型利用领域知识+检索知识回答
        prompt = f"""参考信息:
{context}

问题:{question}"""
        
        return await self.model.generate(prompt)

结合策略:

  • 微调提升推理能力和输出风格
  • RAG提供最新、可变的知识
  • 微调数据中包含"如何使用检索结果"的示例

决策流程图

1. 知识是否需要频繁更新?
   → 是 → RAG
   → 否 → 继续

2. 是否需要改变模型的输出风格/格式?
   → 是 → 微调(可能+RAG)
   → 否 → 继续

3. 知识量是否很大(>1000文档)?
   → 是 → RAG
   → 否 → 继续

4. 是否需要精确的引用来源?
   → 是 → RAG
   → 否 → 继续

5. 是否需要特定领域的深度推理?
   → 是 → 微调+RAG
   → 否 → Prompt工程即可

6. 推理延迟是否是关键指标?
   → 是 → 微调(避免RAG的检索延迟)
   → 否 → RAG

成本对比

方案初始成本维护成本推理成本更新延迟
Prompt工程极低高(大模型)即时
RAG分钟级
微调天级
微调+RAG分钟级

评估方法

async def compare_approaches(question, approaches):
    """对比不同方案的效果"""
    results = {}
    
    for name, approach in approaches.items():
        start = time.time()
        response = await approach.answer(question)
        latency = time.time() - start
        
        results[name] = {
            "response": response,
            "latency": latency,
            "accuracy": await eval_accuracy(response, ground_truth),
            "has_citation": check_citation(response),
        }
    
    return results

结语

RAG和微调不是竞争关系,而是工具箱中不同的工具。RAG擅长动态知识管理,微调擅长行为模式调整。理解每种技术的优势和局限,根据具体场景做出合理选择——必要时大胆组合使用。

加入讨论

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

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