RAG 检索不到正确的文档,你怎么排查?
面试怎么回答
我会沿着链路排查。先确认文档是否真的在索引里:是否解析成功、扫描件是否 OCR、增量任务有没有漏、是否被权限或元数据过滤排除、是不是旧版本,直接按文档 ID 查索引。再看切分:答案是否被切散、Chunk 是否过大稀释语义、表格是否切碎、标题上下文是否丢失。然后看检索方式:用户用词和文档用词不一致需要查询改写,专有名词和编号要结合 BM25 做混合检索,召回数量是否太少,重排是否把它排掉。最后才考虑换 Embedding 模型。配套建一个能看每一步结果的调试页面和检索评测集,用 Recall@K 衡量每次改动。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
用户反馈:「知识库里明明有这份文档,AI 却说找不到相关信息。」RAG 效果不好,大部分问题出在检索环节。面试官问这题,想看你能不能沿着链路一段一段地排查,而不是一上来就换 Embedding 模型。
先确认:文档到底在不在索引里
很多「检索不到」其实是数据问题:
- 文档有没有被成功解析?PDF 解析失败、扫描件没做 OCR,内容是空的;
- 有没有被切分和向量化?增量任务是不是漏了;
- 有没有被权限过滤掉?用户本身没有这份文档的权限;
- 元数据过滤条件是否过严?比如按部门、按时间过滤把它排除了;
- 是否是旧版本?新版本还没入库。
直接按文档 ID 去索引里查,看有没有这些 Chunk、内容是否正常。
再看:切分是不是有问题
- 答案被切到了两个 Chunk 里,每个单独看都不完整;
- Chunk 太大,关键句子被大量无关内容稀释,向量不够「像」问题;
- 表格被切碎,表头和数据分开了;
- 标题、章节信息丢失,Chunk 里没有「这是关于什么的」上下文。
然后看:检索方式是否合适
- 用词不匹配:用户说「报销」,文档写的是「费用核销」,纯向量检索可能找不到,纯关键词检索也找不到,需要同义词或查询改写;
- 专有名词、编号:任务名、错误码、产品型号,向量检索效果差,需要关键词检索(BM25)配合,也就是混合检索;
- 召回数量太少:Top 5 里没有,Top 50 里有,说明需要扩大召回再重排;
- 重排把它排掉了:看重排前后的排名变化。
最后看:Embedding 模型
只有前面都排除了,再考虑 Embedding 模型是否适合你的语言和领域。换模型要全量重算向量,成本最高。
建立排查工具和评测
- 一个调试页面:输入问题,看每一步的结果(改写后的查询、关键词召回、向量召回、合并、重排、最终送给模型的内容);
- 一个检索评测集:问题 + 应该召回的文档,持续统计召回率(Recall@K),每次改动对比。