技术选型讨论里最常出现的提问是:微调还是 RAG,二选一。
但实践中更常见的情况是:你既需要 RAG(因为知识会更新、规模大),又需要微调(因为输出格式不稳定、对资料的使用不忠实)。
这时的正确问题不是"选哪个",而是:
两者各自负责哪一段,怎么让它们不互相抵消?
这篇文章给出一套组合方法。先说结论:顺序应该是"先把 RAG 做扎实,再训练表达与使用习惯",而关键在于训练数据的构造方式。
第一部分:先明确分工——它们解决不同层次的问题
1.1 三者的分工
RAG:解决"模型能看到什么"。它是知识的入口,负责让正确信息进入上下文。
微调:解决"模型如何表达与行动"。它是行为的塑形,负责输出的格式、语气、以及如何使用手上的信息。
提示词:解决"这一次怎么问"。
1.2 组合的逻辑
RAG 保证"料是对的",微调保证"用料的姿势是对的"。
1.3 "用料的姿势"具体指什么
三个很实际的能力:
| 能力 | 具体表现 |
|---|---|
| ① 忠实于资料 | 只在给定资料范围内回答,资料里没有就说没有,而不是凭记忆编一个 |
| ② 正确解析资料格式 | 检索回来的片段有编号、有来源标记、有噪声——模型要能正确引用与区分 |
| ③ 输出形态稳定 | 结构化字段、固定引用格式、统一长度控制 |
1.4 为什么这三件事适合微调
这三件事,恰恰是"提示词很难稳定做到、而微调很擅长"的部分。
为什么提示词很难稳定做到? 因为它们都是"行为倾向",而不是"单次指令" —— 而倾向性的行为,靠一次次提示是很难保证一致性的。
第二部分:最关键的一点——训练数据必须包含检索结果
这是组合里最容易出错、也最致命的地方。
2.1 错误做法
训练数据:用户问题 → 好答案
上线输入:用户问题 + 八段检索资料 → 回答
结果:
模型学的是"直接回答问题"的能力,但上线后它面对的任务是"从资料里找答案"。分布不一致,效果自然打折。
"分布不一致"这个表述是准确的 —— 它和前面讲灾难性遗忘、讲微调排查时是同一类问题。
2.2 正确做法
训练样本的构造方式应该和推理时完全一致,包含三个要素:
| 要素 | 要求 |
|---|---|
| ① 问题 | 与真实用户问法一致 |
| ② 检索片段 | 真实的(或高度仿真的)检索结果,包括编号、来源标记、以及不可避免的噪声 |
| ③ 答案 | 基于这些片段得出的正确答案 |
2.3 特别强调"包含噪声"
真实检索结果里一定有不相关的块。如果训练数据全是"干净且完全相关"的片段,模型上线后会因为干扰而表现下降。
这个问题的机制是:模型会学到"资料里的每一段都是有用的"这个错误假设 —— 而上线后当它遇到无关片段时,就会试图强行用上它们。
2.4 一句话
训练时的输入长什么样,上线时的输入就该长什么样——包括它的脏乱差。
第三部分:必须包含三类样本
除了格式一致,样本的类型覆盖也决定成败。
3.1 第一类:能答对的样本
资料里有答案,模型正确提取并组织。
这是主体,建立基础能力。
3.2 第二类:"资料里没有"的样本(最重要)
给一个问题,而提供的资料里确实不含答案,期望输出是"资料中未提及"。
为什么这一类最重要?
因为它是训练"不瞎编"的唯一手段。
前面讲过:增加上下文中的忠实度,靠提示词约束并不总是可靠;用训练样本直接教它"没有就说没有",效果要确定得多。
而且这类样本的比例不能太少。
如果只占 1%,训练信号会被淹没。建议占比做到 10% 到 20%。
"1% 会被淹没"这个机制值得理解:因为训练是"统计意义上的学习" —— 如果 99% 的样本都是"有答案就给答案",那么模型会学到"总是给答案"这个主导模式,而那 1% 的例外几乎不影响结果。
3.3 第三类:资料有冲突的样本
给几段资料,其中包含相互矛盾的信息(比如新旧版本并存)。
期望输出是:指出冲突、并给出判断依据(比如以标注为"现行"的为准)。
这类样本提升的是"处理真实资料库"的能力——真实的知识库里,矛盾内容几乎是必然存在的。
3.4 推荐配比
能答对 约 60%~70%
资料缺失 约 10%~20%
有冲突 约 10%~20%
注意后两类合计占了 20%~40% —— 这个比例远高于它们在真实查询里的出现频率。
为什么要有意提高比例? 因为它们是"高价值、易出错"的样本 —— 在这些情况下犯错造成的后果(用户被误导)比"答不出一个小细节"严重得多。
第四部分:两种正确的组合姿势
具体怎么组?常见有两条路线。
4.1 姿势一:微调"阅读器"(最常用)
目标:让模型更忠实、更稳定地使用检索到的资料。
数据:问题 + 真实检索片段 + 答案(三类样本按上面的配比)。
收益:
- 忠实度提升;
- 引用格式稳定;
- 对噪声更鲁棒;
- 输出格式统一。
适用:已经上了 RAG,效果还行但不够稳、格式不统一、偶尔编造。
4.2 姿势二:微调"改写器"或"路由器"
目标:提升上游质量 —— 把用户的模糊问题改写成更好的检索查询;或者判断"这个问题是否需要检索"。
数据:
- 原始问法 → 改写后的查询;或
- 问题 → 是否需要检索 / 走哪条路。
收益:
提高召回质量,从源头改善效果。这类微调往往比"改阅读器"的收益更显著,因为它解决了更靠前的问题。
"解决了更靠前的问题"是关键 —— 因为如果检索本身就没召回到正确内容,那么"阅读器"再好也没用。
4.3 怎么选
如果你的问题是"召回了但用得不好",选姿势一;如果是"经常召回错东西",选姿势二。
这个判断依据很简单,但它决定了投入方向 —— 而方向错了的话,投入再多也不会有明显效果。
第五部分:两个会让效果互相抵消的坑
必须知道,否则组合可能白做。
5.1 坑一:训练数据里混入了"凭记忆回答"的样本
如果训练集里有大量"不给资料,模型直接回答"的样本,模型会学到"不看资料也能答"的习惯。
于是上了 RAG 也不去用检索结果。
表现:
- 加了检索反而变差;
- 或者引用来源经常对不上。
处理:
训练数据统一采用"带资料"的格式;如果确实需要保留通用能力,单独保留一部分通用样本但明确区分格式。
"明确区分格式"这个做法很实用 —— 因为它让模型能通过输入的形态来区分"这次该不该用资料"。
5.2 坑二:微调导致对检索格式过拟合
如果训练数据里的资料片段格式过于单一(总是同样的分隔符、同样的编号方式、同样数量),换成另一种文档格式就表现下降。
处理:
训练数据里主动引入格式多样性——不同的片段数量、不同的标记方式、不同长度的资料。
这能让模型学到"读资料"这件事本身,而不是记住某一种排版。
这个思路与前面讲"混数据防遗忘"是同一个原理 —— 通过增加数据多样性来提高泛化能力。
5.3 两个坑的共同点
它们都源于"训练数据与真实场景不匹配"。组合的成败,八成取决于数据构造的认真程度。
第六部分:顺序——先 RAG,后微调
为什么顺序不能反?三条理由都很实际。
6.1 原因一:微调无法弥补"料错"
如果检索召回的段里没有答案,再好的微调也只能让模型"优雅地答错"。
先把检索做对,微调才有意义。
6.2 原因二:RAG 的改进会影响训练数据
你的训练数据里包含"检索片段",而检索策略一变,片段的形态就变了。
如果先做微调、后改检索,训练数据可能就要重做。
这条理由的代价最直接 —— 因为重做训练数据意味着重新洗数据、重新标注、重新训练,成本可能是几周。
6.3 原因三:评测要能分开看
先有 RAG,你才能区分"检索没召回"和"召回了没用上"。
没有这个区分,微调的目标就是不清晰的。
6.4 实践顺序
第一步:把 RAG 做扎实(解析、切分、混合检索、Rerank),建立评测基线
第二步:确认瓶颈在"使用"而不是"召回"
—— 即资料里有答案但用得不好
第三步:才考虑微调,并且严格按"带检索结果"的格式构造数据
这个顺序能避免大量返工。
第七部分:评测——一定要分开评
组合之后,评测复杂度上升。必须分开看。
7.1 四个指标
| 指标 | 测什么 | 属于谁的职责 |
|---|---|---|
| ① 召回率 | 正确答案是否出现在召回结果里 | RAG |
| ② 忠实度 | 回答是否只依据给定资料、引用是否准确 | 微调 |
| ③ 拒答正确率 | 资料里没有时是否正确表示不知道 | 第二类训练样本的验收指标 |
| ④ 格式合规率 | 输出结构是否稳定 | 微调 |
7.2 为什么要分开
因为一旦组合,总指标下降时你无法判断是谁的问题。
判读方式:
| 观察 | 结论 |
|---|---|
| 召回率没变,但忠实度下降 | 微调出了问题 |
| 忠实度没变,但召回率下降 | 检索改动的影响 |
这是组合方案能长期维护的前提。
"能长期维护"这个要求很实际 —— 因为组合方案如果无法归因,一旦效果下降,团队会陷入"要不要整体推倒重来"的争论。
常见误区
误区一:"RAG 效果不好,加个微调就行。"
先归因。
如果问题在召回,微调解决不了,而且会把"检索失败"掩盖成"模型不会用"。
误区二:"微调时用干净的资料片段更好。"
那会让模型在真实噪声面前表现下降。
训练数据要包含真实的脏乱差。
这条误区的动机是"提高数据质量" —— 但在"使用检索资料"这个任务上,"干净"反而是失真的。 这属于**"训练分布的保真度比数据洁净度更重要"的情况。**
误区三:"微调之后就不需要 RAG 了。"
知识会更新,微调后的模型依然不知道上周新发的文件。
两者职责不同。
误区四:"组合一定比单用更好。"
组合增加复杂度与维护成本。
只有在"确实存在两层问题"时才值得做。
"确实存在两层问题"的判据是:你能明确说出"有一部分失败是因为召回不对,另一部分是因为用不好" —— 如果做不到,说明你还没定位清楚,此时上组合只会让问题更难查。
误区五:"信度问题靠提示词强调就够了。"
提示词能改善,但不如训练样本确定。
原因:"是否该拒答"是一个需要判断的边界情况,而提示词只能给出一个笼统的规则 —— 而训练样本能给出大量具体的例子。
误区六:"训练数据的检索片段可以用最理想的结果。"
不能。
"最理想的结果"意味着:片段完全相关、排序完美、没有噪声、格式统一。
而真实系统里:总有几个不相关的块、排序也不完美。
用理想数据训练,等于让模型在一个"不存在的工作环境"里学习。
实战问答
Q1:面试问"RAG 和微调怎么结合",怎么答得专业?
A:按"立分工 → 给关键工程点 → 给顺序"三步。
立分工:
RAG 管"看到什么",微调管"怎么用"。
关键工程点:
训练数据的输入格式必须与推理一致,包含真实的检索片段与噪声;必须包含"资料里没有答案"的负样本,用来训练不瞎编。
顺序:
先 RAG 后微调,并且评测要分开看召回率与忠实度。
中间那句是最有价值的部分 —— 因为它是"组合能不能成功"的实际决定因素,而不是一个理论细节。
Q2:微调之后模型不看检索结果了,怎么救?
A:这是"混入了凭记忆回答的样本"造成的。
处理三步:
① 把训练数据统一改成"带资料"的格式
② 提高"资料缺失 → 拒答"类样本的比例(做到 10%~20%)
③ 在评测里加一项"引用准确率"作为硬指标
第三步的意义在于"形成约束" —— 因为如果没有这个指标,你可能不会发现"模型没在用资料"(因为它的答案看起来也是对的)。
Q3:训练数据里的检索片段怎么造?
A:两种方式。
| 方式 | 特点 |
|---|---|
| 用真实检索系统跑出结果 | 最真实,推荐 |
| 人工构造仿真片段 | 可控,但要注意投入噪声与格式多样性 |
关键是别用"干净且完全相关"的片段。
推荐第一种的理由是"分布保真度" —— 因为人工构造很难复制真实检索结果里的那些微妙特征(比如某类文档总是排在中间、某些片段特别短)。
Q4:组合之后效果反而下降,怎么定位?
A:分开评测。
① 先测召回率
├─ 没变 → 问题在生成侧(微调或提示词)
└─ 下降 → 问题在检索改动上
② 再测忠实度与拒答正确率
→ 定位是"不用资料"还是"瞎编"
"先测召回率"这个顺序是有讲究的 —— 因为它是最独立的一个环节(不依赖模型行为),所以能快速排除一半的可能性。
Q5:什么情况下不值得做这个组合?
A:三种情况。
| 情况 | 判断 |
|---|---|
| 检索本身就不行 | 先把 RAG 做扎实,此时微调无法弥补 |
| 只有一层问题 | 比如只是格式不稳,用结构化输出约束就够了 |
| 团队维护能力有限 | 组合方案需要持续维护两套评测 |
第三条特别值得提醒 —— 因为组合方案的复杂度是"1+1>2"的:你不仅要维护检索、维护微调,还要维护"两者如何交互"的评测。
术语表
| 术语 | 含义 |
|---|---|
| 组合方案 | 同时使用检索增强与微调的系统形态 |
| 阅读器微调 | 让模型更忠实、稳定地使用检索片段的微调方向 |
| 改写器微调 | 优化用户问题到检索查询的转换 |
| 拒答样本 | 提供的资料中确实不含答案、期望模型表示"未提及"的训练样本 |
| 忠实度 | 回答是否严格依据给定资料,不引入外部信息 |
| 格式过拟合 | 模型只适应训练时见过的资料排版,换格式即失效 |
结语
把这篇压缩成三句话:
第一,RAG 和微调可以组合,但分工必须清楚:RAG 给料,微调教它怎么用。
第二,成败的关键在数据构造:
① 训练时的输入格式要与推理一致(含真实检索片段与噪声)
② 必须有"资料里没有答案"的样本(占 10%~20%),用来训练不瞎编
③ 要引入格式多样性,避免对某一种排版过拟合
第三,顺序上,永远是先把 RAG 做扎实,再训练使用方式。
因为微调无法弥补"料错",而且 RAG 的改动会让训练数据作废。
而如果只允许带走一个判断,那就是:问自己"这些失败样本里,有多少是召回错了,有多少是用错了" —— 如果这个问题答不上来,说明还不该做组合。