抽取任务用 json_schema 约束输出,遇到校验失败就整请求重试,最多三轮,一天下来输入 token 是正常量的 4 倍,账单里补全 token 占比异常高。
一开始怀疑是「重试没有上限退避,失败请求集中放大」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。重试沿用了完整原文输入,没有缩小上下文。也可能是失败原因多为字段缺失,重试时未补充约束。
还有一种情况,成功结果与失败请求都重复计费。
上来先统计重试次数与失败原因分布
python -c "import pandas as pd;d=pd.read_csv('calls.csv');print(d.groupby('attempt').size(), d.fail_reason.value_counts())"
失败时只重发缺失字段相关的片段
python -c "import json;r=json.load(open('resp.json'));print([k for k in r if r[k] is None])"
给重试加上限并降到两次
python -c "print('max_retry=2, backoff=1s, only on schema_error')"
末了用量对比确认成本回落到基线
python cost_diff.py --before last_week.csv --after this_week.csv
恢复的判定其实很直接。重试次数降到两次后日均 token 回到正常量的 1.2 倍,字段缺失类失败通过补约束解决,账单差额收敛。
容易忽略的是,重试的成本是成倍放大的,把整段输入重发一遍换一个字段,是最容易被忽略的浪费。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
