AI 纪元 追踪人工智能最新进展,深度解读前沿技术

多Agent上生产,先补这几处容错

多Agent协作最怕的不是单个模型答错,而是状态不同步、超时重试和共享数据冲突。以LangGraph、AutoGen为例,梳理生产部署前必须补上的容错设计。

0 次阅读 约 2848 字 6 分钟 AI 生成
Abstract representation of multi-agent system fault tolerance showing interconnected nodes with subtle misalignment
Abstract representation of multi-agent system fault tolerance showing interconnected nodes with subtle misalignment

多Agent系统一旦进生产,问题往往不是“某个Agent不够聪明”,而是它们在同一条链路里互相拖住。

原稿里提到的618大促故障,就是典型场景:库存查询Agent认为库存充足,优惠券核销Agent已经扣减券码,结算网关却收到了互相矛盾的指令。后面触发的不是一次普通失败,而是无限重试循环,最后把交易链路拖垮。

这个例子里,Qwen-Max、GLM-4-Plus的响应速度并不是关键。真正卡住系统的是状态不一致、重试没有边界、缺少全局协调。

知乎一份题为《188页PPT!2026年智能体协作架构框架与多...》的材料也提到,多智能体系统不是简单堆Agent数量,而是涉及架构设计、通信协议、任务分配、冲突协调和资源调度的系统工程。落到生产部署,就是一句话:先别让它们互相踩脚。

崩盘通常从三个小口子开始

第一个口子是默认网络可靠。

LLM API、工具调用、数据库、搜索接口,任何一个环节都可能超时。单Agent失败,大不了重跑;多Agent并发时,一个节点卡住,其他节点可能拿着旧状态继续往下走。

第二个口子是每个Agent只看自己的上下文。

库存Agent只知道库存,优惠券Agent只知道券码,客服Agent只知道用户诉求。它们单独看都没错,组合到结算链路里却可能冲突。多Agent里的“幻觉”不一定来自模型胡说,也可能来自上下文分裂。

第三个口子是重试太粗。

失败就立刻重试,看起来积极,实际可能制造重试风暴。库存服务已经慢了,多个Agent还同时补请求,系统只会更慢。容错不是“多试几次”,而是知道什么时候该停、什么时候该降级、什么时候该把状态锁住。

2026智源大会在“终端智能体与OpenClaw”论坛中讨论过一个方向:通过Harness连接模型、工具、环境、记忆、符号结构、安全沙箱和端云系统,让Agent从回答者变成执行系统。执行系统要可靠,容错层就不能靠临时补丁。

LangGraph适合把状态摊开管理

LangGraph的思路更接近显式状态机。Agent是节点,消息和状态沿着图流转。它的好处是:哪一步在改状态,哪一步可能失败,失败后回到哪里,都比较容易看清。

在原稿的618故障复盘里,LangGraph可以借助checkpointers保存中间状态。库存查询Agent失败时,不必整条链路从头再跑,而是回到上一个一致状态点。

下面这段更适合作为配置思路看,而不是直接复制进生产:

from langgraph.prebuilt import create_react_agent
from langchain_core.rate_limiters import InMemoryRateLimiter

agent = create_react_agent(
    model,
    tools,
    checkpointer=InMemorySaver(),  # 状态持久化和回滚
    retry_on_timeout=True,
    max_retries=3,
    timeout_seconds=10
)

这里真正重要的不是某个参数名,而是三件事:

  • 每个节点要有超时边界;
  • 重试次数要有上限,比如原稿里的max_retries=3;
  • 中间状态要能保存,失败后能回滚到一致点。

如果没有状态检查点,多Agent协作会退化成一串黑盒调用。它们看起来在协作,实际上没人知道全局状态已经走到哪一步。

AutoGen灵活,但状态要自己兜住

AutoGen更像多Agent对话框架,优势是灵活。多个Agent可以围绕任务讨论、分工、补充信息,搭原型很快。

问题也在这里:对话越自由,状态越容易散。

原稿里的购物车数据竞争,就是这一类风险。多个Agent同时修改同一份数据,如果没有统一状态存储,也没有版本比较,很容易出现“每个Agent都觉得自己是对的”的局面。

在AutoGen里,断路器通常需要接外部库。原稿给了PyBreaker示例:

import pybreaker

breaker = pybreaker.CircuitBreaker(fail_max=3, reset_timeout=60)

@breaker.callable
def call_inventory_service(product_id):
    # 调用库存API的逻辑
    pass

try:
    result = call_inventory_service("PROD_123")
except pybreaker.CircuitBreakerError:
    print("服务暂时不可用,请手动处理")

这段代码的核心是“快速失败”。当库存服务连续失败3次,后续请求不再继续打过去,而是直接进入降级或人工处理。比起让所有Agent一起重试,快速失败更像刹车。

AutoGen不是不能上生产,而是不能只靠对话历史当状态。生产环境里,购物车、订单、库存、券码这类关键数据,必须落到中央状态服务或业务数据库里,由业务层处理并发写入。

状态同步别交给Agent自由发挥

多Agent共享状态时,最危险的是“脑裂”:每个Agent手里都有一份看似合理的状态,但版本不同。

LangGraph在同一个StateGraph实例内更容易做状态互斥;跨进程、跨机器之后,还是要外接Redis、etcd这类状态服务。原稿提到的Context包装外部状态,也只能解决“拿状态”的问题,写入冲突仍要业务层处理,比如加乐观锁。

AutoGen的问题更典型:Agent从不同上下文恢复时,可能拿到不同快照。原稿中的三个扣库存Agent各自缓存库存快照,却没有比较版本,最后就会把冲突传给结算链路。

更稳的做法是:

  • Agent启动时,从中央状态服务同步全量快照;
  • 每次写入带版本号或锁;
  • 状态更新后,通过Webhook通知关联Agent刷新;
  • 关键链路只允许一个最终写入者,其他Agent提供建议或校验。

这听起来不像“智能体创新”,更像老派分布式系统工程。但多Agent上生产,绕不开这一层。

先定停机规则,再谈进化

2026智源大会的“AI自进化”论坛讨论过Agent如何从交互、失败、探索和反馈中形成记忆、规则、世界模型与学习能力。这个方向很重要,但生产系统的第一道门槛仍然是:失败时不要扩大故障。

ICAIBD 2026也把Agentic AI and Agent Collaboration列为Track 3,说明Agent协作已经是一个单独议题。协作越复杂,越不能只看单个Agent的能力。

多Agent容错可以先从几个低成本动作开始:给每个工具调用设超时;给重试加上限;给关键状态加版本;给外部依赖加断路器;给跨Agent写入设唯一入口。

这些配置不漂亮,但管用。

真正的生产部署,通常不是让Agent多做一步,而是让它在该停的时候停下来。

相关阅读