分词器如何分解文本:三个因素
#2025/12/27 #ai
目录
1️⃣ 算法选择(分词方法)
// 类比:选择压缩算法
const tokenizer = {
algorithm: "BPE", // GPT系列
// algorithm: "WordPiece", // BERT系列
// algorithm: "SentencePiece" // T5、Llama系列
}
共同目标:用最少的Token高效表示文本,或者说是为了省空间
2️⃣ 参数配置(设计选择)
# 类比:数据库设计参数
config = {
"vocab_size": 50000, # 词表大小
"special_tokens": [ # 特殊标记
"<s>", # 文本开始
"</s>", # 文本结束
"<|user|>", # 用户消息
"<|assistant|>" # AI回复
],
"case_sensitive": True # 大小写策略
}
关键参数:
- 词表大小:30K、50K、100K?(类比:HashMap的容量)
- 特殊词元:系统保留字(类比:编程语言关键字)
- 大小写:保留还是统一?
3️⃣ 训练数据领域
# 即使算法和参数相同,训练数据不同 = 行为不同
tokenizer_english = train(algorithm="BPE", data="英文维基百科")
tokenizer_code = train(algorithm="BPE", data="GitHub代码库")
tokenizer_multilang = train(algorithm="BPE", data="多语言语料")
# 结果:同样的句子,三个分词器切分方式完全不同
为什么? 分词器会“学习“数据集中的高频模式:
代码数据→ 保留缩进、识别关键字(def,return)英文数据→ 优化常见英文单词多语言数据→ 支持中文、emoji等
四种分词粒度对比
| 分词级别 | 示例 | 优点 | 缺点 | 类比 |
|---|---|---|---|---|
| 词级 | ["Have", "the", "bards"] | 直观易懂 | 无法处理新词,词表巨大 | 字典查询 |
| 子词级⭐ | ["Have", "the", "b", "ards"] | 平衡效率与灵活性 | 稍复杂 | 字节码 |
| 字符级 | ["H", "a", "v", "e"] | 永不OOV | 序列太长 | ASCII编码 |
| 字节级 | [0x48, 0x61, 0x76, 0x65] | 真正通用 | 建模难度大 | UTF-8编码 |
现代LLM主流选择:子词级分词(兼顾性能与灵活性)
实际案例:不同分词器的行为差异
text = "CAPITALIZATION 🎵 show_tokens"
# BERT(2018,大小写不敏感)
# 输出:["capital", "##ization", "[UNK]", "show", "_", "token", "##s"]
# 特点:emoji变成[UNK],全部转小写
# GPT-2(2019)
# 输出:["CAP", "ITAL", "IZ", "ATION", "🎵", "show", "_", "t", "ok", "ens"]
# 特点:保留大小写,emoji能识别
# GPT-4(2023)
# 输出:["CAPITAL", "IZATION", "🎵", "show_", "tokens"]
# 特点:更高效,用更少token表示
关键差异:
- 换行符/空格:有的保留,有的丢弃
- 大小写:敏感 vs 不敏感
- 多语言/emoji:支持 vs 替换为
[UNK] - 代码缩进:专用token vs 多个空格
开发者启示
一句话总结:
分词行为 = 算法 × 参数 × 训练数据
实践建议:
- 不可互换:模型和分词器是绑定的,就像
.dll和.exe必须匹配 - 领域专用:代码生成模型用代码专用分词器
- 版本兼容:GPT-2分词器 ≠ GPT-4分词器
类比理解:
- 算法 = 选择哪种数据结构(HashMap vs TreeMap)
- 参数 = 设置容量和加载因子
- 训练数据 = 决定hash函数的分布特性
记住:分词器不是简单的“按空格切分“,而是经过专门训练的、领域特定的文本编码器!
总结
分词器如何切分文本由三个因素决定:
1. 分词算法
选择哪种技术方案:
- BPE(字节对编码)— GPT 系列采用
- WordPiece — BERT 系列采用
- SentencePiece — T5、Llama 系列采用
共同目标:用最少的词元高效表示文本
2. 设计参数
- 词表大小:3万、5万、10万?
- 特殊词元:
<s>、<|end|>、<|user|>等 - 大小写策略:保留还是统一转小写?
3. 训练数据领域
即使方法和参数相同,训练数据不同,分词行为也不同:
- 英文文本数据 → 适合自然语言
- 代码数据 → 保留缩进、关键字
- 多语言数据 → 支持中文、emoji 等
双向职责
分词器是可逆的转换器:
输入文本 → [编码] → 词元ID → [模型处理]
↓
输出文本 ← [解码] ← 词元ID ← [模型输出]
一句话总结:分词器的行为 = 算法 + 参数 + 训练数据