真实面经题目 · 原创解析
RAG Embedding 召回出现误判时,如何定位并改进?
这题考 RAG 中 embedding 召回误判的诊断和改进,回答要区分误召回与漏召回,并用标注集、近邻检查、负样本、混合检索、rerank 和阈值策略闭环优化。
Embedding 召回误判通常有两类:一种是 false positive,向量距离很近但文档并不能回答问题;另一种是 false negative,真正相关的文档没有被召回。我会先建立 query-document 标注集,区分强相关、弱相关和不相关样本,按业务类型、实体、时间、语言和问题意图切片计算 recall@K、precision@K、MRR、nDCG 和空召回率。定位时要检查最近邻结果、相似度分布、chunk 切分、文档标题和正文是否缺上下文、embedding 模型版本、向量归一化、元数据过滤和索引更新。改进上可以做 query rewrite、领域词扩展、chunk 重切、hard negative 对比学习或微调 embedding,引入 BM25 + dense 的混合检索,用 cross-encoder 或 LLM rerank 复排,再配合 topK、阈值、metadata filter 和低置信拒答。最后要用离线评测和线上 badcase 回流验证每个改动,避免只提升总体召回却增加误召回和幻觉。
RAG embedding 误判不能只说召回不准。要区分 false positive 和 false negative:前者是召回了看似相似但不能回答问题的文档,后者是真正相关文档没有进入候选集。两类问题的修复方向不同。
需要构建 query-document 标注集,标出强相关、弱相关和不相关,并覆盖高频问题、长尾实体、同义表达、时间敏感问题和领域术语。指标可以看 recall@K、precision@K、MRR、nDCG、空召回率、错误召回率,以及不同切片下的表现。
定位时要直接查看 topK 最近邻,分析为什么相似:是共享关键词、主题相近但意图不同、实体被混淆、时间版本不一致,还是 chunk 太碎导致上下文丢失。还要检查相似度分布,判断阈值是否把大量边缘样本放进了候选集。
误判不一定来自 embedding 模型。文档清洗、标题缺失、chunk 边界、表格处理、metadata filter、向量归一化、索引更新延迟和 embedding 版本混用都会影响召回。工程排查要覆盖数据管道和向量索引,而不是只换模型。
常见改进包括 query rewrite、领域词扩展、chunk 重切、加入 hard negative 微调 embedding、BM25 + dense 混合检索、metadata filter、cross-encoder rerank、LLM rerank、topK 和阈值调优。召回层负责不漏,复排层负责把真正可回答的证据排到前面。
每次改动都要用离线标注集和线上 badcase 验证,观察误召回、漏召回、答案幻觉、延迟和成本变化。不能只看总体 recall 提升,因为增加 topK 或降低阈值可能把更多噪声交给生成模型,最终答案反而更差。
误召回重点看阈值、复排、hard negative、metadata filter 和证据可回答性;漏召回重点看 query rewrite、领域词、chunk 切分、embedding 训练和混合检索。
RAG 里很多错误来自表面相似但语义不匹配的文档。hard negative 能让 embedding 学会拉开这些容易混淆的样本。
Dense 擅长语义相似,BM25 对精确词、编号、实体和专业术语更敏感。混合检索能降低单一路径的盲区。
如果相关文档经常出现在 topK 里但排序靠后,或者 top1 表面相关但不可回答,rerank 通常有价值。
阈值调低会增加候选覆盖,但也会引入更多噪声。生成模型可能误用噪声证据,导致幻觉或答非所问。