60 秒回答模板

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 回流验证每个改动,避免只提升总体召回却增加误召回和幻觉。

考点 两类误判
难度 真实面经题
回答目标 定位 Embedding 召回误判

深入解析

01

先定义误判类型

RAG embedding 误判不能只说召回不准。要区分 false positive 和 false negative:前者是召回了看似相似但不能回答问题的文档,后者是真正相关文档没有进入候选集。两类问题的修复方向不同。

02

用标注集建立评估口径

需要构建 query-document 标注集,标出强相关、弱相关和不相关,并覆盖高频问题、长尾实体、同义表达、时间敏感问题和领域术语。指标可以看 recall@K、precision@K、MRR、nDCG、空召回率、错误召回率,以及不同切片下的表现。

03

近邻检查能暴露语义混淆

定位时要直接查看 topK 最近邻,分析为什么相似:是共享关键词、主题相近但意图不同、实体被混淆、时间版本不一致,还是 chunk 太碎导致上下文丢失。还要检查相似度分布,判断阈值是否把大量边缘样本放进了候选集。

04

数据和索引问题同样常见

误判不一定来自 embedding 模型。文档清洗、标题缺失、chunk 边界、表格处理、metadata filter、向量归一化、索引更新延迟和 embedding 版本混用都会影响召回。工程排查要覆盖数据管道和向量索引,而不是只换模型。

05

改进要组合召回和复排

常见改进包括 query rewrite、领域词扩展、chunk 重切、加入 hard negative 微调 embedding、BM25 + dense 混合检索、metadata filter、cross-encoder rerank、LLM rerank、topK 和阈值调优。召回层负责不漏,复排层负责把真正可回答的证据排到前面。

06

线上闭环防止局部优化

每次改动都要用离线标注集和线上 badcase 验证,观察误召回、漏召回、答案幻觉、延迟和成本变化。不能只看总体 recall 提升,因为增加 topK 或降低阈值可能把更多噪声交给生成模型,最终答案反而更差。

易错点

  • 把 embedding 误判答成泛泛的 RAG 优化,没有区分误召回和漏召回。
  • 没有标注集和切片指标,只凭少量 badcase 判断模型好坏。
  • 一遇到误判就换 embedding 模型,忽略 chunk、metadata、索引和阈值问题。
  • 盲目扩大 topK 或降低阈值,导致噪声更多、答案更容易幻觉。
  • 只看召回层,不看 rerank 后证据是否真的支持最终答案。
  • 没有线上 badcase 回流,优化无法覆盖真实长尾问题。

面试官追问

误召回和漏召回分别怎么处理?

误召回重点看阈值、复排、hard negative、metadata filter 和证据可回答性;漏召回重点看 query rewrite、领域词、chunk 切分、embedding 训练和混合检索。

为什么要做 hard negative?

RAG 里很多错误来自表面相似但语义不匹配的文档。hard negative 能让 embedding 学会拉开这些容易混淆的样本。

BM25 + dense 混合检索有什么价值?

Dense 擅长语义相似,BM25 对精确词、编号、实体和专业术语更敏感。混合检索能降低单一路径的盲区。

如何判断是否需要 rerank?

如果相关文档经常出现在 topK 里但排序靠后,或者 top1 表面相关但不可回答,rerank 通常有价值。

阈值调低为什么可能变差?

阈值调低会增加候选覆盖,但也会引入更多噪声。生成模型可能误用噪声证据,导致幻觉或答非所问。