rag-quality-diagnose
name: rag-quality-diagnose
description: RAG 检索增强问答的质量诊断与调优。当 AI 答非所问、检索不到明明存在的内容、引用了错误段落、开始编造、或者加了文档反而更差时使用。触发词:RAG、知识库问答、检索不准、召回率低、答非所问、幻觉、引用错误、向量检索、切块、rerank、重排、embedding 选型。不负责通用 prompt 优化(走 prompt-token-diet)和评测集设计(走 llm-eval-set)。
RAG 质量诊断
RAG 出问题时,八成的人第一反应是换更大的模型。但 RAG 是一条流水线,模型只是最后一环。先定位是哪一环坏了,否则换什么模型都白搭。
一、先分段归因
拿 20 条答错的样本,对每条回答两个问题:
问题 1:正确答案所在的原文,出现在检索结果里了吗?
- 没出现 → 检索环节的问题。往下看第二节。这是最常见的情况。
- 出现了 → 往下问第二个问题。
问题 2:把正确原文单独喂给模型,它能答对吗?
- 能答对 → 生成环节被噪声干扰了。往下看第四节。
- 答不对 → 生成环节或原文本身的问题。往下看第五节。
这个二分法花不了半小时,但能省掉几周的瞎调。跳过这一步的 RAG 优化都是碰运气。
二、检索召不回
按排查顺序:
切块有问题(最常见)
- 切太碎:一个完整的答案被切成三块,每块单独看都不像答案,都排不进前几名。
- 切太大:一块里混了五个主题,向量被平均掉,谁也不像。
- 在语义中间切断:固定字符数切块会把表格拦腰截断、把「因为」和「所以」分开。
改法:按结构切(标题、段落、列表项),保留层级信息。相邻块留 10% 到 20% 的重叠。表格和代码块不许拆开。
每一块前面拼上它的标题路径,这一招便宜且有效:
[产品手册 > 计费规则 > 超额处理] 当月用量超过套餐后,超出部分按……
向量模型不匹配
- 中文内容用了只在英文语料上训练的 embedding 模型,效果会差一大截。选支持中文的模型。
- 检查 embedding 是否被截断。多数模型有 512 token 上限,超出的部分直接丢弃,长块的后半段等于没入库。
- 确认入库和查询用的是同一个模型同一个版本。换了模型必须全量重建索引,这个坑很常见。
查询和文档不在一个语域
用户问「这个怎么退钱」,文档写的是「退款流程与时限规定」。纯向量检索对这种口语与书面语的落差处理得不好。
改法:
- 混合检索:向量 + BM25 关键词,两路结果融合(RRF 是简单有效的融合方法)。专有名词、型号、错误码这类,关键词检索比向量强得多。
- 查询改写:让小模型把用户问题改写成两三个更书面的检索式,多路召回后合并。
- 给文档块生成假设问题,把问题也入库,用问题去匹配问题。
召回数量与重排
- 先把召回数量调大(比如 50),看正确答案是否进入了这 50 条。进了,说明召回没问题,是排序问题,加 reranker。
- 加 reranker 通常比加召回数量有效得多,也便宜得多。 召回 50 条交给 rerank 模型精排出 5 条,是性价比最高的一步。
- 元数据过滤要用上:时间范围、文档类型、部门权限,先过滤再检索,能大幅提升信噪比。
三、检索到了但排序靠后
这是最好解决的一类,加重排序器就行。判断依据:把召回数从 5 调到 50,正确答案出现了,说明是排序问题。
顺带检查:
- 有没有大量重复内容挤占名额(同一份文档的多个版本都入库了)。做去重。
- 有没有一堆目录页、免责声明、页眉页脚这类噪声块。入库前过滤掉。
四、检索对了但答错
模型拿到了正确原文却答错,通常是这几种:
- 上下文太长,正确信息在中间被忽略。 把召回数从 20 降到 5,往往立刻好转。信息放在开头和结尾比放中间更容易被用上。
- 多个片段互相矛盾(新旧两版政策都召回了)。加时间过滤,或者在 prompt 里明确「以最新版本为准」。
- prompt 没有强制引用。 要求模型每句话标注来源块编号,无来源不许说。这一招对抑制幻觉非常有效,而且让错误可追溯。
- 没有给拒答出口。 prompt 里必须写明「检索内容里没有依据时,直接说没有找到,不要推测」。没有这句话,模型一定会编。
五、原文本身有问题
- 文档里就是没有这个答案,用户的期待错了。这种要在产品层面处理,让 AI 明确说「知识库里没有」,而不是硬答。
- 文档过时、多版本并存、内部互相矛盾。这是知识库治理问题,技术手段解决不了。
- 扫描件 OCR 质量差,表格全乱。先修数据。
RAG 救不了烂知识库。 如果诊断结论是这一条,要如实说,别用技术方案掩盖。
六、量化指标
分环节各测各的,不要只看端到端。
| 环节 | 指标 | 怎么算 |
|---|---|---|
| 检索 | Recall@K | 正确块出现在前 K 条的比例 |
| 排序 | MRR / NDCG@5 | 正确块的排名位置 |
| 生成 | 忠实度 | 回答的每句话能否在检索块中找到依据 |
| 生成 | 答案正确率 | 与标准答案比对 |
| 整体 | 拒答准确率 | 该拒答时是否拒答,不该拒答时是否误拒 |
最后一行经常被漏掉。一个「什么都说不知道」的系统在忠实度上是满分,但毫无用处。
七、调优顺序
按投入产出比排:
- 修切块策略(最便宜,收益最大)
- 加 reranker
- 混合检索(向量 + 关键词)
- 减少送进模型的上下文数量
- prompt 加强制引用和拒答出口
- 查询改写 / 假设问题
- 换 embedding 模型(要全量重建索引,成本高)
- 换生成模型(放最后,通常不是瓶颈)
每改一步跑一次评测,记录分环节指标。一次改两处以上,就归因不了了。