手抄用量记在表格里?聊聊自建AI用量统计的三个失败姿势与正确接法
先说三个常见的失败做法
独立开发者和小团队接入 AI 之后,几乎都会走到“想搞清楚到底用了多少”这一步。但第一步就迈错的,我见过太多了。
失败姿势一:手工记账。 每次调用完模型,顺手在 Excel 或备忘录里记一笔“今天大概用了几次”。坚持三天就断了,两周后回头一看,表格里的数据和真实账单对不上,只能推倒重来。手工记录的本质问题是:数据产生在代码里,却指望人在事后补录,这条链路一定会断。
失败姿势二:在自己代码里到处埋 print。 每个调用点都加一行日志,短期看是有效的。但日志散落在各个脚本、各个服务里,没有统一格式,没有聚合口径。到了月底,你想回答“哪个项目花了多少”“哪个功能调用量最大”这类问题时,只能 grep 一遍日志再手工拼数据——等于绕回姿势一。
失败姿势三:只看供应商后台,不做本地统计。 供应商的用量页面当然要看,但它只能告诉你总量,没法按项目、按用户、按功能拆分。而且不同模型、不同时段的数据混在一起,想做归因分析基本无从下手。把用量数据留在别人家,自己的业务决策就要看别人的报表脸色。
三个姿势的共同问题是:没有把统计做成代码里的一条标准化链路。正确做法其实不复杂——统一网关、统一计数、统一存储。下面以 ThisToken.AI 的聚合 API 为例,走一遍完整接入。
为什么选 ThisToken.AI 做统一入口
对于同时用多个模型的团队,与其在每家供应商各自开户、各自管理 Key,不如走一个聚合入口:一个 Key、一个 base_url、统一账单。ThisToken.AI 就是这类服务,注册后拿一个 API Key,就能以 OpenAI 兼容的方式调用多种模型,token 用量也会在响应里统一返回。价格方面以官网价格页为准,这里不展开。
更重要的是:既然所有流量都走同一个入口,统计代码只需要写一份。
第一步:注册并获取 API Key
- 访问 ThisToken.AI 官网,完成注册(邮箱即可,无需企业资质);
- 进入控制台,在 API Key 管理页面创建一个新 Key;
- 立即复制保存——Key 只完整展示一次,丢了只能重建;
- 把 Key 存进环境变量,不要硬编码进代码,更不要提交进 Git 仓库(如果你团队还没有 Key 管理规范,建议先定一条,这是另一篇文章的话题了)。
export THISTOKEN_API_KEY="sk-你的key"第二步:跑通第一段代码,顺手把统计埋进去
下面这段 Python 代码做三件事:调用模型、解析响应里的 token 用量、追加写入本地 JSONL 文件作为用量台账。依赖只需 openai 这个包(pip install openai)。
import os
import json
import time
from openai import OpenAI
# 统一入口:所有模型调用都走这里
client = OpenAI(
api_key=os.environ["THISTOKEN_API_KEY"],
base_url="https://api.thistoken.ai/v1",
)
USAGE_LOG = "ai_usage.jsonl"
def call_and_track(project: str, prompt: str, model: str = "gpt-4o-mini"):
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
)
# 从响应中提取官方返回的用量数据,杜绝手工估算
usage = resp.usage
record = {
"ts": time.strftime("%Y-%m-%d %H:%M:%S"),
"project": project, # 业务维度:哪个项目在用
"model": model,
"prompt_tokens": usage.prompt_tokens,
"completion_tokens": usage.completion_tokens,
"total_tokens": usage.total_tokens,
}
# 追加写入本地台账,一行一条,格式统一
with open(USAGE_LOG, "a", encoding="utf-8") as f:
f.write(json.dumps(record, ensure_ascii=False) + "\n")
return resp.choices[0].message.content
if __name__ == "__main__":
answer = call_and_track(
project="demo",
prompt="用一句话解释什么是API网关。",
)
print(answer)
print("用量已记录到", USAGE_LOG)运行:
python usage_demo.py如果你看到模型回复,并且 ai_usage.jsonl 里多了一行带 token 数的记录——恭喜,你已经避开了开头说的三个失败姿势:数据由代码自动记录,口径来自供应商响应的 usage 字段,存储在自己手里。
第三步:从台账到报表
有了统一格式的 JSONL,后续分析就简单了。想看各项目的 token 消耗占比?用 pandas 十行代码出一张表;想按天聚合画趋势?把 JSONL 定期导入任何 BI 工具都行。等团队规模上来,再把写文件换成写数据库或时序存储,函数签名不用变,只改 call_and_track 里写台账那几行——这就是“统计做成标准链路”的好处:升级成本被限制在一个点。
几个实践提醒
- 所有调用点都收口到
call_and_track。 如果有人在别处直接client.chat.completions.create,统计就漏了。小团队建议在 code review 里把这一条列为检查项。 - 失败请求也要记录。 生产环境可以在外层加 try/except,把报错也写进台账(错误重试与降级放哪一层做,也有讲究),这样统计才完整。
- 定期对账。 每月拿本地台账的 token 总量与供应商账单核对一次,差异大往往意味着有调用点没被收口,或者 Key 被泄用。
写在最后
用量统计这件事,越早做越便宜——晚一个月,就多一个月对不上账的糊涂账。这篇文章给出的方案,注册一个账号、一个 Key、一段代码,一个下午就能跑通。
如果你还没有账号,现在就可以去注册一个:https://api.thistoken.ai/register ,把第一行用量数据记下来,就从今天开始。
---
不想折腾多家供应商的接入差异?在 https://api.thistoken.ai/register 注册,用一个 base_url 调用所有模型。