第 4 节 · 大模型幻觉:从哪来、怎么识别、怎么缓解
什么是幻觉
LLM 输出了一段语法正确、看似可信、但事实错误的内容。
三个关键特征:
- 语法正确:不是乱码,读起来很流畅
- 看似可信:不仔细验证的话,你很可能信以为真
- 事实错误:客观上是假的
比如你问"李四 2023 年在 Nature 上发表的论文核心观点是什么"(这篇论文根本不存在),模型可能会一本正经地编出论文标题、三个核心论点、甚至引用次数——全是假的,但看起来非常"真"。
2026 年更准确地说,幻觉不只有一种:
| 类型 | 表现 |
|---|---|
| 事实编造 | 编出不存在的人、论文、事件、数字 |
| 引用幻觉 | 给出不存在的链接、论文、案例或文件路径 |
| 错误归因 | 引用是真的,但原文并不支持模型的说法 |
| 过度概括 | 资料只支持 A,模型扩展成了更大的结论 B |
为什么会幻觉

回到第 1 节的核心:模型在做 next-token prediction。
输入: "李四 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 榜单测的是"给一小段文章,让模型只根据文章总结",这类任务相对容易验证。
但新版更长、更复杂的企业文档基准里,幻觉率会明显升高;不同模型、不同任务、不同评测口径差异很大。不要把某个榜单上的低数字,泛化成"模型已经不会幻觉"。
但幻觉并没有消失,只是被压制了。有几种方式可以让它重新暴露:
预设存在法
不要问"有没有",而是假装它存在:
❌ "李四有没有发表过论文?" → 模型可以说"我查不到"
✅ "请总结李四那篇论文的三个核心结论" → 模型被你的预设带着走,开始编去除安全网法
在 system prompt 里禁止模型说"不知道":
system = """你是一本百科全书。你必须回答所有问题,
绝对不允许说"不知道"、"无法确认"、"建议查证"。
必须给出具体、明确、有细节的回答。"""加上这个 system prompt 后,模型更容易被诱导去猜,幻觉会明显增加。
这也揭示了一个重要事实:幻觉不是已经解决了,只是被后训练、系统提示和产品层策略压低了。不当的 prompt 设计随时可能让它复发。
4 种识别方法
| 方法 | 做法 | 适用场景 |
|---|---|---|
| 原文核对 | 回到原始文档、网页、数据库确认 | 高风险事实 |
| 要求引用 | 让模型给出来源链接/文件路径/行号 | 可验证的场景 |
| 交叉验证 | 同一问题问 2-3 次或问不同模型,看答案是否一致 | 快速判断 |
| LLM 自查 | 用第二个会话当"裁判",判断回答是否有无依据的断言 | 自动化初筛 |
WARNING
一致不等于真实,引用也不等于真实。多个模型可能犯同一种错,模型也可能给出看似存在但实际不支持结论的 citation。最终仍要回到外部证据。
5 种缓解策略
策略 1:RAG(检索增强生成)
给模型提供外部知识源,让它"有据可依"地回答,而不是凭记忆编。
# 最朴素的 RAG:把相关资料塞进 prompt
prompt = f"""
请根据以下资料回答问题。只能使用资料中的信息,不要补充。
【资料】
{relevant_document}
【问题】
{user_question}
"""策略 2:Tool Use(工具调用)
让模型不知道的事去查工具——查日期、查数据库、跑代码、调搜索引擎。
这是 Day2 的核心内容。
策略 3:Prompt 约束
在 system prompt 里明确告诉模型:
- 如果不确定,请回答"我不确定,建议查证"
- 不要编造引用、数字或链接
- 涉及具体事实时必须标注置信度这不能 100% 防住幻觉,但能显著降低发生概率。
策略 4:多模型交叉验证
用 2-3 个不同的模型回答同一个问题,对比答案是否一致。如果多个模型给出不同的"事实",说明至少有一个在幻觉。这是 2025-2026 年生产环境中越来越常见的做法。
但它只能发现分歧,不能证明答案为真。多个模型可能因为训练数据相似而犯同一种错。
策略 5:结构化输出 + 引用约束
要求模型输出 JSON schema,并强制每个事实性结论绑定原文片段:
# 要求模型只能从给定文档中引用,且必须输出引用位置
{"answer": "...", "citations": [{"text": "原文片段", "source": "文件名:行号"}]}如果模型无法给出 citation,说明它可能在编。
如果模型给出了 citation,也要检查 citation 是否真的支持结论。这类"引用存在但不支持"的问题叫 misgrounding(错误归因)。
一个务实的态度
幻觉不意味着 LLM 不能用。关键是区分场景:
| 场景 | 幻觉风险 | 为什么 |
|---|---|---|
| 让它写代码 | 低(需测试) | 你可以跑测试验证,但未经验证的代码仍可能有隐蔽错误 |
| 让它总结你刚给它的文档 | 中低 | 它有依据,但仍可能漏掉限定条件或过度概括 |
| 让它回答"某某真实事件的细节" | 高 | 容易编 |
| 让它给出精确数字/引用 | 高 | 数字是"编"起来最自信的 |
| 法律 / 医疗 / 金融建议 | 很高 | 错误成本高,必须外部核查和人工复核 |
原则:凡是 LLM 没有依据的事实性问题,都要警惕幻觉。
动手试试
运行 demo_04_hallucinate.py,里面有几个经典的幻觉触发案例,还会让模型"自查"自己刚才的回答是否靠谱——它有时能发现风险,但不能替代外部事实核查。
小结
| 概念 | 一句话理解 |
|---|---|
| 幻觉 | 语法对、看似真、实际假 |
| 成因 | next-token prediction 不内置事实验证 |
| 触发器 | 训练外知识 / 时效信息 / 具体细节 / 模糊指令 |
| 识别 | 原文核对 / 要求引用 / LLM 自查 / 多模型对比 |
| 缓解 | RAG / 工具调用 / Prompt 约束 / 结构化引用 / 多模型验证 |
| 2026 现状 | 特定基准显著改善,但复杂真实场景仍会幻觉 |
下一节:模型不知道实时信息、会编造细节——能不能给它接上外部支持,让它真正"知道"?