模型吃不了字符串,只能吃数字。文本先按 UTF-8 变成字节,取值 0 到 255,一共 256 个符号。直接拿这 256 个去训也行,但一个汉字或表情往往占 3、4 个字节,序列会拉得很长;Transformer 的注意力是平方复杂度,序列一长,算力和显存都扛不住。
所以用 BPE。词表从这 256 个字节起步,在海量文本里数相邻字节对出现多少次,把最高频的一对并成一个新 Token,从 256 起给新 ID。文本里所有这对都替换掉,再重新统计,继续并。合并不看语法,只看频率。常见的 th、the、ing、post 会一步步并成单个 Token。每并一次,序列变短一点。
一个 Token 可能是整词、词根、单个字母,也可能是空格。模型内部看见的是整数 ID,不是字母。所以问 strawberry 里有几个 r,它容易数错;hello 前面多个空格,ID 就变了;某种语言或代码缩进合并不好,会被切成一堆碎 Token,上下文耗得快,推理也更贵。分词器定了模型真正“看见”的世界。