Skip to content

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 会怎样漏报真实费用。

练习 ​

  1. 设计 estimated、provider_billed 和 unknown 三种用量来源。
  2. 预算不足时分别实现降级模型、只读模式和人工接管。
  3. 说明异步任务为何要返回任务 ID,而不是依赖客户端重试创建任务。

用心记录每一步成长