04. 召回效果差时你一般怎么排查?
整理召回效果差时你一般怎么排查?的面试回答思路与拆解方式。
简单回答
召回效果差的排查要沿着"数据→切分→编码→检索→融合"的链路逐步定位。先看知识库里有没有正确答案(数据覆盖问题),再看 Chunk 切分有没有把关键信息切断,再看 Embedding 模型是否适配业务领域,再看检索策略(是否需要混合检索、相似度度量是否合适),最后看有没有加 Rerank。排查的核心方法是"拿 bad case 倒推"——从一个具体的检索失败案例反向追踪每一步的中间结果。
详细解释
排查心法:从 bad case 开始
不要一上来就调参数或换模型。拿 5~10 个典型的"检索失败"案例,逐一分析每个环节的中间结果,才能找到真正的瓶颈。
具体做法是:拿一个用户提问,打印出检索返回的 Top-20 结果,人工看一眼——正确文档在不在里面?如果不在 Top-20 里,说明是召回阶段的硬伤。如果在 Top-20 但不在 Top-5,说明排序有问题但召回没问题。如果在 Top-5 但最终回答还是错了,说明问题在生成端不在检索端。
逐环节排查
知识库覆盖。 最基本的一步——你的知识库里有没有这个问题的答案?听起来很蠢但真的会遇到。有时候用户问的是一个新政策,但知识库还没更新。或者答案在某个附件里但附件没有被解析进去。先确认数据源没有遗漏。
文档解析。 答案在原始文档里有,但解析的时候丢了——表格没提取出来、图片中的文字没 OCR、PDF 解析乱码。把解析后的文本和原始文档对比一下就能发现。
Chunk 切分。 这是最高频的问题根源。答案跨了两个 Chunk 被切断了——前一个 Chunk 说"根据最新政策",后一个 Chunk 说"报销上限为 5000 元",两个 Chunk 单独看都缺乏完整信息,检索时哪个都不够相关。解决方案是调整切分策略、加 overlap、或者用 Parent-Child 分层切分。
还有一种情况是 Chunk 太大导致主题混杂——一个 Chunk 里同时包含了产品 A 和产品 B 的信息,Embedding 变成了一个"模糊"的向量,和任何一个产品的具体查询都不够匹配。
Embedding 模型。 换一个 Embedding 模型试试效果。用通用模型处理专业领域的内容,效果可能不好——模型没见过你的专业术语,编码出来的向量抓不住领域语义。可以试几个不同的 Embedding 模型做对比(BGE、GTE、E5 等),或者在业务数据上微调 Embedding 模型。
一个快速验证方法是:手动把正确 Chunk 的向量和 query 的向量算相似度,看看分数是不是确实低——如果分数低说明 Embedding 模型没有学到这对 query-document 的语义关联。
检索策略。 只用向量检索的情况下,精确关键词匹配容易漏。用户查"错误码 E40012",向量检索可能匹配到一堆和"错误码"语义相近但不是 E40012 的文档。加 BM25 做混合检索通常能补上这个缺口。
检索的距离度量也值得检查——余弦相似度、内积、L2 距离在不同 Embedding 模型上效果不同。有些模型训练时用的是内积,推理时用余弦相似度效果就会打折。
Rerank。 如果召回了正确文档但排序靠后(在 Top-20 但不在 Top-5),加一层 Cross-Encoder Rerank 通常能解决。Rerank 是性价比很高的优化手段——一行代码加进去效果可能提升十几个点。
Query 本身的问题。 有时候不是检索的问题而是 query 的问题。用户的提问太模糊、太口语化、有指代不清,直接拿去检索效果差。加 Query Rewrite(特别是多轮对话场景下的指代消解)可能是最有效的优化。
量化评估
排查完 bad case 之后要做量化评估——构建一个评测集(几百条 query-doc 对),跑 Recall@5、Recall@10、MRR 等指标,作为优化前的基线。每次做了一个改动(换 Embedding、加 BM25、调 Chunk 大小),在评测集上对比效果变化。靠主观感觉判断"好像好了一点"是不可靠的。
面试时可以这样答
召回效果差我一般从 bad case 开始排查——拿几个典型的检索失败案例,打印 Top-20 结果看正确文档在不在里面。
如果连 Top-20 都不在,就沿着链路往前查。先看知识库有没有覆盖,再看文档解析有没有丢内容,再看 Chunk 切分有没有切断关键信息——这是最高频的根因。然后看 Embedding 模型是不是适配业务领域,最后看检索策略——有没有加 BM25 混合检索。
如果在 Top-20 但排序靠后,加 Rerank 通常就能解决。如果 Rerank 也不行,可能是 query 本身有问题——太模糊或有指代不清,需要做 Query Rewrite。
每次改动之后一定要在评测集上跑指标量化对比,不能靠主观感觉判断效果。
常见追问
- 你在实际项目中遇到过最典型的召回失败案例是什么?
- Embedding 模型微调需要多少标注数据?怎么构造?
- 如果加了混合检索和 Rerank 效果还是不好怎么办?