Skip to content

8.5.1 RAG 生成阶段最常见的错误有哪些? ​

先给结论:RAG 生成阶段最常见的错误,不只是“胡编乱造”。更常见也更麻烦的,往往是:答非所问、证据选错、把推测说成事实、引用不忠实、只答对一半、忽略限制条件。

这些错误之所以值得特别重视,是因为它们很多时候都不是完全离谱的错,而是:

  • 看起来像对
  • 也确实引用了一些材料
  • 但关键结论还是不稳

这类错误比纯粹的“完全瞎答”更难发现,也更容易误导用户。

一、最常见的几类生成错误 ​

1. 答非所问 ​

模型表面上围绕同一主题回答了很多内容,但并没有真正回答当前问题。

例如用户问的是:

  • 某条规则在什么条件下生效

模型却回答成了:

  • 这条规则的一般背景介绍

这类错误往往不是因为没材料,而是:

  • 模型抓住了相关主题,但没抓住问题焦点

2. 证据选错 ​

候选里可能有多条相关材料,但模型最终抓住的是:

  • 背景块
  • 一般说明
  • 旧版本
  • 表面相似但不够直接的段落

这时答案看起来仍然“像有依据”,但实际上关键证据没有被正确使用。

3. 把推测说成事实 ​

这类错误在 RAG 里特别常见。

模型可能先根据材料得出一部分可靠结论,然后又顺着语言模式自动补全出:

  • 材料里没有明确支持的细节
  • 看起来合理但未经证据支持的判断

这会让回答呈现出一种危险状态:

  • 前半段可靠,后半段开始漂

4. 只答对一半 ​

有些问题本身需要多个条件、多个步骤或多个例外同时成立。

模型可能确实引用了证据,但只覆盖了其中一部分,比如:

  • 给出了定义,但没给限制条件
  • 给了主流程,但没提例外分支
  • 说了结论,但没说适用范围

这类错误很像“基本答对了”,但对真实系统来说仍然是不完整甚至误导的。

5. 忽略限制条件和例外条款 ​

很多材料里真正决定答案边界的,不是主体规则,而是:

  • 例外条件
  • 生效范围
  • 时间边界
  • 版本限定

模型经常会优先抓主规则,却忽略这些更关键的约束。

于是答案会变成:

  • 表面正确,但边界错了

6. 引用存在,但引用不忠实 ​

这一类会在下一篇专门展开,但这里先建立一个判断:

  • 引用了来源,不代表答案就一定忠实于来源

模型可能:

  • 引用了一条材料
  • 但对那条材料的解释超出了原意

二、为什么这些错误比纯幻觉更麻烦 ​

因为纯幻觉往往相对容易发现,而这些错误通常:

  • 有一点材料依据
  • 有一定语义相关性
  • 看起来不像明显乱说

也正因为如此,它们更容易通过表面检查,却在真实使用里出问题。

三、怎么先粗分是哪一类错误 ​

可以先问三个问题:

  1. 模型有没有真正回答当前问题,而不是只回答相关主题
  2. 模型引用或使用的是不是最关键的那条证据
  3. 模型有没有把材料外推测混进确定结论

这三个问题一拆开,很多“答案不稳”的问题就会清楚得多。

一个最小示意 ​

python
answer = llm(build_prompt(query, context))

if answers_related_topic_but_not_question(answer):
    error_type = "off_target"
elif uses_context_but_misses_key_constraint(answer):
    error_type = "partial_or_misgrounded"
elif adds_unsupported_details(answer):
    error_type = "unsupported_inference"

这段代码想说明的是:

  • 生成错误不是一种,而是要按失败模式拆开看

一个常见误区 ​

很多人会把生成阶段问题统一叫成:

  • 幻觉

这不够细,也不利于排查。因为“幻觉”只是其中一类,而真实系统里更常见的是:

  • 半忠实
  • 半完整
  • 半答对

如果不把错误类型拆开,后面就很难决定该改 Prompt、改上下文构造,还是改检索策略。

一句话总结 ​

RAG 生成阶段最常见的错误,不只是胡编,而是答非所问、证据选错、把推测说成事实、只答对一半、忽略边界条件和引用不忠实。这些错误往往比纯幻觉更难发现,也更需要细分定位。