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 怎么落到动作)
| 现象 | 根因层 | 首选动作 |
|---|---|---|
| 空召回 | 数据 / 过滤 | 查索引完整性、过滤条件、阈值 |
| 正确块未进 topK | Query / 检索 | 混合检索、Query 改写、扩 topK |
| 正确块在 20 名外 | 排序 | 融合权重调优、上精排 |
| 召回正确但答错 | 生成 | 上下文编排、prompt 约束、引用校验 |
| 同类问题全错 | 切块 / 术语 | 重建切块、补术语表、评估换模型 |
| 新文档召回不到 | 索引一致性 | 重建索引、核对增量任务 |
四、优化优先级(按 ROI 排,不要反过来)
- 修数据与切块 —— 收益最大、成本最低,先做解析抽查和切块重建;
- 混合检索 + 多路召回 + RRF —— 补单路盲区,通常是最划算的检索改造;
- Query 改写 / 扩展 + 术语表 —— 解决表达鸿沟,但要防漂移;
- 上精排 —— 提升 topN 精度,不改变召回上限;
- 调 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与代码检索取舍(检索路线取舍)