一、Token:模型眼中的“原子单位”

当我们与大模型对话时,发送的文本和接收的回复都不是以“字”或“词”为单位被处理的。模型真正理解和操作的最小单元,被称为 Token。Token 可能是一个完整的英文单词(如 hello)、一个汉字(如 你)、一个词组(如 机器学习)、甚至一个子词或标点符号(如 ?!)。例如,“我喜欢深度学习” 可能会被分词为:[“我”, “喜欢”, “深度”, “学习”],这就是四个 Token。

这种拆分过程叫做 分词 。不同的模型有自己专用的分词器。将文本拆解为 Token 的目的,是为了将自然语言转化为模型可以高效处理的、数值化的序列。理解这一点至关重要,因为模型的计算成本、上下文窗口限制和最终计费,全部直接与消耗的 Token 数量挂钩。

提示:一个常见的误区是认为 Token 等同于单词。实际上,对于中文,一个汉字通常对应1-2个Token;对于英文,一个常见单词可能是1个Token,但长单词或罕见词会被拆分成多个子词Token。例如,“unhappiness” 可能被拆分为 ["un", "happiness"] 两个Token。

二、Token 的定价与计费原理

云服务商(如 OpenAI)提供大模型 API 时,采用 “按量计费” 的商业模式,其核心计价单位就是 Token。计费通常分为两部分:

输出 Token 的价格通常远高于输入 Token。以当前主流模型为例,价格对比可能是这样:

| 模型类型 (示例) | 输入价格 (每1000 Token) | 输出价格 (每1000 Token) | | :--- | :--- | :--- | | GPT-4-turbo | $0.01 | $0.03 | | GPT-3.5-turbo | $0.0005 | $0.0015 |

因此,一次API调用的总费用 = (输入Token数 * 输入单价 + 输出Token数 * 输出单价) / 1000。

理解计费规则,我们就能明白为什么精准控制输入和输出的长度是节省成本的关键。一个冗长、模糊的提问,不仅会消耗更多输入Token,还可能诱导模型生成更长的回答,导致费用倍增。

三、什么影响了 Token 数量?—— 优化你的提示

Token数量并非固定不变,它受多种因素影响,而我们恰恰可以通过优化提示工程 来主动管理它。

1. 语言差异:处理同等信息,中文通常比英文消耗更多Token。例如,“今天天气很好” 这句话,中文分词可能是4-5个Token,而其英文翻译 “The weather is nice today” 可能只需3-4个Token。这是因为主流模型的语料库中英文占比较高,其分词器对英文的“压缩率”更高。

2. 提示的清晰度与格式:明确、结构化的指令能用更少的Token传达相同的意图。我们可以用代码示例来对比:

# 示例1:一个模糊、冗长的提示(消耗较多Token)
bad_prompt = """
我需要你帮我写一个关于人工智能发展历史的文章。要写得非常详细,从它的起源开始讲,一直讲到现在最新的技术,还要包括未来的展望。字数要多一点,至少要超过一千字。
"""

# 示例2:一个清晰、结构化的提示(消耗较少Token)
good_prompt = """
请撰写一篇关于人工智能发展史的文章,要求如下:
- 结构:分为起源、关键突破、现状与未来展望四个部分。
- 字数:约1000字。
- 风格:科普向,客观准确。
"""

后者通过使用列表明确了结构要求,避免了冗余描述,直接减少了输入Token数,同时也更可能引导模型产出符合预期的回答,间接优化了输出Token。

提示:在请求中使用 JSON 格式或特定指令(如 "respond in 50 words")来约束输出格式和长度,是控制输出Token、避免“话痨”模型的有效技巧。

四、监控与控制成本:实用工具与方法

在实际开发中,盲目调用API是不可持续的。我们必须建立成本监控机制。

调用API后,响应中通常会包含 usage 字段,这是最重要的成本监控数据。

import openai

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "用一句话解释量子计算。"}]
)

# 从响应中提取用量信息
usage_data = response['usage']
print(f"提示词Token数 (Prompt Tokens): {usage_data['prompt_tokens']}")
print(f"生成内容Token数 (Completion Tokens): {usage_data['completion_tokens']}")
print(f"总Token数 (Total Tokens): {usage_data['total_tokens']}")
# 此处可结合单价计算本次调用费用

除了代码层面获取数据,我们还应遵循一些最佳实践:

提示:记住,Token是成本单位,也是能力单位。上下文窗口(如128K Token)既是模型的“记忆力”,也是一次交互成本的理论上限。在设计功能时,需在这两者间取得平衡。

五、总结与进阶思考

总而言之,Token 是大模型技术的经济基础。它是模型思考的“单词”,也是我们使用AI的“计价券”。从开发者角度看,掌握Token的原理意味着:

对于更进阶的场景,一些服务商开始探索“按每秒处理时间”、“按请求次数”等新计费模式,但Token计费在当前仍是最主流、最能反映计算资源消耗的方式。深入理解它,是高效、经济地驾驭大模型力量的第一步。