零基础入门 AI:1 token ~= 3/4 words?3 分钟理解大语言模型分词
ChatGPT API 按 token 数量收费,那么 1 个 token 究竟是多少?
按 OpenAI 的估算,1 token ~= 3/4 words,100 个 token 大约是 75 个单词。
输入的文本是如何被分解为 token 的呢?在大语言模型处理文本时,分词(Tokenization)是最基础又相对独立的一个环节,在整个流程中非常重要,但又经常容易被忽略。今天我们就一起来梳理分词(Tokenization)相关的知识。
简介
什么是分词(Tokenization)?
分词(Tokenization)是为了将自然语言转换为计算机可以理解的数值形式。分词的过程是将文本分解为更小单元的过程,这些更小的单元通常被称为 token。这些 token 可以是单词、子词或者字符,具体取决于所选用的分词方法。这些 token 将会进一步被转换为数字 ID,再转换为向量,从而成为计算机可以理解的输入形式。
分词粒度
分词(Tokenization)有三种主要的粒度:
- 词级别(Word-Based Tokenization):这是最自然的语言单元,对于像英文这样的语言,单词之间天然存在空格分隔,因此切分相对容易。但会造成词表过大,也一定会存在超出词汇表的词(OOV),而且还不能学到词根或词缀的关系。
- 字符级别(Character-Based Tokenization):这是最细粒度的 tokenize 方法,将文本切分为单个字符。这种方法在处理某些语言或任务时可能很有用,尤其是当文本中包含很多未知词或拼写错误时。然而,字符级别的 tokenize 会丢失一些词或短语级别的语义信息。
- 子词级别(Subword-Based Tokenization):这种方法介于词和字符之间,旨在解决词级别 tokenize 可能遇到的问题,如超出词汇表的词(OOV)问题和词表过大问题。子词方法可以将一个词进一步切分为更小的有意义的单元,如词缀或词根。这也是目前最主流的分词粒度。
Subword 分词方法
常见的 subword 分词方法大致可分为以下两类:
基于规则的分词方法:比如 python 中的 NLTK、spaCy 等等,通常是依赖于预定义的规则和模式来识别分词的边界。
from nltk.tokenize import word_tokenize
text = "Don't you love eating apples?"
word_tokens = word_tokenize(text)
print(word_tokens)
# ['Do', "n't", 'you', 'love', 'eating', 'apples', '?']
基于预训练模型的分词方法:比如 python 中的 transformers,可以加载不同的预训练模型,这些模型已经在大量文本上进行了训练,学习了单词的上下文表示。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("lmsys/vicuna-7b-v1.5")
text = "Don't you love eating apples?"
print(tokenizer.tokenize(text))
# ['▁Don', "'", 't', '▁you', '▁love', 'e', 'ating', '▁app', 'les', '?']
在目前主流的大语言预训练模型中,常见的 subword 分词算法有三种:
- BPE(Byte Pair Encoding):BPE 是一种基于频率的子词分词算法,它从字符级别的分词开始,通过不断合并常见的相邻字符来生成新的子词。这个过程持续进行,直到达到预定的词表大小。


