跳到主要内容

Byte-level BPE 与 Tiktoken

要解决的问题

Unicode 字符集极大,纯字符 BPE 仍可能遇到罕见码点;字节级词表固定为 256(或 512 含扩展),任意 UTF-8 文本均可分解为字节序列再合并,彻底消除 UNK。OpenAI GPT-2/3/4 与 Claude 等商用栈广泛采用;tiktoken 提供高性能 Rust 实现。

核心概念

流程:

  1. UTF-8 文本 → 字节序列 b1,,bLb_1,\ldots,b_Lbi{0,,255}b_i \in \{0,\ldots,255\}
  2. 在字节对上运行 BPE merges,得到子词 token;
  3. 可选 regex 预切分(GPT-2 模式):先按模式切分再对每段做 BPE。

词表大小 VV 通常含 256 字节 token + merges 产物 + 特殊 token。

实现特点
tiktokenOpenAI 维护,编码极快,与 GPT-4 兼容
HF tokenizersByteLevel + BPE,生态广

平均每 token 字节数(英文):

BPT=UTF-8 bytes#tokens\text{BPT} = \frac{\text{UTF-8 bytes}}{\text{\#tokens}}

BPT 越低,同样上下文窗口可塞入更多字符。

方法/算法

GPT-2 风格 pretokenization 正则(概念上)将文本分为字母块、数字、空白等,再对每块独立 BPE,避免跨类别错误合并。

训练与 3.2.2 BPE 相同,仅初始 alphabet 为字节。

编码复杂度:O(LlogV)O(L \cdot \log V) 量级,tiktoken 用 Rust 表查找优化至接近线性实践吞吐。

工程实践

  • 安装pip install tiktokentiktoken.get_encoding("cl100k_base") 等对应 GPT-3.5/4。
  • 自定义tiktoken.Encodingmergeable_ranks 字典构建,需与训练 merges 完全一致。
  • 与推理:vLLM、OpenAI API 假设特定 encoding;混用 encoding 会导致乱码或长度超限。
  • 成本:同样 8k 上下文,cl100k 通常比旧 GPT-2 编码 token 数更少(模型计费相关)。

代表工作

局限与注意点

  • 可读性差:单个「字符」可能对应多字节 token,调试生成结果更困难。
  • 中文效率:字节 BPE 对 CJK 往往 1~3 字节/token,序列仍长于专用中文词表(见 3.2.6)。
  • 安全:字节级可编码任意二进制模式,需内容过滤仍在文本层完成。
  • 版本锁定o200k_base 等新 encoding 与旧模型不兼容。

延伸说明

生产环境锁定 cl100k_base / o200k_base 等名称,API 与训练不一致会长度超限。

实践检查清单

  • 256 字节
  • regex
  • BPT

小结

本节核心:256 字节 与全链路 regex 协同;上线前用检查清单做回归。

常见 encoding 对照

名称关联模型
r50k_baseGPT-3 早期
p50k_baseCodex 部分
cl100k_baseGPT-3.5/4 类
o200k_base较新 OpenAI 模型

切换 encoding 会导致同字符串 token 数不同,上下文窗口计费随之变化。

相关章节