GPT-4、ChatGPT和AI模型的免费令牌计数器
使用OpenAI官方的tiktoken库统计任意文本中包含的令牌(token)数量。得到的结果与GPT-4、GPT-3.5和ChatGPT在实际计费和上下文长度限制中使用的分词方式完全一致,方便开发者在调用API前提前估算费用、检查提示词是否超出模型的上下文窗口限制。
令牌计数器
无效输入
文档
什么是令牌计数器?
令牌计数器用于测量一段文本被 AI 语言模型读取时会拆分成多少个令牌。令牌是文本的小片段——完整单词、单词的一部分或标点符号——GPT-4 和 ChatGPT 等模型处理的是这些片段,而不是原始字母。此工具使用 OpenAI 发布的开源分词器库 tiktoken,因此计数结果与 OpenAI 自有模型和 API 得出的结果一致。
分词如何工作
分词器并不是简单地统计单词数量。它会通过一种称为字节对编码(BPE)的算法处理文本。该算法从文本中的单个字节开始,根据训练期间从大量文本中学到的模式,反复合并最常见的相邻字节对。最终得到一个包含数万个常见片段的固定词汇表:完整的短单词、常见的词语片段,以及表示罕见内容的单个字符。
因此,一个英语单词通常会对应一个令牌,但较长或不常见的单词可能会拆分成两个或更多令牌。空格通常会附加在下一个令牌的开头,而不是单独计数;标点符号通常各自构成一个令牌。
此工具支持的编码
Tiktoken 提供多种编码,每种编码都对应 OpenAI 模型的一个系列。此工具支持三种:
| 编码 | 使用该编码的模型 | 近似词汇量 |
|---|---|---|
cl100k_base | GPT-3.5 和 GPT-4 系列模型、ChatGPT | 约有 100,000 个令牌 |
p50k_base | 后期 GPT-3 模型 | 约有 50,000 个令牌 |
r50k_base | 早期 GPT-3 和 GPT-2 模型 | 约有 50,000 个令牌 |
默认选择 cl100k_base,因为它涵盖了如今大多数人使用的模型系列。同一段文本在不同编码下可能产生不同的令牌数,因为每种编码使用不同的文本进行训练,并以不同方式合并字符。
如何计算令牌数
没有简单的算术公式可以将字符数或单词数转换为令牌数,因为 BPE 的合并取决于具体文本和训练得到的词汇表。唯一精确的方法是直接将文本输入分词器:
- 选择与目标模型匹配的编码。
- 将文本输入该编码的分词器。
- 统计生成的令牌 ID 列表中的元素数量。该列表的长度就是令牌数。
对英语文本进行粗略估算时,一个令牌大约对应四个字符,或约四分之三个单词。这只能作为参考。数字、代码、非英语文本和不常见的拼写都可能使这一比例发生很大变化。
算例
以句子为例:
“标记化会将文本拆分成多个片段。”
在 cl100k_base 编码下,tiktoken 会将其拆分成 7 个令牌:
Token、ization、 splits、 text、 into、 pieces、.
请注意,“Tokenization”本身会拆分成两个令牌,即“Token”和“ization”,而其他每个单词都保持完整。末尾的句号也是一个独立令牌。因此,这个包含 37 个字符和 5 个单词的句子会产生 7 个令牌,而不是 6 个。
为什么令牌数很重要
AI 服务提供商按令牌数量收取 API 使用费用,既统计发送的文本,也统计生成的回复文本,因此令牌数可以在发送请求前预测费用。每个模型还有最大的上下文长度,即单个请求及其回复合计可包含的令牌数量上限。该上限因模型而异,也会随着服务提供商发布新版本而变化,因此最好查阅当前所用模型的最新文档,而不要凭记忆推断。
常见问题
AI 语言模型中的令牌是什么? 令牌是语言模型作为一个单元读取的文本片段。它可能是一个完整的短单词、较长单词的一部分、标点符号,或附加在后续单词上的空格。
为什么相同文本在不同编码下会得到不同的令牌数? 每种编码都使用各自的文本样本进行训练,并建立了自己的常见片段词汇表。在一个词汇表中足够常见、可以作为单个令牌的单词,在另一个词汇表中可能并不常见,因此会以不同方式拆分。
标点符号算作令牌吗? 算。标点符号通常各自计为一个令牌,但有时也会与相邻字符合并,具体取决于该组合在分词器训练期间出现的频率。
令牌等同于单词吗? 不等同。简短、常见的单词通常各自对应一个令牌。较长或不常见的单词,以及大多数英语以外的单词,通常会拆分成两个或更多令牌。
此工具的准确度如何? 它使用 OpenAI 自有的 tiktoken 库统计令牌,并运行 OpenAI 内部使用的相同编码逻辑,因此对于相同文本和编码,计数结果会与 OpenAI API 调用返回的结果一致。
此工具能为非 OpenAI 模型统计令牌吗? 它使用 tiktoken 的编码,而这些编码是为 OpenAI 模型构建的。Anthropic 或 Google 等其他服务提供商使用自己的分词器,因此对同一段文本可能产生不同的计数结果。
参考文献
- OpenAI。"tiktoken." GitHub,https://github.com/openai/tiktoken.
- Sennrich、Rico 等。"Neural Machine Translation of Rare Words with Subword Units." arXiv:1508.07909,2016,http://arxiv.org/abs/1508.07909.
- Brown、Tom B. 等。"Language Models are Few-Shot Learners." arXiv:2005.14165,2020,http://arxiv.org/abs/2005.14165.