🧠 大语言模型科普 · Andrej Karpathy 深度讲解

深入理解像 ChatGPT 这样的
大语言模型(LLM)

当你在输入框里打字、按下回车,屏幕另一端到底是什么?这份文档跟着 Karpathy 走完模型的完整训练链路——从下载整个互联网,到分词、神经网络、推理,再到把"文本模拟器"训练成"助手"的三大阶段,并建立一套理解模型"心理"的思维模型。

①预训练 ②监督微调 SFT ③强化学习 RL

这是一份面向普通读者的全面讲解。讲师 Andrej Karpathy 是 OpenAI 创始成员(2015),曾任特斯拉 AI 高级总监(2017–2022),现创办 Eureka Labs。目标是让你建立思考"这个工具到底是什么"的心智模型——它在某些方面神奇强大,在另一些方面很差,还有很多需要警惕的"锋利边缘"。

本文档完整保留视频转录的全部信息,并在此基础上为关键术语补充"是什么/为什么/例子"的解释,配以图标和卡片化排版。原文里的每一个事实、数据、案例都被保留,增补只用于帮助你把抽象概念理解透彻。

📑 全文导航 · 13 个章节

  1. 预训练数据(互联网)
  2. 分词 Tokenization
  3. 神经网络的输入与输出
  4. 神经网络内部结构
  5. 推理 Inference
  6. GPT-2 与 Llama 3.1 基座模型
  7. 从预训练到后训练(对话数据)
  8. 幻觉、工具调用、记忆
  9. 模型需要 token 来思考
  10. 拼写缺陷与锯齿状智能
  11. 强化学习与 DeepSeek-R1
  12. 基于人类反馈的强化学习 RLHF
  13. 未来展望与如何使用
① 预训练 读互联网 15 万亿 token 建立知识库 产出:基座模型 互联网文档模拟器 · 约 3 月 ② 监督微调 SFT 人类标注的对话数据 模仿专家回应 产出:助手模型 会问答 · 约 3 小时 ③ 强化学习 RL 做练习题 · 试错 自己发现解法 产出:思考模型 涌现思维链 · 仍很新 类比上学: 读教科书阐述 看带解答的例题 做练习题
图 1 · 三大训练阶段总览:全文的主线。预训练注入知识,SFT 赋予助手人格,RL 让模型在试错中自我进化。
🌐
第一阶段 · 预训练

第一步:下载并处理整个互联网


构建 ChatGPT 这样的东西要经过多个顺序排列的阶段。第一个阶段叫预训练(pre-training),而预训练的第一步,就是把互联网下载下来并加以处理。

要直观感受这个过程,可以看 Hugging Face 这家公司整理、创建并精选的数据集——FineWeb。他们在一篇博客里详细记录了如何构建这个数据集。所有主流 LLM 提供商(OpenAI、Anthropic、Google 等)内部都有类似 FineWeb 的等价物。

我们想要达到的目标是:从公开来源获取海量文本,要高质量、海量、且高度多样——因为我们希望模型内部装下尽可能多的知识。实现这一点相当复杂,需要多个阶段才能做好。

💾
互联网很大,但过滤后的文本并不大

FineWeb 数据集相当有代表性,但最终只占大约 44 TB 磁盘空间。这点数据一块硬盘几乎就能装下。互联网虽然庞大,但我们处理的是文本,而且做了激进的过滤,所以最后只剩 44 TB。

🕸️① 数据起点:Common Crawl

是什么

Common Crawl 是一个自 2007 年起持续爬取互联网的组织。截至 2024 年,它已索引了约 27 亿个网页。它的爬虫从几个种子网页出发,顺着所有链接一直爬下去,不断索引信息。

为什么

它是大多数预训练数据努力的起点,贡献了最终数据的大部分。但这些原始数据非常粗糙,需要经过很多道过滤工序才能用。

例子

你可以把它想象成一个"互联网的快照仓库"——里面什么都有,但也夹杂了大量垃圾、重复、隐私信息,必须先清洗。

🧹② 清洗的几道关键工序

FineWeb 的处理流程(同一张示意图里记录的)大致包含以下几步:

URL 过滤

有一份"黑名单",列出不想取数据的域名,通常包括恶意软件网站、垃圾站、营销站、种族主义网站、成人网站等。这些网站在这一步就被剔除。

文本提取

爬虫保存的是网页的原始 HTML,里面有列表、CSS、各种标记代码。但我们只想要网页的正文文本,不要导航栏之类的东西。这需要大量过滤和启发式处理,把真正的好内容提取出来。

语言过滤

FineWeb 用一个语言分类器猜测每个网页是什么语言,然后只保留英文占比超过 65% 的网页。这是一个设计决策:不同公司可以自行决定保留各种语言的比例。FineWeb 很专注英文,所以它训练出的模型英文很强,其他语言可能不太行。

去重 + PII 移除

之后还有去重等步骤,最后是 PII(个人可识别信息)移除——比如地址、社保号等,会被检测并过滤掉这类网页。

经过这一整套处理,你就得到了 FineWeb 这样的数据集。点进去能看到最终文本的样子:比如一篇关于 2012 年龙卷风的文章,或者一篇讲"你体内有两个 9V 电池大小的黄色肾上腺"的奇怪医学文章。把它们想象成各种被过滤、只留下文本的网页就行。

🧵
现在我们手里有了什么

把前 200 个网页的文本全部拼接起来,就得到一大块"原始互联网文本的织锦"。这些文本里有各种模式(pattern)。接下来要做的,就是在这堆数据上训练神经网络,让网络内化并建模这些文本的流动方式——我们想要神经网络去模仿它。

🔤
第二部分 · 表示

分词:把文本变成符号序列


在把文本喂进神经网络之前,得先决定怎么表示这些文本。我们的技术要求:神经网络期望一个一维的符号序列,而且符号集合必须是有限的。所以我们要决定符号是什么,再把数据表示成这些符号的一维序列。

现在我们手上的文本本身就是一维序列(从左到右、从上到下)。在计算机里,如果用 UTF-8 编码,就能拿到对应的原始比特(bit)。这样我们就有了恰好两个符号(0 和 1)以及一段很长的序列。

⚖️① 词汇表大小 vs 序列长度的权衡

是什么

序列长度在神经网络里是一种非常有限且宝贵的资源。我们不想要"只有两个符号、但序列极长"的表示;我们想在符号种类(词汇表)序列长度之间做权衡——更多符号、更短序列。

为什么

因为处理超长序列在计算上极其昂贵。把序列缩短,就能让有限的计算资源覆盖更多实际内容。

例子

一个朴素的压缩办法:把连续 8 个 bit 分成一组,叫一个字节(byte)。8 个 bit 只有 256 种组合,于是序列长度缩短 8 倍,但符号变成了 256 种(0–255)。

🔎 换个角度想不要把这些数字当成"数字",而要当成独一无二的 ID 或符号。甚至可以把每个数字换成一个独特的 emoji——于是你得到一串 emoji,共 256 种可能。

🧩② 字节对编码 BPE

是什么

在最先进的语言模型里,我们想进一步缩短序列,用更多符号换更短的长度。方法是运行 字节对编码(Byte Pair Encoding, BPE):寻找非常常见的连续字节对,把它们合并成一个新符号。

为什么

每合并一个新符号,序列就变短一点、符号数变多一点。可以反复迭代。实践中,一个不错的词汇表大小约为 10 万个符号。比如 GPT-4 用了 100,277 个符号。

例子

比如序列"116 后面跟着 32"非常常见,就铸造一个 ID 为 256 的新符号,把所有 116-32 改写成这个新符号。把原始文本转成这些符号(token)的过程,就叫分词(tokenization)

🎴③ 用 Tiktokenizer 看分词的样子

有个网站叫 Tiktokenizer,选 cl100k_base(GPT-4 基座分词器),左边输入文本,就能看到分词结果。一些有趣的观察:

# "hello world" → 恰好 2 个 token
hello        → token 15339
 world       → token 11917  (注意 world 前带一个空格)

# 大小写敏感、空格也算
"Hello world"  → 又是不同的分词
"hello world" 中间放两个空格 → 多出一个 token 220
"HELLO WORLD"  → 变成 3 个 token,而不是 2 个
🔢
记住这一点

一行文本在 GPT-4 看来就是一段 token 序列(比如长度 62)。这些 token 都只是小小的文本块,是序列的"原子";它们的数字编号本身没有任何数值意义,只是独一无二的 ID。共有 100,277 种可能的符号。

⚙️
第三部分 · 训练

神经网络:输入、输出与预测下一个 token


现在我们把数据集里的文本用分词器重新表示成 token 序列。回到 FineWeb,它不仅是 44 TB 磁盘空间,更是一段约 15 万亿 token 的序列。再次提醒:这些数字都代表小文本块,是序列的原子,数字本身没有意义,只是 ID。

44 TB
FineWeb 磁盘占用
15 万亿
FineWeb 的 token 总数
~8000
典型上下文窗口 token 数

🪟① 取一个 token 窗口,预测下一个

是什么

训练时,我们要建模 token 在序列中互相跟随的统计关系。做法是从数据里随机取一个 token 窗口(长度从 0 到某个最大值,比如 8000),把它当作上下文(context)喂进神经网络,让网络预测接下来的那个 token

为什么

窗口长度原则上可以任意,但处理超长窗口在计算上太贵,所以人为定一个值(4000、8000、16000 等)并在那里截断。这个最大值就是模型的最大上下文长度

例子

取 4 个 token 作上下文:bar / view / in / 空格single,网络要预测下一个 token(实际是 3962)。

🎲② 输出是一个概率分布

因为词汇表有 100,277 个可能 token,神经网络会输出同样多的数字,每个对应"该 token 是下一个"的概率。一开始网络是随机初始化的,所以这些概率也是随机的。

但我们从数据里采样了这个窗口,所以知道正确答案(标签就是 3962)。于是有了一套数学过程来更新网络:让正确 token 的概率调高一点,其他 token 的概率调低一点。下一次再喂同样这 4 个 token,网络就会给出略微调整后的预测。

🔁
并行,在整个数据集上同时发生

这个"微调推动"不只发生在某一个 token 上,而是对整个数据集里所有 token 同时进行。实践中我们采样一小批(batch)窗口,在每个 token 上都更新网络,让那个 token 的概率略微升高。这就是训练神经网络的过程——不断更新,直到它的预测与训练集的统计规律一致。

上下文(4 个 token) bar view in single Transformer 神经网络 数十亿参数 · 固定计算量/token 输出:100,277 个 token 的概率分布 space 4% 11799 2% post(3962)✓ 更新网络(训练) ✓ 已知正确答案 = 3962(post) ↑ 把正确 token 的概率调高一点 ↓ 把其它所有 token 的概率调低 在全数据集所有 token 上 并行重复 → 预测逼近真实统计
图 2 · 预测下一个 token 的训练循环:网络对每个位置输出概率分布,再通过更新把"正确答案"的概率往上推。推理时则是反过来——按这个分布"抛硬币"采样。
🔬
第四部分 · 内部

神经网络内部:参数、Transformer 与"巨大的数学表达式"


输入 X 是 token 序列(0 到约 8000 个)。这些输入会和网络的参数(权重)一起,混进一个巨大的数学表达式。视频里只画了 6 个示例参数,但现代网络有数十亿个参数

🎛️① 参数就像 DJ 调音台上的旋钮

是什么

一开始参数完全随机,网络做的预测也完全随机。通过反复迭代更新(这个过程就叫训练),参数被调整,使网络输出与训练集中的模式一致。

为什么

把参数想成调音台上的旋钮,拧动它们就会对每种可能的 token 输入给出不同预测。训练神经网络,本质就是找到一组让预测符合训练集统计规律的旋钮设置

例子

这个数学表达式其实不可怕:输入 x1、x2 和权重 w0、w1、w2…… 混在一起,做的只是乘法、加法、指数、除法这类简单运算。神经网络架构研究,就是设计出"有表达力、可优化、可并行"的数学表达式。

🏗️② Transformer 架构

是什么

生产环境里用的这种特殊结构叫 Transformer。视频里展示的可视化例子约有 85,000 个参数。顶部输入 token 序列,信息流经网络,最后输出 logits/softmax——也就是对下一个 token 的预测。

为什么

token 先被嵌入(embed)成分布式表示(每个 token 对应一个向量),然后这些值流过层归一化(layer norm)、矩阵乘法、softmax、注意力块(attention)、多层感知机(MLP)等一系列简单的数学变换。这些中间值你可以松散地类比成合成神经元的"放电率"。

例子

但要小心别把它当成真正的脑神经元——生物神经元是有记忆的复杂动态过程,而这里没有记忆,是一个从输入到输出、无状态的固定数学表达式。可以把它想成一小块"合成脑组织"。

📣
核心要点

不必纠结所有变换的数学细节。真正重要的是理解:这是一个由固定参数(比如 85000 个)参数化的数学函数,把输入变成输出。拧动参数会得到不同预测,而我们要找到一组好参数,让预测匹配训练集的模式。这就是 Transformer。

🎰
第五部分 · 推理

推理:从模型里"抛硬币"生成新数据


训练之外的另一大阶段是推理(inference)——从模型生成新数据,看看它在参数里内化了什么模式。

🪙① 抛一枚"有偏的硬币"

是什么

从一些起始 token(前缀)开始,喂进网络,网络给出概率向量。我们根据这个分布采样一个 token——就像抛一枚有偏的硬币:模型给的概率越高,越可能被抽中。抽到一个 token 后追加进去,再问下一个,如此循环。

为什么

因为是采样,系统是随机的(stochastic)。有时会复现训练数据里的某个小片段,但更多时候会得到训练文档里没有逐字出现过的 token。所以生成的内容是训练数据的"混音(remix)"——统计性质相似,但不完全相同,像是受训练数据启发而来。

例子

从 token 91 开始,采样得到 860,再得到 287……到第四个时抽到的是 token "article"(13659),而不是训练里原本的 3962。于是序列就和训练数据分叉了——因为每一步都在抛硬币,运气不同,会走向很不一样的模式。

🗣️
你在 ChatGPT 上看到的,就是纯推理

下载互联网并分词是一次性的预处理;有了 token 序列后才开始训练许多不同设置的网络。训练完、对参数满意后,就可以做推理。当你和 ChatGPT 对话时,模型早在几个月前就训练好了,参数固定不变——你看到的生成,全部都是推理,没有任何训练在进行。它只是在续写 token 序列

🦙
第六部分 · 真实模型

GPT-2 与 Llama 3.1:具体的训练与基座模型


📜① GPT-2:第一个"可辨认的现代技术栈"

GPT 意为"生成式预训练 Transformer(Generatively Pre-trained Transformer)"。GPT-2 由 OpenAI 于 2019 年发表。Karpathy 喜欢它,因为它第一次把现代技术栈以可辨认的形态组合起来——今天的一切都能在 GPT-2 里认出来,只是后来一切都变大了。

GPT-2 的规格

Transformer 神经网络,16 亿参数(原文口误为 1.6 billion,论文为 15 亿),最大上下文长度 1024 token,训练数据约 1000 亿 token。这些数字按今天标准都很小:现代 Transformer 接近上万亿或几千亿参数,上下文长度几十万甚至上百万,FineWeb 则有 15 万亿 token。

成本为何暴跌

Karpathy 在 llm.c 项目里复现了 GPT-2。2019 年训练 GPT-2 估计约 $40,000;如今约一天、$600 就能完成,甚至可压到约 $100。原因:① 数据集质量大幅提高、过滤更精细;② 最大的差别是硬件变快了很多;③ 软件也优化得更好,能榨干硬件速度。

训练时的体感

训练界面里,每一行就是对模型的一次更新,每次改善对 100 万 token 的预测。要紧盯一个叫 loss(损失)的数字——它衡量网络当前表现,越低越好。研究员就是边喝咖啡边等 loss 下降。

🔎 一组实测数字每次更新处理 100 万 token、约 7 秒;总共 32000 步,即约 330 亿 token。第 1 步时输出完全随机;到 1% 时已有局部连贯性(但仍像胡言乱语);跑完 32000 步后,就能生成相当连贯的英文了。

$40,000
2019 年训练 GPT-2 的估算成本
~$600
如今复现一次的成本(约一天)
8×H100
作者租用的云端单节点配置

🖥️② 算力:GPU、数据中心与"淘金热"

是什么

这种优化跑在云端的 8×H100 节点上(8 块 H100 GPU 在一台机器里)。作者从 Lambda 这类公司租用,按需价格约 每 GPU 每小时 $3

为什么用 GPU

GPU 非常适合训练网络:计算虽贵,但展现出大量并行性——许多独立的"工人"可同时求解训练背后的矩阵乘法。把 8 块 GPU 堆成一个节点,多个节点堆成数据中心或整个系统。

例子

所有大科技公司都极度渴望 GPU,这正是把英伟达股价推到约 $3.4 万亿(视频录制时)的根本原因。这就是"淘金热"——抢到足够多的 GPU 协同优化。比如有报道称马斯克在单个数据中心部署 10 万块 GPU,它们都只在做一件事:预测数据集里的下一个 token 并改进网络

📦③ 什么是"基座模型"?发布它需要什么?

是什么

预训练结束时产出的模型叫 基座模型(base model)。它本质是一个"互联网文本 token 模拟器"。它本身还不直接有用,因为我们想要的是能回答问题的"助手",而基座模型只会生成互联网网页的"混音"、做"网页梦境"。

为什么很少发布

基座模型只是后续几步里的第一步,所以厂商通常不发布。但也有例外:2019 年发布的 15 亿参数 GPT-2 就是基座模型。发布一个基座模型需要两样东西。

两样东西

① 代码:描述网络运算顺序的 Python 代码(即前向传播 forward pass),通常只有几百行,相当标准、易懂。
② 参数:真正有价值的东西——这一长串数字(GPT-2 约 15 亿个)是所有旋钮的精确、良好设置。

🦙④ Llama 3:更大更现代的开源基座

Llama 3 由 Meta 训练发布,方式与 GPT-2 相同但大得多:最大基座模型 Llama 3.1 405B(4050 亿参数,在 15 万亿 token 上训练)。Meta 同时发布了基座模型和 instruct(指令)模型——后者就是能问答的"助手"(后面章节会讲)。

🔮⑤ 把玩基座模型,看它都学到了什么

作者用 hyperbolic 网站(托管 Llama 3.1 405B 基座)演示。注意:务必选"base"基座版本。几个关键观察:

还不是助手

问它"2+2 等于几",它不会答"是 4,还能帮你什么"。"2+2" 只是被当作前缀,模型只是个极其昂贵的自动补全,按训练文档(网页)的统计去续写。而且它是随机的:同样的前缀每次给出不同答案,因为每次都从概率分布里重新采样。

却已学到海量世界知识

尽管还不能直接当助手用,但在"预测下一个 token"的任务中,模型已经学到大量关于世界的知识,并存进了参数。可以把 4050 亿参数看成互联网的一种压缩——但不是无损压缩,而是有损压缩,留下的是互联网的"模糊轮廓(gestalt)"。

例子

用"巴黎十大必看地标"这样的提示去"诱导"知识,它会续写出一份列表。但不能完全信任:互联网上出现频率高的东西更可能被正确记住,稀有的则未必。知识不是显式存储的,而是对互联网文档的模糊、概率性、统计性的回忆

🔎 三个行为演示逐字背诵:给它维基百科"斑马"词条的第一句,它能凭记忆逐字复述一大段(这叫"反刍 regurgitation",通常不被期望)——因为高质量来源(如维基)在训练时会被优先重复采样,模型可能"见过这页 10 次"。
幻觉:用未来事件(如 2024 大选,而数据截止 2023 年底)做前缀,它会瞎猜——一次说副手是彭斯、对手是希拉里;重采一次又说是德桑蒂斯、对手是拜登和哈里斯。这就是平行宇宙式的幻觉
少样本学习:给 10 对"英文:韩文"翻译,它能在上下文中识别出算法模式并续写正确翻译——这叫上下文学习(in-context learning)
"伪装"成助手:把提示写成"AI 助手与人类的对话网页",基座模型就会续写出助手的角色,从而被巧妙地当助手用。

💬
第二大阶段 · 后训练

从基座到助手:用对话数据做监督微调


小结一下到目前为止:预训练把互联网文档拆成 token、用神经网络预测 token 序列,产出基座模型——一个 token 级别的互联网文档模拟器。但我们要的是助手,能提问、能得到答案。于是进入第二大阶段:后训练(post-training)

⏱️
后训练便宜得多

预训练在实践中可能要在数千台计算机上训练约三个月;后训练通常短得多,比如三小时。因为人工构建的对话数据集,比整个互联网的文本小得多。但算法完全一样——只是换掉数据集

🗂️① 用"对话"替换"互联网文档"

是什么

我们想让模型不再生成互联网文档,而是回答问题。于是构建多轮对话数据集:人类与助手之间的对话。比如人类问"2+2 等于几",助手答"2+2=4";追问"如果是乘呢",助手回应;遇到不该帮的请求,则产生拒绝(refusal)

为什么是"以例编程"

因为是神经网络,我们无法用代码显式编程助手的行为,一切都通过在数据集上训练来隐式编程。我们拿预训练得到的基座模型,把互联网数据集扔掉,换成对话数据集继续训练。模型会很快调整,学会"助手该如何回应人类"的统计规律。

数据从哪来

来自人类标注员(human labelers)。给他们对话上下文,让他们写出理想的助手回应,模型再去模仿。一个真实数据集可能有几十万条多轮、长篇、覆盖多样话题的对话。

📨② 如何把对话变成 token 序列

一切都得变成 token。这类似互联网上的 TCP/IP 数据包——需要精确的规则和协议来表示、结构化信息。各家 LLM 格式略有不同,目前还是"狂野西部"。以 GPT-4o 为例:

# 一段用户↔助手两轮对话 → 最终 49 个 token
<|im_start|>user<|im_sep|> 什么是 2+2 ? <|im_end|>
<|im_start|>assistant<|im_sep|> 2+2 是 4 <|im_end|>
# im_start = "imaginary monologue start"(想象独白开始)
# user 是 token 428,im_sep 是内部独白分隔符
关键:特殊 token

<|im_start|> 这类不是文本,而是后训练阶段全新创建的特殊 token,此前从未被训练过。它们与文本穿插在一起,让模型学会"这是某一轮的开始,这一轮属于 user / assistant"。

推理时

当你在 ChatGPT 输入"如果是乘呢",OpenAI 服务器会构造好上下文,在末尾放上 <|im_start|>assistant<|im_sep|>,然后让模型从这里开始采样,逐个 token 生成回应。细节不重要,重点是:对话这种结构化对象,经编码后变成一维 token 序列,于是之前所有方法都能照用。

👷③ InstructGPT:人类标注员怎么工作

是什么

OpenAI 2022 年的 InstructGPT 论文,首次公开讲了如何在对话上微调语言模型。论文 3.4 节提到,他们通过 Upwork 或 Scale AI 雇佣人类承包商来构建对话:标注员既要想出 prompt,也要写出理想的助手回应

理想回应的标准从哪来

来自公司写的标注指南(labeling instructions)。高层原则就是:有帮助(helpful)、真实(truthful)、无害(harmless)。真实的指南通常有几百页,标注员要专业地学习后照着写。所以这是个非常依赖人力的过程。

例子

标注员想出的 prompt 比如:"列出 5 个重燃职业热情的点子""我接下来该读的十大科幻小说""把这句话翻译成西班牙语"。InstructGPT 的数据集从未公开,但有开源复现,如 Open Assistant——网友们照着写出类似对话(例如"用例子简要介绍经济学中边际效用的相关性",再续写助手回应和追问)。

🤖④ 如今:LLM 帮忙造数据集

过去 2–3 年技术栈进步了:现在很少由人类从零写回应,更常见的是用已有的 LLM 生成答案,人类再编辑。像 UltraChat 这类现代数据集很大程度是合成的,但通常仍有人类参与。这些数据集如今已有数百万条对话,跨越巨大的话题多样性,是"部分合成、部分人工"的 SFT 混合数据集。

🪄
破除"和神奇 AI 对话"的幻觉

当你在 ChatGPT 提问,回来的内容在统计上对齐于训练集,而训练集的种子是人类遵循标注指南写出来的。所以你不是在和某个神奇 AI 对话,而是在和一个"人类标注员的统计模拟"对话——想象在问"一个标注员在这种对话里会怎么回答"。而且这些标注员往往是被公司雇来的受过教育的专家(比如代码问题会找懂代码的人),你像是在询问这类人的"瞬时模拟"。

再举个具体例子:问"推荐巴黎五大必看地标"。如果这个问题恰好在 OpenAI 的后训练数据集里,你很可能看到与标注员所写非常相似的答案(标注员自己上网研究 20 分钟列出清单)。如果不在数据集里,得到的就更涌现(emergent)一些——模型结合预训练知识(它见过大量关于巴黎、地标的对话)和后训练数据,做出统计性的模仿。

🧠
LLM 心理学 · 一

幻觉、工具调用与"记忆 vs 工作记忆"


接下来谈 Karpathy 所说的"LLM 心理学"——训练流程带来的涌现认知效应。第一个就是幻觉(hallucination):模型凭空编造信息。

🌫️① 幻觉从何而来

是什么

设想训练集里有很多"某某是谁"的对话:汤姆·克鲁斯是演员、约翰·巴拉索是参议员……人类标注员写答案时,要么知道这人、要么上网查,然后用自信的口吻写下答案。

为什么会编造

于是测试时你问一个根本不存在的名字(如 Orson Kovats),模型不会说"我不知道"——即便它内部某些特征/激活其实"知道"这人很陌生。因为它在统计上模仿训练集:训练集里"某某是谁"都被自信地正确回答,所以它会沿用这种风格,给出统计上最可能的猜测,然后编造。这些模型不上网、不做研究,只是 token 采样器。

例子

用旧模型 Falcon-7B 问 Orson Kovats:一会儿说他是美国科幻作家,重采一次说是 1950 年代电视剧虚构角色,再来一次说是退役小联盟棒球运动员——全是胡编。而最新的 ChatGPT 会告诉你"没有这个知名人物",说明幻觉已被缓解。

🩹② 缓解一:教模型说"我不知道"

是什么

需要在数据集里加入这样的样本:对于模型确实不知道的事实,正确答案就是"我不知道"。关键问题是:怎么知道模型知不知道?答案是用经验去探测(probe)模型,找出它知识的边界。

Meta 在 Llama 3 里怎么做

① 取训练集里一段文档,用 LLM 基于该段生成事实性问答(信息就在上下文窗口里,LLM 能高准确率地重构);② 拿这些问题反复盘问模型(比如 3–5 次);③ 用另一个 LLM 当裁判,比对模型答案与正确答案是否一致。

例子

问"他为哪支球队效力"——模型 3 次都答"布法罗军刀队",正确,说明它知道。问"他赢了几次斯坦利杯"(正确答案 2)——模型一会儿说 4 次、一会儿说没赢过,显然不知道。于是新增一条训练样本:该问题的答案是"抱歉,我不记得了"。这样模型就有机会把"不确定神经元"和"基于知识的拒绝"关联起来,大幅缓解幻觉。

🔧③ 缓解二:给模型工具(联网搜索)

是什么

比"说不知道"更进一步:让模型像人一样查资料。引入新的特殊 token 和协议,模型可以发射 <SEARCH_START> 查询词 <SEARCH_END>

为什么有用

当采样程序看到 SEARCH_END,就暂停生成,去 Bing/Google 搜索,把检索到的文本(可能用其他特殊 token 包裹)复制粘贴进上下文窗口。把上下文窗口想成模型的工作记忆(working memory)——里面的数据可被模型直接访问,不再是模糊回忆。教会模型用工具,同样靠几千条示范对话。

例子

问 ChatGPT"Orson Kovats 是谁",它判断这是稀有人物,于是触发联网搜索(界面会闪一下"搜索网络"),把网页文本塞进上下文,再附上引用来源作答。你也可以说"别用工具",它就只靠记忆回答。

📣
最重要的心理学要点

参数里的知识 = 模糊的回忆(像你一个月前读过的东西);上下文窗口里的 token = 工作记忆(像你几秒前刚经历的、可直接调用)。这对实际使用很有启发。

📖只说"总结《傲慢与偏见》第一章"
靠模糊回忆,因为这是名著、网上讨论多,质量尚可但有限。
依赖记忆
📎把第一章原文粘贴进去再让它总结
模型可直接访问原文,无需回忆,总结质量显著更高——就像你重读一遍再总结。
质量更高

🪞④ "你是谁?":模型的自我认知

网上常有人问 LLM"你是什么模型、谁造的"。Karpathy 说这问题有点无意义:这东西不是人,没有持久存在——它启动、处理 token、然后关闭,对每个人都如此。每次对话都从零重启,没有持久的自我,只是个遵循训练集统计规律的"token 翻滚器"。

默认会瞎答

如果不显式编程,问"你是谁"会得到相当随机的答案。比如 Falcon 会说"我由 OpenAI 基于 GPT-3 构建"——纯属编造。很多人以为这证明它用了 OpenAI 数据,但未必:这只是它幻觉出的自我标签,因为互联网上有海量来自 ChatGPT 的此类回答,于是它默认自己是"OpenAI 的 ChatGPT"。

两种覆盖方式

① 硬编码对话:如 Allen AI 的开源模型 OLMo,在 100 万条 SFT 混合数据里专门放了 240 条硬编码对话("告诉我你自己"→"我是 Allen 人工智能研究所开发的开放语言模型……"),模型训练后就会复述。
② 系统消息(system message):对话开头有一条隐藏的系统消息,硬编码提醒模型"你是 ChatGPT-4o、由 OpenAI 开发、知识截止某日"。这些 token 在上下文窗口里,提醒模型它的身份。

本质

无论哪种方式,自我认知都是被"编造并栓上去"的,并不像人那样真正深植于内。

🧮
LLM 心理学 · 二

模型需要 token 来思考:把计算摊开在多个 token 上


构造对话样本时有很多"锋利边缘"。看这道题:Emily 买 3 个苹果和 2 个橙子,每个橙子 $2,总价 $13,问每个苹果多少钱? 有两个都得出正确答案(3)的回应,但其中一个明显更好

① 为什么"每个 token 的计算量是有限的"

是什么

模型在训练和推理时,都在从左到右处理一维 token 序列。从前一段 token 到"下一个 token 的概率",中间只经过有限的计算层数(现代 SOTA 网络约 100 层)。所以每个 token 上花的计算量大致固定,而且很小

为什么影响答案质量

模型无法在单次前向传播里完成任意大的计算。因此必须把推理分摊到许多 token 上,不能指望任何单个 token 承担太多计算。

两种答案的对比

差答案:"答案是 $3"——直接把全部计算硬塞进"3"这一个 token,后面的文字只是事后辩解(答案早已生成在上下文里,没真在算)。这等于训练模型"一个 token 猜出答案",注定不可靠。
好答案:逐步给出中间结果(橙子共 $4,所以 13−4=9,再 9÷3=3)。每一步计算都不贵,模型从左到右慢慢逼近答案,到末尾时所有中间结果都在工作记忆里,得出 3 就容易多了。

⚠️
实测:逼模型"一个 token 内算完"会出错

简单数字时,要求"只用一个 token 立刻给答案",它居然能做到(其实是 2 个 token,因为 $ 是独立 token)。但把数字改大(23 个苹果、177 个橙子),它一口气给出 5——错了。允许它正常摊开计算后,它逐步得出正确答案 7。可见单次前向传播塞不下太多计算。

🐍② 更稳的做法:让模型用代码工具

Karpathy 说实践中他不完全信任模型的"心算"(每个中间步骤原则上都可能出错)。所以他会说"use code(用代码)"。代码是 ChatGPT 可用的工具之一:模型写出 Python 程序,程序被送到计算机的另一部分真正运行,再把结果返回。Python 解释器的正确性保证,远高于语言模型的心算。

🔢③ 同理:模型不擅长数数

是什么

问"下面有多少个点",模型想在单个 token、单次前向传播里数完,计算量根本不够。它把一组点看成一两个 token,结果常数错(比如该 177 个却说 161)。

用代码巧解

说"use code"就对了。这其实把难题拆成了模型擅长的子任务:模型不会数数,但很擅长复制粘贴。它把输入的 token 复制成 Python 字符串,再调用 .count()解释器去数,于是得出正确的 177。

🧰
本节口诀

模型需要 token 来思考。把计算分摊到多个 token、让模型产出中间结果;能用工具就用工具,别让模型把所有事都在"脑内"完成——它脑内算的东西,不能完全信任。

🪚
LLM 心理学 · 三

拼写缺陷与"锯齿状智能"


✂️① 为什么模型拼写差

是什么

模型看不到字符,只看到 token(小文本块)。它的整个世界是 token,不像我们的眼睛能看到一个个字母。所以字符级任务常常失败。

例子

让它"把 ubiquitous 每隔三个字符打印一个、从第一个开始",它做错了。因为 ubiquitous 在分词器里是 3 个 token,模型无法像我们一样直接索引单个字母。用 code 就行——把单词复制进 Python 解释器去操作字符,轻松得到正确结果。

🍓 著名的"strawberry"难题"strawberry 里有几个 r"曾让一众 SOTA 模型坚称只有 2 个(实际 3 个)。原因是双重叠加:① 模型看不到字符(分词所致);② 模型不擅长数数。我们之所以还用 token,主要是为了效率;有人想做字符级/字节级模型,但那会产生超长序列,目前没人知道怎么处理。

🧀② 锯齿状智能与"瑞士奶酪"模型

是什么

模型有一些说不通的奇怪短板。比如问"9.11 和 9.9 哪个大",它会说 9.11 更大(错误),有时中途改口、有时又答对,很不稳定。可它却能解奥赛级数学、答博士级理化生问题。

一个可能的解释

有团队研究发现:当模型处理"9.11 vs 9.9"时,网络里一批通常与《圣经》经文关联的神经元被激活。在圣经语境下,9.11 排在 9.9 之后(更"大"),模型似乎被这种联想"分心"了,即便它一边用数学论证,最后仍给出错误答案。这个现象尚未被完全理解

如何看待

把它当成它本来的样子:一个随机的、神奇但不能完全信任的系统。模型能力像"瑞士奶酪"——大体很强,但布满随机的"洞",你不想一脚踩进去。要把它当工具用,而不是把问题丢给它就直接复制结果。

🎓
第三大阶段 · 强化学习

强化学习:让模型在"练习题"中自我发现解法


📚① 用"上学"类比三大阶段

教科书里有三类信息,恰好对应训练的三阶段:

阐述/背景知识

课文的大部分是阐述(exposition)。阅读这些就相当于预训练——建立知识库、获得领域感觉。

带解答的例题

专家(作者)既给问题也给完整解答,相当于助手的"理想回应"。模仿这些专家数据,就相当于监督微调(SFT)

练习题

只给问题和最终答案(答案页),不给解法。你要自己试错、发现哪条路最能到达正确答案。这就是强化学习(RL)

🤔② 为什么需要 RL:人类不知道哪种解法最适合模型

是什么

同一道题有多种到达答案 3 的解法(列方程、用英文讲、直接跳到答案)。解法有两个目的:① 得到正确答案;② 对人类呈现得好看。先只关注"正确"这一目的。

为什么人类标注会失灵

因为对人类容易/困难的,和对 LLM 容易/困难的不一样——它们的认知不同。某个 token 上"30−4÷3"这种跳跃对人很简单,但对模型可能太大、会算错;反过来,我对模型平凡的东西又在浪费 token。模型可能有我没有的博士级知识,我也可能注入它参数里没有的知识、造成困惑的跳跃。所以人类不在好位置替模型标注最优 token 序列。

结论

我们需要让 LLM 自己发现对它有效、能可靠到达答案的 token 序列——通过强化学习的试错来发现。SFT 只是把模型初始化到正确解法的"附近"。

🔁③ RL 怎么运作:猜测—检验—强化

是什么

对同一个 prompt,让模型并行生成大量解法(实践中可能上千甚至上百万个)。因为模型是随机系统,每次生成都不同。我们知道正确答案,于是检验哪些解法对了。

为什么有效

对得到正确答案的解法加以鼓励:把这些(由模型自己产生、非人类标注的)序列拿来训练。比如 15 个解法只有 4 个正确,就取其中最好的一个(可能最短、最漂亮),训练后模型未来更可能走这条路。这就像学生看自己的解答:"这个方法管用,以后就这么解。"

例子

同时在成千上万个 prompt(数学、物理等)上、每个 prompt 上千个解法地迭代。模型逐渐为自己发现能可靠到达正确答案、不做认知跳跃、充分利用自身知识的 token 序列。这就是强化学习:猜测、检验、多做有效的

同一个 Prompt 并行生成大量解法(可上千个) 解法 ✓ 到达正确答案 解法 ✗ 答案错误 解法 ✓ 到达正确答案 解法 ✗ 答案错误 解法 ✓ 到达正确答案 检验 对照答案,挑出最优解 强化 训练这些好序列 未来更可能走这条路 循环迭代:模型自己发现对它有效的解题路径(非人类标注)
图 3 · 强化学习:猜测 → 检验 → 强化。关键在于解法由模型自己生成,人类只提供"最终答案"做对错判定——这正是 DeepSeek-R1 中"思维链"涌现的机制。
👶
训练 LLM ≈ 训练孩子

预训练 = 读所有教科书的阐述、建知识库;SFT = 看专家的全部例题、学会模仿(但有点盲目);RL = 做所有练习题,自己发现解法。不同的是,我们得为 LLM跨所有人类知识学科编写教科书。前两阶段已是行业标准多年,而 RL 这一阶段还很新、尚未标准化

🐋④ DeepSeek-R1:把 RL 公开讲清楚的论文

是什么

许多公司(如 OpenAI)内部早就用 RL 微调,但不公开。中国公司 DeepSeek 最近的论文第一次非常公开地讲了对 LLM 做 RL 微调、它有多重要、如何激发推理能力,并给出了复现所需的细节。这重新点燃了业界对 RL 的公开兴趣。

关键发现

定量:随着上千步更新,模型解数学题的准确率持续攀升。② 定性更震撼:优化后期,模型每个回应的平均长度变长——它学会用更多 token、生成很长的解法来获得更高准确率。

"思维链"是涌现的

解法变长,是因为模型开始出现这样的行为:"等等,等等,这是个值得标记的时刻,让我重新逐步评估……"。它在重新评估、从不同角度尝试、回溯、重构——这些正是人类解题时脑子里(而非写在纸上)做的事。没有任何人能把这些硬编码进"理想回应",它只能在 RL 中被发现。模型学会了所谓思维链(chain of thought),这是优化的涌现性质,既撑长了回应、也提高了准确率。

💭⑤ "思考模型"长什么样,在哪里用

把同一道苹果题给推理/思考模型(经 RL 训练),你能看到它在"思考":先推导出 $3,然后"等一下,我再检查一遍",换个角度设方程验证,"嗯,确实是 $3,我有信心",最后才为人类写出漂亮解答并框出答案。这种思考过程正来自 RL,也是这里看到"啊哈时刻"和各种策略的原因。

何时用思考模型

需要高级推理(数学、代码)时用思考模型,但要多等它"想"一会儿。Karpathy 自己约 80–90% 的使用是 GPT-4o(简单的知识性问题没必要思考 30 秒),遇到难题才转向思考模型。(注:视频录于 2025 年初,称当时 Anthropic 尚未提供思考模型——这一情况此后已发生变化。)

♟️⑥ AlphaGo 的启示:RL 能超越人类

RL 的强大并非新鲜事。DeepMind 的 AlphaGo 就是例证。论文里有张关键图:对比监督学习(模仿人类专家棋手)和强化学习训练的模型的 ELO 等级分。

监督学习的天花板

只模仿人类专家,你会进步,但会触顶,永远超不过李世石这样的顶尖棋手——因为单纯模仿,根本上无法超越被模仿的人。

RL 不受人类水平约束

RL 中,系统通过自我对弈做 rollout(与苹果题一样的图,只是没有 prompt,而是固定的围棋规则),把导向胜利的下法强化。它学到"统计上能赢"的行动序列,可以显著超越顶尖人类。

著名的"第 37 手"

AlphaGo 在对局中走出一手人类专家几乎不会下的棋(人类下出该手的概率约 万分之一),当时连解说都以为是失误,但事后看是神之一手。RL 在自我对弈中发现了人类未知、却绝妙的策略。

🚀
在开放思维领域里的"第 37 手"会是什么?

RL 不被训练数据(英文)的分布束缚。原则上,语言模型若持续扩展这一范式,可能发现人类想不到的类比、全新思维策略,甚至发明一种比英文更适合思考的语言。要实现这一切,需要大量、多样的练习题(游戏环境)让策略得以精炼——这正是当前前沿 LLM 研究的重点:为所有知识领域创造海量练习题。

🎭
强化学习 · 不可验证领域

RLHF:在"无法验证"的领域里做强化学习


前面所有问题都在可验证领域(答案是 3,容易自动打分:对答案查相等,或用 LLM 裁判)。但不可验证领域(写笑话、写诗、做摘要)难以给解法打分——比如"写个关于鹈鹕的笑话",可以生成很多个,但怎么评分?

⚠️
朴素做法不可行

原则上可让人类逐个看笑话打分,但 RL 要做上千次更新、每次上千个 prompt、每个 prompt 上百/上千个生成。Karpathy 算过:这需要让人类评估笑话约 10 亿次——海量人力看着一堆烂笑话,完全不可扩展。

🎯① RLHF 的核心技巧:间接(indirection)

是什么

基于人类反馈的强化学习(RLHF)由当时在 OpenAI 的团队提出(其中许多人现为 Anthropic 联合创始人)。技巧是:只让人类参与一点点,训练一个独立的神经网络——奖励模型(reward model),让它模仿人类打分

为什么能扩展

奖励模型成为"人类偏好的模拟器"。有了它,就能无限次查询这个模拟器、全自动地对它做 RL,而不必每次问真人。模拟器虽不完美,但只要在统计上接近人类判断,就能起作用。

训练奖励模型的过程

对一个 prompt 生成 5 个笑话,让人类从最好到最差排序(排序比直接打分更容易、对人更友好)。奖励模型(独立的 Transformer、纯打分而非生成)对每个"prompt+笑话"输出一个 0 到 1 的分数。用数学方法让模型打分与人类排序保持一致:模型给的分若与人类排序冲突,就更新它(比如人类排第二的笑话模型只给 0.1,就把分数往上推)。如此反复,奖励模型越来越像人类打分的模拟器。

🔎 规模对比不再需要 10 亿次人工评估,而是约 1000 个 prompt × 每个 5 个生成 = 约 5000 个笑话让人类排序即可。

① 人类只需"排序" 约 5000 个笑话即可(非 10 亿次) 🥇 笑话 B ← 最好 🥈 笑话 D 🥉 笑话 A 4️⃣ 笑话 E 5️⃣ 笑话 C ← 最差 ② 奖励模型 独立的神经网络 输入:prompt + 一个笑话 输出:0~1 的分数 ↑ 训练它,使打分与人类排序一致 ③ 对"模拟器"做 RL 无限次查询,全自动打分 在不可验证领域也能跑 RL ⚠ 但只能跑几百步,否则被钻空子 跑太久 → RL 发现对抗样本(如 "the the the" 竟被打 1.0 分) 所以 RLHF "不是有魔力的 RL",只是小幅微调
图 4 · RLHF 的间接技巧:人类排序 → 训练奖励模型当"人类偏好模拟器" → 对模拟器做 RL。好处是把"生成"难题换成更易的"判别",代价是模拟器可被博弈。

👍② RLHF 的好处

能在任意领域跑 RL

让我们能在不可验证领域(摘要、写诗、写笑话等创意写作)用上 RL 这套强大技术。经验上,正确做 RLHF 能让模型变好一点

为什么变好:判别 vs 生成的差距

Karpathy 的最佳猜测是 判别器—生成器差距(discriminator-generator gap):对人类而言,判别(分辨好坏)往往比生成容易得多。在 SFT 里我们要人类写出理想回应(写诗、写笑话很难);RLHF 则只要人类从 5 个里挑出排序,任务简单得多,能产出更高准确度的数据。系统随后在 RLHF 中发现那些会被人类高分评价的回应。

🚨③ RLHF 的严重缺陷:奖励模型会被"钻空子"

缺陷一:有损模拟

我们不是对真实人类判断做 RL,而是对人类的有损模拟做 RL。这个模拟可能误导,因为它只是个输出分数的语言模型,未必在所有情况下都准确反映真人意见。

缺陷二:RL 极擅长"博弈"模拟

更微妙也更致命:RL 极其擅长发现欺骗奖励模型的方法。奖励模型是有数十亿参数的庞大神经网络,存在大量对抗样本(adversarial examples)——某些不在训练集里的奇怪输入,会莫名其妙拿到极高分。

"the the the"的荒诞例子

若 RLHF 跑太久(比如 1000 步更新):前几百步笑话确实在改善,然后突然崩塌,开始产出无意义结果——比如关于鹈鹕的"头号笑话"竟变成 the the the the。你以为该得 0 分,奖励模型却给它打 1.0 分,认定是顶级笑话。你可以把它加进数据集打低分,但对抗样本是无限的,这游戏永远赢不了。

📣
"RLHF 不是(那种有魔力的)RL"

所以 RLHF 只能跑几百步更新,然后必须叫停、收工发布——不能像可验证领域那样无限跑。可验证领域(答案对错分明、AlphaGo 的输赢)无法被钻空子,能跑成千上万步、发现疯狂而强大的新策略,真正"超越李世石"。而奖励模型可被博弈,所以 RLHF 更像是一点小小的微调改进,而非"投入更多算力、跑更久就能得到神奇结果"的真正 RL。GPT-4o 经过了 RLHF(因为它确实有效),但这只是个小幅提升的微调。

🔭
展望 · 追踪 · 使用

未来能力、如何追踪进展与在哪里使用


🚀① 即将到来的能力

📡② 如何追踪 LLM 进展(三个资源)

LM Arena 排行榜

基于人类盲测对比(不知道是哪个模型,只选更好的答案)来排名。视频录制时 Google Gemini 居首、OpenAI 紧随、DeepSeek 第三(MIT 开放权重,十分罕见)。注意:Karpathy 说近几个月该榜有点被"刷分",他已不像以前那样信任——建议当作初筛,然后亲自试几个模型。(他举例:很多人爱用的 Anthropic Claude Sonnet 排在第 14,而用 Gemini 的人没那么多却排得很高。)

AI News 邮件简报

由 swix 等人维护,几乎每隔一天一期,极其全面(部分人工撰写、大量由 LLM 自动构建)。读完基本不会错过重大进展;顶部的摘要质量尤其好。

X(Twitter)

大量 AI 动态发生在 X 上,关注你信任的人即可获取最新资讯。

🗺️③ 在哪里使用这些模型

🧩 总结:当你在 ChatGPT 按下回车,到底发生了什么


你的查询先被切成 token,放进对话协议格式,成为一段一维 token 序列。ChatGPT 看到这段序列,按下回车后,它就像 token 自动补全一样不断往后追加 token。为什么是这些 token?这要回到三个阶段:

① 预训练——从互联网把知识获取进神经网络的参数;② 监督微调(SFT)——用人类标注员按指南写的大量对话,赋予模型"助手人格"。所以你得到的回应,本质是"一个 OpenAI 数据标注员的神经网络模拟":仿佛把问题交给一位先读完标注指南、再花两小时写出理想回应的标注员——只不过你没等两小时,得到的是这个过程的有损模拟。由于认知差异,模型会幻觉,会有"瑞士奶酪式"的随机短板。

③ 强化学习(RL)——当你用 o3-mini 这类思考模型时,情况不同了:GPT-4o 只做 RLHF(没有魔力的微调),而思考模型真正经历了 RL,磨练出思考过程、发现新的思维策略。此时回来的东西不再只是"模拟人类标注员",而是某种新颖、涌现于模拟之中的"思考函数"——原则上有能力做出类似 AlphaGo"第 37 手"那样、连人类都没想到的东西。但目前 RL 还很原始、初生(primordial),主要在数学、代码等可验证领域大放异彩。

"把它当作工具箱里的工具,别完全信任。它会随机犯傻、会幻觉、会跳过心算、会数错数。用它来获得灵感、写初稿、提问——但永远要核查与验证,并对你工作的最终成果负责。如果你这样做,就会用得非常成功。"

这是一个极其令人兴奋的领域。Karpathy 自己每天都用这些模型几十上百次,因为它们极大加速了工作;他相信我们会因此看到巨大的财富创造——只要清楚它们的短板,把它们当工具用。