09. 为什么用了 RAG 之后模型仍然可能产生幻觉?怎么缓解?

整理 为什么用了 RAG 之后模型仍然可能产生幻觉?怎么缓解? 的核心概念、工程要点与面试回答。

简单回答

RAG 降低了幻觉概率但没有消除。原因有几个:检索没有召回正确文档(检索失败),检索到了正确文档但模型没有正确使用(生成端问题),或者检索到的文档本身就有错误或过时。缓解手段包括提升检索质量(提高 Recall)、优化 Prompt 设计(引导模型忠于上下文)、加 Rerank 提升精排质量、在 Prompt 中明确要求模型说"不知道"、以及对输出做事后验证。

详细解释

幻觉的来源分析

理解 RAG 中幻觉的来源,需要从检索端和生成端分别分析。

检索端的失败是最常见的原因。如果检索环节没有召回正确的文档,模型只能基于不相关的上下文或自身的参数知识来回答,幻觉的概率就会很高。检索失败可能是因为 Chunk 切分不合理(正确答案被切到了两个 Chunk 里,每个 Chunk 单独都不完整)、Embedding 模型质量不够(query 和 document 的语义鸿沟没有被有效桥接)、或者知识库本身就没有覆盖这个问题。

检索到了相关文档但不够精确。 比如检索到了 5 个 Chunk,其中只有 1 个是真正相关的,其余 4 个是部分相关或者似是而非的。模型在这些混杂的上下文中可能会被误导,把不相关文档中的信息当作答案的一部分。这也是为什么 Rerank 很重要——不仅要召回正确文档,还要把它排到最前面。

模型自身的倾向。 大模型在预训练阶段被训练成"总是给出回答",它天然不喜欢说"我不知道"。即使 Prompt 里明确告诉它"如果上下文没有相关信息就说不知道",模型仍然可能倾向于基于自己的参数知识编造一个看起来合理的答案,而不是承认信息不足。这是 LLM 的固有特征,不是 RAG 能完全解决的。

模型对上下文的利用不充分或有偏差。 研究表明大模型存在"Lost in the Middle"现象——当上下文很长时,模型对开头和结尾的文档关注度高,对中间部分的关注度低。如果正确答案恰好在中间的某个 Chunk 里,模型可能会忽略它。另外模型也可能做"过度推理"——从上下文中推断出原文没有明确说的结论。

知识库本身的问题。 如果知识库中的文档过时、自相矛盾、或者本身就有事实错误,模型忠实地引用这些内容也会产生"幻觉"(虽然严格说这不是模型的幻觉,而是数据质量问题)。

缓解手段

从检索端缓解是最优先的。提升 Recall——优化 Chunk 策略、换更好的 Embedding 模型、加 Hybrid Search、加 Rerank,这些在前面几个问题中已经讨论过了。检索质量是 RAG 幻觉问题的根本。

Prompt 设计在生成端是最直接的手段。几个有效的策略:明确告诉模型只基于提供的上下文回答,不要使用自己的知识("请仅基于以下参考资料回答。如果参考资料中没有相关信息,请回答'根据现有资料无法回答此问题'");让模型先引用原文再给出答案(这能强迫模型去"对齐"上下文中的信息);限制模型的推理范围("请不要做超出原文内容的推断")。

上下文排序也值得关注。把最相关的文档放在 Prompt 的开头或结尾(而不是中间),因为模型对这两个位置的关注度最高。如果有 Rerank 分数,可以按分数降序排列。

减少上下文噪音。与其塞很多勉强相关的 Chunk,不如只放最相关的几个。上下文越干净、信噪比越高,模型越不容易被误导。可以设一个 Rerank 分数阈值,低于阈值的 Chunk 直接丢弃。

输出验证和后处理。在模型生成答案后,做一些自动化检查:比如让另一个 LLM 或同一个 LLM 做一次"回答是否有检索到的文档支撑"的判断;检查答案中引用的事实是否能在原文中找到;对关键信息做二次检索验证。这些方法增加了延迟和成本,但在高风险场景(如金融、医疗、法律)中是必要的。

微调模型使其更忠实于上下文。通过 SFT 或 RLHF,训练模型学会"忠实引用上下文内容"的行为模式,减少模型依赖自身参数知识编造答案的倾向。这比纯靠 Prompt 约束更可靠,但需要额外的训练成本和标注数据。

面试时可以这样答

RAG 降低了幻觉概率但没有消除,核心原因是幻觉来自多个环节。检索没有召回正确文档是最常见的原因——检索失败了后面再好也没用。其次是检索到了但不够精确,混杂了噪声文档,模型被误导。还有模型自身的问题,LLM 天然倾向于"总是给答案",不喜欢说"不知道"。

缓解思路也要分层。检索端是根本——优化 Chunk、Embedding、加 Hybrid Search 和 Rerank,把检索质量打上去。生成端靠 Prompt 设计引导模型忠于上下文,明确要求没有相关信息就说不知道。还要控制上下文的信噪比,宁可少放几个高质量 Chunk,不要塞一堆勉强相关的。

在高风险场景下,还会做输出验证——比如让 LLM 自查"这个回答是否有上下文支撑",或者对关键事实做二次检索核验。成本高但必要。

常见追问

  1. "Lost in the Middle" 具体是什么现象?怎么应对?
  2. 你在项目中怎么衡量幻觉率?有没有自动化的评测方法?
  3. 微调能不能彻底解决幻觉问题?