Appearance
分词与词表 — 概念
分词算法
llama.cpp 支持以下分词算法:
BPE (Byte Pair Encoding)
GPT 系列模型使用的算法:
- 从字符级开始
- 反复合并最高频的 token 对
- 编码时使用最长匹配
"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 等)
分词流程
相关概念
- tokenization — 分词算法详解
- gguf — 词表在 GGUF 中的存储
新增 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 模式下
thinktoken 泄漏问题 - LFM2/LFM2.5 tool parser 统一重构