提示工程 · Token

什么是 Token?

通过补句实验理解 Token、Tokenizer 和 Token ID,以及为什么 Token 数量会随模型和编码变化。

发生了什么?

当我们发送一条 Prompt 给大语言模型时,发生了什么?

它是怎样返回结果的?

为什么结果有时不一样?

这里要先认识两个重要概念:Token(标记)和概率。

这一章先说 Token。

先来做一个补句实验

现在,大家先忘记其他东西,跟我一起看一句话:

如果你突然

我让大家把这句话补充到 10 个字,你会怎么写?

可以先停一下,想一想。

假如张三和李四分别给出了下面的答案:

张三:如果你突然打了个喷嚏
李四:如果你突然变成一只猫

你会发现,两个人都满足了要求:把“如果你突然”补成一句 10 个字的话,但答案并不一样。

为什么?

因为一句话后面往往不只有一种合理的接法。我们已经看到的内容、掌握的词语和当时的选择,都会影响后面写什么。

先把一句话看成一块一块

我们平时说话或写字时,常常不是把整句话一次想完,而是一边往下说,一边选择接下来写什么。

比如,同一句话可以有不同的停顿:

当、我在、写、这段话、的、时候、我、也是、一个、字、一个字、地、思考
当、我、在写、这段话、的、时候、我也是、一个字、一个字、地思考

我没有刻意控制停顿,只是在自己感觉需要停一下的地方打了顿号。两次停顿的位置并不完全一样。

我们暂时可以把顿号之间的内容看成一块一块的“标记”。前面已经写了什么,会影响下一块可能是什么。

再让张三写一次

如果再让张三写一次,他可能会写:

如果你突然出现在这里

当然,他也可能还是给出上一次的答案。

我们不是张三,并不知道他会如何选择。可以肯定的是,他只能使用自己知道的字、词和表达;如果不知道,还可能写错或“瞎编”。

那我们是否可以先把这个过程看成三步?

  1. 先拥有一定的词汇和句子;
  2. 根据已经出现的内容,判断后面可以接什么;
  3. 如果有很多种接法,再从中选择一种。

此时大家可以停下来,想一想:平时说话和写字时,是不是也有过类似的感觉?

三个小练习

先不要往下看答案。把下面三道题写在纸上,或者直接打在屏幕上,留意自己是怎样一点点把句子接下去的。

将这句话写到 20 个字,标点符号也算一个字:
我的老家,就
把下面的句子补充完整:
我今天在 gptpmt ……
用下面的句式造一个句子:
因为……所以……

写完了吗?

这个补句实验可以帮助我们建立一个直觉:生成文字时,前面的内容会影响后面可能出现的内容。

但需要注意,这只是类比。大语言模型处理 Token 的方式,不等于人类大脑真正思考和说话的机制。

Token 是什么?

模型不会直接按照我们理解的“字数”或“单词数”处理整段文字。

文本进入模型前,会先经过与模型对应的 Tokenizer(分词器),被转换成一串 Token。模型处理这些 Token,再逐步生成新的 Token,最后转换成我们看到的文字。

一个 Token 可能是:

  • 一个完整单词;
  • 一个单词的一部分;
  • 一个汉字或字符的一部分;
  • 空格和文字的组合;
  • 标点符号或其他字节序列。

所以,Token 数量不等于字符数,也不等于单词数。

例如:

I love prompt engineering.
我喜欢提示工程。

这两句话会被切成多少 Token,不能只看字数。即使文字完全相同,换一个模型或编码,切分方式和 Token 数量也可能变化。

一些模型的 Tokenizer 会使用 BPE(Byte Pair Encoding,字节对编码)或它的变体,也有模型采用其他方案。不同模型可能使用不同的词表和编码方式,因此不能把某一个工具、某一张截图或某一次测试的结果,当成所有模型的固定规则。

“水土不服”的 Tokenizer

先来看一句英语:

I love GPT pmt.

这里有字母、空格、单词和标点。Tokenizer 不一定按照完整单词切分:I 可能单独成为一个 Token,前导空格可能和后面的字母组合在一起,GPT 也可能被拆成更小的部分。

为什么会这样?

因为 Tokenizer 是按照自己的词表和编码规则切分文字,不是按照我们在语文课上认识的“字”和“词”来切。

那中文呢?

大家可能会先猜:那中文是不是一个汉字就对应一个 Token?

真的是这样吗?

前面的 GPT 都可能被“劈开”,那汉字能不能被“劈开”?比如这个“爱”字:

我爱 GPT pmt。

汉字当然不会真的从中间切成两半。不过,计算机保存文字时会先把字符表示成编码;某些基于字节处理文本的 Tokenizer,可能把一个汉字对应的字节序列分到不止一个 Token 里。旧工具如果逐个显示这些片段,有时还会出现看不懂的替代符号。

先看一个可以复现的实际结果。截至 2026-08-31,OpenAI 官方 tiktoken 测试中,cl100k_base 对 hello world 的编码结果是 [15339, 1917],一共 2 个 Token;再解码可以还原成原文。可以在官方测试文件中看到这个测试。

这个结果只属于指定编码和指定文字,不代表其他模型或编码也会得到相同结果。

现在不要只看说明,我们可以自己做一次真实切分实验:

  1. 打开当前所用服务的官方 Tokenizer 或计数工具;
  2. 先记录测试日期、服务和模型名称,以及工具显示的编码名称;
  3. 分别输入 I love GPT pmt. 和 我爱 GPT pmt。;
  4. 记录工具实际显示的切分、Token 数量,以及它提供的 Token ID;
  5. 如果工具允许切换模型或编码,再换一个选项重复测试。

每次测试都把模型、编码和日期一起记下来。以后结果变了,我们才能分清是文字变了,还是模型、词表或工具更新了。

简单来说,“把汉字劈开”可以帮助我们记住一种现象:一个人眼中的完整汉字,不一定只对应一个 Token。

但这也不是所有模型的固定结论。换一个模型、词表或编码,同一个汉字可能只占一个 Token,也可能占多个;中文也不必然总比英文使用更多 Token。要知道准确数量,仍然要用目标模型对应的工具实际测试。

Token ID 是什么?

Tokenizer 会把每个 Token 映射成词表中的一个整数标识,这个数字就是 Token ID。

文本:你好
Token:[你][好]
Token ID:[示例 ID 1][示例 ID 2]

上面只用于说明概念,不代表任何真实模型的切分结果。

Token ID 有点像模型词表里的编号。换一个模型或编码,同一段文字的 Token ID 可能完全不同。它也不代表词语的重要程度、事实可信度或模型的信心。

为什么要了解 Token?

首先,模型一次能处理的内容有容量限制。输入、对话历史、工具说明和输出都会占用 Token。

其次,要求“写 500 个汉字”和限制“最多生成多少 Token”不是同一件事。如果业务必须满足严格字数,模型生成以后还要再检查。

最后,许多 API 会记录输入和输出所使用的 Token。具体计量方式会随服务和模型变化,要以实际接口文档和返回的 usage 数据为准。

需要准确数量时,不要套用“一个汉字等于几个 Token”的固定公式。先确定实际模型,再使用该服务对应的 Tokenizer 或计数接口。

OpenAI 用户可以通过官方的 Tokenizer 观察文本切分。其他服务应使用各自的官方工具和文档。

再回到开头的问题

模型拿到一串 Token 以后,怎样决定下一个 Token 是什么?

为什么同一句话,有时会接出不同结果?

这就要继续了解概率和采样。

上一章: 第一次对话

下一章: 概率、采样与 Temperature

Luffy Liu
Luffy Liu

Independent product builder · AI, agents and real workflows.