K6.2 三大失败模式:对症下药
上一节的三盏灯告诉你「哪一环红了」,这一节把每种红灯对应的具体病根拆开,配上药方。RAG 翻车的方式虽多,归拢起来主要是三类。你在失败模式诊断器里已经各注入过一遍,这里把它们讲透。
病一:检索没召回(对的资料压根没捞回来)
症状:上下文相关性红灯。用户问「退货运费谁承担」,可含答案的那段「运费规则」根本没被检索到——检索回来的全是无关内容。模型拿着一手烂牌,要么答「资料不足」,要么瞎猜。
这是 RAG 的头号失败模式,也是最致命的:因为它发生在流水线最前端,后面所有环节都救不回来。资料都没捞回来,重排排个啥、生成照着啥答?
药方全在检索(K1~K4):
- 换更强的嵌入模型、调切块策略(K2:别把答案切散了);
- 上混合检索(K3:语义漏的让关键词补,尤其是精确词);
- 召回阶段多召回一些(K4:召回率优先,宁滥勿缺,反正有重排去伪存真);
- 甚至改写查询(把用户口语化的问题改写成更好检索的形式)。
一句话:没召回的救不回,所以检索这一关要拼命「别漏」。
病二:上下文泄漏(资料对了,模型却用自己的旧记忆)
症状:上下文相关性绿、有据性红。对的资料明明检索回来了、摆在模型面前,模型却无视它,凭训练时的「常识」瞎答——资料写着「会员退货免运费」,它却说「退货运费一般由买家承担」。
这叫「上下文泄漏」(context leak):模型参数里的 旧知识「泄漏」进了答案,盖过了眼前的资料。它比病一更隐蔽——因为检索是对的,你查检索日志一切正常,可答案就是错的。
药方在生成(K5):
- 提示词里把话说死:「只根据以下资料回答,不要使用你自己的知识,资料没有就说没有」;
- 强制引用:逼模型给每句话标出处(K5.2)——它要标出处,就不敢轻易脱离资料编;
- 严重时换个更「听话」(指令遵循更强)的模型。
病三:生成漂移(照着资料答,却把意思答歪了)
症状:上下文相关性绿、有据性红(部分)。模型确实在用资料,但复述时走了样——资料说「会员免运费、非会员自付 10 元」,它压缩成了「退货一律免运费」,把「非会员要付钱」这个关键条件丢了。
这叫「生成漂移」(generation drift):忠实度打了折。它最阴险的地方在于——答案看起来通顺、大方向也对,用户很难发现少了个条件。模型对「长条件、多分支」的内容做概括时,特别容易漏掉或篡改细节。
药方也在生成(K5):
- 要求模型逐条对应资料作答,别自由发 挥概括;
- 对关键的条件、数字,提示模型原样保留、别改写;
- 用有据性评测(K6.1)专门盯这类「漏条件」的漂移。
一张诊断表
把三种病根收拢成一张速查表——这就是你排查 RAG 故障时的地图:
| 失败模式 | 红灯 | 病根在 | 一句话症状 | 主要药方 |
|---|---|---|---|---|
| 检索没召回 | 上下文相关性 | 检索 K1~K4 | 对的资料没捞回来 | 改嵌入/切块/混合检索/多召回 |
| 上下文泄漏 | 有据性 | 生成 K5 | 资料对但模型凭旧记忆答 | 收紧指令、强制引用 |
| 生成漂移 | 有据性 | 生成 K5 | 照着答但复述走样、丢条件 | 逐条对应、关键信息原样保留 |
教学上把三种病分开讲,实战中它们常常一起犯:检索只召回了半对的资料(病一的轻症),模型又在这半对资料上过度发挥(病二/病三)。而且还有本课没细展开的病根—— 比如源文档本身就是错的或过时的(垃圾进垃圾出,回扣 K0 和上篇 4.1),这种检索、生成都没错,错在知识库的「源头」,得靠数据治理解决。三盏灯帮你缩小范围,但最终定位仍要你去读那条失败的轨迹(回扣下篇 A7.3 读轨迹找根因——评测 RAG 和评测智能体是同一套侦探功夫)。
小结
- 检索没召回(上下文相关性红,病根在检索):对的资料没捞回来,最致命——后面救不回,药方是拼命提高召回。
- 上下文泄漏(有据性红,病根在生成):资料对但模型用旧记忆瞎答,药方是收紧指令、强制引用。
- 生成漂移(有据性红,病根在生成):照着答却复述走样、丢条件,药方是逐条对应、关键信息原样保留。
- 三盏灯 → 三种病根 → 对应药方,构成一张诊断表;现实中常是并发症,还要靠读失败案例最终定位。
延伸阅读
- RAG 综述(2023)中关于失败模式与优化方向的部分。
- 下篇 A7.3 评测驱动开发——读失败轨迹、找根因、分桶优化,和本节是同一套侦探功夫。
- 下一节 K6 小结与自测。