RAG 错误根源怎么定位?
Retriever vs Generator 归因分析,指标与验证步骤详解
原题:当RAG系统输出错误结果时,如何通过实验设计或分析方法系统性地判断错误根源是来自检索模块(Retriever)还是生成模块(Generator)?请结合具体指标、验证步骤和实际案例说明判断逻辑。
评估与监控 · 百度真题
回答与解析
核心方法:隔离变量而不是凭症状归因
问答偏题、细节错误或文档外陈述只能作为排查线索,不能直接判定是 Retriever 或 Generator。生成器可能忽略正确证据,检索器也可能召回相关但不足以回答的材料,两者还可能同时失败。
1. 先建立可判定样本
为查询标注参考答案、支持答案的黄金证据及可回答性。没有黄金证据时,无法区分“知识库里没有答案”和“检索器没找到答案”。
2. 黄金证据替换实验
固定模型、prompt、解码参数和问题,把线上检索结果替换为人工确认的黄金证据:
- 使用黄金证据后稳定答对,说明检索、排序或上下文组装是主要瓶颈。
- 黄金证据足够且清晰但仍答错,说明生成阶段的理解、指令遵循、证据忠实度或输出解析需要排查。
- 结果时好时坏,应重复运行并控制随机性,不能用一次生成下结论。
3. 检索与生成消融
- 检索侧:检查黄金证据 Recall@K、MRR/NDCG、chunk 完整性、过滤条件和重排前后位置。
- 生成侧:在相同黄金证据上比较原 prompt、简化 prompt、抽取式基线和不同模型,检查答案 claim 是否被证据支持。
- 交互侧:逐步增加候选、调整顺序并去除重复或冲突文档,判断是否存在 lost-in-the-middle、噪声干扰或上下文截断。
4. 归因矩阵
| 黄金证据召回 | 黄金证据下生成 | 主要结论 |
|---|---|---|
| 否 | 能答对 | 检索或排序问题 |
| 是 | 仍答错 | 生成、prompt 或解析问题 |
| 否 | 仍答错 | 两侧都可能有问题,需分别修复 |
| 是 | 能答对但线上错 | 候选顺序、噪声或上下文组装问题 |
结论:用黄金证据、重复对照和证据级指标拆开检索与生成,再报告单一故障或耦合故障,不能仅凭答案表象甩锅。
口语版讲法(约4分钟)
- 核心思路:隔离变量 + 对照实验
- 症状快速分类
- 关键实验:黄金文档替换
- 实际案例:百度智能客服
- 给出可延伸点:检索与生成的耦合问题
RAG 出错时,我不会先凭感觉说是检索的问题还是生成的问题,而是做隔离变量实验。因为 RAG 是串联系统,前面检索错会传导到生成,生成模型也可能在检索正确的情况下自己发挥,所以要把两个模块拆开看。
答案跑题、数字错误或引用缺失只能作为排查线索,不能直接归因。检索和生成可能同时失败,必须用黄金证据替换、重复对照和证据级指标隔离变量。
第一步看检索 TopK。检查正确文档有没有被召回,排在第几位。如果正确文档根本不在 TopK,基本就是 retriever 召回问题,对应指标看 Recall@K。如果正确文档在 TopK 但排得很靠后,就是排序问题,对应看 MRR 或 NDCG。如果正确文档排在前面,但答案仍然错,就要重点怀疑 generator。
第二步做黄金文档替换。人工把能回答问题的 gold document 放到 context 第一位,再让同一个生成模型回答。如果答案变正确,说明原问题主要在检索或排序;如果答案还是错误,说明生成模型没有正确利用证据,可能是 prompt 约束不够、模型忠实度差,或者上下文里有干扰信息。
第三步做 context 消融。把 Top5 减到 Top3、Top1,或者只保留正确文档,看答案怎么变。如果只保留正确文档后答案稳定正确,说明噪声文档在干扰生成;如果换成无关文档后模型还给出很自信的答案,说明它过度依赖参数知识,有幻觉风险。
第四步做答案和证据对齐。把答案拆成 claim,逐条判断是否能被 context 支撑。这里可以用人工、NLI 模型或强模型辅助打分。Context relevance 低通常是检索问题;context relevance 高但 faithfulness 低,就是生成问题;两者都不高,就说明链路整体都要调。
举个客服例子,用户问“SVIP 下载速度是否有上限”,系统回答了一个固定数值。排查时发现正确政策文档在 Top5 里但排第 4,前面是普通会员说明。把正确文档提到第一位后,如果模型回答正确,主要修 reranker;如果仍然回答固定数值,就要加引用约束、减少噪声、优化 prompt 或换更忠实的模型。
最后我会看端到端指标,比如答案正确率、引用准确率、拒答率。因为检索指标提升不一定等于答案提升,必须确认优化真的改善最终回答。
关键一句:RAG 错误经常是检索和生成耦合导致的,要通过 gold doc、消融和证据对齐拆开看。
面试官还可能这样问
- 问法 1 · 场景切入
我看你做过电商客服的RAG。用户问‘这个订单怎么还没发货’,系统答成了‘您已签收’。你想定位是检索没找到物流信息,还是生成环节写错了,你会怎么一步步查?
- 问法 2 · 层层追问
RAG输出错了,你怎么判断是检索还是生成的锅?……比如答案和检索文档矛盾,是检索没召回对的文档,还是生成没看文档?……具体你会设计什么实验来隔离这两个模块?
- 问法 3 · 直球架构
设计一套实验流程,系统性地分析RAG错误根源在Retriever还是Generator。要求给出具体的替换、消融实验方案,以及用于判定的指标和阈值。结合一个实际案例说明。