RAG Bad Cases
这份案例库记录 RAG 项目中最常见、也最值得复盘的失败模式。每个 bad case 都包含现象、原因、修复方式和如何避免复发。
1. 检索结果看起来相关,但回答缺少关键条件
现象:
用户问“入职半年有没有年假”,系统回答“员工有年假”,但没有说明“入职满一年后才享有”。
常见原因:
- chunk 太小,只检索到“员工享有年假”的片段
- 条件句和结论被切到不同 chunk
- Prompt 没要求保留限制条件
修复方式:
- 增大 chunk 或保留父级标题和相邻上下文
- 对政策、合同、制度类文档按条款切分
- Prompt 中要求回答必须包含适用条件、限制和例外
如何避免复发:
- 在评测集中加入“条件型问题”
- 检查 top-k 结果是否包含完整依据
- 评测答案是否遗漏限制条件
2. 检索不到专有名词
现象:
用户问产品代号、工单号、政策编号时,向量检索找不到答案。
常见原因:
- 只使用向量检索,忽略关键词检索
- 专有名词在 embedding 空间中语义不明显
- 文档中的编号被解析或清洗掉
修复方式:
- 加入关键词检索或混合检索
- 保留编号、代码、产品名等原始文本
- 对 query 提取专有名词并提高匹配权重
如何避免复发:
- 单独准备专有名词评测集
- 检查关键词检索和向量检索的召回差异
- 对编号、代码、URL、产品名做解析保护
3. 模型引用了资料,但引用不支持结论
现象:
回答后面有来源,但打开来源发现只和主题相关,并不能证明结论。
常见原因:
- 模型把检索片段当作装饰性引用
- Prompt 没要求结论和引用逐条对应
- 检索结果相关但证据不足
修复方式:
- 要求每个关键结论都带对应 source
- 在输出中加入
claim和source_ids - 对答案做引用一致性评测
如何避免复发:
- 人工抽检引用准确性
- LLM-as-judge 单独评分 faithfulness 和 citation_support
- 资料不足时拒答
4. 资料没有答案,模型仍然编造
现象:
知识库没有“报销上限”,模型却回答了一个具体金额。
常见原因:
- Prompt 要求模型必须回答
- 没有拒答策略
- 检索分数太低仍继续生成
- 模型根据常识补全
修复方式:
- Prompt 明确只能基于资料回答
- 增加资料不足的固定输出
- 设置检索分数阈值
- 将拒答样例加入 few-shot
如何避免复发:
- 评测集中至少 20% 是拒答问题
- 统计拒答准确率
- 记录用户追问和点踩作为 bad case
5. 文档更新后,系统仍按旧资料回答
现象:
制度已更新,但问答结果还是旧版本。
常见原因:
- 文档更新后没有重新生成 embedding
- 新旧 chunk 同时存在
- metadata 中没有版本或更新时间
- 缓存没有失效
修复方式:
- 文档变更触发重新索引
- 删除旧 chunk 或标记 inactive
- metadata 保存 version、updated_at
- 文档更新后清理相关缓存
如何避免复发:
- 建立索引版本号
- 上线前检查当前回答引用的文档版本
- 对关键政策类文档做更新回归测试
6. 用户看到不该看的文档
现象:
普通员工问到了管理层文档中的内容。
常见原因:
- 权限过滤只在前端做
- metadata 没有保存权限标签
- 检索时没有按用户权限过滤
- 把所有检索结果直接放进 Prompt
修复方式:
- 后端统一做权限校验
- 文档导入时写入权限 metadata
- 检索阶段先过滤权限,再进入模型
- 日志记录每次回答使用的 source
如何避免复发:
- 准备权限隔离评测集
- 用不同角色用户跑同一批问题
- 定期审计回答引用来源
7. Chunk 太大导致成本高且检索不准
现象:
每次回答都塞入大量文本,响应慢、成本高,回答还容易跑偏。
常见原因:
- 固定按很大长度切分
- top-k 设置过高
- 没有 rerank 或上下文裁剪
- 文档噪声太多
修复方式:
- 按标题、段落、语义结构切分
- 降低 top-k 并评测影响
- 加 rerank 或上下文压缩
- 清理重复内容和模板噪声
如何避免复发:
- 监控每次请求 prompt_tokens
- 记录检索 chunk 数量和长度
- 对不同 chunk size 做离线评测
8. 多轮对话中“这个”指代丢失
现象:
用户先问“RAG 怎么做”,再问“这个怎么评测”,系统检索不到正确内容。
常见原因:
- 直接用当前问题检索
- 没有结合对话历史改写 query
- 历史上下文过长或无关
修复方式:
- 将当前问题改写成独立问题
- 保留最近关键主题
- query rewrite 后再检索
如何避免复发:
- 加入多轮评测用例
- 对比 rewrite 前后的检索命中率
- 记录原始 query 和改写 query