Skip to content

分词 (Tokenization) 将输入文本拆分为模型能处理的 token ID 序列,是 LLM 推理的第一步。

为什么需要 tokenization

模型不能直接处理原始文本,需要将文本转换为固定词表中的 token ID 序列。分词算法的质量直接影响模型的处理效率和能力(如多语言支持、代码处理等)。

核心原理

llama.cpp 支持多种分词算法:

类型模型算法
SPMLLaMA, MistralSentencePiece (BPE + byte fallback)
BPEGPT-2, QwenByte Pair Encoding
WPMBERTWordPiece
UGMT5Unigram
RWKVRWKVGreedy tokenization

分词流程:

  1. 文本预处理(Unicode 规范化)
  2. 预分词(按规则分割为词)
  3. 子词编码(BPE 合并 / SPM 查找)
  4. 映射为 token ID
  5. 添加特殊 token(BOS 等)

在源码中的实现

  • src/llama-vocab.cpp — 分词器实现(所有算法)
  • src/unicode.cpp — Unicode 处理
  • src/unicode-data.cpp — Unicode 数据表
  • include/llama.hllama_tokenize() API

相关概念

  • gguf — 词表数据存储在 GGUF 文件中
  • sampler-chain — 分词是逆过程(token → text = detokenization)