考察点
这道题考的是数据进入模型前的第一道加工工序。面试官想确认你知道 tokenizer 不是查词典,而是统计出来的子词切分算法,以及它能解释很多线上现象:为什么模型算错位数、为什么中文输出比英文慢、为什么有些字符串会触发奇怪行为。追问常往 BPE 训练流程、词表大小取舍、数字切分(Qwen2 之后按位切)和 unigram/SentencePiece 上走。
参考答案
从文本到 token 的流程
整体链路:原始文本先做预切分(pre-tokenization,按空格、标点等规则粗切成片段),然后对每个片段应用子词算法切成 token,每个 token 查表得到一个整数 id,模型实际处理的就是 id 序列。推理输出时反查表还原成文本。
为什么不能按词切?英文按词切词表会爆炸(词形变化、组合词),而且任何没见过的词就 OOV 了。按字符切词表小、无 OOV,但序列太长,一个单词五六个 token,语义被稀释,注意力要处理更长的依赖。子词(subword)算法是折中:常见词整体作为一个 token,罕见词拆成有意义的片段,OOV 问题消失。
BPE 的原理
BPE(Byte Pair Encoding)原本是数据压缩算法,GPT-2 把它引入 tokenizer。训练过程是一个贪心的迭代合并:
- 初始化词表为所有单字节(或单字符,现代实现如 GPT-2/Qwen 用 byte-level,256 个基础 token 保证任何文本都能编码)。
- 统计语料中所有相邻 token 对的出现频率。
- 把频率最高的一对合并成一个新 token,加入词表,并替换语料中所有该对的出现。
- 重复 2、3,直到词表达到目标大小(比如 GPT-4 约 10 万,Qwen2.5 约 15 万)。
编码新文本时,按训练学到的合并规则优先级依次应用:先应用最早学到的(最高频)合并。所以 lower 可能直接是一个 token,而 lowest 切成 low + est。
几个推论值得记住:高频词一定是整词 token,罕见词被拆碎;合并顺序决定了切分结果,所以同一个词在不同上下文(大小写、是否带前导空格)可能切成不同 token 序列——GPT 系里 "world" 和 " world"(带空格)是不同的 token。
中文 token 化的坑
第一,压缩率低。中文一个字往往就是一个 token(甚至生僻字一个字拆成多个字节 token),而英文平均一个 token 约 0.75 个词。同样的上下文窗口,装下的中文信息量明显更少;输出时中文也要生成更多 token,延迟和成本都更高。国产模型(Qwen、GLM)专门针对中文扩了词表,压缩率比 GPT-2 时代的 tokenizer 好不少,选模型时值得关注「中文 fertility」(平均每个字几个 token)。
第二,没有空格边界。中文预切分不能依赖空格,字节级 BPE 直接从 UTF-8 字节流学,一个汉字 3 个字节,常见字能学成整 token,生僻字可能停在字节级,影响语义表示。
第三,数字切分退化。早期 tokenizer 把长数字切成不规则片段("123456" 可能切成 "123"+"456"),模型很难学出数值进位关系,这是大模型算术差的根源之一。新一代 tokenizer(Qwen2、LLaMA-3)普遍把数字按单个数字位切分,配合足够训练,算术能力明显改善。
第四,敏感 token 与注入。某些 token 对应聊天模板里的特殊标记(如 <|im_start|>),如果用户输入能被解析成特殊 token,就可能注入伪造的系统指令。生产系统应对用户输入用 encode 时禁用特殊 token 解析(HuggingFace 里是 add_special_tokens=False 加模板渲染,而不是字符串拼接)。
其他算法
Unigram(SentencePiece 支持)思路相反:从一个大词表出发,按概率模型逐步删贡献小的 token,编码时对同一切分算概率取最优,天然支持子词正则化(同一文本多种切分做数据增强)。T5、LLaMA 用 SentencePiece。WordPiece 是 BERT 用的,合并标准用似然而非频率。实践层面:知道 BPE 是主流、SentencePiece 是常用工具库就够,差异不是高频考点。
可能的追问
- 词表大小怎么定? 大词表压缩率高、序列短,但 embedding 参数多(词表 × hidden 维度)、低频 token 训练不充分;小词表反之。主流在 3 万到 15 万之间,多语言模型偏大。
- 为什么大模型数草莓单词里的字母会数错? 模型看到的是 token id,不是字符,"strawberry" 内部结构对它不可见,除非思维链里逐字母拼出来。
- 怎么快速评估一个 tokenizer 对业务语料的适配度? 算业务语料的 fertility(token 数/字符数),和模型官方基准对比;明显偏高说明词表不覆盖你的领域,成本和效果都会受影响。