为什么你的 RAG 应用在生产环境中会失败(以及如何修复)

你构建了一个 RAG 应用。演示效果令人印象深刻。管理层非常满意。然后你上线了。

现实随之而来。

用户收到错误的答案。聊天机器人自信地给出错误信息。真实流量涌入时延迟飙升。向量搜索返回不相关的 Chunk。支持工单不断堆积。

你并不孤单。这是当前企业 AI 项目中最常见的轨迹。"在演示中可以运行"和"在生产环境中可以运行"之间的差距——正是大多数 RAG 项目走向失败的地方。

本文将拆解 RAG 最常见的 7 种失败模式,并提供每种模式的具体解决方案。


RAG 是什么,为什么它如此脆弱?

RAG 是 Retrieval-Augmented Generation(检索增强生成)的缩写。与其完全依赖 LLM 的训练数据,RAG 系统会从你自己的知识库中检索相关文档,并在模型回答之前将其注入 Prompt。

听起来很简单,但实际上并非如此。

从 Ingestion、Chunking、Embedding、Retrieval、Ranking、Prompting 到 Generation,Pipeline 中的每个步骤都可能以不可见的方式出错——直到真实用户出现时才会暴露。


失败模式一:Chunk 太大(或太小)

这是最常见的错误,也是最难调试的,因为表面上一切看起来都很正常。

在导入文档时,你需要在 Embedding 之前将其拆分成 Chunk。如果 Chunk 太大,Embedding 就会变成多个概念的模糊平均值——检索返回了正确的文档,但给出了错误的上下文。如果 Chunk 太小,使答案有意义的周围上下文就会丢失。

解决方案: 采用混合 Chunking 策略。从语义分割开始(按段落或章节边界拆分,而不是固定的 Token 数量)。然后使用父子架构:用小 Chunk 进行精确检索,但将较大的父 Chunk 返回给 LLM 作为上下文。LlamaIndex 等库可以让这个过程变得简单直接。

实用起点:256-512 Token 的 Chunk,10-15% 的重叠率,针对实际查询集进行评估。


失败模式二:你在测量错误的指标

大多数团队用他们确定在文档中的问题来测试 RAG。而生产环境中的用户会以你从未预料到的方式提问。

如果没有评估框架,你就是在盲飞。你不会知道模型更新、数据更新或 Prompt 更改是何时破坏了某些东西。

解决方案: 在上线前构建评估集。收集 50-100 个真实或贴近真实的查询。为每个查询定义预期答案和预期来源文档。然后衡量三件事:

  • Retrieval Recall(检索召回率) — 正确的 Chunk 有没有被检索回来?
  • Answer Faithfulness(答案忠实度) — LLM 是否严格依据检索到的内容回答?
  • Answer Relevance(答案相关性) — 答案是否真正回答了问题?

RAGAS、DeepEval 或简单的 LLM-as-judge 设置都可以自动化这个过程。每次部署都运行评估。


失败模式三:Embedding 与查询风格不匹配

Embedding 对语义意义进行编码——但 500 词技术文档 Chunk 的含义与 10 词用户查询的含义有本质区别。这种不匹配会悄无声息地破坏检索质量。

许多团队对所有内容都使用通用 Embedding 模型(如 text-embedding-ada-002)。在演示中效果不错,因为演示查询都是精心设计的。但当真实用户提出简短、模糊或特定领域的问题时,它就会失效。

解决方案: 使用专为非对称搜索训练的 Embedding 模型——即短查询检索长文档的场景。bge-large-en-v1.5Cohere embed-v3 是不错的选择。更好的方案是:在你自己领域的查询-文档对上微调 Embedding 模型。几百个示例就可以显著提升检索精度。

同时测试:在查询前添加类似 "search query: " 的前缀是否能改善检索效果?某些模型的训练预期中包含这种前缀。


失败模式四:检索的 Chunk 太多(或太少)

大多数 RAG 教程的默认值是 top_k=3top_k=5。在生产环境中,这个数字至关重要。

检索 Chunk 太少会错过关键上下文。检索太多会让 Prompt 充满噪声——LLM 感到困惑,延迟上升,成本增加。

解决方案:top_k 动态化。对于狭义的事实查询,3 个 Chunk 就足够了。对于复杂的推理问题,可能需要 8-12 个。使用 Reranker(如 Cohere Rerank 或 Cross-encoder 模型)作为第二道筛选,在发送给 LLM 之前对检索到的 Chunk 进行相关性评分。这让你可以广泛检索,然后积极地筛选。

此外:设置相关性阈值。如果没有检索到的 Chunk 相似度分数超过 0.7,不要凭空捏造答案——告诉用户你没有这些信息。


失败模式五:Prompt 没有将模型锚定在上下文中

Retrieval 为模型提供了正确的信息。但如果 System Prompt 没有明确指示模型只使用这些信息,它就会愉快地将检索到的上下文与自己(有时是错误的)训练数据混合在一起。

这就是自信的幻觉产生的方式。模型了解接近真相的某些内容,将其与检索到的上下文混合,生成听起来流畅但实际上不正确的答案。

解决方案: 在 System Prompt 中明确且坚定地指定。例如:

"你是一个有用的助手。仅使用提供的上下文中的信息回答用户的问题。如果上下文不包含足够的信息来回答,请明确说明。不要使用外部知识。"

更进一步:指示模型引用它使用的上下文的哪个部分。这强制执行了锚定,并使幻觉可审计。


失败模式六:数据 Pipeline 已经陈旧

RAG 的质量取决于它检索的文档。在生产环境中,你的知识库会不断变化——新政策、更新的价格、已废弃的功能。大多数团队设置好 Ingestion 之后就放任不管了。

当底层数据与向量索引产生偏差时,检索会满怀信心地返回过时的信息。这比承认无知更糟糕。

解决方案: 把 Ingestion Pipeline 当作数据产品来对待。包含以下内容来构建它:

  • 变更检测 — 当源文档更新时触发重新 Ingestion(Webhook、文件监听、数据库 CDC)
  • 版本控制 — 用 last_updated 时间戳标记 Chunk,以便过滤过时内容
  • 监控 — 当 Ingestion 静默失败时发出警报(生成零 Chunk 的格式错误 PDF 是常见故障)

同时,将原始源文档与 Embedding 一起存储,以便在升级 Embedding 模型时可以重新 Embed 所有内容。


失败模式七:缺乏可观测性

在生产 RAG 系统中,当出现问题时,你需要知道 Pipeline 在哪里出了问题。是 Retrieval?Reranking?LLM Prompt?Chunking 策略?

大多数团队在 Pipeline 层面没有任何日志记录就发布了。当用户投诉时,没有任何东西可以调查。

解决方案: 在每个步骤记录所有内容:

  • 查询内容
  • 检索到的 Chunk(带评分)
  • Rerank 后的 Chunk
  • 发送给 LLM 的最终 Prompt
  • LLM 的响应
  • 用户反馈(如果有 UI,记录点赞/踩)

使用 LangSmith、Langfuse 或 Arize Phoenix 等工具对每个请求追踪完整的 Pipeline。这对于任何在生产环境中运行的系统都是不可妥协的。


RAG 生产环境检查清单

上线前,请逐一核对以下各项:

  • [ ] Chunking 策略已针对真实查询进行验证(不仅仅是开发者查询)
  • [ ] 评估集已构建,并在每次部署时运行自动评估
  • [ ] Embedding 模型已针对查询与文档的比例进行测试
  • [ ] Reranker 已作为第二道过滤器就位
  • [ ] System Prompt 明确将模型锚定到检索到的上下文
  • [ ] Ingestion Pipeline 已通过变更检测实现自动化
  • [ ] 相关性阈值已设置——没有答案胜过幻觉答案
  • [ ] 完整 Pipeline 的可观测性与按请求追踪已就绪
  • [ ] 已在真实并发负载下进行延迟基准测试
  • [ ] 检索失败时的降级行为已定义

对你的架构意味着什么

RAG 不是一个功能——它是一个系统。每个组件都有失败模式。在生产环境中取得成功的团队,不是拥有最好 LLM 的团队。而是从第一天起就将检索质量、评估覆盖率和 Pipeline 可观测性视为一等工程关切的团队。

好消息是:这些问题没有一个是无法解决的。它们是工程问题,不是研究问题。你只需要知道它们会来。


正在构建 RAG 应用,或者正在修复一个已经出问题的?

在 Simplico,我们设计并交付生产级 AI 系统——包括具备完善评估、可观测性和检索架构的 RAG Pipeline。如果你的团队正在遭遇上述任何失败模式,欢迎预约免费咨询,我们将帮助你找到并修复问题所在。


由 Simplico Engineering 发布 — AI/RAG 应用、电商、ERP、移动端
simplico.net


Get in Touch with us

Chat with Us on LINE

iiitum1984

Speak to Us or Whatsapp

(+66) 83001 0222

Related Posts

Our Products