核心要点

  • 量化定位:用带标注的检索评测集看 Recall@k / 命中率,判断是召回不到还是排序靠后

  • 召回阶段查根因:embedding 模型是否匹配领域/语言、分块粒度是否过大过小、query 是否需改写/扩展

  • 排序阶段:召回里有正确文档但排名靠后,加 reranker 重排或调相似度阈值

  • 查索引与数据:index 是否更新/重建、向量与文档是否对齐、是否漏建/脏数据

标准回答

先判断是「召回不到」还是「排序靠后」(独占一行)

这是 RAG 调试的分水岭。准备一批带标注(query → 应命中文档)的检索评测集,看 Recall@k:若正确文档根本不在 top-k 里,是召回问题;若在 top-k 里但排名靠后没被用上,是排序问题。两类病因和解法完全不同。

召回阶段排查

若召回不到:检查 embedding 模型是否匹配业务领域与语言(通用模型在专业/中文语料常偏弱)、分块 粒度是否过大(稀释语义)或过小(丢上下文)、query 是否需要改写/扩展(口语化、含指代、过短时召回差),以及是否该上混合检索(向量+关键词 BM25)补齐稀有词与精确匹配。

排序阶段优化

若正确文档已召回但排名靠后:引入 reranker(交叉编码器)对 top-k 精排、调整相似度阈值与返回数量、避免阈值过高把正确结果过滤掉。

索引与数据一致性

检查向量索引是否随知识库更新而重建、文档与向量 id 是否对齐、有无漏建或脏数据、chunk 元数据/过滤条件是否误伤目标文档。

常见误区

⚠️ 常见踩坑

不先用 retrieval 指标区分召回还是排序问题,就盲目加 rerank 或换 embedding——若根本没召回到,rerank 救不回来;以及只看最终回答好坏,不单独评估检索环节。

追问

追问 1为什么要把检索评测和最终回答评测分开?

最终回答受检索、Prompt、模型多个环节共同影响,端到端指标差时无法定位根因。单独评测检索(Recall@k、MRR、命中率)能直接判断「料有没有取对」,把问题隔离到检索环节,避免在生成端反复调 Prompt 却治不了「巧妇难为无米之炊」。

追问 2query 改写在什么情况下最能提升召回?

当用户 query 短、口语化、含指代或与文档用词不一致时最有效:可做 query 扩展/同义改写、多查询生成(multi-query)覆盖不同表述、对话场景做指代消解补全上下文,或用 HyDE 生成假设答案再检索。本质是缩小 query 与文档的语义/词面鸿沟。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。

🛠️ AI 工具

  • Recall

    为 Claude Code 提供持久化记忆能力,完全离线运行,避免每次会话重复解释项目上下文。468 stars。

  • index

    领先的开源浏览器 Agent,可自主在网页上执行复杂任务,支持 Claude 3.7 Sonnet 和 Gemini Pro 等模型