Tokenization
Tokenization
Section titled “Tokenization”Tokenization 是把原始文本转换成模型能理解的数字序列。看似简单,实则影响模型的一切行为。
为什么重要?
Section titled “为什么重要?”同一个意思,不同切分方式会让模型”看到”完全不同的东西:
"我喜欢吃苹果" → ["我", "喜欢", "吃", "苹果"] # 词级别"unbelievable" → ["un", "believe", "able"] # 子词级别"Hello world!" → ["Hello", " world", "!"] # BPEBPE:主流分词算法
Section titled “BPE:主流分词算法”BPE(Byte Pair Encoding)是 GPT 系列使用的算法:
- 从字符级别开始
- 统计相邻 token 对的频率
- 合并最高频的 token 对
- 重复直到达到目标词表大小
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "The Transformer architecture revolutionized AI."tokens = tokenizer.encode(text)print(f"Token IDs: {tokens}")print(f"Token 数量: {len(tokens)}")
# 查看每个 tokenfor tid in tokens: print(f" {tid:>5} → '{tokenizer.decode([tid])}'")不同分词器对比
Section titled “不同分词器对比”text = "Let's tokenize: AI isn't easy, but it's worth it!"
for name in ["gpt2", "bert-base-uncased", "t5-small"]: tok = AutoTokenizer.from_pretrained(name) ids = tok.encode(text) print(f"{name}: {len(ids)} tokens → {[tok.decode([t]) for t in ids]}")分词器的”坑”
Section titled “分词器的”坑””tokenizer = AutoTokenizer.from_pretrained("gpt2")
# 1. 数字处理不稳定print(tokenizer.encode("2024")) # 可能 1 个 tokenprint(tokenizer.encode("2025")) # 可能 2 个 token
# 2. 大小写敏感print(tokenizer.encode("hello")) # [31373]print(tokenizer.encode("Hello")) # [15496]
# 3. 中文分词效率低cn_text = "人工智能正在改变世界"print(f"中文字符: {len(cn_text)}") # 9print(f"Token 数: {len(tokenizer.encode(cn_text))}") # 15-20中文分词的挑战
Section titled “中文分词的挑战”中文 tokenizer 通常 1-2 个汉字 = 一个 token,效率远低于英文(一个单词 = 一个 token)。这是中文 API 费用更高的原因之一。
- 词表大小:GPT-4 约 100K tokens,Llama 3 约 128K tokens
- 特殊 token:
<|endoftext|>(分隔)、<|user|>(对话角色) - 中文分词:通常 1-2 汉字/token,效率低于英文