Skip to content

重试、预算、适配与评估发布:练习答案 ​

练习解答 ​

以下是完整离线文件,保存为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、适配器、路由规则和评估集版本;回滚时恢复整组配置,不能只切换模型名称。

用心记录每一步成长