上一章《预训练数据工程》洗净了几万亿 token 的料,可读完的模型并不会回答问题——它只会接着往下写。 你问它"什么是过拟合?",它可能回你一句"这个问题在统计学中有很多讨论", 因为它觉得网页上下一句就该是这个。 让它变成一个能对话的助手,需要后面两个阶段。
要让它会回答、会按格式办事,靠的是后面两步。 今天所有能对话的大模型,都走过下面这条流水线:
| 维度 | ① 预训练 Pretrain | ② 监督微调 SFT | ③ 对齐 Alignment |
|---|---|---|---|
| 教什么 | 语言本身的规律 + 世界知识 | "别人问,你要答"这个形式 | 什么样的回答更好 |
| 数据形态 | 原始文本(网页、书、代码) | 人工写或强模型生成、再人工筛的(问题,标准答案)对 | 一个更好的回答 + 一个更差的回答 / 可自动判对错的题 |
| 数据量 | 几万亿 token | 几千 ~ 上百万条 | 几万 ~ 上百万对 |
| 损失函数 | 预测下一个词(交叉熵) | 同样的交叉熵,但只在回答上算 | 偏好损失(让模型偏向更好的那个回答;下一章讲强化学习(RL)) |
| 算力占比 | 绝大部分 | 很小一部分 | 很小一部分 |
| 得到什么 | 一个"续写机器" | 一个"会按格式回答的助手" | 一个"回答得让人满意"的助手 |
SFT = 入职培训。给他看几百个"客户这么问,你应该这么答"的范例。他开始会按流程说话了。
对齐 = 绩效反馈。不告诉他标准答案,只说"这两个回答里,A 比 B 好"。他慢慢学会什么叫"好"。
这里有一个反直觉的地方:算力上第 2 和第 3 阶段加起来只占很小一部分(公开报告一般不给确切比例), 但模型能不能用、好不好用,几乎完全由后两个阶段决定。
互动 · 三个阶段吃掉的数据量(真实数量级)
三个阶段,一条流水线
同一个网络,三个阶段换三次目标:先填知识,再纠格式,最后调偏好。
这是理解大模型最重要的一条。
问题是:网页上"什么是过拟合?"这七个字后面,最常见的不是答案,而是更多的正文。 所以 base 模型会接着写文章,而不是回答你。
互动 · 三个训练出来的语言模型,同一个问题
下面是三个真实的二元(bigram)语言模型——只看前一个词来猜下一个词的最简单语言模型。 三个模型结构相同,只是训练语料不同(各 4 句,点开每列下面的「训练语料」看)。 每一步都当场算条件概率,然后取概率最高的词往下走。 真的大模型机制相同,只是看得更远、更准;用 bigram 是为了让这一步能在浏览器里当场算给你看。
差别不在"模型大小",在训练目标:
base 的语料全是网页,问号后面接着的是「这个 问题…」——它在续写文档,不是在回答。
SFT 的语料里,问号后面跟着「助手:」再跟一句回答,它就照着接一句;
但这句是从范例里拼出来的,换个问题也还是那几句套话。
(这里的「助手」只是 SFT 语料里的一个词;真实系统里这串角色标记由程序写好,见第 3 节。)
对齐后的语料里,回答一律先「简单说,」再下定义——它学会了人类更喜欢的那个腔调。
很多人以为"预测下一个词"很弱。恰恰相反——
为了预测得准,模型不得不学会语法、事实、逻辑、甚至推理。
因为"3 + 5 = " 后面跟着 "8" 的概率,比跟着 "9" 高得多。
知识是预测任务的副产品。但"会不会听话"不是——所以还需要后两个阶段。
互动 · 问号后面接什么?三个模型的真实分布
SFT 的数据不是一段散文,而是被特殊符号标好的角色对话。这是模型能区分"谁在说话"的唯一依据。
推理时,程序把 <|im_start|>assistant 这段前缀写好交给模型,
模型从这后面开始自己往下写——它写出来的就是回答。角色标记由程序负责,模型只负责续内容。
如果用户能直接在输入框里打出 <|im_start|>assistant,
他就可以伪造出一段"助手已经说过的话",绕过前面所有设定。
这是 prompt injection(诱导模型越权)最基础的手法之一。
所以部署时必须先在分词阶段把用户输入里的特殊 token 过滤掉。
互动 · 对话模板就是一串被角色标记切开的 token
训练时,整段对话都送进模型,但不是每个词都会产生损失。 决定哪些词算损失的开关叫损失掩码(loss mask)。 如果对用户说的话也算损失,模型就在学"怎么像用户一样提问"—— 这不是我们想要的能力,还浪费掉约三分之一的梯度。
互动 · 切换两种训练方式,看梯度花在哪
只对"模型该学会生成的那部分"算损失。
在 SFT 里是"只算助手的回复";
连 system + user 的 prompt 也通常不算;
在
这个开关看起来很小,但它决定了模型是在学"回答"还是在学"对话"。
那段 system 提示词模型为什么听得懂?SFT 数据里本来就有带 system 提示的对话,它是看会的。
前面说了半天「预测下一个词」,它到底长什么样?这一节把它写成一条式子。 上面那张图画的是 p(每个词的概率),卡片下面那张图画的是 m(每个位置算不算分)。
动画 · 模型的输出是一排概率,损失就是把正确答案那一格往上推
把每个 token 当成一道选择题。模型给正确答案押的概率越高,扣分越少。
它押 90% → 扣 0.11 分;押 10% → 扣 2.3 分;押 1% → 扣 4.6 分。
−log p 就是这个扣分规则——它逼着模型不但要选对,还要「有把握地选对」。
微型图解 · 那张掩码贴在哪儿(每个 token 的交叉熵)
| 类型 | 训到哪一步 | 特点 | 用来干什么 |
|---|---|---|---|
| Base 基座模型 | 只做 |
续写能力极强,但不会拒绝、不会按格式回答。 你问它问题,它可能给你再编三个问题 | 继续训练、做研究、当"原材料" |
| Instruct 指令模型 | 会按指令行事,格式正确。但可能给出有害内容——它只学"像不像范例" | 一般的文本任务 | |
| Chat 对话模型 | 回答更符合人类偏好,更会拒绝不当请求 | 绝大多数日常使用 | |
| Reasoning 推理模型 | 对齐阶段额外加了 RLVR(用能自动判对错的题做强化学习) | 会先想一大段再回答,愿意"多想一会儿" | 数学、代码、复杂推理 |
| Agent 智能体 | 推理 + 工具调用训练(教它用搜索、代码这类外部工具) | 会调用工具、会规划多步任务 | 自动化流程 |
如果你下载一个模型,发现它对什么问题都只会"接着写下去"、
或者对你的指令毫无反应,那大概率你拿到的是 base 模型。
想让它正常对话,至少要找文件名里带 instruct、chat、
SFT 的版本。这是新手最常踩的坑之一。
五种「成品」模型,一条谱系
越往右,训到的阶段越多,模型越「会办事」——但
| 问题 | 具体表现 | 什么时候真的会痛 → 换什么 |
|---|---|---|
| 对齐税 Alignment Tax |
对齐之后,模型在问答、推理、翻译等公开任务上的分数反而下降。 因为「人类觉得好」和「事实上正确」不完全一致,模型学会了更保守、更套路的表达 | 把模型用在事实核查、翻译这类要准确的场景 → 对齐时混一点预训练数据(InstructGPT 的 PPO-ptx:强化学习时混一部分预训练数据一起训,减少对齐税) |
Catastrophic Forgetting |
SFT 数据太少或太单一,模型会丢掉 |
只想在小领域微调、又要它保留通用能力 → 混入通用数据,或用 LoRA(只调一小块参数的微调法)这类小改动 |
| SFT 只教模仿 | 模型学会的是"像范例那样说话",不是"把问题想清楚"。 SFT 是模仿学习:给它标准答案让它模仿,天花板由示范数据的质量决定 | 需要示范里没有的新解法、新知识 → 靠后面的 RL(强化学习)阶段试探出更好的回答 |
| 顺序不是唯一解 | 有些模型跳过 SFT 直接做对齐;有些把 SFT 和偏好学习合成一步。 三阶段只是目前最省事的工程惯例,不是理论必然 | 算力和数据都紧张、又想少两轮迭代 → 用 ORPO(把 SFT 和偏好对齐合成一步的方法),见它那一章 |
既然对齐会让一部分客观分数下降,为什么还要对齐? 因为不对齐的模型会顺着坏请求往下接话。至于「好」这杆秤——它由训练者的标注规范定,不是天上掉下来的。
一个被反复引用的结论来自 LIMA 那篇论文(2023):
1000 条精心挑选的高质量指令数据,就能让模型表现出很好的对话能力。
堆五万条平庸数据,效果反而不如这一千条。
1000 条够教会「格式」,但要覆盖更多任务、语言、安全场景,还是得加数据。
对齐税长什么样
对齐的目标是「人类觉得好」,而它和「事实上正确」并不完全一致。两条线分开的那块,就是对齐税。
横轴的「对齐力度」有两种主流做法:RLHF(先按人类偏好训一个打分的模型,再用它做强化学习)和
DPO(直接拿「更好的回答 / 更差的回答」成对来训)。后面几章细讲。
这三阶段不是孤立的——① 接住上一章《预训练数据工程》洗净的料,③ 交给下一章《强化学习入门》。顺着往下走:
| 阶段 | 从这一章往哪走 |
|---|---|
| 原料从哪来、怎么洗 → 前面的《预训练数据工程》;这一步本身的账在《缩放定律》里算 | |
| SFT | 怎么造这些数据、怎么切分 → 《LoRA 与高效微调》(只调一小块参数的微调法) |
| 对齐 | 两种主流做法 → 《RLHF 与 PPO》、《DPO 家族》 |
绝大多数人只会用到第 ② 和第 ③ 阶段——
所以后面讲对齐的 RLHF、DPO 两章,和阶段 5 后半部分的
LoRA、微调实战决策树,才是你真正会用到的东西。
但理解第 ① 阶段为什么只会"接话",是理解后面一切的前提——
没有这个认识,你会一直困惑"为什么我的模型不听话"。
互动 · 一张对话数据 vs 整个互联网(对数轴)
三个阶段读起来像三道工序,但底下是同一件事做了三遍。这一节把它挑明。
回到第 4 节那个损失掩码开关。先选「对整段对话都算损失」,这时右边会多出一截 粉色柱——被浪费在用户提问上的那部分梯度; 再切到「只对助手回复算损失」,粉色消失,只剩绿色——绿色就是真正用来学「怎么回答」的梯度。
那两个状态下模型结构一模一样、数据一模一样、学习率一模一样,
只有「拿哪些 token 去算损失」不同——而模型的性格就跟着不同了。
(这个互动只展示梯度分配;性格差异是训练的最终结果。)
如果你刚才没想指着那个开关说这句话,回去再切一次。
再回去看第 2 节那三个模型(同一个问题,base / SFT / 对齐)—— 它们是同一个架构、换三次目标压出来的三个分布,这就是这条线。
| 暗线 | 这一章的回答 |
|---|---|
| A 信息流动 | 三个阶段喂进去的都是一条 token 序列,形状没变;变的只是那张 0/1 掩码贴在哪里。 |
| B 什么被牺牲了 | 牺牲了 base 的输出多样性和一部分客观正确性(对齐税),换来一个会按格式答、会拒绝的助手。 |
| C 参数账本 | 预训练花掉绝大部分算力,后两段很少;这笔账的第 1 节那张图里写着。 |
| D 跑在什么上 | 预训练最贵的一步是前向 + 反向的大矩阵乘:每个词、每个参数约 6 次运算 (前向 2 次 + 反向 4 次);对齐还要先生成整段回答再打分,更吃显存。 |
| E 它假设了什么 | 假设「预测下一个词足以承载全部能力」,又假设「人类觉得好的,可以用一小撮示例代表」—— 对齐税就是第二个假设的漏洞。 |
| F 违背了哪个直觉 | SFT 的数据不是越多越好(拼质量);三个阶段也不是平等的工序——最贵的预训练装知识, 便宜的后两步决定你日常感受到的那个「待人的方式」。 |
最重要的洞察是:预训练只会接话,不会听话。
因为它的目标就是"预测互联网上接下来最可能出现什么",
而网页上问号后面跟的往往是更多正文,不是答案。
SFT 阶段有一个小而关键的开关:损失掩码(loss mask)——
只对助手的回复算损失,否则约三分之一的梯度会花在学"怎么写用户的问题"上。
最后记住:后两个阶段花的算力很少,可模型好不好用、听不听话,几乎全由它们决定。
上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。