Skip to content

Tokenizer 与分词

Tokenizer 决定了模型如何把文本切成 token,是输入输出的第一道关口,也是中英文成本差异、词表大小等问题的根源。

什么是 Tokenizer?

Tokenizer(分词器)负责把原始文本切分成 token 序列,并映射成模型词表(vocabulary)中的整数 ID;反过来也负责把模型输出的 ID 解码回文本。token 是模型处理的最小单位,粒度介于「字符」和「单词」之间。

为什么不直接用字符或单词?

  • 按单词切分(Word-level):词表会非常大,且无法处理未登录词(OOV,如新词、拼写错误)。
  • 按字符切分(Char-level):词表很小,但序列变得极长,且单个字符语义稀薄,建模困难。
  • 子词切分(Subword):折中方案。常见词作为整体,罕见词拆成子词片段,兼顾词表大小和 OOV 处理,是主流做法。

主流子词算法

BPE(Byte Pair Encoding)

从字符开始,统计相邻 token 对的出现频率,反复合并最高频的对,直到达到目标词表大小。GPT 系列使用 Byte-level BPE(在字节而非字符上操作),可以编码任意 Unicode,彻底消除 OOV。

一个最小化的合并过程示例(语料里 "low"、"lower"、"newest" 反复出现):

初始:  l o w   l o w e r   n e w e s t
统计高频相邻对 → "e s" 最高 → 合并为 "es"
        l o w   l o w e r   n e w es t
再合并 "es t" → "est"
        l o w   l o w e r   n e w est
再合并 "l o" → "lo" ……
直到词表达到目标大小,"low"、"est" 等高频片段成为独立 token

推理时按训练好的合并规则把新文本切成已知 token;罕见词自然被拆成更小的已知子词。

WordPiece

与 BPE 类似,但合并时选择「能最大化语料似然」的对,而非单纯最高频。BERT 使用 WordPiece。

Unigram / SentencePiece

SentencePiece 是 Google 的工具库,把文本当作原始字节流处理(不依赖空格分词,对中文、日文友好),常配合 Unigram 语言模型算法。LLaMA、T5、Qwen 等大量使用。

中文为什么更「费 token」?

英文一个常见单词往往就是 1 个 token,而中文由于词表覆盖有限,一个汉字常被切成 1~2 个甚至更多 token(尤其 byte-level 下生僻字会拆成多个字节 token)。这导致:

  • 同样的内容,中文消耗的 token 更多 → API 成本更高、占用更多上下文。
  • 因此面向中文的模型(如 Qwen、GLM)会扩充中文词表来缓解。

高频追问

Q:词表大小如何权衡? 词表越大,单个 token 承载信息越多、序列越短、推理越快,但 Embedding 和输出层参数变多、显存占用增加,且低频 token 训练不充分。常见词表大小从 3 万到 15 万不等。

Q:为什么大模型会数错字母、做不好字符级任务(如反转字符串)? 因为模型看到的是 token 而非单个字符,一个 token 可能包含多个字符,模型对 token 内部的字符结构感知很弱。

Q:special token 有哪些?<bos>/<eos>(句子开始/结束)、<pad>(填充)、<unk>(未知)、以及对话模板里的角色标记(如 <|user|><|assistant|>)。微调时对齐这些模板非常重要。

Q:Tokenizer 和模型必须配套吗? 是的。token ID 与 Embedding 一一对应,换了 Tokenizer 就等于换了输入空间,模型权重无法直接复用。

Q:BPE 和 WordPiece 的核心区别? 二者都从字符开始迭代合并。BPE 按「频率」选择合并对(最高频的相邻对);WordPiece 按「能最大化语料似然」选择(合并后对语言模型概率提升最大的对)。BPE 更简单、更主流。

Q:为什么扩充中文词表能省 token / 提速? 默认词表里中文覆盖少,一个汉字常被拆成多个字节 token。扩充中文词表后,常见汉字/词组成为单个 token,序列变短,既省 API 成本又加快推理。代价是 Embedding 和输出层参数变大,且需要继续训练让新 token 学到合理表示。

Q:同样一段话,为什么不同模型算出的 token 数不同? 因为各家 Tokenizer 的算法、词表大小和语料不同。同一句中文在 GPT 系列和 Qwen 上的 token 数可能差一倍以上,所以跨模型比较成本时要用各自的分词器实际计数,不能套用固定换算。

基于 MIT 许可发布