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

什么是 token,如何计算它们?

更新于:20 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

不同语言的分词方式会有所差异。例如,“Cómo estás”(西班牙语,意为“你好吗”)10 个字符却包含 5 个 token。非英文文本往往会产生更高的 token/字符比,这可能会影响成本和限制。

示例

以下是一些真实世界的文本示例及其大致 token 数:

  • 韦恩·格雷茨基(Wayne Gretzky)的名言 “You miss 100% of the shots you don’t take” = 11 个 token

  • 《OpenAI 宪章》= 476 个 token

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

Token 数是如何计算的

当你向 API 发送文本时:

  1. 文本会被拆分为 token。

  2. 模型处理这些 token。

  3. 回复会以一串 token 的形式生成,然后再转换回文本。

Token 用量会按多个类别进行统计:

  • 输入 token – 你请求中的 token。

  • 输出 token – 回复中生成的 token。

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

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

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

想进一步了解 tokenization,你可以使用我们的交互式 Tokenizer 工具,它可以帮助你计算 token 数,并查看文本是如何被拆分成 token 的。

另外,如果你想以编程方式对文本进行分词,可以使用 Tiktoken——这是一个专为 OpenAI 模型使用、速度很快的 BPE 分词器。

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 都相同(“13”)。这是因为在语料数据中,从上下文角度看句号的用法相当一致。

  • ‘red’ 生成的 token 会随其在句子中的位置不同而变化:

    • 句中小写:‘ red’ -(token:“2266”)

    • 句中大写:‘ Red’ -(token:“2297”)

    • 句首大写:‘Red’ -(token:“7738”)

这篇文章对你有帮助吗?