在接入大模型API之前,搞清楚Token到底是什么、一段文本会消耗多少Token、一次调用要花多少钱,是每个开发者都绕不开的问题。不少人直接把代码跑起来才开始看账单,结果发现实际花费比预想高出好几倍,根本原因就是对Token计数和计费规则缺乏了解。本文从Token的切分原理讲起,逐步演示如何精确计数、如何估算成本,并给出控制成本的实用建议。

一、Token到底是什么,大模型如何切分文本
Token是大语言模型处理文本的最小单位。模型并不会直接理解一个个字符,而是先把文本切分成一个个Token,再将每个Token映射成一个整数ID送入模型运算。这个切分过程依赖一个叫tokenizer(分词器)的组件,主流方案是BPE(Byte Pair Encoding,字节对编码)算法。
对于英文文本,切分规则大致是:常见单词可能占一个Token,比如hello通常就是一个Token;不常见的长单词会被拆开,比如unbelievable可能被切成un、belie、vable三段。而对于中文,情况更复杂一些,由于绝大多数模型以英文语料为主训练分词器,一个汉字往往要占用一到两个Token,比如你好可能被切成两个甚至三个Token。这也是为什么同样的字数,中文的Token消耗明显高于英文。
还有一个容易被忽略的细节:空格、标点、换行符都会被计入Token。代码类文本尤其明显,缩进用的空格和制表符都会产生额外Token。另外,模型的输出结果本身也是按Token计费的,很多人只盯着输入的Prompt长度,却忘了生成的回答同样是成本的一部分。
二、如何精确统计Token数量
估算Token数量最可靠的方式是使用模型对应的分词工具。以OpenAI的模型为例,官方提供了tiktoken这个Python库,可以直接对文本进行编码并统计长度。
import tiktoken
# 以gpt-3.5-turbo常用的cl100k_base编码为例
encoding = tiktoken.get_encoding("cl100k_base")
text = "你好,欢迎使用大模型API进行开发。"
tokens = encoding.encode(text)
print(f"Token数量: {len(tokens)}")
print(f"Token列表: {tokens}")如果不知道具体模型用哪个编码,可以直接使用encoding_for_model函数,库会自动匹配对应模型的分词器。需要强调的是,不同模型家族的编码方式并不相同,比如GPT-4o用的o200k_base和GPT-3.5用的cl100k_base对同一段中文的切分结果就不一样,估算时务必选择正确的编码。
除了本地工具,各家厂商也提供了在线计数页面,比如OpenAI的tokenizer页面可以直接粘贴文本查看Token分布。对于消息列表形式的对话请求,还要注意每条消息外层会附加少量固定Token作为结构开销,通常每条消息额外增加3到4个Token,这部分在长对话的累计成本中不容忽视。
三、计费规则与成本估算方法
大模型API的计费核心公式很简单:总成本等于输入Token数量乘以输入单价,加上输出Token数量乘以输出单价。单价通常按每百万Token(1M)多少美元计价,而且输入和输出的价格差别很大,输出价格往往是输入的数倍。
举个例子,假设某模型的输入价格是每百万Token 0.5美元,输出价格是每百万Token 1.5美元。一次请求中,你的Prompt加上历史消息共占用2000个Token,模型生成了800个Token的回答,那么这次调用的成本就是:2000除以一百万乘以0.5,加上800除以一百万乘以1.5,约等于0.0022美元。看起来很少,但如果是每分钟上百次调用的生产服务,一个月下来成本就相当可观了。
def estimate_cost(input_tokens, output_tokens,
input_price=0.5, output_price=1.5):
"""input_price/output_price 单位:美元/百万Token"""
cost = (input_tokens * input_price + output_tokens * output_price) / 1_000_000
return cost
# 单次调用成本
print(estimate_cost(2000, 800))
# 每天调用1万次的月度成本(按30天计)
daily_calls = 10000
monthly = estimate_cost(2000, 800) * daily_calls * 30
print(f"月度预估成本: {monthly:.2f} 美元")在估算时还要考虑一个变量:模型输出的Token数是不可预知的,只能通过max_tokens参数设置上限来封顶。因此做预算时,建议按输出上限的最坏情况计算,再结合实际运行数据不断修正。另外,部分平台对上下文窗口内的缓存命中提供折扣价,如果一个应用的Prompt前缀高度重复,开启缓存能显著降低输入成本。
四、控制Token成本的实用技巧
第一招是精简Prompt。系统提示词中的示例、格式说明、背景知识都会持续占用输入Token,在多轮对话中每轮都要重复付费。可以把长篇指令压缩成要点式描述,删除与当前任务无关的内容,通常能节省百分之二十以上的输入开销。
第二招是管理对话历史。多轮对话如果把全部历史原样传回,Token消耗会像滚雪球一样增长。常见的做法是设置滑动窗口,只保留最近若干轮对话;或者对早期历史做摘要压缩,用一段总结替代原文。此外,开启前面提到的Prompt缓存,能让固定不变的长前缀只按折扣价计费。
第三招是合理设置输出限制。通过max_tokens控制生成长度,配合清晰的输出格式要求,避免模型输出冗长的解释和客套话。如果任务允许,还可以让模型先输出结论再展开细节,方便在必要时提前截断。最后建议在代码中记录每次请求的实际Token用量,API响应中的usage字段包含了输入和输出的具体数值,把这些数据落库分析,才能真正做到对成本心中有数。