分词器如何分解文本:三个因素

#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 多个空格

开发者启示

一句话总结:

分词行为 = 算法 × 参数 × 训练数据  

实践建议:

  1. 不可互换:模型和分词器是绑定的,就像.dll.exe必须匹配
  2. 领域专用:代码生成模型用代码专用分词器
  3. 版本兼容: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  ←  [模型输出]  

一句话总结:分词器的行为 = 算法 + 参数 + 训练数据