下一个 Token 预测

开篇问题

如果有人告诉你,大语言模型最基础的任务只是“预测下一个 token”,你可能会觉得这太简单了。

预测下一个词,为什么能写代码?为什么能总结文档?为什么能解释概念?为什么还能在某些问题上表现出推理能力?

这个疑问非常重要。理解“下一个 token 预测”,就等于抓住了语言模型能力形成的主线。

本章你会理解什么

读完本章,你应该能够理解:

  • token 是语言模型处理文本的基本单位。
  • 下一个 token 预测为什么是训练语言模型的核心任务。
  • 概率分布、采样和输出多样性之间的关系。
  • 为什么简单训练目标可以产生复杂行为。
  • 为什么模型会生成看似流畅但不一定正确的内容。

核心概念

语言模型的基本输入是一段上下文,输出是“下一个 token 的概率分布”。

假设上下文是:

HTTP 状态码 404 表示

模型不会只给出一个唯一答案。它会给许多可能的下一个 token 分配概率,例如:

“资源”  0.42
“未”    0.21
“页面”  0.08
“请求”  0.05
...

具体系统会根据这些概率选择一个 token。选出的 token 被追加到上下文里,模型再预测下一个 token。重复这个过程,就形成了完整输出。

所以模型生成答案不是一次性完成的,而是一个循环:

  1. 读取当前上下文。
  2. 计算下一个 token 的概率。
  3. 选择一个 token。
  4. 把它放回上下文。
  5. 继续下一步。

机制拆解

1. 什么是 token

token 可以粗略理解为模型眼中的文本片段。它可能是一个汉字、一个词的一部分、一个英文单词、一个标点,也可能是一段常见代码片段。

例如下面的文本:

const userName = "Ada";

在模型内部不会被当作一个完整字符串处理,而会先被 tokenizer 切成若干 token,再映射为数字 ID。

开发者可以把 token 暂时理解成“模型版的字符编码单元”。它不像 UTF-8 字节那样固定,也不像自然语言词语那样完全符合人的直觉。它是模型词表中的离散单位。

2. 训练目标非常直接

给定一段训练文本,模型可以从中构造大量训练样本。

例如:

缓存可以减少重复请求

可以变成多次预测任务:

缓存 -> 可以
缓存 可以 -> 减少
缓存 可以 减少 -> 重复
缓存 可以 减少 重复 -> 请求

训练时,如果模型预测错了,就根据误差调整参数。这个过程重复很多次以后,模型会越来越擅长在不同上下文中判断“接下来应该出现什么”。

重要的是,这个训练目标不需要人工为每句话标注答案。普通文本天然就包含“前文”和“后文”。这让大规模训练成为可能。

3. 概率分布不是单一答案

模型每一步输出的是概率分布,而不是确定答案。

例如上下文是:

我今天早上喝了一杯

后面可以是“咖啡”,也可以是“牛奶”,还可以是“水”。这些选项都合理,只是概率不同。

在技术实现中,系统会根据采样策略决定选哪个 token。更保守的策略倾向于选择高概率 token,输出会更稳定;更开放的策略允许低概率 token 被选中,输出会更有变化,但也更容易偏离。

这就是为什么语言模型既能写出自然、不死板的内容,也会带来不可预测性。

4. 复杂能力来自长上下文中的条件生成

“预测下一个 token”听起来很局部,但上下文可以很长。

如果上下文里包含:

  • 一个问题。
  • 一段代码。
  • 一个错误信息。
  • 已经生成的分析步骤。
  • 某种输出格式。

那么下一个 token 的预测就不再只是语法补全,而是在这些条件共同约束下继续生成。

例如上下文是:

请解释这段 TypeScript 报错:
Type 'string | undefined' is not assignable to type 'string'.

模型预测下一个 token 时,需要综合 TypeScript 类型系统、报错句式、解释文体和用户意图。每一步仍然是预测下一个 token,但连续很多步之后,就形成了像“解释问题并给出修复建议”的行为。

5. 生成会受到前文影响

模型已经生成的内容会进入新的上下文。因此,如果模型前面走向了一个错误假设,后面往往会沿着这个假设继续写。

例如它先生成了“这个错误来自运行时”,后面就可能继续解释运行时异常,而不是回到类型系统。语言模型的连续性让输出更像一篇完整文章,但也会放大早期错误。

这也是为什么理解模型的生成过程很重要:它不是先在内部完成一个完美答案再输出,而是在逐步生成中不断承接已有内容。

开发者常见误解

误解一:预测下一个 token 太简单,不可能产生智能行为

单步任务确实简单,但训练数据规模、模型容量和上下文长度会让它变得非常强。

很多复杂任务都可以表示成“在特定上下文中生成合适的后续文本”。问答、翻译、代码补全、摘要和格式转换,表面不同,底层都可以被写成条件生成问题。

误解二:模型每次都选择概率最高的 token

不一定。实际生成通常会使用采样策略。总是选择最高概率 token 会让输出更确定,但可能变得机械、重复,甚至在某些场景下陷入固定模式。

允许一定随机性,可以让模型产生更自然的表达和更多候选方案。

误解三:流畅输出代表模型知道事实

流畅只说明当前 token 序列在语言上连贯,不能保证事实正确。

模型可能学到了“某类问题通常应该这样回答”的表达模式,但如果缺少可靠上下文或训练中存在过时信息,它仍然可能生成错误内容。

误解四:模型先想好完整答案再逐字打印

从外部看,模型像是在打字。但机制上,它是在逐步预测和追加 token。前面的输出会改变后面的预测条件。

这解释了为什么模型有时会中途改变语气、补救前文,或者在长回答里逐渐偏离原问题。

小实验/思考实验

请手动完成下面的补全游戏。

上下文 A:

用户点击提交按钮后,前端应该先

你可能会补出:

校验表单

上下文 B:

用户点击提交按钮后,前端不应该阻塞主线程,而是先

你可能会补出:

更新界面状态

上下文 C:

用户点击提交按钮后,前端已经完成本地校验,下一步应该

你可能会补出:

发送请求

同样是“用户点击提交按钮后”,不同上下文会改变你对下一个词的判断。语言模型做的也是类似事情,只是它在更大的参数空间里计算概率,并且用 token 而不是自然词语作为基本单位。

再思考一个问题:如果上下文只给“用户点击”,你能确定后面是什么吗?上下文越少,合理延续越多,不确定性越高。

本章小结

下一个 token 预测是语言模型最核心的训练目标。模型读取上下文,计算下一个 token 的概率分布,选择 token,再把它追加回上下文,循环生成完整输出。

这个目标看似简单,却可以在大量数据、足够模型容量和长上下文条件下形成复杂能力。问答、写作、代码、翻译和总结,都可以被理解为特定上下文下的连续 token 生成。

但同一个机制也带来限制:模型追求的是“在当前上下文中合理地继续写”,而不是天然保证事实正确、逻辑完备或执行可用。

自测题

  1. token 和字符、单词有什么区别?
  2. 为什么普通文本可以直接构造“预测下一个 token”的训练样本?
  3. 模型每一步输出的为什么是概率分布,而不是唯一答案?
  4. 采样策略为什么会影响输出稳定性和多样性?
  5. 为什么流畅的回答不一定代表事实正确?