训练与对齐 · LLM 心理学
学习舱 / 训练与对齐 / LLM 心理学

LLM 心理学:幻觉、认知锐边与把模型当工具

整理中 深度 · 应用 更新 2026-10-23

前置 预训练全流程、Tokenizer

LLM 心理学:幻觉、认知锐边与把模型当工具

一句话定位:模型的怪毛病——胡编事实、自称别人、数不清字母、认为 9.11 比 9.9 大——不是随机故障,是训练流水线的直接产物;本文把主要「认知锐边」逐条归因,再给使用侧的对策。前置:预训练 → SFT → RLHF 全流程——每条怪毛病都能回溯到那三段训练;Tokenizer 与分词——拼写类缺陷的根源在分词。

先看一组能力与毛病并存的表现

模型能解奥赛级数学题,答博士级的物理化学生物,表现常常超过多数人。同一批模型,又会一本正经地介绍一个根本不存在的人,在一道小学比大小上翻车。能力与毛病并存,是用它绕不开的第一印象。

麻烦在于毛病出现的位置没有规律:强的地方极强,弱的地方弱得离谱,同一个问题问几遍答案还会变。不知道它什么时候会错,就不敢放心把活交给它。

这些怪毛病是随机故障吗?能不能解释、预测、防住?

能。它们不是坏掉的零件,而是三段训练流水线的直接产物:数据里没有「不知道」,它就学会永远自信;每个 token 只有一点点算力,装不下的计算就出错;分词把字符挡在门外,拼写类任务天然吃亏。逐条归因之后,「怎么用」也就清楚了。

怪毛病从哪来:一张因果图

模型的怪毛病:一条可归因的因果链 成因 · 训练流水线里缺的一课 症状 · 你看到的怪毛病 对策 · 训练与使用两侧 1 训练集里只有自信答案 「说不知道」从未被奖励 幻觉:陌生问题也硬答 采样几次,答案还不同 补「我不知道」样本 检索工具:不确定就去查 2 没人教过它「你是谁」 互联网上某家的回答最多 身份错认 自称「某某实验室出品」 硬编码身份对话 或藏一条系统消息 3 每个 token 只过固定计算 约百层网络,算力很小 一步作答就错 数数、心算不可靠 分步写中间结果 计算交给代码解释器 4 token 里看不见字母 只看得到符号块的编号 拼写任务吃亏 字符级操作容易出错 字符操作交给代码 索引、反转、计数同理 四条链叠加=锯齿状智能:整体坚硬,到处小洞——当工具用,检查它的工作

图:四类怪毛病的因果链——成因列是训练流水线缺的一课,症状列是使用者的直观感受,对策列分训练侧与使用侧;右下奶酪块上的洞就是「锯齿」

四条链各有展开:幻觉与身份来自数据缺了什么,一步作答与拼写来自算力和表示的天花板。先看最出名的那个。

幻觉:自信是从数据里学来的

毛病出在哪一环?不是「它撒谎」,是统计模仿。训练集里每一种「X 是谁」都有自信满满的答案:标注员要么本身知道,要么查过才写。而「我不知道」这个行为,在数据里几乎从未被奖励过。

于是对一个凭空编造的人名,模型也按分布给出最像「回答」的样子。拿一个几年前的 7B 开源模型实测:同一个问题采样三次,得到科幻作家、电视剧虚构角色、小联盟棒球手三个假身份。它不是在撒谎,是在模仿「回答这类问题的格式」。

值得注意的是内部其实「知道」。网络内部很可能存在表征不确定性的激活,只是没有样本教它把这个信号翻译成「我不知道」说出口。它有疑心,没学会开口。

缓解一:把「我不知道」写进训练集

思路直接:对模型不知道的事,把理想回复改成「我不知道」。难点是先摸清它知道什么——办法是实证探测,流程四步:

  1. 从训练语料取一段文档,让 LLM 自动生成几个事实问题;
  2. 每个问题问模型三遍,用 LLM 裁判比对标准答案;
  3. 三遍都对记为「知道」,有对不上记为「不知道」;
  4. 给「不知道」的问题补一条新对话,理想回复就是「抱歉,我不记得」。

这套流程出自训练 Llama 3 时的「事实性」小节,全流程无人类参与。实测效果直观:问一位冰球守门员效力过哪支球队,模型三遍都答对,说明知道;问赢过几座总冠军,三遍三个错答案,说明不会——不会的题就补「我不记得」,让内部的不确定信号和这句话挂上钩。

缓解二:给模型一把检索工具

比「说不知道」更好的是「去查」。给模型定义两个新 token:发起搜索与结束搜索。模型发出后,运行采样的程序暂停生成,把查询交给搜索引擎,再把网页文本塞回上下文窗口,模型基于窗口里的原文继续作答、标注引用。

答不上来时的两条出路 通路一 · 改训练数据(见效在训练侧) 通路二 · 加检索工具(见效在运行时) ① 从训练文档自动生成事实问题 ② 同一问题问模型三遍 ③ LLM 裁判比对:对不上=不会 ④ 给「不会」的题补「我不记得」样本 ① 模型发出「发起搜索」特殊 token ② 采样程序暂停,拿查询去搜网页 ③ 网页文本回填进上下文窗口 ④ 继续生成,逐条标注引用 搜不搜由模型自己定:熟悉的问题直接凭记忆答,拿不准才发起检索

图:幻觉的两条缓解通路——左边是训练侧的知识边界探针管线,右边是运行时的检索工具链路(暂停步已标出);今天主流助手的「正在搜索」就是右边这条

要不要搜由模型自己定:对答案足够自信时直接凭记忆作答,拿不准才发起检索。同一个人名问题加上一句「不要使用任何工具」,经过对齐的主流助手就只能回到记忆,然后老实承认查无此人。工具检索的本质,是把参数里的「模糊回忆」换成上下文里的「工作记忆」——这正是下一对概念。

一年后的业界注脚

2025 年 9 月一篇被广泛引用的论文把成因再推了一层:幻觉之所以顽固,是因为评测打分在奖励瞎猜——像选择题乱蒙一样,多数评测里「自信地猜」的期望得分高于「承认不知道」。论文给的修法在评测侧:允许模型跳过作答,对自信的错误罚得更重。这与「数据里没有『不知道』」是同一条逻辑:奖励什么,模型就学会什么。

参数里是模糊回忆,上下文里是工作记忆

参数里的知识像一个月前读过的书:常见的内容记得牢,冷门的只剩模糊印象。上下文窗口里的 token 像摊开在眼前的书页:直接进入网络,逐字精确可读。这对区分是本篇最实用的心智模型。

先看两种知识在四个维度上的分野:

维度参数里的知识上下文里的知识
载体预训练压进权重的几十亿参数当前窗口里的 token
可靠度模糊回忆:常见牢、冷门易错逐字可见,精确
更新方式重新训练粘进对话即可
适合判断「大概是什么」精确引用、总结、核对

落到使用上就一条:要精确,给材料。让模型总结某本书的第一章,凭回忆能出个大概;把第一章原文贴进上下文再让它总结,质量显著更高——文本在窗口里时它逐字可读,不需要回忆。你重读一遍再写总结,也是同样的道理。

这个区分也是 Context 工程与 RAG 的共同出发点:把知识放进窗口,比烧进参数更便宜、可更新、可溯源。

问「你是什么模型」,答案是人写的

这个答案不是「想出来的」。模型没有持续存在的自我:每次对话从零启动,处理 token,然后清空重来。问「你是谁」,得到的只是统计上的最佳猜测。

默认的猜测常常是错的。没被专门教过身份的模型会自称「由某某实验室基于某某模型开发」——这不代表它真用了那家的数据,只因为互联网上那家的回答最多,「自称它」就成了最可能的续写。身份是一个幻觉式标签。

开发者有两种覆盖办法,都是硬编码:

  • 在微调数据里混入几百条「你是谁」的对话,答案人工写好——全开源的 OLMo 在百万级对话里就放了 240 条这样的专用样本;
  • 在对话开头插入一条 system message:藏在上下文里的身份说明,网页上那片空白输入框背后就带着它。

两种办法都是「后装上去的」,没有深层的东西。所以这类问题的答案只能当产品信息读,不能当模型的自知读。

每个 token 只有一点点算力

模型从左到右逐 token 生成,产生每个 token 都要走一遍网络。现代网络约百层的深度,决定了单次前向传播能完成的计算很小,且对每个 token 大致固定。指望在一个 token 里完成整道题的推理,物理上就不够。

两种答案的差距在哪

同一道小学题(3 个苹果、2 个橙子,橙子每个 2 美元,共花 13 美元,求苹果单价),两种写法都对,质量天差地别:

  • 坏写法:开头直接给「答案是 3 美元」。模型必须在生成这个数字的 token 里完成全部计算,后面的解释全是马后炮——答案已在上下文里,后面的字不是在算。
  • 好写法:先写中间步骤「橙子共 4 美元,13−4=9,9÷3=3」。每步只花一点点算力,中间结果躺在工作记忆里,最后轻松收尾(验算:2×2=4,13−4=9,9÷3=3)。

中间结果是写给模型自己的:不为产出这些中间 token,它就算不出最后的数。

「一步作答」实验

把要求换成「用一个 token 直接给答案」:简单数字它还能蒙对;把数字加大到 23 个苹果、177 个橙子(加大后的总价演示里没给,这里只看两种答法的对比),它给出 5——错;放开限制让它正常写步骤,得到 7——对。单次前向传播装不下的计算,逼也逼不出来。

数数是同一个病

问「下面有多少个点」,模型答 161,实际 177。在它眼里那串点只是几个 token ID,数点要在生成答案的那个 token 里一次前向传播完成——又是单 token 装不下的计算。

对策:心算不可信,代码可信

说一句「用代码做」,模型把那串点复制成 Python 字符串再调 .count(),得到 177,正确。它的贡献只是复制粘贴(它擅长),数数交给解释器(有正确性保证)。心算每个中间步都可能错,解释器不会。

这条原理放大后就是推理模型的训练思路:草稿越长、想得越充分,正确率越高——「多想」,本质上就是多花 token。

拼写为什么差:它看不到字母

模型的世界由 token 组成,一个常见英文词往往只是一两个 token ID。让你每隔三个字符取一个字母,你看得见字母所以轻而易举;模型只看到几个数字,token 里装了哪些字母还要靠训练中自己猜。字符级任务对它是天然弱项。

著名翻车题「strawberry 有几个 r」就是双重缺陷叠加:看不到字母(分词)加数数不可靠(算力),一度所有先进模型都答 2。这道题如今已被普遍修复,拿它测不出模型差距,留作感受代差用。

对策同上:字符索引、反转、计数这类操作,交给代码。主流模型自 GPT-2 起采用字节级分词,保证任何字符都能退回字节表示(见分词篇),但纯字符序列太长、成本太高,token 世界短期不会结束。

锯齿状智能:当工具用,别当权威用

9.11 和 9.9 哪个大?模型时对时错,还会自相矛盾。可解释性团队后来用激活追踪给了更细的解释:内部与圣经经文、日期相关的特征被点亮——圣经章节排序里 9:11 排在 9:9 之后——抑制这些特征后错误明显减少。但这类解释只是部分拼图,很多「锯齿」至今未被完全理解。

**这组现象的总名叫锯齿状智能(jagged intelligence):能力分布极不平滑。**整体坚硬,到处是不定时的小洞,你不知道洞在哪。

瑞士奶酪:能力分布的形状 大多数领域: 坚硬 幻觉:编造人名 数字母 r 9.11 vs 9.9 洞在哪,事先不知道 检查它的工作 把模型当工具:找灵感、写初稿、核对结论——为最终产出负责的是你

图:瑞士奶酪模型——奶酪块是模型能力,白洞是翻车点;洞的成因可归到前文四条链,位置却难预测。9.11 与数字母 r 两洞已被新模型普遍修复,感受代差用

使用心法收拢成三条:

  • 当工具用:找灵感、写初稿、问思路,不把产出直接当结论;
  • 检查它的工作:事实核对来源,数值交给代码;
  • 记得它是随机系统:同一问题重问会得到不同答案(机制见采样篇),单次结果不作数。

动手:四个现场自己复现一遍

先把同一现象在各方材料里的叫法对齐,做实验查资料时不会迷路:

本文叫法业界其他叫法
幻觉编造、捏造(fabrication)
知识边界探针事实性流程(factuality pipeline)
模糊回忆 vs 工作记忆参数化知识 vs 上下文知识(in-weights vs in-context)
锯齿状智能能力不平滑、锋利边缘(sharp edges)

任选一个网页版模型,同一会话重跑三次看波动,编号对应开篇因果图:

① 幻觉现场:编一个不存在的名字,问「X 是谁」→ 看它是否硬答;
   追加「不要联网,只用自己的知识」再问 → 对照检索通路关掉后的表现
③ 单 token 瓶颈:要求「一个字内直接给出答案」解一道多步算术题,
   数字从小到大换三组 → 找到开始出错的规模;再放开限制重问 → 对照
④ 拼写现场:让它每隔 3 个字符取字母(选一个 10 字母的词)→ 记录对错;
   追加「用代码做」→ 应当转对
② 身份实验:问「你是什么模型」→ 与官方说明对照;新开会话,
   在系统提示里写明身份再问 → 观察回答变化

读数提示:①③④ 三项在多数新模型上已大幅改善,翻不出来属正常——现象在收敛,成因分析不过期。

这些归因的边界

这套「训练成因」框架是机制直觉,不是逐案诊断工具:具体某一次错误未必能归到某一条根因,9.11 一类的问题至今只有部分解释。用它理解模型,别用它给单次错误开药方。

缓解是降低频率,不是根除:探针与检索让幻觉明显变少,但只要「自信作答」还在被奖励,它就会再出现。单点陷阱题还会随模型更新失效——本篇所有具体翻车例都带保质期,引用前先现测(翻车题的演进与探针口径,另见LLM 发展史与当前格局)。

两条下游坏味道预警:把模型产出当事实直接入库,是幻觉链在数据侧的对应坏味道,接Agent 安全边界的注入与可信问题;把心算数值直接写进生产代码,是算力链在工程侧的对应坏味道,接工具执行机制的代码解释器实践。

自测

模型对一个编造的人名给出自信答案,错在哪一步?知识边界探针和联网搜索分别从哪一环堵住它?

错在训练分布那一环:训练集里每个「X 是谁」都有自信答案,「说不知道」从未被奖励,于是模型对陌生名字也按分布硬答,即便内部已有不确定的激活信号。知识边界探针从数据侧堵:把模型答不对的问题摸出来,在训练集里补「我不知道」样本,把内部不确定信号和拒答话术挂上钩;联网搜索从运行侧堵:模型发出搜索 token,程序暂停采样、取回网页文本回填上下文,让它基于工作记忆作答——答不出时多了一条查证的路。

为什么「一步给出答案」比「写出中间步骤」更容易算错?这条原理怎么解释它数不清一串点?

产生每个 token 只经过一次前向传播,约百层网络能完成的计算很小且大致固定;「一步给答案」是把整道题的计算压进单个 token,装不下就错,而中间步骤把计算分摊到很多 token 上,每步都很轻,中间结果躺在上下文里随时可读。数不清点是同一个病:那串点在它眼里只是几个 token ID,数点要在生成答案的那个 token 里一次完成,所以数错;交给代码后,模型只负责复制字符串,真正的计数由解释器完成。

问模型「你是什么模型」,回答从哪来?要让模型报对身份,开发者有哪两种办法?

回答来自统计模仿,不是自我认知:没被教过身份的模型,会按训练分布猜一个最可能的续写,互联网上哪家助手的回答最多就自称哪家——所以答案经常是错的,只能当产品信息读。两种覆盖办法:一是在微调数据里混入几百条人工写好的「你是谁」对话(全开源模型有放 240 条的先例),训练后模型照着背;二是在对话开头插入 system message,把身份说明作为隐藏 token 放进上下文。两者都是硬编码,没有更深的东西。

总结一篇长文档,为什么「把原文贴进上下文」几乎总比「让它凭记忆答」更可靠?

参数里的知识是模糊回忆:训练时见过的内容只留下统计印象,常见内容牢、细节易错,靠它复述具体文本必然走样。上下文窗口是工作记忆:贴进去的原文逐字进入网络,精确可读、无需回忆。所以总结、引用、核对这类要精确的任务,先把材料放进窗口再做,质量显著更高;参数知识留给判断「大概是什么」。这也是 Context 工程与 RAG 的共同出发点。

参考与延伸

本节点大纲与自测题(7 个子点 · 4 问)

大纲

  • 幻觉成因:训练分布里没有「不知道」,模型对陌生问题按统计规律硬答
  • 幻觉两种缓解:知识边界探针(生成问题→反复问→裁判比对→补「我不知道」样本)、工具搜索(特殊 token 触发→暂停采样→结果回填上下文)
  • 参数知识=模糊回忆 vs 上下文窗口=工作记忆;给材料优于靠回忆
  • 自我认知是硬编码的:默认身份是统计猜测;SFT 数据混入身份对话与 system message 两种覆盖
  • models need tokens to think:每个 token 只过固定少量计算;单 token 作答实验;数数与心算交给代码解释器
  • 分词怪癖→拼写困难:模型只看 token 不看字母,字符级任务天然吃亏
  • 锯齿状智能:能力分布极不平滑(9.11 vs 9.9 的特征污染解释);瑞士奶酪模型与「当工具用、检查它的工作」

自测——答不上来就是缺口

  • 模型对一个编造的人名给出自信答案,错在哪一步?知识边界探针和联网搜索分别从哪一环堵住它?
  • 为什么「一步给出答案」比「写出中间步骤」更容易算错?这条原理怎么解释它数不清一串点?
  • 问模型「你是什么模型」,回答从哪来?要让模型报对身份,开发者有哪两种办法?
  • 总结一篇长文档,为什么「把原文贴进上下文」几乎总比「让它凭记忆答」更可靠?