Agent Workflow Retry Policy 是什么?为什么需要它?
Agent workflow 由多个步骤组成:调用 LLM、执行工具、读写内存、与外部 API 交互。每一步都可能因为网络抖动、API 限流、超时或中间状态不一致而失败。Retry policy 决定了当某一步失败时,系统应该如何重新尝试——重试多少次、间隔多久、哪些错误值得重试、重试时的幂等性怎么保证。
没有重试策略,一次瞬态故障就会导致整个 workflow 彻底失败;而重试策略设置不当,又可能浪费算力、放大系统负载,甚至掩盖真正的 bug。
核心机制:重试条件、退避策略与超时
1. 哪些错误值得重试?
不是所有错误都该重试。区分两类错误:
- 可重试 (retriable):网络超时、HTTP 503、API 限流 (429)、临时性服务不可用。这些错误有较高概率在重试后恢复。
- 不可重试 (non-retriable):HTTP 400 参数错误、401 认证失败、403 权限不足、404 资源不存在。重试这些错误只会白费流量,应该直接失败并触发告警。

// 伪代码示例
if (error.IsRetriable()) {
executeWithRetry(step, retryPolicy);
} else {
failImmediately(step, error);
}
2. 退避策略:指数退避 + 抖动
连续重试只会加重系统拥堵。标准做法是指数退避 (Exponential Backoff):每次重试间隔翻倍,并加入随机抖动 (jitter) 避免所有客户端同时重试。
| 重试次数 | 基础间隔(固定) | 指数退避(2^n) | 指数退避+抖动 |
|---|---|---|---|
| 1 | 1s | 1s | 0.5-1.5s |
| 2 | 1s | 2s | 1.0-3.0s |
| 3 | 1s | 4s | 2.0-6.0s |
| 4 | 1s | 8s | 4.0-12.0s |
建议配置:初始间隔 1s,最大间隔 30s,总超时上限 60s,重试次数 3-5 次。
3. 超时与熔断
不能无限等待。每步应设独立超时 (timeout),整个 workflow 设全局超时。当某步连续失败达到阈值(例如 3 次内失败率 > 50%),应触发熔断 (circuit breaker),暂停对该服务或步骤的重试一段时间,避免资源耗尽。
真实场景:调用外部天气 API 时重试失败
假设 agent 工作流中有一个步骤通过外部 API 获取天气数据。某次请求遇到 DNS 解析超时,触发重试。重试策略设为固定间隔 2s、最多 3 次。结果:接下来 2 次重试全部超时,第三次返回 500。最终 workflow 报错失败。
问题分析:
- 错误类型判断正确:网络超时属于可重试。
- 退避策略不合理:固定间隔 2s 太快,DNS 问题通常需要 10s 以上恢复。采用指数退避后,第一次 2s,第二次 4s,第三次 8s,可能第三次就成功了。
- 缺少熔断:连续 3 次失败后没有暂停,后续再触发该 agent 的请求会继续重试,造成资源浪费。
改进后:指数退避 + 熔断开关,当 1 分钟内失败率 > 30% 时,熔断器打开 30s,期间直接失败并降级返回缓存数据。

容易踩的坑:幂等性缺失与状态残留
重试最隐蔽的风险是非幂等操作被多次执行。例如 agent 调用支付接口、发送通知、写入数据库——这些操作如果重试时不保证幂等,就会产生重复扣款、重复通知、数据脏写。
解决方法:
- 每个请求附加唯一请求 ID (idempotency key),服务端根据 key 去重。
- 或设计操作本身为幂等:例如"把库存设为 100"是幂等的,"库存减 1"不是。
另一个常见坑是状态残留:重试前某个中间状态已经写入数据库 (如"处理中"),重试时没有清理或跳过,导致逻辑重复花费或锁定超时。最佳实践是在重试步骤内保持事务性,失败回滚或标记为可容忍重复。
失败时的备用方案
即使设置了重试,仍有概率失败。必须准备备选路径:
- 降级 (Degradation):跳过失败步骤,使用默认值或缓存数据继续 workflow。例如天气 API 失败,使用前一天预报数据。
- 人工介入:将失败信息写入死信队列或告警通道,人工排查后重新执行。
- 补偿事务 (Saga):对于跨步骤的工作流,如果某步重试后仍失败,触发补偿操作回退之前已成功的步骤。例如先创建订单,后扣款;扣款失败则补偿关闭订单。
- 重试队列:将失败步骤异步推入重试队列,延迟再试,不阻塞主流程。
总结:一份可操作的 checklist
配置 Agent workflow retry policy 时,请对照以下检查点:
- 区分可重试与不可重试错误,为不可重试错误直接失败。
- 采用指数退避策略,初始间隔 1s,最大 30s,加入 25% 随机抖动。
- 设置总超时上限(如 60s)和每步超时(如 10s)。
- 实现熔断器,连续失败率达到阈值时暂停重试。
- 检查每一步是否为幂等操作;若非幂等,请用 idempotency key。
- 失败时提供降级或补偿方案,避免 workflow 完全崩溃。
- 记录重试次数、间隔和最终结果到日志,便于事后分析。
下一步:成为真正的 Agent 工程师
重试策略只是 Agent workflow 设计中的一环。如果你想从普通开发者转型为 Agent 工程师,系统掌握 context 管理、workflow 编排、权限控制、内存机制等内容,我们的高质量原创付费文章和 AI 编程进阶课程能帮你构建完整知识体系。

暂无评论,快来发表你的见解吧