几年前在一次工作中,第一次接触到自然语言处理模型 BERT。当时在评估这个模型的性能时,领导提到该模型的性能指标需要达到 200 token 每秒。虽然知道这是一个性能指标,但对 token 这个概念却不是很清晰。
因为当时接触视觉模型多一些,在视觉模型的性能评估中,有一个关键指标叫做 fps(Frames Per Second),通俗理解就是一秒钟可以处理的图片数。fps 数值越大,说明模型吞吐性能越好。那么 token 每秒又是什么呢?要搞清楚这个,就得先来了解一下什么是 token。
1、什么是 Token
在计算机领域中,token 通常是指一串字符或符号,比如微信公众平台的密钥,就被称作一个 token,其实就是一长串的字符。
而在人工智能领域,尤其是自然语言处理 (Natural Language Processing, NLP) 中,'token'指的是处理文本的最小单元或基本元素。它可以是一个单词、一个词组、一个标点符号、一个子词或者一个字符。
目前很多大模型无论展示能力,还是收费定价,都是以 token 为单位。例如 OpenAI 的收费标准为:GPT-4,1k 个 token 收费约 0.01 美元。这意味着输入和输出的长度直接决定了成本。
如何理解 Token?
假设要让一个 AI 模型识别下面的一句话:'I love natural language processing!'。
模型并不是直接认识这句话是什么意思,而是需要先将这句话拆解成一个个的 token 序列。比如这个句子可以分解成以下的 tokens:
- 'I'
- 'love'
- 'natural'
- 'language'
- 'processing'
- '!'
最后的标点符号同样是一个 token,这样模型看到的就是基本的 token 单元,这样有助于 AI 模型理解这个句子的结构和含义。
2、Tokenization 与拆分机制
在 NLP 任务中,处理文本之前,需要先将文本进行 tokenization,也就是将文本 token 化,然后再对这些 tokens 进行操作。目前有很多算法可以完成这个 tokenization 的过程。
一个 token 不就是一个单词吗?
其实不是这样的。就像上面说的,一个 token 可以是一个单词,也可以是一个词组或者一些子词。
比如在 tokenization 阶段,可能会把'New York City'这三个单词当做一个 token,因为这三个单词合在一起具有特定的意思,叫做纽约市。
还可能把'debug'这个单词看作两个 token,分别为'de'和'bug',这样模型可能知道'de'前缀代表'减少'的意思。
如果再遇到诸如'devalue'时,就会把它直接分为两个 token,分别是'de'和'value',并且可以知道 devalue 代表'减少价值'的意思。
这样的 token 就属于单词中的子词,这样做有很多好处,其中一个好处便是模型不需要记住太多的词。
否则,模型可能需要记住'bug'、'debug'、'value'、'devalue'四个 token。而一旦将词分成子词,模型只需要记住'bug'、'value'和'de'这三个 token 即可,而且还可以扩展识别出'decrease'的意思。
总结来说,一个 token 可能会代表是一个单词,也可能会是一个词组,或者字符和标点符号。
3、常见的分词算法
为了高效地处理文本,业界发展出了多种分词算法,主要包括以下几种:
- 基于字符的分词 (Character-level):将每个汉字或字母视为一个 token。优点是词汇表极小,能覆盖所有生僻字;缺点是忽略了语义组合,序列过长,计算效率低。
- 基于词的分词 (Word-level):以空格或标点分割单词。优点是保留了完整的语义单元;缺点是无法处理未登录词 (OOV),且词汇表会非常大。
- 基于子词的分词 (Subword-level):折中方案。如 Byte Pair Encoding (BPE)、WordPiece、Unigram 等。它们通过统计频率合并高频字符序列,既能压缩词汇表,又能有效处理生僻词。
其中,BPE 是目前许多大模型(如 GPT 系列)使用的核心算法。它从字符集开始,迭代地将出现频率最高的相邻字符对合并为新 token,直到达到预设的词汇表大小。
4、代码示例:如何使用 Python 计算 Token
在实际开发中,我们通常使用 Hugging Face 的 transformers 库或 OpenAI 的 tiktoken 库来处理 tokenization。以下是一个使用 计算文本 Token 数量的示例:


