Agent 降级与容错系统设计
Agent 调用链路长(LLM + 多个工具 + 外部服务),任何一环都可能挂。本篇谈重试、熔断、Fallback、降级路径四位一体。Agent 基础见 Agent架构与ReAct;通用降级理论见 限流与熔断降级。
设计原则
生产级 Agent 的底线是”默认不崩溃”:即使部分工具/模型不可用,也要给出”尽可能好”的结果,而不是整条链路 500。
四机制架构
flowchart TB Call[工具/模型调用] --> Retry["① 重试策略<br/>指数退避+幂等"] Retry -->|仍失败| Circuit["② 熔断<br/>开/半开/关"] Circuit -->|打开| Fallback["③ Fallback 兜底"] Circuit -->|恢复探测| Call Fallback --> Degrade["④ 降级路径<br/>返回部分结果/静态答案"] Degrade --> Resp["用户拿到“降级但可用“的响应"]
① 重试策略
- 指数退避 + 抖动:避免重试风暴打爆依赖。
- 只重试安全错误:网络超时、429 可重试;编程错误(4xx 参数错)不重试,否则无意义。
- 幂等:重试前确认工具调用可重复(如查询幂等,写操作需幂等键),见 工具幂等性与重试策略。
② 熔断机制
- 错误率超阈值 → 熔断器”打开”,短时间内直接拒绝,不再打依赖(给它喘息)。
- 一段时间后”半开”探测,成功则恢复”关闭”。
- 与分布式熔断思路一致,见 限流与熔断降级。
③ Fallback 兜底
- 主模型失败 → 切备用模型;主工具失败 → 用简化实现或缓存结果。
- Fallback 本身要简单可靠,不引入新依赖。
④ 降级路径
关键权衡
| 问题 | 设计回答要点 |
|---|---|
| 哪些错误该重试? | 瞬时错误(超时/限流/5xx)可重试且指数退避;编程错误(参数错)不重试 |
| 熔断和重试冲突吗? | 不冲突:重试处理瞬时失败,熔断处理”依赖已挂”避免无效重试与雪崩,二者分层 |
| 降级会不会让用户觉得”答非所问”? | 会,所以降级要”诚实”:返回部分结果并明确标注不确定性/不可用,优于直接报错 |
| 怎么保证重试不重复副作用? | 工具幂等设计 + 幂等键,写操作重试前校验是否已执行 |
速记卡(面试闪卡)
Q1:一句话讲清「Agent 降级与容错系统设计」到底是什么? A:生产级 Agent 底线是”默认不崩溃”:部分工具/模型挂了也给出尽可能好的结果而非整链 500(Fault Tolerance)。
Q2:设计原则 —— 怎么理解? A:生产级 Agent 的底线是”默认不崩溃”(Fail-safe):即使部分工具或模型不可用,也要给出”尽可能好”的结果,而不是整条链路 500。像电梯坏一层还有备用,绝不把人关在半空(容错,Fault Tolerance)。
Q3:① 重试策略 —— 怎么理解? A:重试用指数退避 + 抖动避免打爆依赖;只重试安全错误(网络超时、429),编程错误(4xx 参数错)不重试;且要保证幂等——查询天然幂等,写操作需幂等键。像敲门没人应,等久点再敲,但别把”门牌写错”也当重试(指数退避,Exponential Backoff)。
Q4:② 熔断机制 —— 怎么理解? A:错误率超阈值 → 熔断器”打开”,短时间内直接拒绝不再打依赖,给它喘息;过一阵”半开”探测,成功则恢复”关闭”。和分布式熔断思路一致。像电闸短路跳闸,过会儿推上去试,还短路再跳(熔断器,Circuit Breaker)。
Q5:③ Fallback 兜底 —— 怎么理解? A:主模型失败 → 切备用模型;主工具失败 → 用简化实现或缓存结果。Fallback 本身要简单可靠、不引新依赖。降级路径则是实在拿不到结果时返回”部分答案+说明”而非报错,如 RAG 检索挂了退化为基于通用知识回答并标注不确定(降级,Degradation)。
Q6:核心速记主线有哪些?
- 设计原则:默认不崩溃,部分失败也返回可用结果
- 重试:指数退避+抖动,只重试瞬时错误且保证幂等
- 熔断:错误率超阈打开,半开探测恢复关闭
- Fallback 切备用 + 降级路径返回部分结果并诚实标注
口诀 A:Agent 容错四件套,默认不崩是底线; 重试退避加抖动,瞬时错误才重来; 熔断打开拒请求,半开探测再合上; Fallback 切备用,降级诚实说实话。
相关链接
快速问答
| 问题 | 参考答案 |
|---|---|
| Agent 容错四机制? | 重试(指数退避+幂等)、熔断(开/半开/关)、Fallback(切备用)、降级路径(返回部分结果)。 |
| 重试和熔断如何配合? | 重试处理瞬时失败;熔断在依赖已挂时直接拒绝,避免无效重试与雪崩,二者分层不冲突。 |
| 哪些错误不该重试? | 编程错误(参数错/4xx),重试无意义且可能放大问题;只重试瞬时错误。 |
| 降级响应怎么设计才不坑用户? | 诚实降级:返回部分结果并明确标注”信息不全/不确定”,优于整条链路报错。 |