引言:当 Agent 都“逻辑正确”,系统却开始随机出错
在单 Agent 世界里,失败通常是:
推理错了
计划不合理
工具用错了
错误是“局部可解释的”。但当你引入多个 Agent 后,你会看到一种非常诡异的现象:
单独看每个 Agent,都没毛病
日志里每一步都“合理”
但系统结果却:
随机失败
状态错乱
偶发性不可复现
于是你会听到一句熟到不能再熟的工程黑话:“看起来像是个并发问题。”没错。Agent 系统,一旦共享状态,本质上就是并发系统。这个在传统软件领域经常遇到的,其实Agent系统也存在类似的问题。
一、多 Agent ≠ 多线程,但问题一模一样
多 Agent 协作系统,在工程上等价于“分布式并发程序”。
哪怕:每个 Agent 是顺序执行的,每个 Agent 内部都有 Debugger,每个 Agent 都“很聪明”。只要它们:同时读 / 写同一个业务对象或者依赖彼此尚未稳定的中间状态时。那么以下问题不可避免:
竞态条件
死锁
活锁
状态撕裂(State Tear)
二、什么是 Agent 世界里的“共享资源”?
在传统并发里,共享资源是:
内存变量
文件
数据库记录
在 Agent 系统里,共享资源通常是:
业务对象
一个订单(Order)
一个用户状态(User Profile)
一个工单(Ticket)
一个任务进度(Task State)
多个 Agent 可能分别负责:
校验
补全
决策
执行
但它们写的是同一个对象。
抽象状态
这些变量更加危险,比如
“任务是否已完成”
“是否允许进入下一阶段”
“当前是否安全执行”
这些状态不一定有实体字段,往往通过多个 Agent 的“判断”隐式决定,这是竞态的温床。
外部系统
例如:
调用支付接口
发送通知
执行部署
修改外部系统
一旦多个 Agent同时认为“现在该我动手了”,灾难就开始了。
三、竞态条件:Agent 系统里最隐蔽的杀手
定义:当多个 Agent 的正确行为,在时间交错下,产生了错误系统结果。
一个典型 Agent 竞态案例,假设你有两个 Agent:
Agent A:负责“库存检查”
Agent B:负责“下单确认”
共享对象:Order.status
时间线:
T1: Agent A 读取 status = "PENDING" T2: Agent B 读取 status = "PENDING" T3: Agent A 判断:库存充足 ✅ T4: Agent B 判断:可以确认订单 ✅ T5: Agent A 写入 status = "READY" T6: Agent B 写入 status = "CONFIRMED"看起来没问题?但如果系统约定:只有 READY → CONFIRMED 才是合法路径,那么你已经得到一个非法跃迁。重点在于:A 没错,B 也没错,错的是「它们同时做了对的事」。
为什么 Agent 特别容易触发竞态?因为 Agent 有三个天然特性:
1️⃣ 推理耗时不可控
LLM 推理 ≠ CPU 指令,你无法假设“很快就执行完”。
2️⃣ 决策是“延迟生效”的
Agent 的判断基于:
旧状态
上下文快照
非实时视图
3️⃣ Agent 会“自信地行动”
一旦它判断“该做”,它不会怀疑:“这个判断是不是已经过期了?”
四、死锁:Agent 世界里的“礼貌陷阱”
死锁在 Agent 系统中,往往不是资源锁死,而是“认知互锁”
一个非常 Agent 化的死锁场景
Agent A:“我要等 Agent B 给我确认,才能继续。”
Agent B:“我需要 Agent A 的最新结果,才能确认。”
双方都在:
合理等待
遵守流程
没有任何异常日志
系统却永远停住了。
Agent 死锁的三种常见形态
1️⃣ 状态依赖死锁
A 等待状态 X 变为 true
B 等待 A 完成某一步
状态 X 永远不会被触发
2️⃣ 责任回避死锁(非常常见)
Agent A:“这一步不该我来做”
Agent B:“那应该是 A 的职责”
每个 Agent 都是“合规的”,系统却无人推进。
3️⃣ 过度安全死锁
当你引入:
Sentinel
审核 Agent
风控 Agent
但没有最终裁决者时:所有人都在等“别人先放行”。
五、为什么 Debugger 在这里已经不够了?
你会发现一个痛点:单 Agent Debugger,解释不了“系统级错误”。
每个 Agent 的单步都合理
每个 Decision 都能自洽
错误出现在交错顺序上
这意味着你需要的,不只是单步跟踪(Step Trace),而是多 Agent 的时序视图(Temporal Trace)
六、工程级解决思路
1️⃣ 明确“共享对象”的唯一写入者
一个非常重要的铁律:共享业务对象,必须只有一个 Agent 拥有“最终写权限”。其他 Agent只能:提供建议,产出候选决策,输出结构化意见,但不能直接写。
2️⃣ 把“状态跃迁”显式化为状态机
不要让 Agent“自由写字段”。
PENDING → READY → CONFIRMED → COMPLETED任何跃迁必须:
显式声明 from / to
由协调者校验合法性
Agent 只是提议:“我建议从 READY → CONFIRMED,理由是……”
3️⃣ 引入协调 Agent
这是多 Agent 系统的关键角色:
不做业务
不做推理
不调用工具
它只做一件事:裁决多个 Agent 的行为是否可以同时发生。本质上,它是:事务管理器 + 状态机执行者 + 冲突解决者
4️⃣ 为 Agent 行为加“版本号”(乐观锁)
每一次 Agent 决策,都必须基于:
{ "object_id": "order_123", "state_version": 17 }写入时:如果版本已变化 → 决策作废 → 重新推理。这在 Agent 世界里,极其重要。
七、竞态 & 死锁 ≠ Bug,而是架构信号
当你开始看到竞态和死锁,说明你的 Agent 系统已经进入“真实系统”阶段。这不是坏事,真正的坏事是:你还在用“单 Agent 心智模型”解决问题,你还在试图“让 Agent 更聪明”。而没有让系统更有约束,