Skip to content

RAG 召回率低:企业级六层排查与优化优先级(口播版) ​

面试高频问题:你们 RAG 召回效果不好 / 召回率低,怎么排查? 一句话答案:别先调 topK 和阈值。按「评测口径 → 数据与切块 → Query → 检索 → 精排 → 生成」六层漏斗逐层定位,先量化再归因;优化顺序按 ROI:修数据切块 > 混合检索多路召回 > Query 改写 > 精排 > 调参。 适用面次:二面深度 / 三面综合(RAG 工程化 + 线上问题定位) 本版定位:口语应答脚本 —— 先给「开口就能说」的话术,再给速查表与归因矩阵。


【30 秒极简版】(面试官随口一问时用) ​

召回低我不会先去调 topK。第一步先分清是真召回低,还是召回但排后面、召回了但模型没用上、评测集本身有问题。然后按漏斗查:文档有没有入库、解析和切块有没有把语义切碎、Query 表达和文档术语差多远、检索是不是只有向量一路、精排有没有把正确块挤掉、最后才是生成层上下文编排。优化顺序是先修数据和切块,再上混合检索和多路召回,Query 改写和精排往后放,调参最后做。


【2 分钟完整口播】(正式被问到时的主干回答) ​

我会分六层排查,不跳步。

第零层,先把问题定义清楚。 「召回率低」至少有四种情况:一是空召回,一条都没返回;二是正确块根本不在 topK;三是正确块在 topK 里但排得靠后,这其实是排序问题不是召回问题;四是召回了但模型没用上,这属于生成层。四种问题的解法完全不同,所以第一步是拿线上 badcase 采样,按这四类分开,同时看日志里的召回列表、相似度分数和过滤条件。

第一层,数据和切块,这是收益最大也最常被忽略的一层。 先确认该有的文档到底有没有入库、权限或租户过滤有没有把它挡掉;再看解析,PDF 双栏、表格、扫描件、页眉页脚噪声,解析失败往往是静默丢内容;然后是切块,块太大语义被稀释,块太小上下文不足,跨页表格被拆散都会直接导致召不回。常用解法是按标题层级切、父子块(小块召回、大块补上下文)、适当 overlap,并补全标题、章节、来源这些元数据。还要查索引一致性:增量更新漏了、删除没同步、embedding 模型换了但索引没重建,都会表现为「怎么调都召回不到」。

第二层,Query。 用户问法口语化、省略、指代、错别字、中英混、内部黑话,和文档术语对不上。解法是 query 改写、同义词/术语表、多 query 扩展、子句拆分,多轮场景先把指代补全。但改写要防漂移 —— 改完和原问题不是一回事,召回反而更差。

第三层,检索。 只有向量一路,遇到型号、编号、专有名词就弱;只有 BM25 一路,遇到同义表达就弱。所以企业级一般做混合检索:向量 + 稀疏检索,用 RRF 融合。再查 embedding 选型是否匹配中文和领域、query 和文档是否同一模型、topK 是否太小、相似度阈值是否过严、metadata filter 逻辑有没有写错,以及向量库参数(HNSW 的 ef/M、IVF 的 nprobe)和距离度量是否与归一化方式匹配。

第四层,精排。 记住分工:召回保广度,精排保精度。精排不会提高 Recall@K,只会改善 top1/top3 的命中;但如果 rerank 的候选截得太小,正确块在进精排前就被丢了。这里还要看精排模型是否适配领域、长文档是否被截断。

第五层,生成。 有些「召回低」其实是上下文编排问题:召回块太多被截断、无关块挤占窗口、prompt 没要求引用来源、模型忽略了中间段落。用引用溯源就能区分「没召回」和「召回了没用上」。

最后,优化按 ROI 排:先修数据和切块,再上混合检索和多路召回,再做 Query 改写,然后上精排,最后才调 topK、阈值和索引参数。调参必须单变量、有固定回归集,不然改了三处不知道是哪处生效。


一、先分清四种「召回低」 ​

现象本质首查位置
返回 0 条空召回索引是否完整、过滤条件、阈值
正确块不在 topK真召回低数据/切块、Query、检索路数
正确块在 topK 但排后排序问题融合权重、精排、topK 截断
召回了但答案没用上生成/上下文问题上下文编排、prompt、截断
同类问题全错系统性缺陷切块策略、术语体系、模型不适配

面试第一句就说这个分类,立刻区别于「上来就调参」的候选人。


二、六层排查漏斗 ​

第 0 层:评测与观测(先量化,再动手) ​

  • 指标:Recall@K、Hit Rate@K、MRR、nDCG;按业务场景 / 意图切片,不只看总体均值;
  • 标注粒度:必须是 query → 正确 chunk id 级别,只看答案对错无法区分召回与生成问题;
  • 线上观测:空召回率、top1 分数分布、召回条数分布、过滤命中数;
  • badcase 采样:100~300 条起步,人工归类到上面五类,形成归因矩阵。

第 1 层:数据与切块(收益最大) ​

检查项典型问题处理
文档覆盖该入库的没入库;权限/租户过滤挡掉核对文档清单与过滤条件
解析质量PDF 双栏、表格、扫描件、页眉页脚噪声;失败静默丢解析结果抽查、表格单独处理、OCR 兜底
切块策略块太大语义稀释 / 太小上下文不足 / 跨页跨表割裂按标题层级切、父子块、适度 overlap
元数据缺标题、章节、来源、时间、业务标签入库时补全,供过滤与精排使用
索引一致性增量漏更、删除未同步、换 embedding 未重建文档/切块/模型/索引四版本对齐

第 2 层:Query 表达 ​

  • 口语化、省略、指代、错别字、中英混写、内部黑话;
  • 改写手段:query rewrite、术语表/同义词、多 query 扩展、HyDE、子句拆分;
  • 多轮场景:先做指代消解与上下文补全;
  • 风险:改写漂移 —— 改写后语义偏离原问题,召回更差,必须用回归集验证。

第 3 层:检索 ​

检查项说明
检索路数纯向量对编号/型号弱,纯 BM25 对同义表达弱 → 混合检索 + RRF 融合
embedding中文/领域适配、维度、归一化、最大输入长度;query 与 doc 同模型
topK / 阈值太小或阈值过严会直接漏;阈值应按分数分布定,不拍脑袋
过滤条件metadata filter 逻辑、租户/权限字段、时间范围
向量库参数HNSW ef/M、IVF nprobe;距离度量(cosine / IP / L2)与归一化匹配
集合/分区多租户或分库时 collection 选错,表现为整体召回异常

第 4 层:精排 ​

  • 职责分离:召回保广度,精排保精度;
  • 精排不提升 Recall@K,只改善 top1/top3;候选截断过小会在精排前丢正确块;
  • 检查精排模型领域适配、长文档截断、输入拼接格式。

第 5 层:生成与上下文 ​

  • 上下文超长被截断、无关块挤占窗口;
  • prompt 未要求「只依据检索内容回答 / 标注来源」;
  • 模型忽略中间段落(长上下文位置效应);
  • 引用溯源是区分「召回错」与「生成错」的关键手段。

三、归因矩阵(badcase 怎么落到动作) ​

现象根因层首选动作
空召回数据 / 过滤查索引完整性、过滤条件、阈值
正确块未进 topKQuery / 检索混合检索、Query 改写、扩 topK
正确块在 20 名外排序融合权重调优、上精排
召回正确但答错生成上下文编排、prompt 约束、引用校验
同类问题全错切块 / 术语重建切块、补术语表、评估换模型
新文档召回不到索引一致性重建索引、核对增量任务

四、优化优先级(按 ROI 排,不要反过来) ​

  1. 修数据与切块 —— 收益最大、成本最低,先做解析抽查和切块重建;
  2. 混合检索 + 多路召回 + RRF —— 补单路盲区,通常是最划算的检索改造;
  3. Query 改写 / 扩展 + 术语表 —— 解决表达鸿沟,但要防漂移;
  4. 上精排 —— 提升 topN 精度,不改变召回上限;
  5. 调 topK / 阈值 / 索引参数 —— 最后做,单变量、固定回归集、有基线对比。

兜底策略同样要讲:无召回时主动澄清或转人工,比硬答更安全;权限过滤必须前置或按租户分区,不能为了召回牺牲权限。


五、工程保障 ​

  • 四版本对齐:文档版本、切块版本、embedding 版本、索引版本一一对应,可回滚;
  • 监控:空召回率、抽样 Recall@K、top1 分数分布、答案采纳率、转人工率;
  • 回归与灰度:固定评测集 + 单变量改动 + 小流量灰度(详见 29 篇);
  • 成本延迟:多路召回与精排都有延迟预算,扩 topK 前先算清 token 与耗时。

六、追问预案 ​

Q:召回率和准确率怎么权衡?

召回先保广度,精排再收精度:topK 放大保证正确块进候选,再用精排把噪声压下去。只扩 topK 不精排,噪声和成本一起涨。

Q:没有标注数据怎么评估召回?

先人工标 100~300 条 query 对应 chunk,成本可控;再用 LLM 辅助预标 + 人工抽检校准;线上用点击、采纳、转人工做弱信号。

Q:调大 topK 不就行了?

那是治标。先定位是哪一层漏:数据没入库、切块碎了、Query 表达差异,这些扩 topK 也救不回来,只会多塞噪声。

Q:多租户权限会不会影响召回?

会。后过滤会把结果删空,正确做法是按租户分区/前置过滤,让检索只在有权限的集合里进行。

Q:什么时候该换 embedding 模型?

前面五层都排除了才考虑。换模型要全量重建 + 固定回归集对比 + 灰度,不能只凭感觉。


七、露馅点 vs 加分点 ​

  • ❌ 一上来就说「调 topK、调阈值」→ ✅ 先做四类问题分类 + 六层漏斗
  • ❌ 只看最终答案对错 → ✅ 用 chunk 级 Recall@K 把召回和生成分开
  • ❌ 把「召回但排后」当召回问题 → ✅ 区分召回上限与排序精度
  • ❌ 只用向量检索 → ✅ 混合检索 + RRF,补编号/专有名词与同义表达盲区
  • ❌ 改三处一起上 → ✅ 单变量 + 固定回归集,可归因
  • ❌ 为提升召回放宽权限 → ✅ 权限前置/分区,安全不让步
  • ❌ 无召回硬答 → ✅ 澄清或转人工兜底

八、一句话收尾 ​

召回率低不是「参数没调好」,而是数据、切块、表达、检索、排序、生成六层里某一层断了;企业级的做法是先用 chunk 级指标定位断点,再按 ROI 从数据修到参数,最后用回归集和灰度证明真的修好了。


关联笔记:12PDF文档RAG工程化-四环节流水线(解析与切块)、13GraphRAG跨文档多跳推理-三层架构与生产防御(多跳召回)、27一句话多意图与跨轮补答-子句拆分单标签路由与补答取舍(子句拆分与精排前提)、28RAG知识库变更感知-人工重建定时比对与Webhook增量(索引一致性)、29Prompt优化AB测试-线下固定评测集配对比较与四指标权衡(回归集与单变量验证)、24Agent性能量化评估-五维指标体系(指标采集)、17Codex为什么不用RAG-AgenticSearch与代码检索取舍(检索路线取舍)