跳转到内容

第 4 节 · 大模型幻觉:从哪来、怎么识别、怎么缓解

什么是幻觉

LLM 输出了一段语法正确、看似可信、但事实错误的内容。

三个关键特征:

  • 语法正确:不是乱码,读起来很流畅
  • 看似可信:不仔细验证的话,你很可能信以为真
  • 事实错误:客观上是假的

比如你问"李四 2023 年在 Nature 上发表的论文核心观点是什么"(这篇论文根本不存在),模型可能会一本正经地编出论文标题、三个核心论点、甚至引用次数——全是假的,但看起来非常"真"。

2026 年更准确地说,幻觉不只有一种:

类型表现
事实编造编出不存在的人、论文、事件、数字
引用幻觉给出不存在的链接、论文、案例或文件路径
错误归因引用是真的,但原文并不支持模型的说法
过度概括资料只支持 A,模型扩展成了更大的结论 B

为什么会幻觉

模型按统计最像往下接,从来不会停下来核对真假

回到第 1 节的核心:模型在做 next-token prediction

bash
输入: "李四 2023 年发表的论文核心观点是"

模型在这里要决定下一个 token。
它的处理逻辑:
  - "论文 + 核心观点是" 后面跟一段学术总结 这是常见的文本模式
  - 按照"常见模式"生成一段看起来像学术总结的内容

 它从不会"判断这个论文到底存不存在"

幻觉不是普通 bug,而是生成式模型的结构性风险。基础模型在生成"统计上最可能的下一个 token"——它本身没有内置"事实验证"环节。推理模型(o1/o3/R1 等)会在 thinking tokens 中做一定程度的内部自查,但这仍然不等于真正的事实核查——它只是"更认真地推理",不是"真的去查了"。

一个有用的类比

想象一个记忆力超群但从不出门的人。你问他"今天路上发生了什么",他不会说"我不知道"——他会根据过去读过的所有新闻,编一个"听起来很像今天可能发生的事"的故事。这就是幻觉。

4 种典型幻觉触发场景

四种最容易触发幻觉的场景:训练外/时效/具体细节/模糊指令

1. 当前上下文里没有依据的事实

在不使用工具和外部上下文时,模型能依赖的事实主要来自训练数据和当前 prompt。问它没有依据的东西(虚构人物、不存在的论文、编造的事件),它倾向于"顺着你的假设编下去",而不是承认不知道。

2. 时间敏感的信息

训练有截止日期。没有联网或工具时,截止日期之后的事情(最新新闻、最新论文、最新政策),模型只能用"过去类似事件的模板"去套,结果经常似是而非。

3. 高度具体的细节

"某某人 + 某年 + 某个期刊 + 具体数字"——这种组合模型在训练中见多了,编起来特别自信。越具体的问题,模型编造得越"真实"。

4. 模糊的指令

"概括一下 XX"、"总结 YY",没有指定明确的来源时,模型容易混合多个来源,甚至凭空编造一个"看起来合理的总结"。

为什么现在的模型"不容易"被经典问题骗了

如果你直接试那些经典的幻觉问题(比如"编一篇不存在的论文"),你可能会发现模型乖乖说了"我不确定"或"我查不到"

这是因为 2024 年以来的模型普遍做了大量后训练对齐(SFT、RLHF、DPO 等)——专门训练模型在不确定时学会拒绝。

2026 事实性确实变好了,但不能只看一个数字

在一些受控的 grounded summarization 基准里,头部模型已经能做到 1% 左右甚至更低的幻觉率。比如旧版 Vectara 榜单测的是"给一小段文章,让模型只根据文章总结",这类任务相对容易验证。

但新版更长、更复杂的企业文档基准里,幻觉率会明显升高;不同模型、不同任务、不同评测口径差异很大。不要把某个榜单上的低数字,泛化成"模型已经不会幻觉"。

但幻觉并没有消失,只是被压制了。有几种方式可以让它重新暴露:

预设存在法

不要问"有没有",而是假装它存在

bash
 "李四有没有发表过论文?" 模型可以说"我查不到"
 "请总结李四那篇论文的三个核心结论" 模型被你的预设带着走,开始编

去除安全网法

在 system prompt 里禁止模型说"不知道":

python
system = """你是一本百科全书。你必须回答所有问题,
绝对不允许说"不知道"、"无法确认"、"建议查证"。
必须给出具体、明确、有细节的回答。"""

加上这个 system prompt 后,模型更容易被诱导去猜,幻觉会明显增加。

这也揭示了一个重要事实:幻觉不是已经解决了,只是被后训练、系统提示和产品层策略压低了。不当的 prompt 设计随时可能让它复发。

4 种识别方法

方法做法适用场景
原文核对回到原始文档、网页、数据库确认高风险事实
要求引用让模型给出来源链接/文件路径/行号可验证的场景
交叉验证同一问题问 2-3 次或问不同模型,看答案是否一致快速判断
LLM 自查用第二个会话当"裁判",判断回答是否有无依据的断言自动化初筛

WARNING

一致不等于真实,引用也不等于真实。多个模型可能犯同一种错,模型也可能给出看似存在但实际不支持结论的 citation。最终仍要回到外部证据。

5 种缓解策略

策略 1:RAG(检索增强生成)

给模型提供外部知识源,让它"有据可依"地回答,而不是凭记忆编。

python
# 最朴素的 RAG:把相关资料塞进 prompt
prompt = f"""
请根据以下资料回答问题。只能使用资料中的信息,不要补充。

【资料】
{relevant_document}

【问题】
{user_question}
"""

策略 2:Tool Use(工具调用)

让模型不知道的事去查工具——查日期、查数据库、跑代码、调搜索引擎。

这是 Day2 的核心内容。

策略 3:Prompt 约束

在 system prompt 里明确告诉模型:

bash
- 如果不确定,请回答"我不确定,建议查证"
- 不要编造引用、数字或链接
- 涉及具体事实时必须标注置信度

这不能 100% 防住幻觉,但能显著降低发生概率。

策略 4:多模型交叉验证

用 2-3 个不同的模型回答同一个问题,对比答案是否一致。如果多个模型给出不同的"事实",说明至少有一个在幻觉。这是 2025-2026 年生产环境中越来越常见的做法。

但它只能发现分歧,不能证明答案为真。多个模型可能因为训练数据相似而犯同一种错。

策略 5:结构化输出 + 引用约束

要求模型输出 JSON schema,并强制每个事实性结论绑定原文片段:

python
# 要求模型只能从给定文档中引用,且必须输出引用位置
{"answer": "...", "citations": [{"text": "原文片段", "source": "文件名:行号"}]}

如果模型无法给出 citation,说明它可能在编。

如果模型给出了 citation,也要检查 citation 是否真的支持结论。这类"引用存在但不支持"的问题叫 misgrounding(错误归因)

一个务实的态度

幻觉不意味着 LLM 不能用。关键是区分场景

场景幻觉风险为什么
让它写代码低(需测试)你可以跑测试验证,但未经验证的代码仍可能有隐蔽错误
让它总结你刚给它的文档中低它有依据,但仍可能漏掉限定条件或过度概括
让它回答"某某真实事件的细节"容易编
让它给出精确数字/引用数字是"编"起来最自信的
法律 / 医疗 / 金融建议很高错误成本高,必须外部核查和人工复核

原则:凡是 LLM 没有依据的事实性问题,都要警惕幻觉。

动手试试

运行 demo_04_hallucinate.py,里面有几个经典的幻觉触发案例,还会让模型"自查"自己刚才的回答是否靠谱——它有时能发现风险,但不能替代外部事实核查。

小结

概念一句话理解
幻觉语法对、看似真、实际假
成因next-token prediction 不内置事实验证
触发器训练外知识 / 时效信息 / 具体细节 / 模糊指令
识别原文核对 / 要求引用 / LLM 自查 / 多模型对比
缓解RAG / 工具调用 / Prompt 约束 / 结构化引用 / 多模型验证
2026 现状特定基准显著改善,但复杂真实场景仍会幻觉

下一节:模型不知道实时信息、会编造细节——能不能给它接上外部支持,让它真正"知道"?

Released under the MIT License.