将原始文本转换为模型可以处理的token的算法。分词器维护一个固定的token类型词汇表,并将任何输入文本拆分为该词汇表中的token序列。不同的模型使用不同的分词器——同一句话在Claude、GPT和Llama中的分词结果不同,这会影响上下文使用量和成本。
分词器是你的文本和模型之间看不见的层。它决定了你的提示词消耗多少token、为什么有些语言比其他语言更昂贵、以及为什么代码有时比散文更快地消耗上下文。当你触及上下文限制或遇到意外的API费用时,分词器通常就是答案。
大多数现代分词器使用字节对编码(BPE)或其变体SentencePiece。BPE的工作原理是从单个字节或字符开始,反复合并最频繁出现的相邻对,生成新的token。经过数千次合并后,"the"这样的常见词变成单个token,而罕见词则被拆分为子词片段。
分词器的词汇表大小涉及真正的工程权衡。更大的词汇表(10万以上token)能更高效地压缩文本——常见词汇和短语获得专用token,因此消耗的上下文更少。但更大的词汇表也意味着模型输入和输出层的嵌入表更大。
分词器是在语料库上训练的,而语料库的语言分布决定了效率。英文文本通常约1个token对应1个词。但中文、日文、韩文、阿拉伯文和印地文等语言表达相同含义可能需要2到4倍的token。
分词过程中的怪癖解释了LLM的几种令人困惑的行为。模型在字符级任务上表现不佳(比如数"strawberry"里有几个字母),因为它们看到的是token而非字符。它们处理某些变量名比其他的好,因为常见名称是单个token,而不常见的会被碎片化。