OpenAI
页面内容为机器翻译。查看英文原文

什么是 Token,如何计算 Token?

更新于:12 days ago

什么是 Token?

Token 是 OpenAI 模型处理文本的基本构件。它们可以短至单个字符,也可以长至完整单词,具体取决于语言和上下文。空格、标点符号和词的一部分都会计入 Token 数量。这就是 API 在生成响应前在内部对文本进行分段的方式。

关于英语的一些实用经验法则:

  • 1 个 Token ≈ 4 个字符

  • 1 个 Token ≈ ¾ 个单词

  • 100 个 Token ≈ 75 个单词

  • 1–2 个句子 ≈ 30 个 Token

  • 1 个段落 ≈ 100 个 Token

  • 约 1,500 个单词 ≈ 2,048 个 Token

Token 化处理会因模型和编码而异。使用 Tokenizer 工具或 tiktoken.encoding_for_model(model),即可获得目标模型的确切计数。

示例

以下是一些真实文本示例及其大致 Token 数量:

  • 韦恩·格雷茨基的名言“你不出手,就会 100% 错失投篮机会”= 11 个 Token

  • 《OpenAI Charter》= 476 个 Token

  • 《美国独立宣言》= 1,695 个 Token

Token 数量是如何计算的

当你向 API 发送文本时:

  1. 文本会被拆分为 Token。

  2. 模型会处理这些 Token。

  3. 响应会作为一串 Token 生成,然后再转换回文本。

Token 用量会按几个类别进行跟踪:

  • 输入 Token – 请求中的 Token。

  • 输出 Token – 响应中生成的 Token。

  • 缓存 Token – 对话历史中重复使用的 Token(通常按较低费率计费)。

  • 推理 Token – 在一些高级模型中,生成最终输出前会在内部包含额外的“思考步骤”。

这些计数会出现在你的 API 响应元数据中,并用于计费和用量跟踪。

如需进一步了解 Token 化处理,你可以使用我们的交互式 Tokenizer 工具,它可以计算 Token 数量,并查看文本如何被拆分为 Token。

或者,如果你想以编程方式对文本进行 Token 化,可以使用 Tiktoken,这是专为 OpenAI 模型使用的快速 BPE Tokenizer。

Token 限制

每个模型都有一个最大组合 Token 限制(输入 + 输出)。当前的高容量模型在上下文中最多支持数十万个 Token,不过实际限制可能会因模型版本和你的使用层级而异。

如果超过限制,你可以:

  • 缩短或改写提示。

  • 将大段文本拆分成更小的块。

  • 发送前先总结或预处理输入。

Token 定价

API 使用按 Token 计价,价格会因模型以及 Token 是输入、输出还是缓存而异。查看 OpenAI 的定价页面以了解当前费率。一些推理模型可能会在内部使用更多 Token,但其目标是通过减少完成每项任务所需的 Token 数量来提高效率。

探索 Token

API 会根据语料数据中的上下文来处理单词。模型会接收提示,将输入转换为 Token 列表,处理提示,并将预测的 Token 转换回我们在响应中看到的文字。

在我们看来可能完全相同的两个单词,生成的 Token 可能会因其在文本中的结构方式不同而不同。请看 API 如何根据单词“red”在文本中的上下文为其生成 Token 值:

Sentence split into color-coded tokens with Text selected over Token IDs
Token ID output as a list of integers with the Token IDs tab selected

在上面的第一个示例中,“ red”的 Token“2266”包含一个尾随空格(注意,这些是用于演示的示例 Token ID)。

Sentence split into color-coded token blocks: My favorite color is Red.
Tokenizer output with Token IDs selected and a list of numeric token IDs

“ Red”的 Token“2296”(带有前导空格并以大写字母开头)不同于小写字母“ red”的 Token“2266”。

Tokenizer example splitting “Red is my favorite color.” into color-coded tokens
Tokenizer output with Token IDs selected and a list of token ID numbers

当“Red”用于句首时,生成的 Token 不包含前导空格。Token“7738”不同于该单词前两个示例中的 Token。

观察结果:

一个 Token 越可能出现/越频繁,分配给它的 Token 编号就越低:

  • 句点生成的 Token 在 3 个句子中都相同(“13”)。这是因为从上下文来看,句点在整个语料数据中的用法相当相似。

  • 为“red”生成的 Token 会因其在句子中的位置而异:

    • 句子中间的小写形式:“ red” -(Token:“2266”)

    • 句子中间的大写形式:“ Red” -(Token:“2297”)

    • 句首的大写形式:“Red” -(Token:“7738”)

这篇文章对你有帮助吗?