幻觉 Hallucination
流畅、自信、却是编的——为什么这是结构性的,而不是「再大一点就好」
Hallucination · 幻觉 · 一本正经地胡说
- 是什么——幻觉和普通「答错」有何不同。
- 为什么消不掉——为什么它是结构性的,而非「再大一点就好」。
- 为什么这么自信——编就编吧,为什么语气那么笃定、最害人。
- 什么时候高发——哪些情况下更容易幻觉。
- 怎么对付——有哪些缓解手段(注意:缓解,不是根治)。
- 幻觉是流畅、自信却编造的内容,比普通答错更难识别。(§1)
- 它是结构性的:模型建模似然不是真相,答对和瞎编是同一个动作。(§2)
- 它这么自信,是因为「像人写的」是训练目标、与对错无关,且它不知道自己不知道。(§3)
- 数据稀疏、超训练截止、被诱导、高温时更易发生。(§4)
- 可用 RAG、可核验引用、外部工具、校准与人工复核来降低风险;任何单一措施都有失效模式。(§5)
- 长回答应拆成原子断言,并分别检查检索覆盖、证据质量、忠实性、引用与拒答。(§6–7)
1什么是幻觉直觉
模型会犯错这件事并不新鲜,任何系统的输出都可能出错。真正值得单独讨论的,是有一类错误在形态上与其他错误截然不同:普通的错误往往伴随着犹豫——措辞磕绊、语气含糊、给出多个自相矛盾的备选,或者干脆承认自己不确定。而幻觉恰恰相反,它流畅、自信、细节丰富,编造的内容具有与真实内容几乎一致的外观。一篇根本不存在的论文会带着完整的标题、作者和期刊名;一个从未有过的 API 会被描述得有名有姓、有参数有返回值。每一处细节都彼此呼应,读起来像真的。
危险的来源正在于这种「看起来太可信」的外观。面对一个明显犹豫或前后矛盾的答案,读者很容易产生警觉,会主动去查证;而面对一段细节饱满、语气笃定的叙述,查证的冲动会大幅下降。你很难一眼分辨出哪一句是模型依据事实生成的、哪一句是它现场编造的。幻觉的危害不在于模型「错了」,而在于错误被包装得与正确不可区分,因此它能在不被察觉的情况下进入决策、报告或代码。
要判断一段输出是否是幻觉,需要把它放在一个可核验的框架里。这个判断过程接收三样输入:模型输出本身、其中可以独立核实的具体断言、以及与之对应的权威证据;输出则是逐条断言的状态标记——「支持」「矛盾」「未覆盖」或「不可核验」。一条断言被证据支持,说明它站得住;与证据矛盾,说明它是事实错误;证据范围内根本没有相关内容,说明它缺乏依据;连可核验的证据范围都无法确定,则它暂时无从判定。幻觉专指那些看似可信、却缺乏依据或与事实相悖的生成内容;它强调的是「伪造依据的外观」。一个普通的计算错误同样可能造成严重后果,但它通常不带有这种虚构细节层层包装的外表,因此不属于这里讨论的幻觉形态。
这个判断框架还隐含一条边界:在证据范围没有指定的情况下,不能把「暂时没找到」直接升级为「不存在」。模型没有检索到某条事实,只说明在它看到的那部分证据里没有相关内容,而不能据此断定事实本身不成立。「未覆盖」与「矛盾」是两种不同的状态,混淆它们本身就是一种新的幻觉来源。
2为什么它是结构性的直觉
一个自然的问题:幻觉既然危害这么大,为什么不直接把它当 bug 修掉?为什么模型越做越大,它依然存在?答案是它并非实现层面的疏漏,而是源自模型训练目标的本质。大语言模型建模的是「在训练数据的统计规律下,最可能接下去的内容」。训练过程不断优化的是「下一个词像不像人写的」,而从来不是「这个说法对不对」。优化的方向自始至终是语言层面的似然,而不是事实层面的真伪。
由此可以直接推出两个后果。第一,模型内部没有一个「真相数据库」可供核对:它生成每个词时依据的是训练语料中词与词的统计关联,而不是对世界状态的查询。第二,模型无法感知「自己不知道」:当它缺乏某个事实时,它不会停下来报告知识空缺,因为训练目标里根本没有「承认未知」这一项;它只会从统计上最像样续写方式中挑一个继续写下去。
图 1 展示的正是这一点。在「答对」和「瞎编」这两种情形下,模型做的事是同一件:挑「最可能的下一个词」。区别只在于,第一种情形里训练数据恰好包含正确答案,统计上最可能的续写碰巧就是对的;第二种情形里训练数据没有答案,但模型依然会按同样的机制流畅地续下去,生成一段语言上通顺、事实上无据的内容。也就是说,「答对」与「瞎编」在机制上没有分界线——它们共用同一个生成过程,只是输出的内容是否恰好与事实重合。正因为分界不在机制里,才不能指望靠单纯扩大模型来把幻觉从机制上剔除。
更精确的表述是:纯语言建模目标不提供通用的「事实验证器」。对于开放世界问题和长尾事实,模型永远存在剩余风险——只要某类问题的正确答案没有以足够强度出现在训练分布中,语言似然就无法替模型判断真伪。理论分析也只能在特定分布和校准假设下给出下界,而不存在一个对所有问题都成立的零错误保证。规模、数据、检索、工具和后训练确实能显著降低某些类别的幻觉——例如让模型在有证据可查的问题上先查再答——但这些手段降低的是特定风险类别,而不是消除结构性根源。面对所有可能的未知事实,没有任何方案能给出零错误的保证。
可以把这种结构性风险分析本身看作一个输入输出过程:输入是训练目标、当前问题和模型可获得的证据,输出是对「是否存在仅靠语言似然无法验证的事实缺口」的判断。之所以这个缺口在结构上必然存在,是因为下一 token 训练只根据上下文提高可能续词的概率,它从不询问一个通用的真相裁判;长尾或开放世界的问题即使完全没有证据,也依然能产生语言上合理的续写。规模、数据和工具能把这个缺口压窄,但无法证明它为零。
3为什么它还这么自信直觉
上一节解释了幻觉为什么在机制上无法根除,但真正让它难以防范的,还有第二个特征:错误内容被表达得极其笃定。为什么编造的内容不伴随着迟疑,反而语气坚决?因为「流畅、自信、像人写的」本来就是模型在训练中被要求逼近的表面特征。训练信号奖励的是表达层面与人类专家文本的相似度,而「内容对不对」从来不在这个奖励之内。模型把「怎么把话说得像专家」学到了极致,却从未被要求学习「不确定时该怎样露怯」。结果就是:它对真实内容和对编造内容使用同样笃定的口吻——语气这个信号本身不携带任何关于真伪的信息。
更深一层的原因是,模型在编造时并不「知道自己在编」。人编瞎话时内心清楚事实是什么、自己在偏离它;模型没有任何这种自我察觉。生成的那一刻,它只是在按统计规律挑选最可能的词,从它的内部过程看,这与正常作答没有任何区别——它「以为」自己在正常回答。既然模型自己都无法区分这两者,它内部也就不存在一个可以读出来的标志说「这段是我瞎猜的」。因此不能指望它主动标注自己不确定,更不能把它的自我陈述——「我很确定」「据我所知」——当作可信度证据,这些话同样是按语言习惯生成的文字。
由此可以得到一条可操作的结论:判断一段回答的可靠程度,不能看它的措辞多么笃定。可以把它形式化为一个表面自信分析:输入生成概率、表达风格、证据覆盖情况和校准结果,输出「语气强度是否与证据匹配」的判断。训练可以让肯定句更流畅,却不能让肯定语气变成事实概率——语气的自信度与内容的正确率之间不存在由训练目标保证的对应关系。应对幻觉依赖的是外部验证和经过任务校准的风险信号,例如证据是否充分、来源是否可查,而不是文字的自信程度或模型的自述。
4什么时候更容易幻觉工程
幻觉在各类问题上的发生率并不均匀。虽然机制上它随时可能出现,但有几类情况会显著把模型从「有依据地回答」推向「按语言模式补全」,识别这些信号是实际使用中最有效的前置防御。
第一类是训练数据里没有或非常稀疏的内容。冷门人物、小众事实、你所在公司的私有信息——这些内容模型在训练时几乎没见过。它没有可依据的统计关联,却仍然要生成点什么,于是只能顺着语言模式编出貌似合理的细节。凡是涉及私有数据或长尾事实的问题,都是幻觉高发区。
第二类是训练截止之后发生的事。模型的知识停留在训练数据的截止时间点,此后的新闻、政策变化、产品发布它一概不知道。但它不会因为不知道就拒绝回答,而是会用旧知识拼出一段看似在谈论最新情况的文字。
第三类是被问题的措辞诱导。当你问「张伟那篇论文的结论是什么」时,提问本身就预设了「张伟有一篇论文」这个未经验证的事实。模型倾向于顺着你的预设往下编——先默认论文存在,再为其补上标题、结论和细节,而不是先质疑预设本身。
第四类是采样温度偏高。温度控制生成时对低概率词的接受程度:温度越高,模型越「放飞」,越容易偏离高概率的稳妥答案,去选择那些语言上花哨、事实上危险的续写。关于温度与概率分布的关系,见「信息论与熵」的相关章节。
把这些条件放在一起,可以整理成一个高发条件判断:输入是知识覆盖情况、时间范围、问题中的预设、采样温度和可获得的资料,输出是需要采取的风险动作——检索补充证据、向用户澄清预设、降低温度或直接拒答。需要注意的是,这些条件只是提高风险的信号,不表示每次都会出错;反过来,低温也不能保证安全——同一个错误完全可能在低温度下被稳定地复现。风险信号用于决定「什么时候必须额外查证」,而不是用于断言「这次一定错了」。
5怎么对付它:案例推演工程
幻觉消不掉,但可以把它的实际影响压到可控范围。所有手段围绕同一个思路:不要让模型凭空生成,而是把它锚在可核验的材料上,并为每条关键断言保留外部查证的通道。
第一类手段是 RAG(检索增强生成):回答之前先检索真实材料,让模型基于给定的资料作答。模型不再仅凭参数记忆生成,而是被要求从拿到的文本里组织答案,回答因此被「锚」在真实内容上。具体机制见「RAG」深读页。第二类是要求引用出处:让模型标明每一句来自哪份材料,这样拿到答案的人可以一键核对。溯源的具体做法见「引用与溯源」。第三类是分解、计算与验证:对推理题,要求模型列出步骤,或调用计算器、代码执行器来算。要注意步骤本身仍可能出错,所以关键结论不能只依赖模型自己的推演,最终仍需用外部证据验证。第四类是风险筛查与转人工:在完成校准和任务验证之后,可以综合多次采样的答案一致性、检索覆盖程度、验证器给出的分数或 token 概率来筛选高风险输出,但原始的 logprobs 只是生成概率,并不等同于事实正确率。第五类是提示允许「不知道」:明确告诉它「不确定就说不知道,别编」,这能减少一部分凭空编造,因为模型对表达形式的服从可以部分抵偿它不主动承认未知的倾向。
这些手段的共同局限必须说清楚:它们都是「缓解」,不是「根治」。RAG 检索错了、材料本身是错的、或者问题超出了所给材料的范围,幻觉照样发生。只要底层训练目标仍是「似然」而非「真相」,就不存在一劳永逸的解法。正确的心态是:凡是重要的事实都要核对,永远不把模型语气上的自信当作保证。
「张伟论文」的核验过程可以完整展示这套思路的运作方式。第一步,如果直接让模型生成,它手头只有用户的提问预设和自身的参数记忆,此时绝不能据此补出论文标题、期刊和 DOI——任何具体细节都必然是编的。第二步,改用作者、年份加主题去学术索引检索,结果没有精确匹配,却存在多位同名作者;此时正确动作是把「论文存在」这个命题降级为「未证实」,而不是从同名作者里挑一篇最像的来凑数。第三步,交叉核对作者主页和 DOI 注册库,仍然没有匹配,就应当明确报告「未找到」,并同时列出检索范围与同名歧义,让用户看到结论的依据边界。第四步,请求用户补充机构、题名片段或链接,把「拒绝编造」转化为可继续取证的下一步。
注意这里的措辞选择:校准并不意味着语气变软,而是让断言的强度与证据覆盖相匹配。「未在这些来源找到」比「这篇论文不存在」更准确——前者陈述的是检索行为的结果,后者跳到了对世界的全称否定;「可能是同名作者」比凭空选定某个张伟更可核验。整条缓解流程的输入是待核验问题、检索来源、工具结果、证据覆盖和任务风险,输出是带引用的回答、带范围的「不确定」、澄清问题或转人工。RAG、引用和提示都可能失效,凡是高影响的断言,最终都必须由外部证据亲自验证。
| 案例推演:核验“张伟论文” | 系统获得的证据 | 应该怎样回答 |
|---|---|---|
| 直接生成 | 只有用户预设和模型参数记忆 | 不能据此补标题、期刊和 DOI |
| 作者+年份+主题检索 | 学术索引无精确匹配,却有多位同名作者 | 把“论文存在”降为未证实,而非挑最像的一篇 |
| 交叉核对 | 作者主页、DOI 注册库仍无匹配 | 明确说未找到,并列出检索范围与同名歧义 |
| 请求补充 | 让用户提供机构、题名片段或链接 | 把拒绝编造转成可继续取证的下一步 |
6怎样把长回答拆成可核验事实评测
一段较长的回答往往是真假混杂的:可能前几句都有据可查,中间却夹着一句凭空编造的关键数据。如果只对整段打一个「正确」或「错误」的标签,最危险的那一句就会被平均掉。正确的做法是先把输出拆成最小的可核验原子断言——每条断言都独立成立、独立可查——再依据指定的证据集逐条标为「支持、矛盾、未覆盖、不可核验」四种状态之一。这里评测的是断言相对给定证据的事实精度,而不是对整个世界真相的穷尽判定;证据集之外的事,判定只能停留在「未覆盖」。
用「张伟论文」的回答做个拆解示范。一条断言是「作者名为张伟」:证据集中同名作者过多,无法唯一对应,判为未覆盖,处置动作是请求机构等消歧信息。第二条是「发表于 2019 年」:同样没有证据支持,判为未覆盖,处置动作是不许补全这个年份。第三条是「题名为《Graph…》」:所给 DOI 指向的是另一篇论文,直接构成矛盾;这是关键错误,整段回答都不得发布。第四条是「主题涉及图神经网络」:这个信息只来自用户的提问预设,模型不能把用户的话当作来源,应标为待证。第五条是「我没有找到精确匹配」:这句话由检索日志直接支持,可以输出,但必须同时说明检索范围。可以看到,同样是出现在一段回答里的句子,经过拆解后各自的处置方式完全不同。
有了逐条判定,就可以计算原子事实支持率:Rsupport = Nsupported ÷ Nverifiable,即被证据支持的断言数除以可核验的断言总数。假设一段回答里有 5 条可核验断言,其中 3 条被支持,支持率就是 3 ÷ 5 = 60%。但平均分不是唯一门槛:如果那唯一一条矛盾的断言恰好是药物剂量、金额或 DOI 这样的关键字段,即使其余四条全部正确,整段也应当判定为失败——一个剂量错误造成的后果远不是 80% 的支持率所能抵消的。生产环境中的评测应当同时报告支持率、关键矛盾率、证据覆盖率,以及模型拒答后的任务覆盖率,用多个指标共同刻画质量,而不是只盯一个平均分。
整个原子事实评测流程的输入是一段回答和指定的证据集,输出是可核验断言数 Nverifiable、被支持数 Nsupported、支持率 Rsupport,以及关键矛盾率和覆盖率。操作顺序是:先把回答拆到每条都能独立查证的最小断言,再逐条映射到证据来源并判定状态,最后用 Nsupported ÷ Nverifiable 计算比例。5 条中 3 条支持就是 60%;但一条药量、金额或 DOI 上的关键矛盾足以让整段失败,这一点单看平均支持率是看不出来的。
| “张伟论文”回答中的原子断言 | 证据判定 | 处置 |
|---|---|---|
| 作者名为张伟 | 未覆盖:同名作者过多 | 请求机构等消歧信息 |
| 发表于 2019 年 | 未覆盖 | 不得补全 |
| 题名为《Graph…》 | 矛盾:所给 DOI 指向另一论文 | 关键错误,整段不得发布 |
| 主题涉及图神经网络 | 仅来自用户预设 | 标为待证,而非引用用户当来源 |
| “我没有找到精确匹配” | 由检索日志支持 | 可输出,并说明检索范围 |
7定位失败:检索、生成还是引用诊断
一段带引用的回答出错了,问题究竟出在哪?「有引用」并不等于「引用支持了这句话」——错误可能发生在流水线的任何一个环节,必须分层归因,才能对症下药。
从下游往上游看,第一个评测层是检索覆盖,核心问题是「需要的证据是否被取回」。典型失败包括:证据根本没进索引、查询词构造错误、或者同名消歧失败导致取回了错误人物的资料。第二个评测层是证据质量,核心问题是「来源是否原始、可信且仍然有效」。二手转述、过期页面、多个来源互相抄袭——都会让后续一切判定建立在不可靠的地基上。第三个评测层是忠实性,核心问题是「回答是否只陈述了材料真正支持的内容」。典型失败是把「相关」扩写成因果,或者把材料中的「未提及」写成对事实的否定。第四个评测层是引用正确性,核心问题是「每个引用是否真的指向对应的断言」。常见的失败形态是链接本身真实存在,但它并不支持相邻的那句话——引用成了一种装饰。第五个评测层是选择性回答,核心问题是「证据不足时是否拒答或转人工」。典型失败是为了追求回答覆盖率而强行作答。
这五层背后对应三个必须分开的目标。闭卷事实性问的是「回答与世界事实是否一致」——不借助外部材料时,这条只能靠模型自己的知识回答;给定材料的忠实性问的是「回答是否受所给证据支持」;引用正确性问的是「链接是否真的支撑相邻断言」。三者相关,但不能互相替代:一段引用格式完美的回答可以在事实上完全错误,一段事实正确的回答也可能引用了错误的出处。
分层诊断把这一排查过程形式化:输入检索候选、来源版本、回答断言、引用映射和拒答行为,输出对检索覆盖、证据质量、忠实性、引用正确性或选择性回答其中某一层的失败归因。它解决的具体问题是:当回答有引用、引用却不支持断言时,如何定位错误。排查顺序是固定的:先问证据是否被取回,再问来源是否可靠,接着问陈述是否超出来源、链接是否对应相邻句子,最后检查证据不足时是否如实拒答。只有定位到具体层,修复才有针对性——索引缺失补索引,消歧失败改查询,忠实性不足重写生成约束,而不是笼统地「再生成一遍」。
| 评测层 | 核心问题 | 典型失败 |
|---|---|---|
| 检索覆盖 | 需要的证据是否被取回? | 索引缺失、查询错、同名消歧失败 |
| 证据质量 | 来源是否原始、可信且仍有效? | 二手转述、过期页面、来源互相抄袭 |
| 忠实性 | 回答是否只陈述材料真正支持的内容? | 把“相关”扩写成因果,把未提及写成否定 |
| 引用正确性 | 每个引用是否指向对应断言? | 真实链接却不支持邻近句子 |
| 选择性回答 | 证据不足时是否拒答或转人工? | 为追求覆盖率而强答 |
8把整条因果链连起来综合
把前面各环节的结论按因果顺序串起来,可以得到一条完整的推理链,它从「下一 token 似然」这一个根源出发,一直推到日常使用中必须做的事。
链条的起点是幻觉的定义:流畅、自信却缺乏依据或与事实相悖的内容,比普通答错更难识别。它之所以难识别,是因为它发生在机制层面:模型建模的是语言的统计似然而不是事实真值,「答对」和「瞎编」在模型内部是同一个动作——都只是挑最可能的续写。这解释了为什么它无法被根除。与此同时,模型表现出与内容真伪无关的自信,因为「像人写的」恰恰是训练目标本身,而模型又无法感知自己不知道什么,于是它对错误内容与正确内容使用同样的笃定口吻。
机制根源决定了风险分布:当训练数据稀疏、问题超出训练截止时间、提问中夹带错误预设、或采样温度偏高时,模型更倾向滑入纯语言模式的补全,幻觉因此高发。识别这些信号,是决定「何时必须查证」的依据。
应对手段沿两个方向展开。其一是在生成前把模型锚到真实材料上——RAG 检索、要求逐句引用、调用外部工具计算,再辅以校准过的风险信号和人工复核。其二是对生成结果做结构化核验:长回答拆成原子断言,逐条对照证据判定支持、矛盾、未覆盖或不可核验,并沿检索覆盖、证据质量、忠实性、引用正确性、选择性回答五个层次定位失败。这两类手段没有一个是万能的——RAG 可能检索错,引用可能是装饰,校准信号不等于事实——所以它们必须组合使用,且最终都要落到外部证据上。
链条的末端是一个可检验的标准:能解释「语言似然不等于事实真值」这一核心命题,并能针对具体场景设计出检索、引用验证、拒答与人工复核的组合控制,才算真正掌握了幻觉治理的内核。达不到这一步,任何单点工具都只是把风险换了个地方藏起来。
9概念依赖与延伸学习路线
理解本页内容需要三个先修概念。第一个是「大语言模型」本身——它是做什么的、以何种方式训练出来的,这一页的整套分析都建立在对语言建模目标的准确理解上。第二个是「预测下一个 token」,即模型逐个挑选最可能续写词的工作方式;幻觉的结构性根源正是这一机制的直接推论。第三个是「采样与温度」,它决定了生成时对低概率词的接受程度,是解释「高温下更容易幻觉」以及如何通过降温降低风险的前提。
本页的核心概念可以压缩为四组:似然非真相——模型优化的是续写的像样程度而非事实真伪;结构性——因此幻觉源于机制,不能靠扩大规模根除;自信的口吻——流畅与笃定是训练目标本身,不携带真伪信息;缓解非根治——RAG、引用、校准等一切手段都只是降低风险,最终仍依赖外部验证。
紧邻的延伸方向有五个。RAG 是回答前先检索、再基于给定材料作答的流程,是把回答锚在真实内容上的主要手段;引用与溯源解决「哪句话出自哪里、能否一键核对」的问题;思维链让模型把推理步骤显式写出来,便于逐步检查而不是只看到结论;Logprobs 与置信度讨论如何把生成概率信号转化为经过校准的风险估计;检索则支撑了上述所有方案的证据来源。更远一层的方向包括:对齐——如何让模型的行为目标与人类意图一致;评测——如何系统度量包括幻觉在内的各类失败;可解释性——模型内部表示能否告诉我们它为何如此回答;以及推理模型——以更长推演换取更高可靠性的新一代设计。这些方向都不是本页的替代,而是在「似然非真相」这一根基之上,各自应对幻觉治理的不同侧面。
| 学习层级 | 涉及概念 |
|---|---|
| 先修 | 大语言模型、预测下一个 token、采样与温度 |
| 本页核心 | 似然非真相、结构性、自信的口吻、缓解非根治 |
| 紧邻延伸 | RAG、引用与溯源、思维链、Logprobs 与置信度、检索 |
| 更远 | 对齐、评测、可解释性、推理模型 |
- Kalai & Vempala, Calibrated Language Models Must Hallucinate:对任意事实分布中不可避免错误的理论边界;不等于所有幻觉都无法降低。
- Lewis et al., Retrieval-Augmented Generation:外部检索对知识密集任务的帮助及其边界。
- Ouyang et al., InstructGPT:后训练如何改善有用性、真实性与拒答行为。
- Min et al., FActScore:把长文本拆成原子事实并计算有可靠来源支持的比例。