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 但使用最长优先匹配
  • 未知词用 ## 前缀标记子词

Unigram

T5 系列使用:

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

词表结构

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
};

每个 token 包含:

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

分词流程

相关概念