【AI工程师精讲】33:RAG 与微调组合:能一起用,但顺序和训练数据有讲究

0 阅读14分钟

技术选型讨论里最常出现的提问是:微调还是 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 的改动会让训练数据作废。

而如果只允许带走一个判断,那就是:问自己"这些失败样本里,有多少是召回错了,有多少是用错了" —— 如果这个问题答不上来,说明还不该做组合。