1. 背景:为什么Token会成为AI考核的新分母
1.1 从“工作量考核”到“Token消耗考核”
很多团队在推进AI应用落地时,都会遇到一个很现实的问题:一个AI功能到底创造了多少价值,应该怎么衡量?
传统后端业务考核通常会看需求数量、Bug率、代码质量、接口耗时,这些指标主要围绕“人”和“系统稳定性”展开。但大模型应用进入业务功能后,情况发生了变化。用户点一次按钮、AI回复一段内容,这个过程里模型读取了多少输入、生成了多少输出,背后消耗了多少计算资源,用传统的调用量、用户数、代码行数都很难回答。
这时候,“Token消耗量”开始被重视起来。于是出现了一个新概念:AI考核的新分母,Token效。
Token效并不是某个具体的开源项目,它更多是一种考核思路。把Token消耗量作为分母,把业务效果、任务数量、质量得分作为分子,计算单位Token产出。用这个指标去横向对比不同团队、不同模型、不同场景,可以比较快速地定位出哪些地方属于“高消耗、低产出”。
1.2 Token到底是什么
要理解Token效,首先得弄清楚Token是什么。
Token不是字符,也不是严格意义上的单词,它是大语言模型处理文本时的基本单位。模型会把一段输入拆分成很多个Token。简单近似地说,英文大约1个词对应1到2个Token,中文1个字可能对应1到2个Token,具体拆分方式取决于模型使用的分词器和词表。在调用模型API时,输入和输出都按Token计费,上下文窗口的大小也以Token上限来限制。
Token同时具备两个关键属性:
- 计费属性:API费用、推理成本都与Token数量直接相关。
- 容量属性:模型的上下文窗口决定了最多能同时处理多少Token。
在考核场景里,Token是一个客观、可统计的消耗刻度。它不依赖人的主观评价,不像代码量那样容易被“注水”,也不会因为不同开发者风格不同而产生巨大偏差。Token消耗多少,直接反映了模型实际处理的工作量大小。
1.3 为什么调用次数和用户数都不够用
一个很容易踩的误区是:用API调用次数来衡量AI使用量。调用次数只能反映“调没调”,并不能反映“调了多少”。同一个AI问答功能,用户输入一句“你好”和输入一段800字的工单描述,调用次数都是1,但Token消耗差异可能达到几十倍。
另一个误区是把用户数当成核心指标。用户数只能说明覆盖范围,不能说明模型的工作量。一个智能客服可能同时有1000个在线用户,但每个用户平均只问两句话;另一个数据分析助手只有50个用户,但每个用户每天执行20次复杂查询,后者的Token消耗可能是前者的几十倍。
所以,在一些已经落地AI应用的团队里,Token消耗总量逐渐被看成“工作量权重”。谁调用了大模型,谁消耗了更多上下文,谁承担了更复杂的生成任务,从Token消耗曲线上都能看出来。这也正是Token能够成为“新分母”的核心原因。
1.4 别和“令牌桶”搞混
“Token效”在中文语境下偶尔会被误认为是令牌桶限流算法。令牌桶是一种控制请求速率的经典算法,构建在网关或服务端,解决的是“每秒最多放行多少请求”的问题。这在接口防刷、流量控制场景很常见,但和本文讨论的Token不是一个概念。
本文里的Token专门指大语言模型中的词元,Token效指Token消耗效率。也就是一个AI功能消耗了多少Token,换来了多少业务产出。这两者不要混淆。
2. 环境准备与统计方案设计
2.1 需要收集哪些数据
要让Token效率考核落地,第一步不是写代码,而是明确数据来源。通常可以在API网关、调用方服务端或者日志平台里记录以下字段。
| 字段 | 说明 | 举例 |
|---|---|---|
| request_id | 请求唯一ID | REQ001 |
| team | 所属团队或业务线 | platform、ops |
| project | 具体AI功能 | 智能问答、工单摘要 |
| date | 请求日期 | 2025-01-06 |
| model | 使用的模型名 | gpt-4o-mini |
| prompt_tokens | 输入Token数 | 120 |
| completion_tokens | 输出Token数 | 80 |
| total_tokens | 总Token数 | 200 |
| duration_ms | 响应耗时,单位毫秒 | 1800 |
| business_count | 本次请求完成的业务数 | 1 |
| is_cached | 是否命中缓存 | false |
其中request_id用来保证请求唯一性,team和project用于分组统计,model用来计算不同单价下的成本,prompt_tokens和completion_tokens是核心消耗量。business_count这个字段需要根据业务自己定义。比如智能问答场景中,用户原来手动点一次“查询”算1个业务数;工单处理场景中,处理完1个工单算1个业务数。字段语义必须一致,否则后续指标对比没有意义。
2.2 本地环境准备
本文的统计脚本使用Python 3.9+,主要依赖pandas。安装命令如下:
pip install pandas如果你没有现成的日志文件,可以直接使用文中的模拟数据CSV来跑通整个流程。脚本本身不绑定特定模型平台,凡是能从API返回的usage字段或者网关日志里拿到Token数的场景都可以套用。成本单价需要结合你们自己实际的模型采购价格填写,文中的数值仅作演示。
2.3 考核周期与统计口径
考核周期一般建议按周或按月进行。按日统计适合做监控告警,按周和按月统计适合做团队绩效。口径上需要提前定义清楚:
- 缓存命中的请求算不算消耗?建议考核时不计算缓存命中部分,因为模型没有真正重新推理。但可以单独统计缓存命中率,用来评估系统设计得好不好。
- 失败的请求算不算消耗?如果请求因为超时、安全策略等原因返回错误,但Token已经产生,建议计入成本并单独标注,方便排查。
- 多轮对话怎么算?用户会话内的每个请求都分别记录,但统计业务数时按“会话完成的任务数”来算,而不是按对话轮数来算。否则闲聊轮数多、任务完成少会导致指标虚高。
3. 核心指标设计:Token效率怎么算
3.1 基础消耗指标
先要有几个原始指标:
- 总Token消耗:所有请求 total_tokens 之和,代表整体消耗规模。
- 输入Token占比:prompt_tokens 除以 total_tokens,反映消耗主要发生在输入侧还是输出侧。如果这个比例持续走高,说明上下文越喂越长,Prompt可能已经膨胀。
- 平均单请求Token:total_tokens 除以请求数,反映每次请求的“重量”。这个值持续上涨,通常说明Prompt模板在膨胀,或者多轮对话历史没有被有效清理。
3.2 单位业务Token量
这是最核心的“分母型指标”:
单位业务Token量 = 总Token数 / 业务数它回答的是“完成一个业务单位到底花了多少Token”。举个例子:
- 团队A:总Token 710,完成3个业务,单位业务Token约236.67。
- 团队B:总Token 4200,完成7个业务,单位业务Token约600。
从成本效率看,团队A明显更省。但这里要特别小心,业务数量不等于业务质量。如果一个团队把任务拆得很碎,每个报告都让用户点好几次按钮,业务数会虚高,Token效率反而被高估。因此需要引入质量修正。
3.3 质量修正指标
只追求Token高效容易走向另一个极端:让模型少生成内容、减少思考深度,结果是回答质量明显下降。为了兜底,可以给每个团队设置一个质量分。质量分由业务验收、自动化评估、抽样人工评测共同得出,取值范围建议控制在0到1之间。然后计算:
单位质量Token效率 = 质量分 / 单位业务Token量结果越大,说明每消耗一个Token带来的质量产出越高。为了方便阅读,实际展示时可以乘上一个放大系数,比如10000。
质量分参考取值:
- 0.95:任务完成率高,极少返工。
- 0.85:大部分场景可用,少量质量波动。
- 0.70:经常需要人工修正,说明模型选型或Prompt设计存在问题。
3.4 成本换算指标
Token数最终要换算成成本,才能和预算、账单对上。计算公式是:
成本 = 输入Token数 * 输入单价 / 1000000 + 输出Token数 * 输出单价 / 1000000不同模型输入和输出的单价不同,一般来说输出Token比输入Token更贵。成本指标可以让人更直观地理解AI资源投入,尤其是在预算审批场景里,成本比Token数量更有说服力。
3.5 指标组合使用
实际考核时建议至少组合这三类指标:
| 指标类别 | 具体指标 | 用途 |
|---|---|---|
| 消耗量 | 总Token、总成本、请求数 | 看规模 |
| 效率值 | 单位业务Token、单位业务成本 | 看投入产出 |
| 质量修正 | 质量分、采纳率、返工率 | 防止片面降本 |
只使用一个指标的教训非常多。只看总Token会惩罚业务量大的团队;只看单位业务Token会诱导团队压缩输出;只看质量分又没法度量资源投入。三层指标配合,才是一个可落地的AI考核体系。
4. 完整实战:用Python搭建Token消耗统计脚本
4.1 项目结构
先创建项目目录:
token_metric/ ├── data/ │ └── api_logs.csv ├── output/ │ └── metric_report.csv ├── config.py └── calc_token_metric.pyoutput目录保存最终统计结果。脚本运行前可以先手动创建空目录,或者让脚本自动创建目录。
4.2 模拟日志数据
在 data/api_logs.csv 中放入模拟日志:
request_id,team,project,date,model,prompt_tokens,completion_tokens,total_tokens,duration_ms,business_count,is_cached REQ001,platform,qss,2025-01-06,gpt-4o-mini,120,80,200,1800,1,false REQ002,platform,qss,2025-01-06,gpt-4o-mini,150,60,210,1200,1,false REQ003,ops,robot,2025-01-06,deepseek-chat,500,300,800,3500,2,false REQ004,ops,robot,2025-01-06,deepseek-chat,450,250,700,3000,1,false REQ005,data,etl,2025-01-06,gpt-4o,800,600,1400,6500,3,false REQ006,data,etl,2025-01-06,gpt-4o,700,500,1200,5500,2,false REQ007,platform,qss,2025-01-06,gpt-4o-mini,30,20,50,600,1,true REQ008,ops,robot,2025-01-06,deepseek-chat,1000,800,1800,8000,3,false REQ009,data,etl,2025-01-06,gpt-4o,900,700,1600,7200,2,false REQ010,platform,qss,2025-01-06,gpt-4o-mini,200,100,300,1500,1,false这些数据是模拟的,代表三个团队在一天内的API调用情况。business_count按场景自定义,is_cached标记这条请求是否命中了缓存。
4.3 配置模型单价与质量分
在 config.py 中维护模型单价和质量分:
# 模型成本单价,单位:元/百万Token # 注意:这里只是演示值,实际价格以你们的采购合同或平台报价为准 MODEL_PRICE = { "gpt-4o": {"input": 30, "output": 60}, "gpt-4o-mini": {"input": 1.5, "output": 4}, "deepseek-chat": {"input": 1, "output": 2}, } # 质量分,0~1,由业务验收、人工评测、自动化评测共同给出 QUALITY_SCORE = { "platform": 0.9, "ops": 0.85, "data": 0.95, }这里把单价写成演示值,并标注了需要按实际环境调整。配置单独放一个文件,后续调整价格时不需要改动主脚本。
4.4 编写统计脚本
在 calc_token_metric.py 中编写主逻辑:
""" Token效率统计脚本 输入:data/api_logs.csv 输出:output/metric_report.csv """ import pandas as pd from config import MODEL_PRICE, QUALITY_SCORE def load_logs(path): df = pd.read_csv(path, dtype={"is_cached": str}) df["date"] = pd.to_datetime(df["date"]) return df def calc_cost(row): """根据模型单价计算单次请求成本,单位:元""" price = MODEL_PRICE.get(row["model"]) if price is None: # 模型没有配置单价时,成本记为0,但需要检查配置 return 0.0 cost = ( row["prompt_tokens"] * price["input"] + row["completion_tokens"] * price["output"] ) / 1_000_000 return cost def main(): df = load_logs("data/api_logs.csv") df["cost_yuan"] = df.apply(calc_cost, axis=1) # 剔除缓存命中请求,命中缓存时模型没有真正推理 effective = df[df["is_cached"] == "false"].copy() grouped = effective.groupby("team").agg( total_tokens=("total_tokens", "sum"), prompt_tokens=("prompt_tokens", "sum"), completion_tokens=("completion_tokens", "sum"), request_count=("request_id", "count"), business_count=("business_count", "sum"), total_cost=("cost_yuan", "sum"), ).reset_index() grouped["token_per_business"] = grouped["total_tokens"] / grouped["business_count"] grouped["cost_per_business"] = grouped["total_cost"] / grouped["business_count"] grouped["avg_tokens_per_request"] = grouped["total_tokens"] / grouped["request_count"] grouped["quality_score"] = grouped["team"].map(QUALITY_SCORE).fillna(0.8) grouped["efficiency_score"] = grouped["quality_score"] / grouped["token_per_business"] * 10000 grouped = grouped.sort_values("efficiency_score", ascending=False) grouped.to_csv("output/metric_report.csv", index=False) print("=== Token效率统计结果 ===") print(grouped[ ["team", "total_tokens", "request_count", "business_count", "token_per_business", "cost_per_business", "efficiency_score"] ]) if __name__ == "__main__": main()脚本做了四件事:
- 读取日志并计算每条请求的成本。
- 剔除缓存命中的请求,避免考核激励误导。
- 按团队分组汇总,计算单位业务Token量、单位业务成本、平均单请求Token。
- 加入质量分,计算综合效率得分并排序,最后写入CSV文件。
4.5 运行命令与预期输出
执行前先确保当前目录包含 data/api_logs.csv 和 config.py,然后运行:
python calc_token_metric.py预期输出如下:
=== Token效率统计结果 === team total_tokens request_count business_count token_per_business cost_per_business efficiency_score 2 platform 710 3 3 236.666667 0.000555 38.028169 0 data 4200 3 7 600.000000 0.025714 15.833333 1 ops 3300 3 6 550.000000 0.000775 15.4545454.6 结果解读
这个模拟结果很有参考价值。
platform团队得分最高,原因是用了性价比高的gpt-4o-mini,Prompt体量也比较小,平均单请求Token约236,单位业务Token约237。这说明该团队的Prompt模板精简,上下文管理得当。
ops团队虽然配置的模型单价最低,但Prompt很长,平均单请求Token超过1000,单位业务Token达到550。如果只看模型单价,会误以为ops最省,实际上它的Token消耗效率很一般。
data团队总Token最多,因为使用了gpt-4o并且输入内容较长。只看总Token会误伤data团队,但在加入业务数和质量分修正后,它的单位业务Token约600,效率排在中间。
这里有一个值得注意的细节:ops的token_per_business是550,data是600,单看Token量ops反而更好。但加入质量分后data反超,因为data的quality_score是0.95,ops只有0.85。这正说明了考核体系为什么要引入质量修正,而不是让团队盲目压低Token消耗。
5. 常见问题与排查思路
5.1 常见问题速查表
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 统计的Token和平台账单对不上 | 日志记录不全,或用了客户端分词器估算 | 统一使用API返回的usage字段统计 |
| 某个团队Token消耗突然翻倍 | Prompt膨胀,或多轮上下文越堆越多 | 检查Prompt模板,限制会话历史轮数 |
| 缓存命中请求也计入成本 | 日志没有记录is_cached字段 | 在网关层补充缓存标记并剔除命中请求 |
| 模型单价不准确 | 忽略了输入和输出单价差异 | 按模型维度配置input和output单价 |
| 考核结果和真实体验不符 | 只看Token量,不看质量分 | 引入质量分、采纳率、返工率等修正指标 |
5.2 详述几个高频问题
第一个高频问题是Token统计对不上。日志里的total_tokens应该直接读模型API返回的usage字段,不要自己在客户端按字符数估算。不同分词器对同一段文本切出的Token数量可能不同,客户端估算只能用于事前控制Prompt长度,不能用于事后账单核对。如果发现统计结果远小于账单,优先怀疑有请求漏记,比如内部测试、异步任务、定时任务没有走统一网关。
第二个是缓存问题。同一个Prompt反复调用时,如果系统做了缓存,模型并没有真正重新推理,自然不应该把Token算到团队头上。脚本里的is_cached字段就是为了区分这一点。建议把缓存命中率单独作为系统优化指标来观察,而不是直接算进绩效考核。
第三个是多轮对话越长越贵。每轮对话都把全部历史消息重新发给模型,输入Token会持续膨胀。典型现象是用户聊到第20轮时,单次请求Token已经过万,单位业务Token自然暴涨。解决思路是做上下文压缩:只保留最近N轮,把更早的内容用摘要代替。业务效果基本不变,Token消耗却可以明显下降。
6. 最佳实践与工程建议
6.1 Prompt瘦身是性价比最高的优化手段
在Token效率考核中,见效最快的优化通常是Prompt工程。常见的Token浪费包括:
- 系统提示词里堆了大量背景描述,但每轮请求都会重复发送。
- 用户输入里包含大量无用信息、重复内容。
- 输出格式要求不清晰,模型反复尝试导致输出Token膨胀。
建议把Prompt模板按场景做版本管理。每次修改后记录Prompt的Token量变化,再配合业务效果对比。比如原来系统提示词有800 Token,精简到400 Token后,如果业务效果没有下降,单位业务Token基本能直接减一半。
6.2 模型分级,别让大模型处理所有任务
不同任务的难度差别很大。简单分类、关键词抽取、格式转换可以让小模型完成;复杂推理、长文档分析才需要使用大模型。考核时按model字段分别统计,一方面能看清每个模型的成本分布,另一方面也方便排查是否有团队把简单任务硬塞给大模型。
比如一个关键词抽取任务,用大模型的输入Token可能是小模型的三倍,输出长度却差不多,成本差距非常明显。模型路由策略做得好,整体Token效率会有立竿见影的提升。
6.3 上下文治理与缓存复用
给会话设置最大轮数策略,超过阈值后强制做历史摘要。对于知识库问答这类场景,相同问题的命中率很高,可以用向量检索加结果缓存的方式复用答案,避免每次重复调用模型。建议在网关层统一管理模型路由、缓存和限流,这样日志也能完整沉淀,Token考核才有数据基础。
6.4 成本预警与预算管理
建议按团队设置Token预算,并对每日Token消耗做环比监控。出现以下信号时需要重点关注:
- 日均Token消耗环比上涨超过30%。
- 单位业务Token连续多日上涨。
- 缓存命中率明显下降。
监控的意义不是限制使用,而是提前发现Prompt膨胀、模型误用、日志漏配等问题。很多成本失控都是逐步发生的,等到月底看账单才注意,往往已经浪费了一个月。
6.5 考核体系落地注意事项
最后说几点工程化建议:
- 指标口径要写清楚,避免月底对不上账。
- 质量分不能纯主观,至少要有自动评测和人工抽查样本。
- 考核结果不要只用来排名,要配套优化案例分享,让低效团队学习高效团队的做法。
- Token效率是过程指标,永远不要为了降Token而牺牲回答质量。设置质量分的目的就是兜底。
7. 总结与学习路线
到这里,你应该已经理解Token效在AI考核里的含义:把Token消耗作为分母,把业务效果作为分子,量化每一单位Token带来的价值。通过文中这个Python脚本,可以把一条条API日志转换成团队维度的Token效率报表,包含总Token、单位业务Token、单位成本、质量修正得分等关键字段。
如果要在实际项目中落地,优先做好三件事:
- 在网关或服务端统一记录API的usage字段,保证Token统计口径完整。
- 为每个业务场景定义business_count的计数规则,保证跨团队可比。
- 引入质量分,防止考核指标诱导团队压缩输出质量。
下一步可以继续学习Prompt工程、RAG场景下的上下文压缩、LangChain或Spring AI里的Token管理,以及企业级AI网关的设计。这些方向本质上都是围绕同一个问题:如何让AI能力用得更省、用得更值。