LLM 调用不再盲目重试:超时、指数退避与成本控制快速上手
先定预算,再写重试循环
LLM 调用失败后立即再发一次,看似简单,却可能放大限流、延迟和费用。可靠的起点是:一个总截止时间、有限重试次数、带随机抖动的指数退避。以下配置适合交互式文本应用作为起点,长文本生成应按实际耗时调整。
第一步:拆开超时,避免请求无限等待
- 连接超时设为 5 秒:限制建立连接的等待时间,避免网络故障长期占用资源。
- 读取超时先设为 30 秒:限制等待响应数据的时间;它通常不是整个生成过程的时长上限。
- 总截止时间设为 60 秒:覆盖全部尝试、退避等待和响应处理。流式输出也可能持续收到数据而不断延长,因此仍需单独设置总时限。
每次重试前计算剩余预算,并将本次超时限制在剩余时间内。若剩余时间已不足以完成一次有意义的请求,就返回明确错误,而不是继续排队。
第二步:只重试可能恢复的错误
- 考虑重试:临时连接失败、连接重置,以及通常具有瞬时性的 408、429、500、502、503、504;同时检查响应中的具体错误原因。
- 不要原样重试:400、401、403、404、422 通常需要修正参数、密钥、权限或模型配置。余额不足、硬性配额耗尽,也不会因短暂等待自动恢复。
- 谨慎处理读取超时:客户端没收到结果,不代表服务端没有完成生成;再次调用可能产生额外费用。
第三步:指数退避必须加入随机抖动
设置最多重试 2 次,即总共最多 3 次请求。第 n 次重试从 1 开始,等待时间取 0 到 min(8 秒,0.5 秒 × 2 的 n−1 次方) 之间的随机值。这种全抖动策略能避免大量客户端同时恢复请求。
遇到 Retry-After 时,按响应指示等待;它可能是秒数,也可能是 HTTP 日期。不要比服务端要求的时间更早重试。如果等待后无法满足总截止时间,直接结束当前任务,或转入后台队列。
还要检查 SDK 的内置重试。若由业务层统一控制,使用支持该选项的 OpenAI SDK 时可设置 max_retries=0,避免内外两层重试叠加。
第四步:保护流式输出与工具副作用
流式响应已输出部分内容后,不要无声重发并拼接结果,否则可能出现重复段落。应提示生成中断,或由产品层设计明确的续写流程。工具执行、下单、写数据库等操作必须使用业务幂等键;只有服务端明确支持时,才能依赖接口幂等机制。
第五步:在 59API 上落地并观察成本
59API 的 API 基础地址是 https://api.59api.com,兼容 OpenAI SDK,并支持 Claude Code、Codex 和 Gemini CLI。具体端点与模型标识按接入文档配置,可用 DeepSeek V4 Flash 或 Claude Sonnet 5.5 分别测试延迟与质量,不要在重试时静默切换模型。
59API 主打低价、按量付费,提供原生官方品质模型、不降级,也有邀请返利,适合控制开发与试运行成本。不过,低单价不等于重试免费:记录状态码、尝试次数、总耗时、请求标识及用量,持续观察成功率和每次成功调用的成本。
可以注册 59API,用小额预算先跑一组正常、限流和超时测试;确认重试确实提高成功率,而不是仅仅增加请求量,再逐步放大流量。
Pronto para começar?
Conecte Claude e GPT em minutos pelos menores preços, sem cortes. Cadastre-se e obtenha sua chave API.
Cadastro grátis