重试、预算、适配与评估发布:练习答案
练习解答
以下是完整离线文件,保存为answer.py后运行python answer.py;先建立与正文一致的初始状态,再验证变体。
python
def retry_delay(status,attempt,remaining,retry_after=None):
if status not in {429,500,502,503,504} or attempt>=3:return None
delay=retry_after if retry_after is not None else min(2**attempt,8)
if delay<0:raise ValueError('negative delay')
return delay if delay<remaining else None
assert retry_delay(400,0,30) is None
assert retry_delay(429,0,5,6) is None
assert retry_delay(503,1,10)==2
assert retry_delay(503,3,100) is None
print('retry policy passed')
assert retry_delay(503,1,2) is None
rows=[{'group':'zh','ok':True},{'group':'zh','ok':False},
{'group':'en','ok':True},{'group':'en','ok':False}]
for group in ['zh','en']:
subset=[r for r in rows if r['group']==group]
assert sum(r['ok'] for r in subset)/len(subset)==0.5等待已经用尽全部时间,下一次请求没有执行预算,不能启动。实际策略还应预留最小请求时间。
深化页面练习解答
重试、退避与整体 deadline
等待时间等于剩余 deadline 时不应重试,因为请求本身还需要连接、读取和清理时间。副作用状态未知时先查询执行状态;只有确认未执行或下游具备幂等约束,才允许重试。
Token、工具费用与原子预算
预算应同时有租户级和任务级上限,二者都通过后才执行。工具费用、检索费用和人工处理费用必须单独记账。异步任务返回任务 ID,是为了让客户端查询同一个任务,而不是通过 HTTP 重试再次创建任务。
适配层、回归集与灰度发布
平均延迟会掩盖单个长尾样本,发布门禁应同时观察分位数、最大值和错误分组。灰度版本至少绑定模型、提示词、schema、适配器、路由规则和评估集版本;回滚时恢复整组配置,不能只切换模型名称。