介绍
在大模型应用开发中,分词器(Tokenizer)是连接人类语言与模型输入的关键组件。目前社区中最主流的两大选择是Hugging Face的tokenizers和OpenAI推出的tiktoken。两者都以高性能著称,但在设计哲学、API风格、功能支持和适用场景上存在显著差异。
本文将从性能、易用性、功能完整性、生态兼容性四个维度,全面解析这两个库的优劣,并提供清晰的选型建议,帮助你在不同的项目场景中做出最佳选择。
tokenizers(主流)
- 开发者:Hugging Face
- 核心定位:一个功能全面、高度可定制的高性能分词库。它被设计为Hugging Face生态系统的底层引擎。
- 设计哲学:通用性与可扩展性。它不仅提供了BPE、WordPiece、Unigram等多种主流分词算法的实现,还允许开发者通过配置文件或代码深度定制分词的每一个环节,从预处理正则到后处理规则。
- 核心优势:
- 支持多种算法:BPE, WordPiece, Unigram, ByteLevel-BPE等。
- 高度可定制:可以轻松自定义特殊标记、添加前缀/后缀、控制未知标记的行为等。
- 支持训练:可以直接用它在自定义语料上训练一个全新的分词器。
- 与Hugging Face生态无缝集成:是
transformers库的默认后端。
- 哪些主流开源模型在用?
- Meta Llama 系列 (Llama 2, Llama 3):目前最火的开源模型之一,其官方和社区的实现都基于transformers和tokenizers。
- 通义千问 (Qwen):阿里巴巴达摩院开源的强大模型,提供了完整的transformers兼容版本。
- BERT, GPT-2, T5, BART 等经典模型:这些模型的官方实现就是transformers库本身。
- deepseek
tiktoken
- 开发者:OpenAI
- 核心定位:一个专为速度和内存效率优化的极简分词库,主要用于复现OpenAI模型的分词结果。
- 设计哲学:极简主义与极致性能。它只专注于一件事:将文本快速、准确地转换为Token ID。它的代码库非常小,依赖极少,API设计极其简洁。
- 核心优势:
- 极致的速度:通常被认为是目前最快的分词库之一,尤其在处理长文本时优势明显。
- 极小的内存占用:加载的分词器模型非常轻量。
- API极简:学习成本极低,几行代码即可上手。
- 官方标准:能完美复现GPT-3.5, GPT-4,
cl100k_base等OpenAI官方模型的分词结果。
- 哪些主流开源模型在用?
- OpenAI
性能对比
两者都采用Rust或C++等高性能语言编写核心逻辑,性能都远超纯Python实现。但在具体场景下,tiktoken通常略胜一筹。
| 特性 | tokenizers |
tiktoken |
结论 |
|---|---|---|---|
| 核心语言 | Rust | Rust | 旗鼓相当 |
| 分词速度 | 极快 | 极致快 | tiktoken在大多数基准测试中略快,尤其是在长文本上。 |
| 内存占用 | 低 | 极低 | tiktoken的模型文件更小,加载更快,内存占用更低。 |
| 启动时间 | 快 | 非常快 | tiktoken的初始化开销极小。 |
一句话总结:如果你的应用场景对每毫秒的性能都锱铢必较,tiktoken是不二之选。tokenizers虽然也很快,但为其丰富的功能付出了微小的性能代价。
API风格与易用性
1. tokenizers 的API风格:功能丰富,略显复杂
tokenizers的API围绕“分词器对象”构建,提供了丰富的方法来控制分词的每一个步骤。
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.pre_tokenizers import Whitespace
from tokenizers.trainers import BpeTrainer
# 1. 加载或创建一个分词器
# 从文件加载
tokenizer = Tokenizer.from_file("path/to/your/tokenizer.json")
# 或者从头创建并训练
tokenizer = Tokenizer(BPE())
tokenizer.pre_tokenizer = Whitespace()
trainer = BpeTrainer(special_tokens=["<|endoftext|>"])
tokenizer.train_from_iterator(["your", "training", "data"], trainer=trainer)
# 2. 编码文本
output = tokenizer.encode("Hello, world! This is a test.")
print("Tokens:", output.tokens)
print("Token IDs:", output.ids)
# 3. 解码Token IDs
decoded_text = tokenizer.decode(output.ids)
print("Decoded:", decoded_text)
# 4. 批量编码(支持多线程)
batch_output = tokenizer.encode_batch(["First sentence.", "Second sentence."])
特点:API功能完备,控制力强,但需要理解Tokenizer, Model, PreTokenizer, Trainer等多个概念,上手稍复杂。
2. tiktoken 的API风格:极简直观,即插即用
tiktoken的API非常直接,核心就是加载编码和解码。
import tiktoken
# 1. 加载一个预定义的编码(Tokenizer)
# cl100k_base 是 GPT-4, GPT-3.5-Turbo 等模型使用的编码
encoding = tiktoken.get_encoding("cl100k_base")
# 或者通过模型名称获取
encoding = tiktoken.encoding_for_model("gpt-4")
# 2. 编码文本为Token IDs
token_ids = encoding.encode("Hello, world! This is a test.")
print("Token IDs:", token_ids)
# 3. 解码Token IDs为文本
decoded_text = encoding.decode(token_ids)
print("Decoded:", decoded_text)
# 4. 获取Token数量(这是一个非常常见的操作)
num_tokens = len(token_ids)
print("Number of tokens:", num_tokens)
特点:API极其简洁,目标明确。对于只想快速编码/解码并计数的用户来说,体验非常流畅。
功能完整性
这是两者最核心的区别。
| 功能 | tokenizers |
tiktoken |
|---|---|---|
| 支持的算法 | BPE, WordPiece, Unigram, ByteLevel-BPE | 仅支持OpenAI使用的BPE变体 |
| 训练新分词器 | ✅ 完全支持 | ❌ 不支持 |
| 自定义特殊标记 | ✅ 高度灵活 | ✅ 有限支持(只能添加,不能修改合并规则) |
| 添加前缀/后缀 | ✅ | ❌ |
| 填充(Padding)和截断(Truncation) | ✅ | ❌ |
| 生成Attention Mask | ✅ | ❌ |
| 官方模型覆盖 | 覆盖所有Hugging Face模型 | 仅覆盖OpenAI官方模型 |
一句话总结:tokenizers是一个功能齐全的通用工具箱,而tiktoken是一个专门用于处理OpenAI模型的专用工具。
生态系统与适用场景
1. tokenizers 的适用场景
- Hugging Face生态开发:当你使用
transformers库中的任何模型(如BERT, GPT-2, Llama, Qwen等)时,tokenizers是默认且唯一的选择。它能确保分词器与模型完美匹配。 - 研究与自定义模型训练:如果你需要在自己的数据集上训练一个全新的模型,你几乎肯定需要使用
tokenizers来训练一个与之配套的分词器。 - 需要复杂预处理的场景:如果你的应用需要在分词前后进行复杂的文本操作,
tokenizers丰富的钩子和配置能满足你的需求。
2. tiktoken 的适用场景
- 与OpenAI API集成:这是
tiktoken最主要的用途。在调用OpenAI API前,使用tiktoken精确计算提示词(Prompt)和补全(Completion)的Token数量,从而精确控制成本和避免超出上下文长度限制。 - 追求极致性能的场景:在一些对性能要求极高的生产环境中,如实时数据流处理,
tiktoken的微小性能优势可能会被放大。 - 需要轻量级依赖的场景:
tiktoken的依赖非常少,易于安装和部署,适合对环境有严格要求的应用。
选型建议
| 特性 | tokenizers |
tiktoken |
|---|---|---|
| 核心优势 | 功能全面、可训练、生态完整 | 极致速度、内存高效、API极简 |
| 主要劣势 | API相对复杂,性能略逊 | 功能单一,不支持训练,仅限OpenAI模型 |
| 最佳拍档 | transformers 库 |
openai Python库 |
| 社区支持 | 非常活跃,Hugging Face官方维护 | 活跃,OpenAI官方维护 |
最终决策树
你是否在使用OpenAI的API?
- 是 -> 首选
tiktoken。它是官方标准,能帮你精确计费和管理上下文。 - 否 -> 进入下一步。
- 是 -> 首选
你是否在使用Hugging Face的
transformers库或训练自定义模型?- 是 -> 必须使用
tokenizers。它是生态的一部分,无法替代。 - 否 -> 进入下一步。
- 是 -> 必须使用
你的核心需求是什么?
- 极致的速度和极简的API -> 选择
tiktoken。 - 除了分词,还需要填充、截断、生成Mask等功能 -> 选择
tokenizers。
- 极致的速度和极简的API -> 选择