Skip to content

Tokenization

Tokenization 是把原始文本转换成模型能理解的数字序列。看似简单,实则影响模型的一切行为。

同一个意思,不同切分方式会让模型”看到”完全不同的东西:

"我喜欢吃苹果" → ["我", "喜欢", "吃", "苹果"] # 词级别
"unbelievable" → ["un", "believe", "able"] # 子词级别
"Hello world!" → ["Hello", " world", "!"] # BPE

BPE(Byte Pair Encoding)是 GPT 系列使用的算法:

  1. 从字符级别开始
  2. 统计相邻 token 对的频率
  3. 合并最高频的 token 对
  4. 重复直到达到目标词表大小
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)}")
# 查看每个 token
for tid in tokens:
print(f" {tid:>5} → '{tokenizer.decode([tid])}'")
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]}")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
# 1. 数字处理不稳定
print(tokenizer.encode("2024")) # 可能 1 个 token
print(tokenizer.encode("2025")) # 可能 2 个 token
# 2. 大小写敏感
print(tokenizer.encode("hello")) # [31373]
print(tokenizer.encode("Hello")) # [15496]
# 3. 中文分词效率低
cn_text = "人工智能正在改变世界"
print(f"中文字符: {len(cn_text)}") # 9
print(f"Token 数: {len(tokenizer.encode(cn_text))}") # 15-20

中文 tokenizer 通常 1-2 个汉字 = 一个 token,效率远低于英文(一个单词 = 一个 token)。这是中文 API 费用更高的原因之一。

  • 词表大小:GPT-4 约 100K tokens,Llama 3 约 128K tokens
  • 特殊 token:<|endoftext|>(分隔)、<|user|>(对话角色)
  • 中文分词:通常 1-2 汉字/token,效率低于英文