Token、工具费用与原子预算
成本控制要覆盖模型输入、缓存输入、输出、工具调用、检索和人工处理。任务开始时先预留上限,执行结束按实际用量结算并释放余量。并发请求不能使用“检查余额后再扣款”的非原子流程,否则两个请求会同时穿透预算。预算耗尽应暂停、降级或转人工,并留下可解释的原因。
第一个可运行实验:预留、结算与释放
使用 Python 3.12 保存 budget.py,运行 python budget.py。示例用整数微单位避免浮点误差。
python
class Budget:
def __init__(self, limit):
self.limit = limit
self.reserved = 0
def reserve(self, amount):
if amount < 0 or self.reserved + amount > self.limit:
return False
self.reserved += amount
return True
def settle(self, reserved, actual):
if reserved < 0 or actual < 0 or reserved > self.reserved:
raise ValueError('invalid settlement')
self.reserved -= reserved
return actual
b = Budget(100)
assert b.reserve(80) is True
assert b.reserve(30) is False
assert b.settle(80, 25) == 25
assert b.reserved == 0
print('budget accounting passed')预留额不是实际账单;流式响应中断也要结算已经产生的用量。按租户、用户、任务、模型和步骤记录成本,P50 只能说明典型请求,P95/P99 和单任务上限才能发现长上下文或工具循环失控。不要把供应商返回的 usage 当成唯一事实,适配层应标明估算、计费和缺失状态。
变体实验
加入每日租户预算和单任务预算,要求两层都通过才允许执行。再让工具成本高于模型成本,观察只统计 token 会怎样漏报真实费用。
练习
- 设计
estimated、provider_billed和unknown三种用量来源。 - 预算不足时分别实现降级模型、只读模式和人工接管。
- 说明异步任务为何要返回任务 ID,而不是依赖客户端重试创建任务。