Tokenization
Tokenization 是模型的第一道工序:文本切成 token 再进模型。面试主线:为什么需要、主流算法、中英文差异、工程影响。
为什么需要
- 模型输入输出都是 token 序列(embedding 查表按 token)
- 词汇表固定(如 32K-150K),不能直接吃任意文本
- token 是计价单位:API 按 token 收费,上下文长度按 token 算
BPE:字节对编码(主流)
语料统计高频字符对 → 合并成新 token → 重复直到词汇表满
例: "low" + "er" → "lower"; "play" + "ing" → "playing"- BPE 从字符/字节开始,逐步合并高频对,词汇表里既有词也有子词
- 特点:未登录词也能表示(拆成子词/字节),词表可控
- 子词的好处:形态变化共享 token(run/running/runs 共用车+后缀)
其他算法
| 算法 | 机制 | 使用 |
|---|---|---|
| BPE | 合并高频字节对 | GPT 系列、Llama |
| WordPiece | 按语言模型概率挑合并 | BERT |
| SentencePiece | 直接处理原始文本(含空格),可换 BPE/Unigram | T5、Llama 部分 |
| Unigram | 概率模型逐步删除 token | SentencePiece 选项 |
中英文差异
- 英文:词根子词切分(“unbelievable” → un + believ + able),平均 ~1.3 token/词
- 中文:没有空格分词,常见做法是单字/双字成 token(或按字节 BPE)
- 中文 token 效率低:一个汉字常对应 1-2 个 token,同样意思中文的 token 数多于英文(成本高、上下文占得快)
- 面试点:中文场景注意 token 消耗,提示词和上下文要精简;部分中文模型针对中文优化过词表
工程影响
| 影响 | 说明 |
|---|---|
| 成本 | 输入输出都按 token 计费 |
| 上下文 | 窗口按 token 算,中文占得快 |
| 质量 | 切分不当时模型理解差(罕见词拆得碎) |
| 一致性 | 同一内容 token 数因模型而异 |
tiktoken 等工具可以预估 token 数(调 API 前算成本、控制上下文长度)。
面试追问
- BPE 怎么工作? 从字符开始,统计并合并高频字节对,直到词表满。子词表示未登录词
- 为什么要子词? 词表可控 + 未登录词可拆 + 形态共享(run/running 共用前缀)
- 中文 token 有什么问题? 无空格分词,单字/双字成 token,效率低:同样内容 token 数更多,成本更高
- token 和字符的关系? 不一定一一对应:英文词根、中文单字、标点单独。用 tiktoken 预估
- 词汇表多大? 主流 32K-150K。越大表示越精细但 embedding 层越大