RAG 管道故障模式:生产环境调试现场指南
RAG 故障模式的全面目录,包含症状、根本原因和修复方法。基于真实生产事件和社区讨论构建。
RAG 管道会静默地失败。与崩溃的服务或抛出的异常不同,损坏的 RAG 管道仍然会返回答案。只不过是错误的答案、不完整的答案,或者被不应该到达 LLM 的信息所污染的答案。系统看起来运行正常,实际上却在输出无用的结果。
本指南编录了我们在生产 RAG 系统中反复看 到的故障模式。每个条目遵循相同的结构:您观察到什么、为什么会发生以及如何修复。请收藏本页。当凌晨 2 点您的检索管道返回无意义的结果而您无法弄清原因时,您会需要它。
故障模式 1:检索未命中(相关文档存在但未被检索)
症状: LLM 说"我没有关于这个的信息"或虚构一个答案,即使正确的文档在您的向量存储中。用户报告系统"不知道"您明知已经索引的内容。
根本原因: 查询 embedding 和文档块 embedding 在向量空间中不够接近,尽管它们在语义上是相关的。这发生在以下情况:
- 查询使用的术语与源文档不同(用户询问"解雇员工",文档使用"非自愿终止")
- embedding 模型未在您的领域词汇上训练
- 块太大,用不相关的上下文稀释了 embedding
- 块太小,丢失了与查询匹配所需的语义含义
修复方法:
- 添加混合搜索层(BM25 关键词搜索与向量相似度并行)以捕获术语不匹配
- 在上线前用真实用户查询测试检索——不仅仅是您自己编写的查询
- 尝试不同的块大小:256-512 个 token 对大多数文档类型来说是一个合理的起点
- 如果您的内容使用专业词汇,考虑使用领域适配的 embedding 模型
- 添加查询扩展或重写,在 embedding 之前重新表述用户查询
故障模式 2:检索到错误的上下文(不相关的文档获得高分)
症状: LLM 给出自信但不正确的答案,引用了错误文档、错误章节或完全不同主题的信息。检索到的块看起来合理但与实际问题无关。
根本原因: 向量相似度不等于相关性。两个段落可以在语义上相似(相同领域、相同词汇),但一个对另一个并不相关。常见触发因素:
- 模板文本(页眉、页脚、免责声明)获得高相似度分数,因为它们到处出现
- 来自不同时间段或版本的文档未被区分
- 缺少元数据过滤器,因此搜索考虑整个语料库而不是相关子集
修复方法:
- 添加元数据过滤(日期、文档类型、部门、版本),使检索在相似度排序之前缩小搜索空间
- 在摄取过程中去除模板文本——在分块之前移除页眉、页脚和重复的免责声明
- 在初始检索之后实施重排序步骤,使用 cross-encoder 模型比原始余弦相似度更准确地评分查询-文档相关性
- 添加相关性阈值——如果块的相似度分数低于经过测试的最低值,则不要将其传递给 LLM
故障模式 3:过时的上下文(文档已过期)
症状: LLM 基于旧信息给出答案——上季度的定价、被替代的政策、已弃用的 API 端点。用户失去信任,因为他们知道信息已更改但系统仍给出旧答案。
根本原因: 向量存储包含已被更新或替换的文档的 embedding,而索引管道不检测或处理更新。这是生产中最常见的 RAG 故障,因为大多数团队构建了初始索引管道,但从未构建更新管道。
修复方法:
- 在元数据中实施带时间戳的文档版本控制, 以便可以按新近度过滤
- 构建增量重新索引管道,检测更改的文档并仅重新 embed 更新的块
- 为每个块添加"上次索引"时间戳,并在上下文中将其呈现给 LLM,以便它可以提醒可能过时的信息
- 安排定期的完整重新索引作为安全网,即使您有增量更新
- 请参阅我们关于 embedding 漂移和过时向量 的深入分析以了解检测策略
故障模式 4:块边界损坏(答案跨块分裂)
症状: LLM 给出感觉不完整的部分答案,或者因为相关内容被分裂在块边界而组合了两个不相关部分的信息。用户描述答案"接近但缺少关键细节"。
根本原因: 固定大小分块在任意字符或 token 计数处分割文档,忽略语义边界。一个关键段落被一分为二。前半部分落在一个块中,后半部分在另一个块中。检索找到一半但找不到另一半。
修复方法:
- 使用尊重段落、节和标题 边界的语义分块
- 添加块重叠(块大小的 10-20%),使边界内容出现在相邻的块中
- 对于结构化文档(法律合同、技术规范),按节层级而不是按大小分块
- 在每个块中包含父节标题,以便 LLM 即使对于节中间的块也有结构上下文
- 请参阅我们关于糟糕的块如何毒害 RAG 答案的文章以获取详细分析
故障模式 5:上下文窗口溢出(检索到太多上下文)
症状: LLM 忽略一些检索到的文档,给出仅引用第一个或最后一个块的答案(首因/近因偏差),或产生过于笼统的响应,不涉及上下文中的具体细节。
根本原因: 检索步骤返回太多块,超出了 LLM 的有效上下文利用能力。即使是拥有超过 128K 上下文窗口的模型,在上下文嘈杂或过多时也会表现出性能下降。当模型被埋在十页松散相关的文本中时,它无法区分信号和噪音。
修复方法: