一、Token:大模型的最小信息单元

当我们与 ChatGPT 或任何大模型对话时,输入和输出的文本并非直接以完整的“字”或“词”被处理。它们会被模型的 分词器 切割成更小的、称为 Token 的片段。Token 是模型理解和生成文本的最小信息单元

你可以把 Token 想象成模型认识的“词汇表”里的词条。例如,英文单词 “ChatGPT” 可能是一个 Token,而 “Transformer” 可能被分成 “Trans” 和 “##former” 两个 Token(“##” 表示它是前一个 Token 的延续部分)。中文通常一个字或一个常用词会被视为一个或多个 Token。这个切割过程直接影响模型的“输入长度”和最终的费用。

二、Tokenization:文本是如何被“切”的?

这个将文本切分成 Token 的过程叫做 Tokenization。不同的大模型使用不同的分词算法,这导致了 Token 数量的差异。目前主流的分词器包括:

理解分词很重要,因为它决定了你发送一段文本,最终会被模型计数为多少个 Token。通常,一个中文字或常见英文字母组合是 1-2 个 Token,而罕见的词或专业术语可能会被拆分成更多的 Token。

关键提示:输入提示词、模型生成的回答,都会被计数为 Token。在长对话中,整个对话历史(通常)都会作为上下文被重新计算 Token 数量,这是成本可能快速累积的原因之一。

三、Token 与模型的“工作内存”

大模型在处理信息时,并非拥有无限的记忆。它们一次性能“看到”和处理的 Token 数量是有上限的,这个上限被称为 上下文窗口context window。例如,GPT-4 有一个 128K Token 的上下文窗口。

这意味着,你输入的提示和模型已经生成的内容的总 Token 数,不能超过这个窗口。一旦接近或超过这个限制,模型会“遗忘”最早的对话内容。这也解释了为什么在长对话中,模型有时会不记得之前聊过什么。上下文窗口的大小直接影响了模型的可用性和成本,窗口越大,模型单次处理的信息越多,但消耗的算力也越巨大。

四、计费原理:按量计费的核心

绝大多数商业大模型 API(如 OpenAI 的 API)采用按 Token 计费的商业模式。计费通常遵循一个简单的公式:总费用 = (输入 Token 数 × 输入单价) + (输出 Token 数 × 输出单价)

这里有几个关键点需要理解:

  1. 输入输出价格不同:通常,输出 Token 的单价高于输入 Token。因为生成回答是计算更密集的过程。
  2. 价格随模型变化:能力更强的模型(如 GPT-4)的 Token 价格远高于轻量模型(如 GPT-3.5 Turbo)。
  3. 计费单元:API 返回的响应中会明确包含 usage 字段,告诉你本次请求消耗了多少输入和输出 Token。这是你结算的依据。
关键提示:优化你的提示词,在满足需求的前提下减少 Token 数量,是控制 API 调用成本最直接有效的方法。

五、代码实践:估算你的 Token 开支

我们无法直接“看到”分词过程,但可以使用官方工具来准确计算。以 OpenAI 为例,可以使用 tiktoken 库。

首先,安装库:pip install tiktoken

import tiktoken

# 根据模型名称加载对应的分词器
# 例如 'cl100k_base' 用于 GPT-3.5-turbo 和 GPT-4
enc = tiktoken.get_encoding("cl100k_base")

def count_tokens(text, model="gpt-3.5-turbo"):
    # 也可以使用 encoding_for_model 自动匹配模型
    # enc = tiktoken.encoding_for_model(model)
    token_count = len(enc.encode(text))
    return token_count

# 示例
prompt_text = "请用中文解释什么是大模型中的Token,并举一个例子。"
response_text = "Token是大模型处理文本的基本单元,比如句子‘我喜欢AI’可能被分成‘我’、‘喜欢’、‘AI’三个Token。"

input_tokens = count_tokens(prompt_text)
output_tokens = count_tokens(response_text)
print(f"输入 Token 数: {input_tokens}")
print(f"输出 Token 数: {output_tokens}")

# 假设模型价格 (仅为示例,请以官方实时价格为准)
# GPT-3.5 Turbo: 输入 $0.0015 / 1K tokens, 输出 $0.002 / 1K tokens
input_price_per_1k = 0.0015
output_price_per_1k = 0.002
cost = (input_tokens * input_price_per_1k / 1000) + (output_tokens * output_price_per_1k / 1000)
print(f"本次调用的估算成本: ${cost:.6f}")

运行这段代码,你就可以量化自己每次交互的 Token 开销,这是进行成本控制的第一步。

六、成本优化与实用建议

理解了 Token 和计费原理后,我们可以采取一些策略来优化使用:

七、总结:从理解到掌控

Token 是连接人类语言与模型计算的桥梁,而基于 Token 的计费则是使用大模型服务必须面对的现实成本。从 Tokenization 的原理到 tiktoken 的实践,我们一步步拆解了这个黑盒。

掌握这些知识,能让你从一个被动的 API 调用者,转变为一个主动的 成本管理者效果优化者。在开发应用时,你可以更准确地估算运营成本,设计更高效的提示工程方案,从而让大模型这项强大技术的使用,变得既有效率,又经济可控。记住,最优的使用体验,来自于对技术细节的深刻理解和务实应用。