Skip to main content

Tokenizer

Workflow
  • Tokenization/分词/Encode - 文本 -> Token IDs
    • 一般使用 BPE 算法
  • Decode - Token IDs -> 文本

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
    • 序列标记
    • 对话标记
    • 功能标记

modelvocab sizetokenizernotes
openai/gpt250257byte-level-bpe
openai/r50k_base50257byte-level-bpe
openai/p50k_base50281byte-level-bpe
openai/p50k_edit50283byte-level-bpe
openai/cl100k_base100276byte-level-bpe
openai/o200k_base200018byte-level-bpe
openai/o200k_harmony201088byte-level-bpe
  • o200k_harmony
    • vocabe 201088
    • 在 c200k_base 上增加了额外的特殊 token
abbr.stand formeaning
BPEByte Pair Encoding
unigramUnigram
NFKCUnicode Normalization Form KC

SentencePiece

  • spm_encode
  • spm_decode
  • spm_normalize
  • spm_train
  • spm_export_vocab
pip install sentencepiece

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
    • 动态分辨率: 不强制缩放到固定正方形,保留原始比例
    • 计算公式: Tokens=H/28×W/28+2\text{Tokens} = \lceil H/28 \rceil \times \lceil W/28 \rceil + 2
      • 底层 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')