Token (令牌)
文本处理的最小单位。大语言模型使用独特的分词方案,与字符或单词不同。
令牌 (Token) 是处理文本时的最小单位。在自然语言处理 (NLP) 和大语言模型 (LLM) 中,文本在处理前会被分割 (分词) 为令牌。令牌是与字符和单词都不同的独特单位,分割方法因语言和模型而异。随着 LLM 的普及,令牌的概念不仅为程序员所知,也被普通用户广泛了解。
ChatGPT 等 LLM 使用的分词器 (BPE: Byte Pair Encoding) 将频繁出现的字符串模式学习为单个令牌。英文中常用 1 个令牌大致对应 4 个字符 (约 0.75 个单词) 这一估算,像 "Hello" 这样的短单词是 1 个令牌,而长单词和专业术语会被拆成多个令牌。中文、日语这类 CJK 文本,1 个令牌多为 1 到 2 个字符;另一方面,使用频率较低的汉字和符号并不在分词器的词表之中,会被一直分解到 UTF-8 的字节序列,出现 1 个字符消耗 2 到 3 个令牌的情况。也就是说,无法用一个统一的系数把字符数换算为令牌数。一次能处理的令牌数上限即上下文窗口因模型而异,GPT-4o 为 128K 令牌。即使同样是 128K,实际能装进去的字符数也会随语言构成和分词器而大幅变化,因此与其依赖换算表,不如把有代表性的文本实际送进分词器确认更为可靠。
API 的使用费用基于令牌数计算,因此令牌数管理直接关系到成本控制。OpenAI 的 API 对输入令牌和输出令牌分别计费,优化提示词 (删除不必要的上下文、编写简洁的指令) 是降低成本的关键。使用 tiktoken 库可以在 API 调用前预先计算令牌数,防止超出上下文窗口限制。
中文的令牌效率往往低于英文。表达相同含义的文本,中文比英文消耗更多令牌。这是因为 BPE 分词器的训练数据中英文文本占比较大。传达同样内容的句子,中文一侧的令牌数容易更多,在处理大量文本时,这一差异会以成本差的形式显现出来。不过实际的比例会随模型的世代和分词器而变化,所以在估算费用时,把自己要处理的文章取一部分原样送进分词器,自行算出每个字符对应多少令牌的系数,精度会更高。
令牌的概念也用于 LLM 以外的领域。在编程语言编译器中,源代码通过词法分析被分割为令牌,此时的令牌是关键字、标识符、运算符、字面量等语法元素。在认证领域,包含认证信息的数据结构也被称为令牌,如 JWT (JSON Web Token)。由于令牌一词在不同领域含义不同,明确讨论的上下文非常重要。
从字符计数的角度来看,令牌数和字符数是不同的指标。字符数是人类视觉识别的单位,而令牌数是模型处理的单位。在 LLM 的实际应用中,需要同时关注字符数限制 (如社交媒体发帖限制) 和令牌数限制 (API 的上下文窗口)。由于令牌数无法从字符数精确反算,在处理接近上下文窗口上限的分量时,把在哪里截断的判断放在令牌数一侧而不是字符数一侧才更安全。