Lecture 5 · 对齐(一):幻觉与校准 · Alignment: Hallucinations

Prompt Engineering · Lecture 05。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:CMU 17-630 Prompt Engineering(Prof. Travis Breaux),第 4 周的第一个主题 · Alignment: Hallucinations。原课 Schedule 对这一讲的说明(意译):介绍对齐,重点是幻觉的类型与来源、校准良好的模型有什么好处,以及减少幻觉的策略。 依据说明:原课的 slides 和阅读清单不公开。Schedule 点名的四个方面——对齐的概念、幻觉的类型与来源、校准的好处、减少幻觉的策略——分别在 §1、§2–§3、§4–§5 和 §6–§7 展开。材料来自 Askell et al.(2021)、Lin et al.(2022,TruthfulQA)、Maynez et al.(2020)、Ji et al.(2023)与 Huang et al.(2023)两篇综述、Kandpal et al.(2023)、Mallen et al.(2023)、Kalai & Vempala(2024)、Guo et al.(2017)、Kadavath et al.(2022)、Gekhman et al.(2024)、Manakul et al.(2023)等;引用时按原文的说法转述结论,具体数字以原文为准。全部实验是本讲义自己设计的,不代表课堂上讲了什么。 配套代码 Code:code/lecture05/(PyTorch CPU;1 个模块 + 5 个脚本;不需要 API key;第一次运行会训练一个”长尾”迷你 GPT 约 50 秒、3 个指令微调模型各约 5 秒,之后读缓存;每个脚本都在 20 秒以内) 预计阅读时间:4 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 说清楚对齐(alignment)在讲什么,以及幻觉为什么是”诚实”这一维的问题。
  2. 区分幻觉的几种类型:事实性 vs 忠实性,内在 vs 外在;能把一个具体的错误归进去。
  3. 解释幻觉的主要来源:长尾知识、训练目标(“写出最像样的续写”)、微调数据里的新知识、评测的激励方式、解码的随机性、不会用上下文。
  4. 用可靠性图、ECE、Brier、AUROC 描述一个模型的置信度,知道”校准”和”区分对错”是两回事;会用温度缩放修正校准。
  5. 用选择性预测(风险—覆盖率)和按代价定阈值设计一个”会说不知道”的系统,知道校准为什么是这种设计的前提。
  6. 理解几种减少和检测幻觉的方法——允许弃权、训练弃权、多次采样的一致性检测、检索、验证——以及它们各自的盲点。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面再展开 Previewed only
第 1 讲:知识的跨格式迁移、反转诅咒、温度检索增强生成的工程(第 7 讲)
第 3 讲:指令微调(本讲直接复用它的方法)、RLHF 的流程偏见与谄媚(第 6 讲)——同样是”后训练的副作用”
第 4 讲:self-consistency、系统性错误 vs 随机错误、“忠实地错”验证链(CoVe)与自我纠正(第 10 讲)
前置讲 P3:Wilson 区间、开发集 / 测试集对抗性提示与过度拒答(第 12 讲)

0.3 本讲地图 Map

§1  什么是对齐:helpful / honest / harmless;幻觉在哪里
§2  幻觉的类型:事实性 vs 忠实性;内在 vs 外在
§3  幻觉从哪里来:长尾知识;"校准良好的模型必然幻觉";微调、评测与解码            ← 代码 01
§4  校准:可靠性图、ECE、AUROC;温度缩放;后训练怎样改变校准                       ← 代码 02
§5  让模型说"不知道":选择性预测、按代价定阈值、训练弃权、提示里给退路            ← 代码 03、05(可选)
§6  检测幻觉:多问几遍(SelfCheckGPT、语义熵)和它的盲点                          ← 代码 04
§7  减少幻觉的策略总览与评测
§8  小结   §9 常见误区   §10 练习   §11 延伸阅读   §12 下一讲预告

0.4 记号与术语 Notation & terms

术语本讲义里的意思
幻觉(hallucination)模型生成的、看起来合理但没有依据或与事实 / 给定资料不符的内容
置信度(confidence)模型对自己答案的把握。本讲的迷你模型直接用”答案 token 的概率”;chat API 通常只能用口头报告或多次采样来估计
校准(calibration)置信度和实际正确率一致:说”80% 把握”的答案,应该有 80% 是对的。注意:第 2 讲的”校准”是另一个意思(修正标签偏向)
ECE期望校准误差:把置信度分段,各段”平均置信度”和”准确率”之差的加权平均
AUROC置信度区分”答对”和”答错”的能力:随机挑一对对 / 错样本,对的那个置信度更高的概率
选择性预测(selective prediction)允许模型在没把握时弃权;覆盖率 = 回答的比例,风险 = 回答了的里面答错的比例
出现次数一个事实在预训练语料里被陈述的次数(本讲的长尾实验的自变量)

0.5 本讲的实验装置 · The setup

第 1 讲的世界里,24 个国家每个都有 36 篇百科词条,知识是”均匀”的,模型几乎全知道。真实语料不是这样:少数实体被反复提到,大多数实体很少被提到。本讲造了一个长尾世界(hallu_lab.py):

  • 60 个国家,每个国家的百科词条篇数服从齐普夫分布:最热门的 384 篇,14 个国家只有 1 篇,12 个国家只有 2 篇;还有 6 个国家只出现在题目列表里——名字见过,事实一次都没出现过。
  • 其余配方和第 1 讲一样(问答页、题目列表、评论、故事);问答页按热门程度抽国家,所以热门国家被”问答”得更多。
  • 240 个事实(60 个国家 × 首都、语言、出口、领导人)按在语料里被陈述的次数分档:0 次 24 个、1 次 24 个、2 次 29 个、3–5 次 64 个、6–20 次 58 个、21 次以上 41 个。
  • 在这份语料上训练一个和第 1 讲结构、超参数、步数都相同的迷你 GPT(“长尾模型”)。

后半讲还用第 3 讲的方法在长尾模型上做指令微调,比较三种数据配方:只用模型知道的事实、也教它不知道的事实(给正确答案)、不知道的事实回答 unknown。


1. 什么是对齐 · What is alignment

“对齐”(alignment)粗略地说是:让模型做我们真正想让它做的事。Askell et al.(2021)提出了一个被广泛采用的框架:一个对齐的助手应该是

  • 有帮助的(helpful):尽力完成用户的任务,问清楚不明确的地方;
  • 诚实的(honest):只说它相信是真的话,准确地表达自己的不确定性,不欺骗;
  • 无害的(harmless):不帮助造成伤害,不冒犯,不歧视。

三者经常冲突:一个”尽力帮忙”的模型在不知道答案时,最”有帮助”的样子就是编一个答案——这恰恰违反了”诚实”。Evans et al.(2021)把”诚实”进一步拆成几个部分:真实(不说假话)、校准(把握的程度和实际一致)、透明(不隐瞒)、不欺骗。

幻觉主要是”真实”和”校准”这两部分的失败:模型说了没有依据的话,而且说得很有把握。原课把幻觉放在”对齐”的第一讲,是因为它不只是”模型知识不够”的技术问题,而是”模型被训练成什么样”的问题。一个典型的证据来自 TruthfulQA(Lin et al. 2022):这个基准专门收集了人们常有误解的问题(“打碎镜子会怎样?”),他们发现模型会模仿训练数据里流行的错误说法(“imitative falsehoods”),而且在他们测试的模型里,越大的模型往往越不真实——越大越会模仿人类的说法,包括人类的错误。

本讲沿着这条线走:幻觉是什么(§2)、从哪里来(§3)、怎样知道模型有没有把握(§4)、怎样让它在没把握时说出来(§5)、怎样从外面检测(§6)、整体上怎样减少(§7)。


2. 幻觉的类型 · Types of hallucination

两篇综述(Ji et al. 2023;Huang et al. 2023)给出了两个常用的分法。

事实性 vs 忠实性(Huang et al. 2023):

  • 事实性幻觉(factuality):说的话和世界上的事实不符,或者无法验证。例如问一个冷门人物的生平,模型编了一段经历。
  • 忠实性幻觉(faithfulness):说的话和给定的输入不符——不按指令做、和提供的资料矛盾、自相矛盾。例如让它总结一篇文章,它加进了文章里没有的内容。

内在 vs 外在(Maynez et al. 2020 在摘要任务上提出):

  • 内在(intrinsic):和资料矛盾(文章说 A,摘要说非 A);
  • 外在(extrinsic):资料里没有、无法从资料验证的内容(可能碰巧是真的,但没有依据)。

前几讲的实验里已经出现过几种:

例子类型
第 4 讲:用领导人做桥的两跳题,模型编一个国家,然后”忠实地”按它答下去事实性(编造实体)
第 3 讲 04 号脚本:反查首都的完整句子”visis is the capital of thenania .”——格式漂亮、内容错误事实性(编造关系)
本讲 01 号脚本演示 2:问从没见过的国家的首都,模型答了另一个国家的首都事实性(张冠李戴)
本讲 01 号脚本演示 4:资料里写着首都是什么,模型不看,答它记忆里的那个忠实性(无视上下文)

分类有实际的用处:不同类型的幻觉要用不同的办法对付。事实性幻觉要靠检索、弃权、验证;忠实性幻觉要靠让模型更好地读上下文(检索增强的前提)、引用来源、检查输出和资料是否一致。


3. 幻觉从哪里来 · Where hallucinations come from

配套代码:01_longtail.py

3.0 一个思想实验:只按”答对了没有”计分的考试

想象一场考试:每道题答对得 1 分,答错得 0 分,空着不答也是 0 分。一个理性的考生会怎么做?——每道题都写点什么。哪怕只有 10% 的把握,写了期望得 0.1 分,空着必然是 0 分。在这种计分规则下,“诚实地留空”永远是劣势策略。

语言模型的预训练很像这场考试。它的目标是给”真实的下一个词”尽可能高的概率(交叉熵损失)。语料里,“the capital of volel is” 后面跟着的永远是一个首都名,从来不是”我不知道”——所以模型学到的最优策略是:无论有没有把握,都给出一个首都名,把概率分给最像样的那几个候选。它不是在”撒谎”,它只是在做训练目标要求它做的事。

指令微调和 RLHF 有机会改变这一点(教它说”不知道”),但也可能加重它:如果评测和人类偏好都奖励”具体、自信”的回答,模型就学会了更自信地猜(§3.4)。这个思想实验贯穿本讲:幻觉是”计分规则”的产物——要减少它,就要改变规则:让”不知道”不再是零分(§5),或者让编造更容易被发现(§6)。

3.1 长尾知识

在长尾模型上,用问答页格式问每一个事实(240 个),按它在预训练里出现的次数分档:

出现次数事实数准确率 [95% CI]平均置信度答错时的平均置信度
0 次244.2% [0.7, 20.2]0.250.25
1 次2420.8% [9.2, 40.5]0.300.23
2 次2996.6% [82.8, 99.4]0.440.16
3–5 次64100.0%0.79–
6–20 次58100.0%0.94–
21 次以上41100.0%0.99–

知识随出现次数的变化非常陡:见过一次,多半记不住;见过两三次,就记住了。真实的大模型有同样的形状:Kandpal et al.(2023)发现,模型回答一个问题的准确率随”相关文档在预训练数据里出现的次数”急剧变化;Mallen et al.(2023,PopQA)按实体的流行程度看,结论一样——大模型对热门实体几乎全对,对冷门实体错得很多,而且把模型变大对冷门知识的帮助很小。

3.2 不知道的时候,它说了什么

24 个从没见过的事实,模型一次也没有说”不知道”——base 模型的输出里根本没有这个选项,它只会写出”最像样的下一个词”。24 个回答全都是别的国家的同类属性:问 londor 的首都,它答 thunum(zondova 的首都);问 londor 的语言,它答 ralish(ziltia 的语言)。被借用的国家大多也是冷门国家(中位数只有 2 篇百科):模型把几个它都不太熟的国家混在了一起。

这就是幻觉最典型的样子:流畅、格式正确、内容真实存在但属于别处。它不是程序出错,而是”写出最可能的续写”这个训练目标在知识缺失时的自然结果。

3.3 “校准良好的模型必然幻觉”

Kalai & Vempala(2024)给出了一个很有启发性的理论结果。考虑一类”任意的”事实(例如某个人的生日——没有规律可以从别的事实推出来)。用 Good–Turing 估计的思路:训练数据里”只出现过一次”的事实所占的比例(单次事实率,monofact rate),估计了”从没出现过的事实”的总概率。他们证明:一个在这类事实上校准良好的语言模型,它的幻觉率大致不会低于单次事实率(减去它的校准误差)。

直觉是:模型无法区分”只见过一次的真事实”和”从没见过、但看起来同样合理的假事实”。要对前者给出合理的概率,就必须也给后者分概率——也就是会编。

在我们的语料里:至少出现一次的 216 个事实中,单次事实占 11.1%;从没出现过的占全部 240 个的 10.0%;模型在单次事实上的错误率是 79.2%。

这个结果的推论是:幻觉不只是”没训练好”,而是”从有限的样本里学会生成”这件事的统计后果。减少幻觉要靠训练目标之外的东西:让模型能说”不知道”、检查一致性、去外部查证。

3.4 微调、评测与解码

除了预训练数据的长尾,还有几个来源:

  • 用模型不知道的事实做微调。Gekhman et al.(2024)发现,指令微调数据里如果有模型在预训练里没学到的新知识,这些例子学得很慢,而一旦被学会,模型在其他问题上的幻觉也增加了。直觉是:微调教会了它”对这类问题要给一个确定的答案”,而不是那些新事实本身的规律(任意事实没有规律)。本讲 02–04 号脚本在迷你模型上复现了这个现象(§4.3、§5.3、§6.2)。
  • 评测和偏好的激励。Kalai et al.(2025)指出,大多数基准只按”答对了没有”打分,答”不知道”和答错一样得零分——于是一个会猜的模型总是比一个老实的模型分高。RLHF 的人类偏好也可能奖励”自信、具体”的回答。我们怎样评价模型,就在怎样训练它。
  • 解码。温度越高,越可能抽到低概率的词(第 1 讲 §8.7);对一个本来就没把握的问题,采样会让编造的答案更多样。
  • 不会用上下文。即使把正确的资料放进提示,模型也可能不用它——这在迷你模型上是极端的(下一节)。

3.5 资料就在提示里,它也不看

01 号脚本演示 4:在问题前面加一句百科,“the capital of X is K .”——给正确的或错误的资料,看模型答什么:

国家提示答出真正的首都答出资料里写的首都
热门(≥ 3 篇)不给资料100.0%–
热门给错误的资料100.0%0.0%
冷门(0–1 篇)不给资料45.0%–
冷门给正确的资料45.0%45.0%
冷门给错误的资料45.0%0.0%

给冷门国家正确的资料,准确率还是 45%,和不给一样:资料就在上一句,模型没用上。原因和第 2 讲 §8.6 一样:这个迷你模型没有归纳头,不会”照抄前文”。检索增强生成的前提是模型会读上下文——第 7 讲用真实的大模型讲 RAG。

真实的大模型会读上下文,但会遇到另一个问题:资料和记忆冲突时听谁的。Longpre et al.(2021)、Xie et al.(2024)发现,模型对热门事实更”固执”(坚持记忆),对冷门事实更容易被资料说服;Mallen et al.(2023)发现检索对冷门事实帮助最大,对热门事实有时反而有害,于是提出只在问题涉及冷门实体时才检索(自适应检索)。


4. 校准 · Calibration

配套代码:02_calibration.py

4.1 为什么要关心校准

如果模型的置信度是可信的,我们就能:只在它有把握时用它的答案(§5)、按”答错的代价”决定要不要回答、把不确定性告诉用户、把没把握的问题转给更强的模型或人。这一切都要求置信度和实际正确率一致——这就是校准。

一个模型被称为完美校准,如果对任意 pp,

P(答对∣置信度=p)=pP(\text{答对} \mid \text{置信度} = p) = p

4.2 可靠性图与几个指标

把 240 个事实按置信度分成 10 段,每段比较”平均置信度”和”准确率”:

置信度区间事实数平均置信度准确率准确率 − 置信度
(0.0, 0.1]50.080.00−0.08
(0.1, 0.2]220.150.27+0.13
(0.2, 0.3]160.250.44+0.19
(0.3, 0.4]140.340.36+0.01
(0.4, 0.5]70.430.86+0.42
(0.5, 0.6]40.520.50−0.02
(0.6, 0.7]140.651.00+0.35
(0.7, 0.8]220.761.00+0.24
(0.8, 0.9]260.861.00+0.14
(0.9, 1.0]1100.960.99+0.03

把这张表画成图(横轴平均置信度、纵轴准确率),完美校准就是对角线。四个常用的指标:

  • ECE(期望校准误差)=∑bnbn∣accb−confb∣= \sum_b \frac{n_b}{n} \left| \text{acc}_b - \text{conf}_b \right|:这里是 0.110。 一个小例子:10 个回答,4 个的置信度是 0.9(其中 3 个对),6 个的置信度是 0.6(其中 3 个对)。第一段的差是 |0.75 − 0.9| = 0.15, 第二段 |0.5 − 0.6| = 0.10,ECE = 0.4 × 0.15 + 0.6 × 0.10 = 0.12——平均来说,模型报的把握比实际高了约 12 个百分点。
  • Brier 分数 =1n∑i(confi−yi)2= \frac{1}{n}\sum_i (\text{conf}_i - y_i)^2:同时惩罚”不准”和”不诚实的把握”,这里是 0.084。
  • AUROC:置信度区分对错的能力,这里是 0.949——随机挑一个答对的和一个答错的,95% 的时候答对的那个置信度更高。
  • 可靠性图本身:看偏差的方向。

这个模型的置信度很会排序(AUROC 高),但数值偏低:有 6 个区间的准确率比平均置信度高出 0.1 以上——它说”我有 40% 的把握”时,实际上大多是对的。这些主要是只出现两三次的事实:它记住了,却”不太相信自己”。置信度不到 0.3 的 43 个事实准确率只有 30%,大多是在瞎猜。

校准和区分是两回事:一个模型可以排序很好但数值不准(这里),也可以数值平均起来准、却分不清对错(例如对所有问题都说 80%,而准确率恰好是 80%——ECE 为 0,AUROC 为 0.5)。看置信度的质量要同时看两者。

Kadavath et al.(2022,《Language Models (Mostly) Know What They Know》)在大模型上发现:只要题目的格式合适(多选、判断),大模型的 token 概率大体是校准的;还可以让模型评估自己写的答案是否正确(P(True)),或者训练它预测”我知不知道这道题”(P(IK))。

4.3 温度缩放

最简单的事后校准方法是温度缩放(temperature scaling,Guo et al. 2017):找一个温度 TT,用 softmax⁡(z/T)\operatorname{softmax}(z / T) 代替 softmax⁡(z)\operatorname{softmax}(z),在一小份带标签的数据上让正确答案的负对数概率最小。它只有一个参数,不改变 argmax——准确率不变,只改置信度。

在一半事实上拟合、另一半上检验:

准确率ECEBrierAUROC
测试集 · 原始(T = 1)80.8%0.1330.0870.960
测试集 · 温度缩放(T = 0.80)80.8%0.0490.0630.964

拟合出的温度小于 1:把分布变尖,让偏低的置信度升上来。ECE 从 0.133 降到 0.049。AUROC 几乎不变:温度缩放是单调变换,不改变排序。它的局限也在于只有一个参数:这个模型在冷门事实上偏自信、在半冷门事实上偏不自信,一个温度没法同时修好两头。

4.4 后训练怎样改变校准

在长尾模型上做三种指令微调,在没进过任何微调数据的国家上(144 个事实)比较:

模型准确率ECEAUROC答错时的平均置信度从没见过的事实上的平均置信度
base(问答页格式)84.0%0.1230.9630.240.26
SFT · 只用知道的事实72.9%0.0940.8780.350.42
SFT · 也教它不知道的事实60.4%0.1840.6620.650.92
SFT · 不知道就答 unknown(只算没弃权的)72.4%0.0990.8110.570.60
  • 只用知道的事实:ECE 略好(0.123 → 0.094),可准确率、AUROC 都下降了,答错时的置信度从 0.24 升到 0.35。ECE 一个数字掩盖了这些变化。
  • 也教它不知道的事实:在别的它不知道的事实上,它变得自信地错:对从没见过的事实,平均置信度高达 0.92。这是 Gekhman et al.(2024)的发现在迷你模型上的样子。
  • 真实模型上也有相关的观察:GPT-4 技术报告(OpenAI 2023)展示,预训练模型在 MMLU 上的置信度相当校准,经过后训练(RLHF)之后明显变差。

口头报告的置信度。chat API 大多不给概率,于是人们让模型用文字报告把握(“confidence: 85”)。Tian et al.(2023)发现,对 RLHF 之后的模型,口头置信度常常比 token 概率校准得更好;Xiong et al.(2024)则发现口头置信度普遍偏高,而且集中在 80、90、95 这几个整数上。05 号脚本(可选)可以在真实模型上测这一点。


5. 让模型说”不知道” · Abstention

配套代码:03_abstention.py;05_real_llm.py(可选)

5.1 选择性预测:用覆盖率换可靠性

按置信度从高到低排序,只回答前一部分、其余弃权:

覆盖率置信度阈值风险(回答了的里面答错)随机弃权时的风险
100%0.0717.9%17.9%
90%0.1811.1%17.9%
80%0.335.7%17.9%
70%0.640.6%17.9%

只回答最有把握的 80%,风险就从 17.9% 降到 5.7%——用少量的覆盖率,换来大量的可靠性。前提是置信度能区分对错(AUROC 高);随机弃权毫无用处。这叫选择性预测(El-Yaniv & Wiener 2010);在问答系统里,Kamath et al.(2020)训练一个额外的”校准器”来决定何时弃权,特别是在测试分布和训练分布不一样时。

5.2 阈值怎样定

按目标风险:在开发集上找”风险不超过 5% 的最低阈值”,在测试集上验证:

定法阈值开发集:覆盖率 / 风险测试集:覆盖率 / 风险
原始置信度0.3377% / 4.3%82% / 5.1%
温度缩放后(T = 0.75)0.5777% / 4.3%81% / 3.1%

测试集的结果和开发集有出入(每边只有 120 个事实)。阈值要在独立的数据上验证,并且要定期复查——问题的分布一变,阈值就可能失效。

按代价:弃权的代价记为 1,答错的代价记为 cc。回答的期望代价是 (1−置信度)⋅c(1 - \text{置信度}) \cdot c,所以只有当置信度 >1−1/c> 1 - 1/c 时才应该回答。这个规则把置信度当成了真实的正确率,所以只在校准良好时才是最优的:

答错的代价 c阈值原始置信度:平均代价温度缩放后:平均代价全部回答
20.500.2830.2500.300
40.750.3750.2920.600
100.900.6170.3921.500

校准之后,同样的规则代价更低——校准决定了”按代价定阈值”是否可信。答错的代价越高(医疗、法律),阈值越高、弃权越多。弃权率是一个产品决策,不是一个技术常数。

5.3 直接训练模型说 “unknown”

除了在外面加阈值,还可以训练模型自己弃权。R-Tuning(Zhang et al. 2024)的思路:先用模型自己的回答找出它不知道的问题,再把这些问题在微调数据里的目标回答改成”我不确定”。在长尾模型上比较三种配方(测试用的国家都没进过微调数据;base 模型知道其中 121 个事实、不知道 23 个):

微调配方知道的事实:答对知道的:过度弃权不知道的:弃权不知道的:幻觉
只用知道的事实86.0%0.0%0.0%95.7%
也教它不知道的事实71.9%0.0%0.0%100.0%
不知道就答 unknown69.4%15.7%39.1%60.9%
  • 只用知道的事实微调,它从没见过”unknown”这个回答,也就从不弃权。
  • 教它”背”没有依据的事实,幻觉更多,连知道的事实也答得更差。
  • 训练弃权:不知道的事实里 39.1% 弃权、幻觉降到 60.9%;代价是知道的事实里 15.7% 也弃权了(过度弃权)。幻觉减少了,但没有消失:弃权的能力要从”模型自己的知识边界”上学,而这条边界本身是模糊的(见过两次的事实它知道,但没把握)。

真实的 chat 模型也被训练成在一些情况下说”我不知道”,但过度拒答本身也是一种失败——一个什么都说”不确定”的助手没有用(第 6、12 讲会讨论过度拒答)。

5.4 最便宜的办法:在提示里给它一条退路

很多模型默认被训练成”尽量给出答案”。在提示里明确允许它说不知道——“If the information is not in the provided document, say ‘unknown’.”——常常能大幅减少幻觉。05 号脚本(可选)在真实的 Claude 上测这一点:资料卡故意只写每个国家 4 个事实中的 2 个,问全部 4 个,比较”只说根据资料回答""允许说 unknown""再要求口头置信度”三种提示下的幻觉率。编写这份讲义的环境里没有安装 anthropic SDK,没有真实模型的结果可以报告;--toy 模式用一个显式旋钮的模拟器检查代码能跑通。

写这类提示的几条经验:

  1. 给退路:明确说没有依据时可以说”不知道”,并规定说法(便于程序识别)。
  2. 限定依据:要求只根据提供的资料回答(“Use only the document”),并要求引用出处(第 7 讲)。
  3. 让不确定性可见:要求标出没把握的部分,或给出置信度——但别把口头置信度当成精确的概率。
  4. 评测时奖励诚实:评分规则里把”不知道”和”答错”区分开(例如 SimpleQA 把回答分成”正确""错误""未作答”三类),否则你在激励模型去猜(Kalai et al. 2025)。

6. 检测幻觉:多问几遍 · Detecting hallucinations by sampling

配套代码:04_selfcheck.py

6.1 一致性:没有概率时的置信度

很多 API 不给 token 概率。SelfCheckGPT(Manakul et al. 2023)的想法是:对同一个问题采样好几次——模型真知道的事,每次都说一样的;编出来的,每次编得不一样。在长尾模型上(240 个事实,温度 1):

方法每个问题的生成次数AUROC
概率(需要 logprobs)10.949
采样一致性,k = 230.905
采样一致性,k = 560.940
采样一致性,k = 10110.951

只采样 2 次,一致性就有 0.905;10 次就追上了概率。原因很直接:一致性是在用采样估计下一个词的分布有多集中——和概率是同一个信息,只是更贵、更粗。

长回答比单个词复杂:同一个意思有很多种说法,字面不同不等于意思不同。SelfCheckGPT 对长篇回答逐句检查它和其他样本是否一致;语义熵(Kuhn et al. 2023;Farquhar et al. 2024)先把”意思相同”的回答归为一类(用一个判断蕴含关系的模型),再算类别的熵——熵高,说明模型在几个不同的意思之间摇摆,很可能在编。

6.2 盲点:稳定的幻觉

一致性(k = 20)事实数其中答错错误率
高(≥ 0.8)16410.6%
中(0.4–0.8)30826.7%
低(< 0.4)463473.9%

在这个 base 模型上,一致性是一个很好的信号。但高一致性的那一档里仍有错误答案:模型每次都编同一个。这种”自信的、稳定的”幻觉在一致性上和真知识看起来一模一样——第 4 讲的系统性错误:投票修不好它,一致性也查不出它。

base 模型上它很少;可某些微调会让它大量增加(对话格式、没进过微调数据的国家):

微调配方准确率AUROC(概率)AUROC(一致性,k = 10)稳定的幻觉 / 全部错误
只用知道的事实72.9%0.8780.8494 / 39
也教它不知道的事实60.4%0.6620.63332 / 57

用没有依据的事实做微调,让模型在不知道的问题上也给出稳定的答案。幻觉越稳定,靠模型自己的信号(概率、一致性)就越难发现。要发现它们,需要模型之外的信息:检索资料来核对(第 7 讲)、用另一个独立的模型交叉检查、或者让模型逐条验证自己说的每个事实(第 10 讲的验证链 CoVe,Dhuliawala et al. 2024)。


7. 减少幻觉的策略总览 · Mitigation strategies

把本讲和前后几讲的方法放在一起:

方法原理修什么盲点 / 代价讲次
检索增强(RAG)把相关资料放进上下文,让模型据此回答长尾、过时的知识要求模型会读上下文;检索错了会误导;资料与记忆冲突第 7 讲
提示里允许”不知道”给模型一条退路被迫编造可能过度弃权;依赖模型是否听话§5.4
阈值弃权置信度低就不回答没把握的回答需要可信的置信度(校准);牺牲覆盖率§5.1–§5.2
训练弃权(R-Tuning 等)不知道的问题,目标回答是”不确定”默认就编的习惯知识边界模糊;过度弃权§5.3
微调数据只用已知知识不教模型”对任意问题都给确定答案”微调带来的新幻觉新知识要靠预训练或检索§4.4
一致性检测(SelfCheckGPT、语义熵)编造的内容在多次采样间不一致随机的编造稳定的幻觉;k 倍成本§6
验证链(CoVe)列出说法 → 逐条独立核查 → 修改长回答里的错误事实核查本身也可能出错第 10 讲
引用与可溯源要求每个说法给出处无依据的说法;方便人工核查引用也可能编造第 7 讲
解码策略低温度;DoLa(Chuang et al. 2024)等对比层的方法采样带来的随机编造多样性下降–
事实性微调用自动的事实性评分构造偏好数据(Tian et al. 2024)长文本的事实错误需要可靠的事实性评分器–

评测幻觉的常用基准:TruthfulQA(模仿性的错误)、FActScore(Min et al. 2023:把长回答拆成原子事实,逐条对照资料核查)、HaluEval(模型能否识别幻觉)、SimpleQA(短问答;区分”正确 / 错误 / 未作答”)。设计自己的评测时,记住 §5.4 的那一条:把”不知道”和”答错”分开计分,并且同时报告覆盖率和风险。


8. 小结 · Summary

  1. 对齐 = helpful + honest + harmless;幻觉是”诚实”里”真实”和”校准”的失败,而且三者常常冲突:“尽力帮忙”在不知道时最容易变成编造。
  2. 幻觉的类型:事实性(违背世界)vs 忠实性(违背输入);内在(矛盾)vs 外在(无依据)。不同类型要用不同的办法。
  3. 长尾:迷你模型对出现 0 次的事实 4.2%、1 次 20.8%、2 次 96.6%;不知道时从不说”不知道”,而是借别的国家的答案。真实大模型的冷门知识同样薄弱,变大也帮助不大。
  4. 理论下界:校准良好的模型在”任意事实”上的幻觉率大致不低于单次事实率(这里 11.1%)。幻觉是从有限样本学习生成的统计后果。
  5. 校准:用可靠性图、ECE、Brier 看数值准不准,用 AUROC 看能不能区分对错——两者不同。温度缩放把 ECE 从 0.133 降到 0.049,不改变准确率。
  6. 后训练改变把握:用不知道的事实做微调,模型在别的未知事实上变得自信地错(从没见过的事实平均置信度 0.92)。
  7. 说”不知道”:只回答最有把握的 80%,风险从 17.9% 降到 5.7%;按代价定阈值要求校准;训练弃权减少了幻觉(95.7% → 60.9%),也带来过度弃权(15.7%)。提示里给退路是最便宜的办法。
  8. 检测:多次采样的一致性几乎能替代概率(AUROC 0.951 vs 0.949),但查不出稳定的幻觉;微调会让稳定的幻觉变多(4 → 32)。这时需要模型之外的信息:检索、交叉验证、逐条核查。

9. 常见误区 · Common pitfalls

误区实际情况
“幻觉是模型的 bug,换个更大的模型就好了”长尾知识上,变大帮助很小;校准良好的模型也必然幻觉;更大的模型更会模仿人类的错误说法(TruthfulQA)
“模型说它有 90% 的把握,那就是 90%”需要校准;口头置信度常常偏高、集中在整数上;后训练会改变校准
“ECE 小就说明置信度好用”还要看 AUROC:一个总说 80% 的模型 ECE 可以是 0,却完全分不清对错
“把正确的资料放进提示,模型就会用”要求模型会读上下文;资料和记忆冲突时,模型可能坚持记忆
“微调时把模型不知道的事实教给它,它就知道了”这些例子学得慢,学会后别的幻觉反而增加(Gekhman et al. 2024)
“多采样几次、看一致不一致就能查出幻觉”查不出稳定的幻觉(每次都编同一个);成本是 k 倍
“让模型多弃权总是更安全”过度弃权让助手没用;弃权率是在代价之间权衡的产品决策
“评测只看准确率就够了”这等于奖励猜测;要把”不知道”和”答错”分开计分

10. 练习 · Exercises

练习 1(分类) 把下面每个错误归类(事实性 / 忠实性;内在 / 外在):(a)让模型总结一篇说”公司利润下降”的新闻,它写”利润上升”;(b)总结里多了一句文章没提到的 CEO 的名言;(c)问”爱因斯坦哪年获得诺贝尔奖”,它答 1925 年;(d)让它”用三个要点回答”,它写了五段。

参考答案:(a)忠实性、内在(和资料矛盾);(b)忠实性、外在(资料里没有,无法从资料验证,即使碰巧是真的);(c)事实性(实际是 1921 年度的诺贝尔物理学奖,1922 年才宣布并颁发);(d)忠实性(不按指令),通常不叫”幻觉”而叫”不遵循指令”,但在 Huang et al. 的分类里属于对指令的不忠实。

练习 2(读表) §3.1 的表里,出现 2 次的事实准确率 96.6%,平均置信度只有 0.44。(a)这是过度自信还是信心不足?(b)对一个按”置信度 > 0.5 才回答”的系统,这意味着什么?(c)怎样修?

参考答案:(a)信心不足(准确率远高于置信度)。(b)这些几乎全对的答案大多会被弃权,白白损失覆盖率。(c)温度缩放(T < 1,把分布变尖)能整体提高置信度;但它同时会让 0 次、1 次的瞎猜也更自信,所以如果不同档的偏差方向不同,可以考虑更细的校准方法(例如按某个特征分组校准,或用一个小模型把原始置信度映射成校准后的值,如保序回归 isotonic regression)。

练习 3(计算) 一个系统里,答错的代价是弃权的 5 倍。(a)应该在置信度高于多少时回答?(b)如果模型系统性地过度自信(实际正确率比置信度低 0.1),按(a)的阈值会发生什么?

参考答案:(a)回答的期望代价 (1 − p) × 5 < 1,即 p > 0.8。(b)置信度 0.8 的答案实际只有 70% 对,期望代价 0.3 × 5 = 1.5 > 1,回答它们比弃权更糟;系统会回答太多、代价超出预期。应该先在开发集上校准(或者把阈值提高到实际正确率达到 0.8 的那个置信度)。

练习 4(解释) 用 Kalai & Vempala(2024)的论证解释:为什么即使一个模型在训练数据上完美地学到了分布、并且校准良好,它仍然会在冷门事实上产生幻觉?这对”只要数据足够好、训练足够久,幻觉就会消失”的看法意味着什么?

参考答案:对于没有规律可循的”任意事实”,模型无法区分”只见过一次的真事实”和”从没见过的、同样合理的假事实”。校准要求它给前者合理的概率,于是也必须给后者分配概率——生成时就会以相应的频率说出假事实。单次事实率估计了”未见事实”的总概率,所以构成了幻觉率的下界。这意味着:只靠”把语言模型训练得更好”(更好地拟合分布)不能消除这类幻觉;需要模型之外的机制——弃权、检索、核查——或者在训练和评测中明确奖励”不知道”。

练习 5(设计) 为一个回答公司内部政策问题的助手设计一套”减少幻觉”的方案和评测。至少包括:提示怎样写、什么时候弃权、怎样检测、怎样评测。

参考答案(一种可能):提示:只根据检索到的政策文档回答,要求引用条款编号;文档里没有时回答”文档中没有找到,请联系 HR”。弃权:用检索相似度和答案的口头置信度(或多次采样的一致性)作为信号,在开发集上按”答错的代价”定阈值。检测:把回答拆成原子说法,检查每条是否能在引用的条款里找到依据(FActScore 的思路);对不一致的样本做人工抽查。评测:一组有标准答案的问题(包括故意问文档里没有的),分开统计”正确 / 错误 / 弃权”,报告风险—覆盖率曲线和过度弃权率(本来能答却弃权的比例)。

练习 6(动手) 修改 hallu_lab.build_sft 的 “abstain” 配方:不是”base 模型答错就标 unknown”,而是”base 模型的置信度低于 0.5 就标 unknown”。重新训练并和原来的比较过度弃权率和幻觉率。你预期会怎样?

参考答案:按置信度标注会把”答对但没把握”的事实(例如出现两次、置信度 0.44 的那些)也标成 unknown,于是过度弃权更多;但它也会把”答错但比较自信”的少数事实保留为正常回答。预期:过度弃权率上升,不知道的事实上的弃权率也上升,幻觉率可能下降。这体现了一个权衡:按”对不对”标注更准确,按”有没有把握”标注更保守。实际结果要运行才知道(在 build_sft 里把条件换成 probe 返回的 conf < 0.5,并给缓存键加一个新的变体名)。

练习 7(批判) 有人提出”让模型对每个回答都附上 0–100 的置信度,低于 70 就不显示”。分析这个方案的优点和风险。

参考答案:优点:不需要 logprobs,任何 API 都能用;简单透明。风险:口头置信度常常偏高、集中在少数几个整数上(Xiong et al. 2024),阈值 70 可能几乎过滤不掉任何东西;不同模型、不同提示下数值的含义不同,换模型要重新标定;它对”稳定的幻觉”同样无能为力。改进:在开发集上测量口头置信度的可靠性图和 AUROC,据此定阈值;结合多次采样的一致性;对高风险问题做外部核查。

练习 8(联系) 第 4 讲发现 self-consistency 修不了”系统性错误”,本讲发现一致性检测查不出”稳定的幻觉”。这两件事是同一个现象吗?为什么用没有依据的事实做微调会让它更严重?

参考答案:是同一个现象的两面:当模型的错误在多次采样之间保持一致时,“多次采样”这个工具——无论用来投票还是用来检测——都看不到它,因为它只能观察到模型输出分布的形状,而分布本身集中在错误答案上。用没有依据的事实做微调,训练模型”对这类问题给出一个确定的答案”,把原本分散的、不确定的分布(容易被一致性检测发现)变成了集中在某个错误答案上的分布——随机的幻觉变成了稳定的幻觉。


11. 延伸阅读 · Further reading

对齐与诚实

  • Askell, A. et al. (2021). A General Language Assistant as a Laboratory for Alignment. arXiv:2112.00861.
  • Evans, O. et al. (2021). Truthful AI: Developing and Governing AI that Does Not Lie. arXiv:2110.06674.
  • Lin, S., Hilton, J., & Evans, O. (2022). TruthfulQA: Measuring How Models Mimic Human Falsehoods. ACL.

幻觉的分类与来源

  • Maynez, J., Narayan, S., Bohnet, B., & McDonald, R. (2020). On Faithfulness and Factuality in Abstractive Summarization. ACL.
  • Ji, Z. et al. (2023). Survey of Hallucination in Natural Language Generation. ACM Computing Surveys.
  • Huang, L. et al. (2023). A Survey on Hallucination in Large Language Models: Principles, Taxonomy, Challenges, and Open Questions. arXiv:2311.05232.
  • Kandpal, N., Deng, H., Roberts, A., Wallace, E., & Raffel, C. (2023). Large Language Models Struggle to Learn Long-Tail Knowledge. ICML.
  • Mallen, A. et al. (2023). When Not to Trust Language Models: Investigating Effectiveness of Parametric and Non-Parametric Memories. ACL.
  • Kalai, A. T., & Vempala, S. S. (2024). Calibrated Language Models Must Hallucinate. STOC.
  • Kalai, A. T., Nachum, O., Vempala, S. S., & Zhang, E. (2025). Why Language Models Hallucinate. arXiv:2509.04664.
  • Gekhman, Z. et al. (2024). Does Fine-Tuning LLMs on New Knowledge Encourage Hallucinations? EMNLP.
  • Xie, J. et al. (2024). Adaptive Chameleon or Stubborn Sloth: Revealing the Behavior of Large Language Models in Knowledge Conflicts. ICLR.

校准

  • Guo, C., Pleiss, G., Sun, Y., & Weinberger, K. Q. (2017). On Calibration of Modern Neural Networks. ICML.
  • Kadavath, S. et al. (2022). Language Models (Mostly) Know What They Know. arXiv:2207.05221.
  • Tian, K. et al. (2023). Just Ask for Calibration: Strategies for Eliciting Calibrated Confidence Scores from Language Models Fine-Tuned with Human Feedback. EMNLP.
  • Xiong, M. et al. (2024). Can LLMs Express Their Uncertainty? An Empirical Evaluation of Confidence Elicitation in LLMs. ICLR.

弃权与检测

  • El-Yaniv, R., & Wiener, Y. (2010). On the Foundations of Noise-free Selective Classification. JMLR.
  • Kamath, A., Jia, R., & Liang, P. (2020). Selective Question Answering under Domain Shift. ACL.
  • Zhang, H. et al. (2024). R-Tuning: Instructing Large Language Models to Say “I Don’t Know”. NAACL.
  • Manakul, P., Liusie, A., & Gales, M. J. F. (2023). SelfCheckGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models. EMNLP.
  • Kuhn, L., Gal, Y., & Farquhar, S. (2023). Semantic Uncertainty: Linguistic Invariances for Uncertainty Estimation in Natural Language Generation. ICLR.
  • Farquhar, S., Kossen, J., Kuhn, L., & Gal, Y. (2024). Detecting Hallucinations in Large Language Models Using Semantic Entropy. Nature.

减少与评测

  • Min, S. et al. (2023). FActScore: Fine-grained Atomic Evaluation of Factual Precision in Long Form Text Generation. EMNLP.
  • Chuang, Y.-S. et al. (2024). DoLa: Decoding by Contrasting Layers Improves Factuality in Large Language Models. ICLR.
  • Tian, K., Mitchell, E., Yao, H., Manning, C. D., & Finn, C. (2024). Fine-tuning Language Models for Factuality. ICLR.
  • Dhuliawala, S. et al. (2024). Chain-of-Verification Reduces Hallucination in Large Language Models. Findings of ACL.(第 10 讲细讲)
  • Wei, J. et al. (2024). Measuring Short-Form Factuality in Large Language Models (SimpleQA). arXiv:2411.04368.

12. 下一讲预告 · Next lecture

这一讲看到,后训练会改变模型”有多大把握”:教它背没有依据的事实,它就变得自信地错。第 6 讲继续原课第 4 周的第二个主题:对齐(二):偏见、毒性与谄媚——另外三种后训练前后都要面对的失败。

  • 偏见和毒性从哪里来(数据分布、标注者、表征伤害);评测基准 BBQ、WinoBias、StereoSet、CrowS-Pairs、RealToxicityPrompts、ToxiGen 的设计思路和局限,特别是”歧义上下文 vs 消歧上下文”这个关键设计;
  • 谄媚(sycophancy):顺着用户的观点说话、被质疑就改口(Perez et al. 2023;Sharma et al. 2024)——为什么 RLHF 会奖励它;
  • 对齐税:对齐让模型在别的能力上付出的代价;提示层面的缓解(去偏提示、“先独立判断再看用户意见”)和它的边界;
  • 动手:一个带偏好的模拟评审者和模拟模型,测量谄媚率怎样从”人类偏好”里长出来;构造一个歧义 / 消歧两种上下文的偏见基准,看去偏提示的效果和副作用。
← 返回课程目录