tiktoken
OpenAI 开源的 BPE 分词器,精确计算 GPT/Claude 等模型的 token 消耗
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
OpenAI 开源的 BPE 分词器,精确计算 GPT/Claude 等模型的 token 消耗
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
如果你曾与 GPT、Claude 等大语言模型 "对话",不知道有没有想过一个问题:模型看到的文字,和你看到的文字是一样的吗?
答案是否定的。模型并不直接读取汉字或英文单词,而是将文本转换成一个个数字 ID——这些数字就是 token(词元)。一个汉字大约对应 1-2 个 token,英文单词则根据长度被拆成几个 subword(子词)。将文本转换为 token 的过程,叫做分词(Tokenization),而完成这个过程的核心算法,就是 BPE(Byte Pair Encoding,字节对编码)。
tiktoken 就是 OpenAI 开源的 BPE 分词器,它是 ChatGPT API 背后默默运转的"翻译官"。只要你在调用 OpenAI API 时涉及 token 计数、上下文窗口计算,tiktoken 就在发挥作用。
在 tiktoken 出现之前,OpenAI 内部使用一套闭源的分词实现。虽然 Hugging Face 的 tokenizers 库提供了类似功能,但存在两个核心问题:
速度瓶颈。Hugging Face 的 Python 实现本质上是纯 Python 或调用 Rust 底层库,在高频 API 调用场景下,分词环节成为了性能瓶颈。以 OpenAI 的 API 规模而言,每秒可能处理数百万次分词请求,分词速度的微小差异会被放大成巨大的成本和延迟差异。
精确匹配需求。OpenAI 的不同模型(如 GPT-4、GPT-3.5-Turbo、o1-preview)使用不同的编码方案。如果用第三方库模拟这些编码,存在细微差异导致 token 计数不准的风险——超出上下文窗口限制的请求会被 API 直接拒绝。
因此,OpenAI 选择从零开发 tiktoken:核心逻辑用 Rust 实现(极致性能),通过 PyO3 绑定暴露 Python 接口,兼容 pip 安装。2022 年正式开源后,迅速成为 Python 生态中调用 OpenAI API 时的标准 token 计数工具。
tiktoken 提供了两个核心入口:
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
# 根据模型自动选择编码
enc = tiktoken.encoding_for_model("gpt-4o")
支持的编码方案包括:cl100k_base(GPT-4/ChatGPT)、o200k_base(GPT-4o 及更新模型)、p50k_base(Codex)、p50k_edit(编辑模型)、r50k_base(GPT-3)等,覆盖了 OpenAI 全系列模型。
tiktoken 的核心算法完全由 Rust 实现,对外提供 Python API。Rust 保证了内存安全的同时,实现了极高的计算效率。根据官方基准测试,在 1GB 文本上,tiktoken 比 Hugging Face 的 GPT2TokenizerFast 快 3-6 倍。
tiktoken 包含了一个 _educational 子模块,专门用于教学:
from tiktoken._educational import *
# 训练一个简单的 BPE 编码器
enc = train_simple_encoding()
# 可视化 GPT-4 编码过程
enc = SimpleBytePairEncoding.from_tiktoken("cl100k_base")
enc.encode("hello world")
这个模块适合希望深入理解 BPE 算法原理的开发者,是理解语言模型工作机制的绝佳入口。
tiktoken 支持扩展新的编码方案,只需传入 BPE 训练好的词汇表文件(vocab)和合并规则(merges),即可支持任意自定义编码。这为第三方模型接入提供了标准化扩展路径。
tiktoken 采用典型的"高性能核心 + 友好接口"架构:
src/lib.rs:Rust 核心库,实现 BPE 编码/解码的高效算法src/py.rs:PyO3 绑定层,将 Rust 函数暴露为 Python 可调用对象tiktoken/core.py:Python 上层 API,提供 get_encoding() 和 encoding_for_model() 等入口tiktoken/load.py:负责从远程加载编码词汇表数据(支持 HTTP 和本地文件)tiktoken/registry.py:内置编码方案注册表,管理所有支持的编码方案元数据tiktoken/model.py:编码模型定义,包含正则规则和特殊 token 配置项目使用 pyo3 crate 构建 Python 扩展模块,Cargo.toml 配置如下:
crate-type: ["cdylib", "rlib"]:cdylib 生成 .so/.pyd 供 Python import,rlib 供 Rust 内部测试extension-module feature:避免 PyO3 与 Python 静态链接,确保跨平台兼容性构建系统使用 setuptools-rust,通过 cibuildwheel 自动构建 macOS(x86 + ARM)、Linux 多平台 wheel,开发者无需手动编译。
| 层次 | 技术 |
|---|---|
| 核心算法 | Rust(Rust 1.75+,edition 2024) |
| Python 绑定 | PyO3 0.28 |
| 构建工具 | setuptools-rust + cibuildwheel |
| 依赖 | fancy-regex、regex、rustc-hash、bstr |
| Python 版本 | >= 3.9,支持自由线程 Python 3.13 |
pip install tiktoken
纯 Python 安装,无需 Rust 工具链(wheel 已预编译)。支持 macOS(Intel + Apple Silicon)、Linux(x86_64 + aarch64)。
只有一个运行时依赖:regex(正则表达式处理)。可选依赖 blobfile 用于优化远程词汇表加载性能。
作为纯计算库,tiktoken 对硬件几乎没有要求:
对于需要在生产环境中集成的开发者,建议将 tiktoken 封装为微服务或直接在应用进程内调用。
随着大模型上下文窗口越来越大(GPT-4o 支持 128K tokens,Claude 3.5 支持 200K tokens),精确的 token 计数直接影响 API 调用成本。tiktoken 的出现让"按 token 计费"变得透明、可验证,推动了整个行业对 token 计数标准化的重视。
tiktoken 开源后,迅速被 LangChain、AutoGPT、Semantic Kernel 等主流 AI 开发框架集成。这些框架在计算 LLM 调用成本、构建检索增强生成(RAG)管道时,依赖 tiktoken 做精确的上下文窗口管理。
从 CHANGELOG 可以看到,tiktoken 对 OpenAI 新模型的支持非常迅速:
这种快速迭代能力,让 tiktoken 成为 OpenAI 开发者工具链中不可或缺的一环。
tiktoken 是一款看似简单、实则极其重要的底层基础设施库。它用 Rust 实现 BPE 分词算法,以 Python 库的形式提供给开发者,解决了 OpenAI API 调用中"精确计数 token"这个看似小但实际影响巨大的问题。
对于 AI 开发者,掌握 tiktoken 意味着能够精确管理上下文窗口、优化 prompt 长度、降低 API 调用成本。对于 AI 爱好者,理解 token 的概念是理解语言模型工作原理的关键一步。
如果你正在构建基于 OpenAI API 的应用,强烈建议将 tiktoken 纳入开发工具链——它是你与 GPT 之间最底层也最可靠的"翻译官"。