Appearance
实验 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就绪 (点击运行)
点击右上角「▶ 运行」或按 ⌘/Ctrl+Enter 在浏览器端直接执行交互实验指南与思考题
- 观察高频合并:在输入框中输入重复性文本(如
strawberry或重复汉字大语言模型大语言模型),观察频次统计表中的 Top 候选字节对,点击逐步合并,体会压缩比的变化。 - 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