大模型调用防卡死:超时、重试与指数退避快速配置指南
一、先设总预算,再决定重试次数
大模型请求失败,不一定应该立即重发。限流时密集重试会放大拥塞;生成较慢时,过短的超时又会制造重复请求。实用原则是:限制等待时间,只重试临时故障,每次重试前随机等待。
普通交互可以先用这组起始配置:连接超时5秒、读取超时60秒、整个操作最多90秒、最多尝试3次,即首次请求加2次重试。它不是所有模型的标准答案:长推理和大输出任务应根据实际延迟提高预算,或改用后台任务。
二、区分三种超时,避免“配了却仍然卡住”
- 连接超时:限制建立网络连接的等待时间,建议从3至5秒起步。
- 读取超时:限制等待下一段响应数据的时间,不等于完整生成时长。流式响应持续返回数据时,调用仍可能运行很久。
- 总截止时间:覆盖所有尝试、退避等待和响应读取,由应用单独控制。预算耗尽后不再发起请求。
使用异步任务时,可通过应用层截止时间取消等待,但取消客户端任务不代表服务端一定停止生成,也不保证免除费用。连接池等待、写入超时也应有限值,避免请求无限排队。
三、先关闭叠加重试,再接入接口
使用开放人工智能软件开发工具包时,建议显式设置 max_retries=0,再由业务层统一管理重试。例如在 Python 中导入 AsyncOpenAI 和 httpx 后,可初始化:client = AsyncOpenAI(api_key="你的密钥", base_url="https://api.59api.com", max_retries=0, timeout=httpx.Timeout(60.0, connect=5.0))。
这里的60秒不是总预算;异步业务仍需设置外层截止时间。密钥应从环境变量读取,不要写入仓库。同时检查网关、任务队列是否还会重试,避免三层各试3次,最终放大为27次请求。
四、按错误类型决定是否重试
- 通常可重试:连接失败、临时网络中断、明确属于速率限制的429,以及502、503、504等临时服务故障。
- 通常不重试:400参数错误、401认证失败、403权限问题、模型不存在、上下文超限,以及明确表示余额或配额耗尽的错误。
- 超时需谨慎:服务端可能已经接收并处理请求。重新发送可能重复生成、重复计费,不能把超时当作“请求从未发生”。
不要只看状态码,也要检查错误类型和响应正文。重试时保持相同模型与参数;如果需要切换模型,应作为明确的降级策略,而不是悄悄改变结果质量。
五、指数退避加随机抖动,并服从剩余预算
可以采用全抖动策略:等待秒数 = random(0, min(8, 0.5 × 2^n)),其中 n 从0开始表示第一次重试。这样不同客户端不会在同一时刻集中重发。即使当前仅重试两次,也保留8秒上限,方便后续调整。
若服务端返回 Retry-After,应先解析秒数或日期,并把它作为最早重试时间;不要随机出一个更短的等待值。每次等待前检查剩余总预算,若等待后已没有足够时间完成一次有效尝试,就直接结束并返回可识别的失败原因。
持续出现限流时,还应降低并发、限制队列长度;连续服务故障则可短暂熔断。退避只能缓解冲击,不能创造额外容量。
六、处理流式响应,并观察真实成本
流式请求尚未输出内容时,可以按上述规则重试;已经向用户输出部分文字后,不要静默重放整个请求,否则容易重复显示内容。应明确提示中断,提供重新生成入口。涉及工具调用、付款或写数据库时,必须在业务端做去重;不要假设任意接口都支持幂等键。
上线至少记录模型名、状态码、尝试次数、首个输出片段延迟、总耗时、用量和请求标识,并避免记录密钥或敏感提示词。重点看“每次成功操作的总成本”,而不只是单次调用价格。
59API 提供低价、按量付费的 Claude 与 GPT 模型访问,覆盖 Opus、Sonnet、Haiku、Fable,使用原生官方品质模型、不降级,并兼容 Claude Code、Codex 和开放人工智能软件开发工具包。它适合在控制预算的同时落地上述可靠性策略,也提供推荐返利。如果正在搭建调用层,可以注册59API,用少量预算验证超时、限流和流式中断场景,再逐步放量。
¿Listo para empezar?
Conecta Claude y GPT en minutos a los precios más bajos, sin recortes. Regístrate para obtener tu clave API.
Registro gratis