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 本身要简单可靠,不引入新依赖。

④ 降级路径

  • 实在拿不到结果时,返回”部分答案 + 说明”,而非报错。
  • 例如 RAG 检索挂了,退化为”基于模型通用知识回答并标注不确定性”。
  • 异常处理三层架构见 异常处理与降级策略工具调用降级策略

关键权衡

问题设计回答要点
哪些错误该重试?瞬时错误(超时/限流/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),重试无意义且可能放大问题;只重试瞬时错误。
降级响应怎么设计才不坑用户?诚实降级:返回部分结果并明确标注”信息不全/不确定”,优于整条链路报错。