Tokenizer
约 2 分钟阅读
Workflow
- Tokenization/分词/Encode - 文本 -> Token IDs
- 一般使用 BPE 算法
- Decode - Token IDs -> 文本
- 算法
- BPE - Byte Pair Encoding - 基于频率合并、自底向上 - BP 数据压缩算法
- Byte Level
- 能处理任意数据,不会出现
[UNK]
- 能处理任意数据,不会出现
- Character Level
- Word Level
- e.g. gpt2, llama
- Byte Level
- WordPiece - 基于概率合并、自底向上
- e.g. bert
- arXiv:1609.08144arXivarXiv:1609.08144arXiv摘要 · PDF · HTML
- Unigram - 基于概率剪枝、自顶向下
- e.g. T5, ALBERT
- BPE - Byte Pair Encoding - 基于频率合并、自底向上 - BP 数据压缩算法
- digram coding / Byte-pair encoding / BPEWikipediaByte pair encoding tokeniser
- SentencePieceGitHubgoogle/sentencepiece
- Apache-2.0, C++
- 支持 BPE, unigram, char, word
- openai/tiktokenGitHubopenai/tiktoken
- pypi tiktoken
- 定义的模型 openai/tiktoken/tiktoken_ext/openai_public.pyGitHub 文件openai/tiktoken/tiktoken_ext/openai_public.py
- huggingface/tokenizersGitHubhuggingface/tokenizers
- Apache-2.0, Rust
- Go binding daulet/tokenizersGitHubdaulet/tokenizers
- Proposal: Add Golang Bindings for tokenizers huggingface/tokenizers#1751GitHub Issuehuggingface/tokenizers#1751
- rsennrich/subword-nmtGitHubrsennrich/subword-nmt
- Unsupervised Word Segmentation for Neural Machine Translation and Text Generation
- Subword Neural Machine Translation
- dqbd/tiktokenGitHubdqbd/tiktoken
- JS port and JS/WASM bindings for openai/tiktoken
- dqbd/tiktoken/tiktoken/model_to_encoding.jsonGitHub 文件dqbd/tiktoken/tiktoken/model_to_encoding.json
- dqbd/tiktoken/tiktoken/registry.jsonGitHub 文件dqbd/tiktoken/tiktoken/registry.json
- Online tiktokenizer.vercel.app
- dqbd/tiktokenizerGitHubdqbd/tiktokenizer
- Online playground
- dqbd/tiktokenizerGitHubdqbd/tiktokenizer
- tiktokenizer.vercel.app/hf/Qwen/Qwen2.5-72B/tokenizer.json
- HF:Qwen/Qwen2.5-72BHuggingFaceHF:Qwen/Qwen2.5-72Bhuggingface.co · huggingface.co/Qwen/Qwen2.5-72B/blob/main/tokenizer.json
- zurawiki/tiktoken-rsGitHubzurawiki/tiktoken-rs
- MIT, Rust
- crates.io/crates/tiktoken-rs
- Typescript/JS/Wasm
- Golang
- tiktoken-go/tokenizerGitHubtiktoken-go/tokenizerTokenization/分词/Encode - 文本 -> Token IDs · 一般使用 BPE 算法 · Decode - Token IDs -> 文本 · 算法 · BPE - Byte Pair Encoding - 基于频率合并、自底向上 - BP 数据压缩算法笔记:Tokenizer
- MIT, Go
- pkoukk/tiktoken-goGitHubpkoukk/tiktoken-go
- MIT, Go
- tiktoken-go/tokenizerGitHubtiktoken-go/tokenizerTokenization/分词/Encode - 文本 -> Token IDs · 一般使用 BPE 算法 · Decode - Token IDs -> 文本 · 算法 · BPE - Byte Pair Encoding - 基于频率合并、自底向上 - BP 数据压缩算法笔记:Tokenizer
- platform.openai.com/tokenizer链接platform.openai.com/tokenizerTokenization/分词/Encode - 文本 -> Token IDs · 一般使用 BPE 算法 · Decode - Token IDs -> 文本 · 算法 · BPE - Byte Pair Encoding - 基于频率合并、自底向上 - BP 数据压缩算法笔记:Tokenizer
ChatGPT 特殊 Token
<|endoftext|>
<|endofprompt|>
<|eos|>
<|pad|>
<|bos|>
<|eol|>
<|math|>
<|doc|>
<|im_start|>
<|im_end|>
<|im_sep|>
<|fim_prefix|>
<|fim_middle|>
<|fim_suffix|>- add_special_tokens
- 序列标记
- 对话标记
- 功能标记
| model | vocab size | tokenizer | notes |
|---|---|---|---|
| openai/gpt2 | 50257 | byte-level-bpe | |
| openai/r50k_base | 50257 | byte-level-bpe | |
| openai/p50k_base | 50281 | byte-level-bpe | |
| openai/p50k_edit | 50283 | byte-level-bpe | |
| openai/cl100k_base | 100276 | byte-level-bpe | |
| openai/o200k_base | 200018 | byte-level-bpe | |
| openai/o200k_harmony | 201088 | byte-level-bpe |
- o200k_harmony
- vocabe 201088
- 在 c200k_base 上增加了额外的特殊 token
| abbr. | stand for | meaning |
|---|---|---|
| BPE | Byte Pair Encoding | |
| unigram | Unigram | |
| NFKC | Unicode Normalization Form KC |
SentencePiece
- spm_encode
- spm_decode
- spm_normalize
- spm_train
- spm_export_vocab
pip install sentencepiece依赖包sentencepiecePyPI 包sentencepiecePyPI
Multi Model
- Gemini
- 1 token ≈ 4 字符
- 100 tokens ≈ 60-80 单词
- 多模态 (Multimodal):
- 音频 (Audio): 固定速率 32 tokens/s
- 视频 (Video): 固定速率 263 tokens/s
- 图像 (Image):
- 边长均 ≤ 384px: 消耗 258 tokens
- 超过 384px: 图像会被切分为 768x768 的网格分片 (Tiles),每个分片消耗 258 tokens
- Qwen2.5-VL
- 动态分辨率: 不强制缩放到固定正方形,保留原始比例
- 计算公式:
- 底层 Patch 为 14x14,经过 2x2 合并(Pooling)后,每个 Token 对应 28x28像素 的区域
- 额外 +2 是因为包含
<|vision_start|>和<|vision_end|>
- Qwen 3.5
- 原生多模态 (Native Multimodal): 采用早期融合(Early Fusion)架构,文本与视觉 Token 在同一空间处理。
- Token 消耗:
- 依然遵循 动态分辨率 逻辑,通常按 28x28 像素/Token 比例转换(继承 2.5-VL 的高效表征)。
- 视频处理通过时间轴切片,每秒视频转换的 Token 数与帧率及分辨率挂钩。
FAQ
tokenizer.json vs vocab.json
- vocab.json + merges.txt
tokenizer = Tokenizer.from_file("byte-level-bpe.tokenizer.json)
# 会保存为 merges.txt+vocab.json
tokenizer.model.save('tokenizer')关联信息
反向链接、本文链接的其他页面和外部资料。
参考资料
GitHub16 条
- anthropics/anthropic-tokenizer-typescriptgithub.com/anthropics/anthropic-tokenizer-typescript
- daulet/tokenizersgithub.com/daulet/tokenizers
- dqbd/tiktokengithub.com/dqbd/tiktoken
- dqbd/tiktoken/tiktoken/model_to_encoding.jsongithub.com/dqbd/tiktoken/blob/main/tiktoken/model_to_encoding.json
- dqbd/tiktoken/tiktoken/registry.jsongithub.com/dqbd/tiktoken/blob/main/tiktoken/registry.json
- dqbd/tiktokenizergithub.com/dqbd/tiktokenizer
- google/sentencepiecegithub.com/google/sentencepiece
- huggingface/tokenizersgithub.com/huggingface/tokenizers
- huggingface/tokenizers#1751github.com/huggingface/tokenizers/issues/1751
- niieani/gpt-tokenizergithub.com/niieani/gpt-tokenizer
- openai/tiktokengithub.com/openai/tiktoken
- openai/tiktoken/tiktoken_ext/openai_public.pygithub.com/openai/tiktoken/blob/main/tiktoken_ext/openai_public.py
- pkoukk/tiktoken-gogithub.com/pkoukk/tiktoken-go
- rsennrich/subword-nmtgithub.com/rsennrich/subword-nmt
- tiktoken-go/tokenizergithub.com/tiktoken-go/tokenizer
- zurawiki/tiktoken-rsgithub.com/zurawiki/tiktoken-rs
Wikipedia1 条
- Byte pair encodingWikipedia:Byte pair encoding
HuggingFace1 条
- HF:Qwen/Qwen2.5-72Bhuggingface.co/Qwen/Qwen2.5-72B/blob/main/tokenizer.json
标准文档1 条
- arXiv:1609.08144arxiv.org/abs/1609.08144arXiv
其他外链5 条
- ai.google.dev/gemini-api/docs/tokensai.google.dev/gemini-api/docs/tokens
- crates.io/crates/tiktoken-rscrates.io/crates/tiktoken-rs
- platform.openai.com/tokenizerplatform.openai.com/tokenizer
- tiktokenizer.vercel.apptiktokenizer.vercel.app/
- tiktokenizer.vercel.app/hf/Qwen/Qwen2.5-72B/tokenizer.jsontiktokenizer.vercel.app/hf/Qwen/Qwen2.5-72B/tokenizer.json