跳到主要内容

智能体死锁:当 AI 代理永远在等待彼此

· 阅读需 10 分钟
Tian Pan
Software Engineer

关于多智能体 AI 系统,有一个令人不安的事实:当你让两个或更多由 LLM 驱动的代理共享资源并同时做出决策时,它们的死锁率在 25% 到 95% 之间。不是偶尔发生。不是在边缘负载下。在使用标准提示的正常运行条件下,一旦代理必须同时协调,系统就会卡住。

这不是理论上的担忧。协调故障约占生产环境中多智能体系统故障的 37%,而没有正式编排的系统故障率在 41% 到 87% 之间。经典的分布式系统故障模式——死锁、活锁、优先级反转——又回来了,只是穿上了新衣服。

哲学家就餐问题,现在有了 Token 预算

最初的哲学家就餐问题是计算机科学中经典的死锁场景:五位哲学家围坐在一张桌子旁,每人需要两把叉子才能吃饭,但总共只有五把叉子。如果每位哲学家同时拿起左边的叉子,没人能拿起右边的叉子,所有人都会饿死。

LLM 代理以惊人的精确度重现了这种故障模式。DPBench 基准测试的研究表明,当 GPT 级别的模型被置于同时协调场景中时,三个代理的死锁率达到 95-100%,五个代理则为 25-65%。同样的模型在顺序模式下死锁率接近零。问题不在于推理能力——而在于同时执行。

根本原因是研究人员所说的趋同推理。在相似数据上训练的 LLM 会独立地得出相同的"理性"策略。当两个代理都确定最优操作是先获取资源 A 再获取资源 B,并且它们同时执行该策略时,就会产生循环等待。两个代理都没有错。两个都遵循着完全合理的计划。但系统仍然冻结了。

为什么更多沟通反而使情况更糟

直觉上的修复方案——让代理相互交流——会产生严重的反效果。当研究人员在哲学家就餐场景中启用代理间通信时,五个代理的死锁率从 25% 跳升到 65%。消息到行动的一致性只有 29-44%,这意味着代理宣布了意图但未能按照声明执行。

这是因为基于 LLM 的通信引入了三个叠加问题:

  • 宣布却不承诺。 代理可以声明"我将等待资源 B",然后立即尝试获取资源 A。模型生成了听起来合理的协调语言,却没有将自己绑定到声明的计划上。
  • 同步延迟。 当代理 B 读取代理 A 的消息并制定响应时,代理 A 已经行动了。通信通道有延迟,但行动通道没有。
  • 礼貌螺旋。 在人类对话规范上训练的代理会无休止地相互谦让。"你先请。""不,你先请。"这就是活锁——系统是活跃的,在消耗 token,生成消息,但进展为零。

更深层的洞察是,自然语言是一种糟糕的同步原语。分布式系统几十年前就通过使用结构化协议(互斥锁、信号量、消息队列)解决了这个问题,正是因为非正式的协调无法扩展。在代理之间添加聊天只是重新验证了同样的教训。

你实际会遇到的三种故障模式

在实践中,智能体死锁以三种模式呈现,它们比经典死锁更难检测,因为 LLM 代理会产生进展的假象,实际上却什么也没完成。

镜像循环

两个目标冲突的代理无限期地来回传递工作。一个常见的生产示例:一个执行"专业语气"的编辑代理拒绝了优化"轻松亲切"风格的写作代理的输出。写作代理修改,编辑代理再次拒绝,循环持续直到 token 预算耗尽。

这不是经典意义上的死锁——没有资源被锁定——但它产生了相同的结果:零有用输出和无限的资源消耗。系统看起来很有生产力,因为代理在积极生成响应。如果没有语义哈希来检测各迭代之间输出的 95% 相似性,循环对标准监控来说是不可见的。

资源死锁

代理 A 持有数据库锁并等待代理 B 的验证。代理 B 需要查询同一数据库来生成验证。双方都无法继续。这是教科书式的循环等待,不会生成任何错误信号。系统只是在两个代理都保持"等待"状态时停止产出。

隐蔽之处在于,智能体资源死锁通常涉及不明显共享的隐式资源。两个代理可能都需要调用每秒限制 10 次请求的外部 API。两者都没有在传统意义上"锁定" API。

但当十个自主代理在峰值负载期间同时调用同一服务时,由此产生的重试风暴会造成有效的死锁。每个代理的指数退避重试放大了争用,而不是解决它。

共识死锁

在代理必须在继续之前达成一致的系统中——审核链、多步骤审批工作流——趋同推理可以产生一种状态,即每个代理都在等待另一个代理先行动。这是优先级反转:最低优先级的代理持有隐含的"先行动"责任,但没有代理认为自己优先级最低。

与经典的优先级反转不同,没有调度器来检测和解决反转。代理只是在等待,消耗保活资源,直到超时触发或人类注意到。

检测比预防更难

你不能问代理它是否在循环中。即使 LLM 第二十次产生语义相同的输出,它也会自信地报告正在取得进展。检测需要外部机制。

状态哈希对循环检测有效。对每个代理在每个步骤的语义内容(不是精确的 token)进行哈希。如果连续三次输出的相似度在 95% 以内,则触发逃逸序列。这可以可靠地捕获镜像循环模式。

依赖图分析在设计时捕获循环等待。在部署多智能体系统之前,列举每个代理可以获取的每种资源以及它等待的每种资源。如果图中有环,就存在潜在的死锁。这是操作系统理论中的 Coffman 条件检查,应用于代理架构。

基于预算的检测处理状态哈希和图分析遗漏的情况。每个会话的 token 消费硬上限(例如 5.00 美元),配合在 25% 增量处触发审查的速率门控,可以捕获产生足够多样化输出以逃避语义哈希的失控循环。如果代理工作流已花费 75% 的预算但只完成了 10% 的预期输出,那就有问题了。

真正有效的预防模式

智能体死锁的预防策略直接来源于分布式系统,并针对基于 LLM 的代理的独特特性进行了调整。

顺序轮流

最有效的单一干预措施是消除同时性。当代理轮流行动并在决策前观察彼此的行为时,死锁率从 25-95% 降至接近零。这是多代理等价于全局锁——它序列化访问并从构造上消除循环等待。

代价是吞吐量。顺序执行意味着你的八代理流水线比理论上的并行执行要慢 8 倍。对于资源敏感的操作,这种权衡几乎总是值得的。对独立任务使用并行,对共享资源使用顺序执行。

中心辐射编排

中央编排代理接收所有请求,分解任务,将工作分配给专家代理,并综合结果。没有专家直接与另一个专家通信。这通过使所有资源访问流经单一点来消除循环依赖。

生产数据显示,与未编排的点对点代理网格相比,中心辐射架构将故障率降低了 3.2 倍。权衡是编排器是单点故障和潜在瓶颈。对于 50 个以下并发任务的大多数工作负载,这是可以接受的。

断路器代理

专用的监控代理监视死锁特征:"代理网球"(分歧持续超过三轮)、礼貌螺旋(无限谦让的语言标记)和预算速率异常。触发时,断路器终止停滞的工作流并升级到回退路径——通常是更简单的单代理流水线或人工交接。

断路器模式之所以有效,是因为它接受死锁会发生的事实,专注于快速恢复而不是理论上的预防。在有五个交互代理的系统中,最终死锁的概率足够高,你应该为它而设计,而不是对抗它。

资源排序

对所有共享资源施加全局排序。每个代理必须以相同的顺序获取资源。代理 A 和代理 B 都在 API 调用之前获取数据库锁,而不是相反。这是 Dijkstra 对哲学家就餐问题的原始解决方案,对 LLM 代理的效果与对线程一样好。

LLM 代理的挑战在于执行。线程可以通过代码强制按顺序获取锁。一个被指示"始终先获取数据库锁"的 LLM 代理可能不会遵循这些指示。解决方法是将资源获取完全移出代理的控制——放入编排层,在那里可以通过编程强制执行。

为你无法预防的死锁而设计

关于多智能体 AI 系统的不适真相是,死锁预防是一个频谱,而不是二元的。你可以通过顺序执行、中心辐射编排和资源排序将死锁概率从 95% 降低到 5%。但在任何代理对共享状态做出自主决策的系统中,你无法将其降低到零。

成熟的工程响应是纵深防御:设计时依赖分析以消除明显的循环,通过状态哈希和预算门控进行运行时检测,以及通过断路器绕过停滞工作流实现优雅降级。在生产中生存下来的系统不是那些预防所有死锁的系统。而是那些在几秒内检测到死锁并自动恢复的系统——在人类注意到之前。

多智能体 AI 的时代也是重新发现——以艰难的方式——为什么分布式系统很难的时代。过去五十年并发编程的每一个教训都适用。代理是新的。故障模式不是。

References:Let's stay in touch and Follow me for more thoughts and updates