Skip to content

实验 05 · Byte 级 BPE — merge 循环与 exact round-trip ​

本实验将 Tokenizer 的核心逻辑从“黑盒 API 调用”转化为“看得见的频次统计与合并演进”。你可以直接在下方免安装的网页 BPE 演练台中输入任意中英文、代码或 emoji,观察从 UTF-8 字节流逐步合并为词表单元的全过程。

演练台固定使用 byte-level BPE。换一份语料或改 merge 次数,词表成员会变;换算法(WordPiece、Unigram)、预分词或特殊 token,变的是另一组集合。代码模型的对照见 第6章 · 词表成员。


网页即时交互实验:UTF-8 字节级 BPE 合并演练 ​

在现代 LLM 中,模型底层并不直接理解字符串,而是接收整数 Token ID。字节级 BPE(Byte-level BPE)以 256 个原生字节为初始词表,通过贪心地统计连续高频字节对并逐步执行 merge 操作,扩充词表:

交互:BPE 合并与编解码

raw bytes: 6 token ids: [258, 256, 257] (3 toks) decode: lowest round-trip: OK

合并步骤
merge 1: ("w" + "e") → id 256 ×8
merge 2: ("s" + "t") → id 257 ×8
merge 3: ("l" + "o") → id 258 ×7
merge 4: ("st" + " ") → id 259 ×7
merge 5: (" " + "lo") → id 260 ×6
merge 6: ("st " + "n") → id 261 ×6
merge 7: ("st n" + "e") → id 262 ×6
merge 8: ("st ne" + "we") → id 263 ×6
merge 9: ("w" + " lo") → id 264 ×5
merge 10: ("st newe" + "st newe") → id 265 ×5
🐍

实验 05 · UTF-8 字节级 BPE 分词

统计相邻连续字节对频次,执行贪心合并演进与词表扩充
↗ 独立演练台
Python 3行 1, 列 129 行 · 854 字符
运行:⌘ / Ctrl + ↵
就绪 (点击运行)
点击右上角「▶ 运行」或按 ⌘/Ctrl+Enter 在浏览器端直接执行

交互实验指南与思考题 ​

  1. 观察高频合并:在输入框中输入重复性文本(如 strawberry 或重复汉字 大语言模型大语言模型),观察频次统计表中的 Top 候选字节对,点击逐步合并,体会压缩比的变化。
  2. emoji 与多字节字符:输入包含多字节 UTF-8 编码的字符(如 🔥 为 4 字节 f0 9f 94 a5),观察在尚未完全合并前,Token 是如何以散装字节切分的,这直观解释了为什么旧模型数错 emoji 或产生乱码。

本地动手实验与单元测试 ​

在网页端获得直观认识后,回到本地运行你的纯手写 BPE 分词器,验证端到端的 UTF-8 无损往返(round-trip):

bash
cd <仓库根目录>
source .venv/bin/activate
export PYTHONPATH="$PWD/python"

# 运行 BPE 编码与解码单元测试
pytest python/tests/test_bpe.py -v

下一步 ​

→ 返回第6章正文查看完整实现细节与故障注入表
→ 进入实验 06:Tensor 反传与训练稳定性

私有学习站 · 原理从零构建 · 勿提交个人隐私或密钥