Token 是什么?理解大模型的第一块积木

用过 ChatGPT、DeepSeek、Claude 或其他大模型的人,应该都听过一个词:

Token

比如:

  • 模型支持 128K Token 上下文;
  • API 按输入 Token 和输出 Token 计费;
  • Prompt 太长会消耗很多 Token;
  • 大模型本质上是在预测下一个 Token。

那么,Token 到底是什么?

它是一个汉字吗?
是一个英文单词吗?
128K Token 是不是等于 128000 个汉字?

都不是。

简单说:

Token 是大模型处理信息时使用的基本单位。


一、先用 Pixel 和 Voxel 做个类比

理解 Token,可以先从两个更熟悉的概念说起。

图片是由很多 Pixel,像素 组成的。

比如一张 1920 × 1080 的图片,本质上就是:

1920 × 1080 个像素点

每个像素都有自己的位置和颜色值。

所以可以说:

Pixel 是图像的基本颗粒。

三维空间也可以被切成一个个小立方体,这些小立方体叫 Voxel,体素

在三维重建、机器人、自动驾驶等场景里,Voxel 可以表示某个空间位置是否被占据、密度是多少、属于什么物体等。

所以也可以说:

Voxel 是三维空间的基本颗粒。

那么语言呢?

一句话进入大模型之前,也会被拆成一个个小单元。

这些小单元,就是 Token

所以可以粗略类比为:

图像       → Pixel
三维空间   → Voxel
文本       → Token

不过要注意,这只是类比。

Pixel 和 Voxel 通常有明确的空间位置和固定采样尺度;
Token 更抽象,它是模型为了计算方便切出来的信息单元。


二、Token 不是字,也不是词

我们看到的是一句话:

我喜欢人工智能

但大模型不会直接处理这整句话。

它会先通过 Tokenizer,也就是分词器,把文本切成若干 Token。

例如可能切成:

["我", "喜欢", "人工智能"]

也可能切成:

["我", "喜", "欢", "人工", "智能"]

具体怎么切,取决于模型使用的 Tokenizer。

所以,Token 不是固定等于一个汉字,也不是固定等于一个英文单词。

它可能是:

  • 一个汉字;
  • 一个中文词;
  • 一个英文单词;
  • 半个英文单词;
  • 一个标点;
  • 一个空格;
  • 一段常见字符串。

比如英文单词:

unbelievable

可能会被拆成:

["un", "believ", "able"]

所以更准确地说:

Token 是一种可变粒度的信息单元。

它不是人类语言学意义上的“字”或“词”,而是模型自己的切分单位。


三、为什么不直接按字或按词切?

因为两种方式都有问题。

如果全部按字切,序列会变长。

比如:

我喜欢人工智能

按字切就是:

["我", "喜", "欢", "人", "工", "智", "能"]

这样虽然简单,但“人工智能”这个整体含义被拆散了。

如果全部按词切,词表又会变得很大。

英文里有很多词形变化:

run
runs
running
runner

中文里也有大量新词、组合词和专有名词。

如果每个词都作为独立单位,词表会非常庞大;遇到训练时没见过的新词,模型也更难处理。

所以现代大模型通常采用折中方案:

不完全按字切,也不完全按词切,而是按“子词”切。

比如:

unbelievable

可以拆成:

["un", "believ", "able"]

这样即使模型没见过完整的 unbelievable,也可能见过其中的子词片段。


四、文本进入大模型后发生了什么?

当我们输入:

我喜欢人工智能

Tokenizer 可能先把它切成:

["我", "喜欢", "人工智能"]

然后再把这些 Token 映射成数字 ID:

[37046, 10419, 27327]

大模型真正处理的不是文字,而是这些数字。

接下来,每个 Token ID 会被转换成向量,也就是 Embedding

整体流程可以理解为:

文本
  ↓
Tokenizer
  ↓
Token IDs
  ↓
Embedding
  ↓
Transformer
  ↓
预测下一个 Token

大模型生成文本,本质上就是不断做一件事:

根据前面的 Token,预测下一个最可能的 Token。

比如输入:

今天天气很

模型可能预测下一个 Token 是:

于是得到:

今天天气很好

然后继续预测下一个 Token。

一句一句回答,就是这样生成出来的。

下面是修改后的第五节,已经把那种“对于科普文章来说……”的元话术删掉了,也把“Token 决定/影响”改成了更严谨的表述。

你直接替换原文第五节即可。

五、为什么大模型里总是在说 Token?

Token 本身并不神秘。

它更像是大模型世界里的一种统计口径。

我们之所以经常看到 Token,是因为很多和大模型使用相关的规则,都会用 Token 数来描述。

比如:

  • 模型的上下文窗口;
  • API 的输入和输出统计;
  • 一次回答最多能生成多长;
  • Prompt、历史对话、检索结果需要截断到多长。

这些通常都不是按“汉字数”或“英文单词数”来计算,而是按 Token 数来计算。

1. 上下文窗口通常按 Token 数计量

我们常说:

8K 上下文
32K 上下文
128K 上下文

这里的 K,通常指的是 Token 数量。

所以:

128K Token ≠ 128000 个汉字
128K Token ≠ 128000 个英文单词

不同语言、不同内容,被切出来的 Token 数并不一样。

例如:

中文:一个 Token 可能对应一个字,也可能对应多个字
英文:一个 Token 可能对应一个词,也可能只是词的一部分
代码:空格、换行、括号、符号、变量名都会被计入 Token

所以,不能简单用“字数”去换算 Token 数。

更准确地说:

模型的上下文窗口限制的是 Token 数,不是字符数,也不是词数。

2. API 计费通常按 Token 数统计

很多大模型 API 会区分:

输入 Token
输出 Token

用户发给模型的 Prompt、历史对话、系统提示词、检索到的资料,都可能算作输入 Token。

模型生成的回答,则算作输出 Token。

具体价格由服务商决定,但统计口径通常是 Token 数。

因此,在实际工程里,我们经常会控制 Prompt 长度、压缩上下文、裁剪历史对话,或者限制 RAG 检索返回内容。

目的不是因为 Token 本身“重要”,而是因为:

输入和输出最终都要换算成 Token 数来统计。

3. 不同模型的 Tokenizer 可能不同

不是所有模型都会使用同一个 Tokenizer。

同一句话,在不同模型里,可能会被切成不同数量、不同粒度的 Token。

比如中文、代码、数学公式、多语言混合文本,如果切分方式不同,进入模型前形成的 Token 序列也会不同。

所以,估算上下文长度或 API 成本时,最好使用对应模型的 Tokenizer 来统计,而不是直接用字数或词数估算。


六、Token 不只属于文本

今天的大模型已经不只处理文本。

图像也可以被转换成类似 Token 的形式。

在 Vision Transformer 这类模型中,图片通常不是一个像素一个像素输入模型,而是先切成 Patch。

比如一张图片大小是:

224 × 224

如果每个 Patch 是:

16 × 16

那么这张图可以被切成:

14 × 14 = 196 个 Patch

这些 Patch 会被转换成向量,再送入 Transformer。

所以可以粗略理解为:

Pixel → Patch → Visual Token

不过要注意:

文本 Token 是由 Tokenizer 切出来的子词单元;
图像 Patch 是从图片上切出来的空间块。

二者来源不同,但进入 Transformer 后,都可以变成一组向量序列参与计算。

所以更准确地说:

Token 可以泛指模型处理信息时使用的输入单元。

这里我们只用图像 Patch 举例,不展开三维空间、点云或 BEV 等更具体的技术路线。


七、用代码看一句话有多少 Token

最后,用一个简单代码看看文本是怎么被切成 Token 的。

先安装:

pip install tiktoken

示例代码:

import tiktoken

encoding = tiktoken.get_encoding("cl100k_base")

text = "我喜欢人工智能,也喜欢写 Python 代码。"

token_ids = encoding.encode(text)

print("原始文本:", text)
print("Token IDs:", token_ids)
print("Token 数量:", len(token_ids))

print("\n逐个 Token 解码:")
for token_id in token_ids:
    print(token_id, repr(encoding.decode([token_id])))

输出结果大致会像这样:

原始文本: 我喜欢人工智能,也喜欢写 Python 代码。
Token IDs: [37046, 10419, 27327, ...]
Token 数量: 12

逐个 Token 解码:
37046 '我'
10419 '喜欢'
27327 '人工智能'
...

注意,不同模型、不同 Tokenizer,切分结果可能不一样。

同一句话,在不同模型里,Token 数量不一定完全相同。


总结

Token 是理解大模型的基础概念。

它不是简单的“字”,也不是简单的“词”。

更准确地说:

Token 是模型处理信息时使用的基本单位。

一句话进入大模型之前,会经历:

自然语言
  ↓
Tokenizer
  ↓
Token IDs
  ↓
Embedding
  ↓
Transformer
  ↓
预测下一个 Token

所以,大模型看起来是在理解语言,底层其实是在处理 Token 序列。

下次再看到“128K Token 上下文”“输入 Token 计费”“输出 Token 计费”这些说法时,可以把它想象成:

大模型不是直接吃文字,而是一口一口地吃 Token。

Token,就是理解大模型的第一块积木。

更多推荐