模型都在降价,你的API账单却在涨?3步搭Token成本监控+预算告警,把每一分钱算明白
今天 AI 圈最热闹的两件事:谷歌 Gemini 3.7 Flash 输入输出价格直接砍半,OpenAI 推 Ultrafast 模式把 GPT-5.6 Sol 提速 14 倍。大厂打价格战,看起来很美好——但很多开发者发现:模型降价了,自己每月的 API 账单反而在涨。原因很简单:用量涨得比降价快,而且你根本不知道钱花在哪。
更扎心的是,很多团队连”哪个模型、哪个功能烧钱最多”都说不清,等到月底看账单才傻眼。真实案例:一个团队把 RAG 问答的检索范围从 10 个文档扩到 100 个,输入 Token 直接翻十倍,模型降价 50% 都盖不住成本的暴涨;另一个团队某天测试脚本进了死循环,一夜烧掉平时一个月的预算,等发现时账单已经出了。监控不是锦上添花,是省钱的第一步。 这篇教程教你 3 步搭一个 Token 成本监控 + 预算告警,把每一笔调用都算明白。
第 1 步:统一记录每次调用的 usage
用 OpenAI 兼容 SDK 时,在响应里拿到 `usage` 字段并落库。无论你用的是 Gemini、DeepSeek 还是别的模型,只要走 OpenAI 兼容接口,这一步代码都能复用:
import sqlite3, time
from openai import OpenAI
client = OpenAI() # 密钥放环境变量,别写进代码
def call_and_log(model, prompt):
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
)
u = resp.usage
conn = sqlite3.connect("cost.db")
conn.execute(
"INSERT INTO usage_log(model, input_tokens, output_tokens, ts) VALUES (?,?,?,?)",
(model, u.prompt_tokens, u.completion_tokens, int(time.time())),
)
conn.commit()
return resp.choices[0].message.content
第 2 步:按模型最新单价计算成本
维护一个价格表(单位:美元/百万 Token)。注意价格变化很快——Gemini 3.7 Flash 今天已经降到输入 0.75、输出 3.75,记得及时更新:
PRICES = {
"gemini-3.7-flash": {"in": 0.75, "out": 3.75},
"gpt-5.6-sol": {"in": 5.0, "out": 30.0},
"deepseek-v4-pro": {"in": 0.5, "out": 2.0},
}
def calc_cost(model, input_tokens, output_tokens):
p = PRICES.get(model, {"in": 0, "out": 0})
return (input_tokens / 1e6 * p["in"]) + (output_tokens / 1e6 * p["out"])
第 3 步:每日汇总 + 预算告警
每天定时跑一次汇总,超过预算就发告警。示例用最简的文件标记,生产环境可以换成钉钉/企业微信 webhook 或邮件:
def daily_report():
conn = sqlite3.connect("cost.db")
rows = conn.execute(
"SELECT model, SUM(input_tokens), SUM(output_tokens) FROM usage_log "
"WHERE ts > ? GROUP BY model", (int(time.time()) - 86400,)).fetchall()
total = sum(calc_cost(m, i, o) for m, i, o in rows)
print(f"今日成本: ${total:.2f}")
if total > 20.0: # 日预算阈值
print("⚠️ 超预算!检查是否有死循环或异常调用")
成功验证
连续跑 3 次调用后执行 `daily_report()`,能看到成本随用量增长;把阈值临时调到 0.01,触发一次告警,确认链路通。正确标准:每笔调用有记录、成本可计算、超预算必告警。
进阶玩法:在 `usage_log` 表里加一列 `feature`,给每个业务功能打标签,比如”客服”、”RAG”、”总结”。一周后跑一个 `GROUP BY feature`,你会第一次看到”哪个功能在烧钱”的真相——八成会惊讶地发现,最贵的不是你以为的那个。有了这个数据,砍成本就不是拍脑袋,而是有依据的决策。
常见失败处理
– usage 字段为空:部分模型流式输出(stream=True)不返回 usage,需要自行累计,或改用非流式统计。
– 价格表过期:模型降价后记得更新 `PRICES`,否则报表虚高。
– 漏记调用:所有入口都要走 `call_and_log`,别让裸 SDK 调用绕过日志。
– 多环境混用:测试和生产的调用都写进同一个表,可以在表里加 environment 字段区分。
这套方案适合日调用量百万 Token 以内的中小项目,直接跑在单机 SQLite 上零成本;如果每天几亿 Token,建议换 ClickHouse 或云日志服务。价格战是红利也是陷阱:不算清楚成本,降价只会让你花得更多。3 步搭好监控,明天就能看到真实的 API 账单。
🔥 关注LC智趣厅,教你用最小的成本把 AI 用到极致。
👇 关注不错过,明天还有实操干货。
— END —
LC 智趣厅 · 科技与生活的交点
ihygg.cn