10. RAG 效果差时应该怎么排查?
整理 RAG 效果差时应该怎么排查? 的核心概念、工程要点与面试回答。
简单回答
RAG 效果差时要沿着数据链路逐环节排查:先看检索(是不是没有召回正确文档),再看精排(召回了但排序靠后),再看上下文(给到模型的内容是否足够),最后看生成(模型是否正确利用了上下文)。核心原则是"从前往后查"——检索环节的问题不解决,优化后面的环节没有意义。
详细解释
排查的总体思路
RAG 是一个多环节串联的系统,效果差可能是任何一个环节出了问题。最忌讳的是一上来就调 Prompt 或换模型——这就像程序报错了直接改输出格式,不看代码逻辑。正确的排查顺序应该是从前往后,逐步定位瓶颈。
先看检索:正确文档有没有被召回
这是最高优先级的排查环节。拿几个典型的 bad case,看看检索返回的 Top-K 结果里有没有包含正确答案的文档。如果正确文档根本不在 Top-K 里——这就是召回失败,后面所有环节都是在"烂基础"上建房子。
召回失败常见原因:Chunk 切分把关键信息切断了(比如答案跨了两个 Chunk,每个 Chunk 单独看都不完整);Embedding 模型和业务领域不匹配(用通用模型编码专业术语效果差);用户 query 和文档表述差异太大(语义鸿沟);知识库本身就没有覆盖这个问题。
排查手段:直接打印检索返回的原始结果,人工看一眼相关性。做一个小型评测集(几十到几百条 query-doc 对),跑 Recall@K 量化检索质量。如果 Recall@10 就很低,说明问题在召回阶段。
再看精排:召回了但排序靠后
如果正确文档在 Top-50 但不在 Top-5,说明召回没问题但排序有问题。可能是 Embedding 相似度区分度不够(很多不相关文档的相似度分数和正确文档差不多),或者没有加 Rerank。
这时候加一层 Rerank(如 bge-reranker)通常会有明显改善。也可以检查是不是向量检索的距离度量选得不对(余弦相似度 vs 内积 vs L2 距离在不同 Embedding 模型上有差异)。
看上下文组装:给模型的内容是否合适
把最终送给模型的完整 Prompt 打印出来看。常见问题有:上下文太长导致关键信息被淹没(放了太多 Chunk,信噪比低);上下文太短缺少必要信息;文档排列顺序不合理(最相关的文档放在了中间,被模型忽略);Chunk 截断后丢失了关键信息。
最后看生成:模型是否正确利用了上下文
如果给到模型的上下文是完整、正确、相关的,但模型的回答依然不对,那问题就在生成端。可能是 Prompt 指令不够明确(模型不知道应该基于上下文回答而不是自由发挥);可能是模型能力不足(对长上下文的理解力不够、对专业领域的理解不够);也可能是模型的参数知识和检索到的内容冲突,模型"选择了"自己的知识而不是上下文。
这种情况下可以优化 Prompt、换更强的模型、或者做微调让模型更忠实于上下文。
建立系统化的排查框架
真正做项目不可能每次都手动排查,需要建立监控和评测体系。关键是把每次请求的完整链路信息都记录下来:用户原始 query、改写后的 query、检索返回的 Chunk 列表及分数、Rerank 后的排序、最终 Prompt、模型的输出。有了这些信息,排查问题时可以快速定位到具体环节。
定期从线上日志中抽样做 bad case 分析,分类统计问题类型(检索失败占比、排序问题占比、生成问题占比),然后针对性优化。这比"感觉效果不好就换模型"高效得多。
一个实用的排查清单
文档解析有没有问题——原始文档的关键内容是否被正确提取?Chunk 切分有没有切断关键信息?Embedding 模型是否适合当前领域?是否做了 Hybrid Search?是否加了 Rerank?Prompt 是否明确指示模型基于上下文回答?上下文是否太长或噪声太多?模型是否有能力处理当前长度的上下文?
面试时可以这样答
RAG 效果差要沿着数据链路从前往后排查,核心原则是先确认检索环节没问题,再去看生成环节。
第一步看召回——正确文档有没有在 Top-K 里。如果没有,说明是检索阶段的问题,可能是 Chunk 切分、Embedding 模型或者 query-document 语义鸿沟导致的。这一步不解决,后面优化都没意义。
第二步看精排——召回了但排序靠后的话,加 Rerank 通常能改善。第三步看上下文组装——送给模型的 Prompt 是不是信噪比够高、最相关的文档有没有放在关键位置。第四步才看生成端——模型有没有正确利用上下文、Prompt 指令是不是够明确。
工程上要把每次请求的全链路信息记下来:原始 query、改写 query、检索结果、Rerank 结果、最终 Prompt、模型输出。有了这些,排查 bad case 就不用猜,直接看数据。定期做 bad case 分析,统计问题集中在哪个环节,然后针对性优化。
常见追问
- 你实际项目中 bad case 最常出现在哪个环节?
- 你怎么构建 RAG 的评测集?标注数据从哪来?
- 检索和生成的问题同时存在时,应该先优化哪个?