钱被哪个模型吃掉了:一把 key 上的按模型用量拆分
介绍如何通过请求日志和响应中的模型字段,将一把 API key 的总花费和 token 用量按模型拆分开,从而定位多模型工作流中最消耗成本的模型。
在多模型工作流里,一把 key 同时调用多个后端很常见。当账单上涨时,你首先想知道的是:钱到底被哪个模型吃掉了?本文介绍如何按模型拆分花费和 token 用量,找出最贵的那个后端。
原理:日志里藏着模型指纹
大多数 LLM API 聚合站在响应中会返回实际使用的模型标识(通常在 model 字段),并在请求日志中记录每次调用的输入、输出 token 数。因此,只要按模型对日志分组汇总,就能得到每个模型的 token 消耗和对应费用。
费用计算可以用聚合站的计费规则反推:用户按官方价 ×1.3 扣费,因此每个模型的成本 = 该模型官方价 ×1.3 × 用量。但如果你只想比较相对高低,直接看 token 用量和官方价倍率即可。
第一步:记录每次调用的模型与用量
在客户端代码里,每次请求完成后从响应中提取模型名和用量信息,写入结构化日志。例如:
import json, time
def log_usage(response, request_model):
entry = {
"ts": time.time(),
"request_model": request_model,
"actual_model": response.get("model"),
"input_tokens": response["usage"]["prompt_tokens"],
"output_tokens": response["usage"]["completion_tokens"],
}
with open("usage.jsonl", "a") as f:
f.write(json.dumps(entry) + "\n")
注意区分 requestmodel(你请求的模型别名)和 actualmodel(实际服务的模型),后者才是计费依据。
第二步:按模型聚合 token 与费用
读取日志,按 actual_model 分组,分别累加输入、输出 token。然后乘以该模型的官方单价和聚合站的倍率(×1.3),得到每个模型的总费用。
from collections import defaultdict
usage = defaultdict(lambda: {"input": 0, "output": 0})
for line in open("usage.jsonl"):
e = json.loads(line)
m = e["actual_model"]
usage[m]["input"] += e["input_tokens"]
usage[m]["output"] += e["output_tokens"]
for model, u in usage.items():
print(model, u)
如果你有各模型的官方单价表,可以进一步换算成金额,并排序找出最贵的模型。
第三步:定位最贵的后端
聚合结果后,按总费用从高到低排序。通常最贵的模型要么是单价高,要么是调用量大。你可以进一步拆分:是输入 token 多还是输出 token 多?输出 token 通常单价更高,因此长回复的模型更容易推高成本。
如果发现某个模型费用异常,检查是否在低价值任务上误用了高单价模型,或者是否因为重试、循环导致重复调用。
第四步:优化多模型工作流
找到最贵的模型后,可以考虑:
- 将简单任务路由到更便宜的模型(如 DeepSeek、Qwen、GLM、Kimi 等),复杂任务才用 Claude 或 GPT。
- 对输出长度设限,减少不必要的长回复。
- 缓存重复请求,避免重复计费。
- 定期审查日志,确保模型路由符合预期。
小结
按模型拆分花费和 token 并不复杂:记录响应中的模型与用量,按模型聚合,再乘以单价和倍率。坚持做这件事,你就能清楚知道每一分钱花在了哪个模型上,从而优化多模型工作流的成本结构。