Ch10 LLM架构

项目五:从零训练一个分词器

20 分钟。需要 Python 基础。你会亲手训练一个 AI 的分词器——就是 ChatAI 把文字切成 token 的那个东西。

你要做什么

用 BPE(字节对编码)算法,从一个文本文件里学出一个分词器。训练完成后,你可以把任意中文句子切成 token。

为什么学这个

第10章 · LLM 原理与架构演进 讲了 tokenizer 是 AI 的”词典”。现在你亲手做一个,理解 token 到底是怎么来的。

第一步:准备训练文本

创建一个 corpus.txt,放一些中文文本(越多越好,至少几百字):

人工智能是计算机科学的一个分支。人工智能企图了解智能的实质。
深度学习是机器学习的一个分支。深度学习使用多层神经网络。
自然语言处理是人工智能的重要应用。自然语言处理让计算机理解人类语言。

第二步:安装依赖

pip install tokenizers

HuggingFace 的 tokenizers 库速度极快(Rust 写的)。

第三步:训练

from tokenizers import Tokenizer, models, trainers, pre_tokenizers

# 创建 BPE 分词器
tokenizer = Tokenizer(models.BPE())

# 预分词:按字符分割(中文不需要空格分词)
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=False)

# 训练
trainer = trainers.BpeTrainer(
    vocab_size=300,        # 词汇表大小
    min_frequency=1,       # 最少出现次数
    special_tokens=["[PAD]", "[UNK]", "[CLS]", "[SEP]"],
)
tokenizer.train(["corpus.txt"], trainer)

# 保存
tokenizer.save("my_tokenizer.json")
print("分词器已保存!")

# 测试
loaded = Tokenizer.from_file("my_tokenizer.json")
text = "人工智能让计算机理解人类语言"
output = loaded.encode(text)
print(f"原文: {text}")
print(f"Token IDs: {output.ids}")
print(f"Tokens: {output.tokens}")

第四步:看看输出

运行后会看到类似:

原文: 人工智能让计算机理解人类语言
Token IDs: [45, 78, 23, 89, 102, 56, 90, 120]
Tokens: ['人工', '智能', '让', '计算机', '理解', '人类', '语言']

你的分词器把”人工智能”分成了”人工”和”智能”两个 token——因为训练数据不够多,它还没见过”人工智能”作为一个整体。

试试更多

增加训练数据:往 corpus.txt 加更多文本(可以复制粘贴一篇长文章)。词汇表从 300 扩到 1000。重新训练,看看分词效果有什么变化。

调整参数:把 vocab_size 改成 100、500、2000,观察:

  • 太小:很多词被切成单字(“人""工""智""能”)
  • 太大:训练变慢,但分词更准确

看看训练过程:BPE 算法从单个字符开始,统计哪些字符对最常一起出现,把它们合并成一个新 token。重复这个过程直到达到 vocab_size。

你学到了什么

  • Tokenizer 不是魔法——就是统计哪些字符经常一起出现,把它们合并成词
  • 词汇表大小决定了分词粒度:太小 = 单字,太大 = 速度慢
  • BPE 是 GPT 系列使用的分词算法(第10章 · LLM 原理与架构演进)

相关笔记

来源

关联5

知识图谱

局部图谱 · 点节点跳转