📑 本页目录(点开跳转)
主线 3 · 模型怎样一个字一个字写下去
⏱ 9 分钟 | ⭐ 主线第三站
🎯 一句话
聊天模型的基本工作不是“先想好整段答案再写”,而是:看见左边已经出现的 token,猜下一个 token;猜完,把它放回左边,再猜一次。 这就是 Decoder-only 和自回归生成。
因果遮罩:不许偷看答案
训练时,完整句子明明就在眼前。若模型能看右边,它只会抄答案,学不会预测。所以我们给注意力加一条规则:当前位置只能看自己左边的位置。
生成就是一个小循环
- 读入已经写好的 token。
- 为下一个 token 给出概率表。
- 选出一个 token,接到句子末尾。
- 把新句子再送回去,继续下一步。
这解释了两个现象:它会慢慢往外吐字;而且前面生成错一个词,后面会顺着这个错误继续写。
训练时其实不是一个字一个字算
生成必须串行,但训练可以并行。训练样本例如“猫追老鼠很快”,会同时要求模型完成四道题:看“猫”猜“追”、看“猫追”猜“老鼠”、看“猫追老鼠”猜“很”……
因果遮罩保证每个位置只能使用自己左边的信息,于是这些题可以在一张矩阵里同时算出来,又不会泄题。这就是为什么训练能把 GPU 跑得很满,而在线生成仍要等前一个 token 出来。
“选下一个词”也不是总选概率最高
若每次都选最高概率,回答会更稳定,却很容易模板化和重复。实际生成还会使用 temperature、top-p 等规则:它们不是让模型突然更懂,而是在已经给出的概率分布里控制“保守还是多样”。这部分在推理优化的解码专题会细讲。
为什么叫 Decoder-only
“Decoder-only”不是说它没有理解能力,而是说整套网络都遵守左看规则。它用同一种结构完成两件事:读你的问题时根据前文更新向量;写回答时继续预测下一个 token。规模足够大后,这个简单目标会逼它学到语法、事实关联、代码模式和部分推理套路。
早期还有 Encoder-only 和 Encoder-Decoder 两条常见路线。它们不是“错误版本”:Encoder 很适合理解、分类、抽取;Encoder-Decoder 很适合输入与输出结构明显不同的翻译、摘要等任务。Decoder-only 在通用聊天模型里流行,是因为它用一个统一的“续写”目标就能吸收各种文本和代码,也天然匹配开放式生成。
这和 KV Cache 有什么关系?
每次生成新 token 时,前面的内容没有变,没必要从头再算一遍。模型会把过去 token 的 K 和 V 暂存起来,这就是 KV Cache。
好处:生成更快。代价:上下文越长,缓存越占显存。它是部署与长上下文问题的桥梁,等需要关心速度和显存时再深入。
可以把一次请求分成两段:Prefill 是先读完整个问题并建立缓存,决定首字要等多久;Decode 是之后逐 token 生成,每一步只计算新 token,但都要读取越来越长的缓存,决定每秒能吐多少字。现代模型常用 GQA,让多个注意力头共享较少的 K/V 头,以减轻缓存压力;但“长上下文会吃显存”这条基本约束仍在。
✅ 检查点
- 因果遮罩的目的:防止训练时偷看右边答案。
- 自回归的意思:每次只预测一个 token,再把结果接回输入。
- Decoder-only 的核心是“用同一个左看结构训练和生成”。
点开核对
遮罩堵住右侧答案,模型才会练习预测;生成时把刚选出的 token 接到左边,再继续预测。这就是自回归循环。
🔗 想再深一层,去哪一套
| 去哪 | 为什么 |
|---|---|
| AI 基础设施 16 · KV Cache | ⭐ 这一页那个循环为什么必须缓存,以及缓存会吃掉多少显存;第七节让你算出自己能开多大 batch |
| ML 基础 附录C · 手撕代码速查 | 第 2 题就是「缩放点积注意力(含因果掩码)」—— 遮罩在代码里只是一行 |
| 06b · 解码策略 | 循环每一步「猜下一个 token」到底怎么猜:温度、top-p、beam 各自改了什么 |
🛑 可以停在这里
不必先背 BERT、Encoder-Decoder 的历史。先能解释“模型为什么一个词一个词输出”,就够了。
⚡ 走神救援
模型只能看左边,所以只能猜下一个 token;猜出的 token 又会成为新的左边。这条简单循环,就是聊天模型生成回答的发动机。