RAG 与 微调:构建 LLM 应用 6 个月后的实战心得
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
六个月前,我的团队受命为一家中型 B2B SaaS 公司开发内部支持工具。该公司拥有约 120 名员工,文档散落在 Notion、Confluence 以及一个从 2019 年起就几乎处于停滞状态的 SharePoint 实例中。需求很简单:建立一个能够回答内部流程问题且不会“一本正经胡说八道”的聊天机器人。
当时,我必须做出技术选型:是使用 RAG (检索增强生成) 还是对模型进行 微调 (Fine-Tuning)?在阅读了无数深度文章并观看了大量视频教程后,我发现没有一个能针对特定业务场景给出明确答案。因此,在随后的六个月里,我通过三个不同的项目分别运行了这两种方法,并利用 n1n.ai 提供的各种高性能模型(如 DeepSeek-V3 和 Claude 3.5 Sonnet)进行了压力测试。以下是我在实战中总结出的真实经验。
核心区别:思维方式 vs 知识储备
将 RAG 与微调视为对立关系其实是一个伪命题,但它们解决的问题确实截然不同。简单来说:微调改变的是模型的思维方式,而 RAG 改变的是模型在查询时的知识储备。
写出来可能觉得显而易见,但在实践中,开发者很容易因为微调看起来更“高大上”、更像真正的 AI 工作而盲目选择它。通过 n1n.ai 调用 API 时,我们通常利用的是基础模型强大的推理能力。如果你的目标是让模型了解你的私有文档,RAG 通常是第一选择。
为什么 RAG 是知识库场景的首选?
在我们的第一个项目中,RAG 在以下几个维度彻底击败了微调:
- 可追溯性与引用:对于 HR 或法律文档,答案的来源至关重要。RAG 可以返回原始文档的代码片段,而微调后的模型只会自信地给出答案,却无法说明出处。
- 数据实时性:我们的内部文档每天都在更新。如果每次更新文档都要重新微调模型,那简直是财务和运维的灾难。而 RAG 只需更新向量数据库,模型就能立即“看到”最新的政策。
- 处理异构数据:对数万页杂乱的 Confluence 页面进行微调需要极其繁琐的数据清洗。相比之下,RAG 配合合理的切片(Chunking)策略,处理速度要快得多。
RAG 实战代码示例
我们使用了 LangChain 0.2.x 框架,并连接到 n1n.ai 的 OpenAI o3 节点,以获取最强的逻辑推理能力:
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 初始化嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 经验之谈:切片策略比大多数人想象的更重要
# 对于 Confluence 风格的文档,512 token 配合 64 的重叠度效果最佳
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=64,
separators=["\n\n", "\n", ".", " "]
)
docs = splitter.split_documents(raw_docs)
# 将数据存入向量数据库
vectorstore = Chroma.from_documents(docs, embeddings, persist_directory="./chroma_db")
# 检索端配置
retriever = vectorstore.as_retriever(
search_type="mmr", # 最大边际相关性,减少冗余
search_kwargs={"k": 6}
)
# 通过 n1n.ai 调用模型,确保企业级稳定性
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o", temperature=0),
retriever=retriever,
return_source_documents=True
)
result = qa_chain.invoke({"query": "公司的远程办公费用报销政策是什么?"})
什么时候微调才是正确答案?
虽然 RAG 很强大,但在第二个项目中——一个专门的法律合同实体提取工具——微调展现了其不可替代的价值。我们需要模型严格按照特定的 JSON 模式提取信息,即使是 Claude 3.5 Sonnet 这样的顶级模型,在长达数百页的合同面前,仅靠 Prompt Engineering(提示词工程)也很难保证 100% 的格式正确率。
微调的适用场景:
- 稳定的输出格式:当你需要模型永远返回特定 Schema 的 JSON 或代码时。
- 特定的语调与术语:例如医疗诊断或特定法律术语的精确表达,微调可以将这些“语感”植入模型参数。
- 规模化的成本与延迟优化:在 n1n.ai 上,一个针对特定任务微调过的 GPT-4o mini,其表现可能优于通用的 GPT-4o,但成本仅为后者的几分之一。
避坑指南:不要试图用微调来让模型“背书”
这是我犯过最昂贵的错误。在 2024 年底的一个项目中,我试图通过微调让模型学习公司的专有技术手册。我将手册格式化为数千组问答对进行训练。结果呢?模型学会了手册的“语气”,但在具体的技术参数上频繁出现幻觉。它会非常自信地给出一个错误的零件编号,因为它只是学习了这些数字出现的 概率分布,而不是真正记住了它们。
黄金法则: 改变形式用微调,获取事实用 RAG。如果你发现自己的 System Prompt 已经写了超过 2000 个 token 只是为了纠正格式,那就该考虑微调了。如果模型事实性错误频出,请优化你的 RAG 检索链。
RAG 与 微调 对比表
| 特性 | RAG | 微调 (Fine-Tuning) |
|---|---|---|
| 主要目标 | 知识检索 | 行为/风格改变 |
| 数据更新频率 | 实时/动态 | 静态 (需重新训练) |
| 幻觉风险 | 较低 (可提供证据) | 较高 (自信地胡说) |
| 初始成本 | 较低 (向量库构建) | 较高 (算力+标注) |
| 推理延迟 | 略高 (需额外检索步骤) | 较低 (直接推理) |
| 模型访问 | n1n.ai API | 自定义检查点 |
进阶建议:混合架构 (Hybrid Approach)
在我的第三个项目中,我们采用了混合方案:使用微调来确保模型能够理解公司内部的缩写和特定的逻辑推理逻辑,同时挂载 RAG 插件来查询实时的 SQL 数据。这种组合在处理复杂业务逻辑时,准确率比单一方案提升了约 25%。
此外,无论你选择哪种方案,评估框架 (Evaluation) 都是重中之重。我建议建立一个包含 50-100 个核心问题的“黄金数据集”,每次调整模型或 RAG 参数后都进行回归测试。在 n1n.ai 平台上,你可以轻松切换不同的模型(如 OpenAI o3 或 DeepSeek-V3)来测试同一套 RAG 逻辑在不同推理引擎下的表现,这对于优化系统至关重要。
总结来说:先从 RAG 开始,它能解决你 80% 的问题,且成本极低。只有当你遇到 RAG 无法解决的格式、语调或极端延迟问题时,再考虑微调。
Get a free API key at n1n.ai