给每次调用打标签:在一把 key 上按功能归因花费
当聚合站只按 API key 计费时,无法直接区分不同功能的花费。本文介绍如何通过请求头附加自定义标签,并在本地记录日志,从而在一把 key 上重建按功能归因的花费分布,帮助优化成本。
问题:一把 key,多个功能,花费混在一起
使用 LLM API 聚合站时,通常一个 key 可以调用多个模型。但账单往往只按 key 汇总,你很难知道具体是哪个功能、哪个团队或哪个实验消耗了多少。尤其是当同一个 key 被多个后端服务共用时,成本归因变得模糊。
解决思路:给请求打标签
大多数 API 允许在请求头中添加自定义字段。你可以利用这一点,为每次调用附加一个标识,例如:
X-Feature: summarization
或更结构化的:
X-Tags: feature:summarization,team:content,env:prod
这些头不会影响模型调用,但会被你的本地日志系统捕获。
在客户端埋点
在你的代码中,调用 API 时统一注入标签。下面是一个 Python 示例,使用 requests 库:
import requests
def call_llm(prompt, feature, model="claude"):
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"X-Feature": feature,
}
payload = {
"model": model,
"messages": [{"role": "user", "content": prompt}],
}
resp = requests.post(API_URL, json=payload, headers=headers)
return resp.json()
实际使用时,你可以根据业务函数传入不同的 feature 值。
本地日志记录
在发起请求的同时,将关键信息写入本地日志(文件或数据库)。建议记录:
- 时间戳
- 功能标签(feature)
- 模型名称
- 输入 token 数(可从响应中获取)
- 输出 token 数
- 请求 ID(如果响应返回)
示例日志条目:
{
"timestamp": "2025-03-24T10:00:00Z",
"feature": "summarization",
"model": "claude",
"input_tokens": 150,
"output_tokens": 50,
"request_id": "req_abc123"
}
从日志重建花费分布
聚合站通常按官方价 ×1.3 扣费。你需要知道每个模型的官方单价才能计算成本。假设你已知官方单价(单位:美元/千 token),则单次调用成本为:
cost = (input_tokens / 1000) * input_price + (output_tokens / 1000) * output_price
实际扣费为 cost * 1.3。
然后,按功能标签聚合日志:
from collections import defaultdict
# 假设已加载日志列表 logs
feature_cost = defaultdict(float)
for log in logs:
price_in = MODEL_PRICES[log["model"]]["input"]
price_out = MODEL_PRICES[log["model"]]["output"]
cost = (log["input_tokens"]/1000)*price_in + (log["output_tokens"]/1000)*price_out
feature_cost[log["feature"]] += cost * 1.3
print(feature_cost)
输出类似:
{"summarization": 1.25, "translation": 0.80, "chatbot": 3.10}
注意事项
- 标签一致性:确保所有调用路径都注入相同的标签名,避免遗漏。
- 日志完整性:如果请求失败,也要记录尝试的标签(可选),以便分析异常成本。
- 模型价格更新:官方单价可能调整,定期核对你的价格表。
- 隐私:日志中不要记录 prompt 或响应原文,只记录元数据。
扩展:贡献 key 的归因
如果你同时贡献 key 并获得返 USDC(官方价 ×1.1 或 ×1.2),也可以用类似方法记录贡献收益。但注意,贡献 key 的收益与用户扣费是分开计算的,不要混淆。
通过给请求打标签并本地记录,你可以在仅按 key 计费的聚合站上,清晰地按功能分摊成本,为优化和预算提供依据。