Skip to content

分词与词表 — 概念

分词算法

llama.cpp 支持以下分词算法:

BPE (Byte Pair Encoding)

GPT 系列模型使用的算法:

  1. 从字符级开始
  2. 反复合并最高频的 token 对
  3. 编码时使用最长匹配
"hello world" → ["he", "llo", " world"]

SPM (SentencePiece)

LLaMA 系列使用,基于 byte-level BPE + byte fallback:

  • 预留 256 个 byte token 作为 fallback
  • 空格替换为 (U+2581)
  • 支持添加 BOS token

WPM (WordPiece)

BERT 系列使用:

  • 类似 BPE 但使用最长优先匹配
  • 未知词用 ## 前缀标记子词
  • 现已支持 normalizer.lowercase — 用于 Jina Embeddings 等需要大小写不敏感的场景

Unigram

T5 系列使用:

  • 从大词表中逐步删减
  • 编码时使用概率最大的路径

HybridDNA (Carbon-3B)

专为 DNA 序列设计的混合分词器:

  • 文本部分使用标准 BPE
  • DNA 序列使用固定长度 k-mer(6 碱基)分词
  • DNA 段由 <dna></dna> 标签界定
  • 非 ACGT 字符回退到 <oov> token
  • 内部通过虚拟继承扩展 BPE tokenizer(llm_tokenizer_bpe_session 的子类)

词表结构

c
enum llama_vocab_type {
    LLAMA_VOCAB_TYPE_NONE = 0,
    LLAMA_VOCAB_TYPE_SPM  = 1,  // SentencePiece
    LLAMA_VOCAB_TYPE_BPE  = 2,  // Byte Pair Encoding
    LLAMA_VOCAB_TYPE_WPM  = 3,  // WordPiece
    LLAMA_VOCAB_TYPE_UGM  = 4,  // Unigram
    LLAMA_VOCAB_TYPE_RWKV = 5,  // RWKV greedy
};

// 注意:HybridDNA 是 BPE 的变体(类型仍为 LLAMA_VOCAB_TYPE_BPE),通过虚拟继承扩展

每个 token 包含:

  • 文本表示(text)
  • 分数(score)— 用于 BPE 合并优先级
  • 类型(normal, control, unknown, byte 等)
  • 特殊标记(BOS, EOS, PAD, EOT 等)

分词流程

相关概念

新增 tokenizer 支持

近期上游新增了以下 tokenizer:

  • jina-embeddings-v2-base-zh — 中文嵌入模型,使用 whitespace 预分词
  • LFM2.5-8B-A1B — 新增 tokenizer 和 chat template(含 reasoning round-trip 修复)
  • MiniCPM5 — 转换工具新增 tokenizer 支持
  • Granite 4.1 — 新增 chat template

Chat Template 变化

llama.cpp 使用 Jinja 模板处理 chat 格式,近期更新:

  • Granite 4.1 template (models/templates/ibm-granite-granite-4.1.jinja)
  • LFM2.5 template — 修复 reasoning 模式下 think token 泄漏问题
  • LFM2/LFM2.5 tool parser 统一重构