LLM应用实战2-理解Tokens

基本定义

Tokens 是大型语言模型(LLM)处理文本或代码的最小语义单元,可包含以下形式:

  • 字符(如英文字母 a 或中文字符 北)
  • 单词(如英文单词 apple 或中文词汇 北京)
  • 子单词(如将 unhappy 拆分为 un 和 happy)
  • 文本/代码片段(如 def find_max() 或 HTML 标签

    特定 Token 的表达形式和粒度由 分词算法(Tokenization)决定(例如 BPE、WordPiece、Unigram Language Model)。

Tokenization 的作用

  1. 语义分割:通过拆分文本为统一格式的 Token,解决模型直接处理字符或词的语言差异问题(如中文无空格分割)。
  • 示例:中文短语 北京欢迎你 可能被分割为单一 Token 北京欢迎你 或组合 Token 北京|欢迎|你。
  1. 数值化映射:
  • 每个 Token 会被分配唯一数值 ID(如 北京 → ID 70090),模型处理的实质是这些 ID 序列。
  • 类似 ASCII 编码,但覆盖更复杂的语义单元。
  1. 效率优化:
  • 平衡计算成本与语义保留,例如通过合并高频字符对降低处理复杂度。

主流 Tokenization 算法示例

在这里插入图片描述
以 BPE 为例:

  • 输入词表:low, lower, newest, widest
  • 高频字符对:e+s → es(合并) → 最终 Token 可能包括 low, es, t 等。

示例

来源于: https://platform.openai.com/tokenizer

GPT-4o&GPT-4o mini

在这里插入图片描述
可以看到: 总共6个字符,被划分成了4个Tokens

在这里插入图片描述
这分别是这4个Token的ID

在这里插入图片描述
可以看到: “欢迎”和“你!”的ID在同一个模型下是保持一致的。

在这里插入图片描述
这是英文的分词,相比中文来说,更加直观。

GPT-3.5 & GPT-4

在这里插入图片描述
在这里插入图片描述
可以看到,不同版本的LLM分词方式不同,这里出现了乱码,为什么会有乱码并且把一个中文词语转换成了多个Token?
因为大语言模型(LLMs)在处理文本时,若输入包含特殊 Unicode 字符(尤其是多字节字符或组合字符),可能导致

  1. 字节级拆分差异:
  • 某些 Unicode 字符在 UTF-8 编码中由多个字节表示,而 Tokenization 算法(如 BPE)可能按字节对生成子词,导致单个字符对应多个 Tokens
  • 示例:字符 ç(Unicode: U+00E7)在 UTF-8 编码为 0xC3 0xA7,可能被拆分为两个 Tokens。
  1. 分词算法的语言偏向性:
  • 主流 Tokenizers(如 GPT-4 的 BPE)基于英语语料优化,对中文、表情符号等处理可能不够精细,从而拆分不合理。