两个工作者同时写入了同一个键。两次写入都“成功了”。其中一个消失了。

Reddit r/AI_Agents 工具

摘要

讨论了多智能体系统中共享状态的两个故障模式——并发丢失更新和僵尸写入者,并提出了一种带有栅栏写入者和模型验证保证的解决方案。

如果你运行一个带有并行工作者的编排器,或者共享状态(内存存储、决策文档、计划文件)的长时间运行智能体,这里是我在多智能体设置中经常发现的两种故障模式。它们从外部看起来一模一样:运行正常结束,然后在下游某个地方,系统表现得好像更新从未发生过。两者最初都被归咎于模型。但两者都不是模型的问题。 **故障1:并发丢失更新。** 一个规划器派发了六个工作者,每个工作者将其结果写入一个共享键。两个工作者在同一瞬间完成。两次写入都返回成功。但其中一个随后就不见了。典型的最后写入获胜,但智能体使其比普通服务更糟糕:没有人会怀疑地重新读取文档。下一个提示只是继承了任何幸存下来的内容,流畅地对其进行推理,而差距在三步之后才显现为“智能体忘记了X”。 **故障2:僵尸写入者。** 一个长时间运行的智能体在持有写入授权时中途停滞。恢复机制(正确地)回收了授权,以便其余进程不会被阻塞。一个小时后,停滞的进程醒来并完成了它的写入。这就是陷阱:如果在此期间没有其他东西接触过该工件,版本号仍然匹配。所有版本检查都通过。过时的提交覆盖在了系统早已越过的状态之上。 我最终从写入路径中想要的东西,并且最终构建了: * 并发的同键写入者解析为恰好一个获胜者。失败者会得到一个类型化的、可重试的冲突(重新读取、重新计算、再次提交),而不是静默丢弃。 * 被回收的写入者会被栅栏化。每次回收都会增加一个所有权纪元,每次声明都会记录其所属的纪元,并且提交会原子性地检查两者以及版本持久化。即使版本号从未变动,僵尸写入也会被拒绝。 这些保证在TLA+中进行了模型检查。检查器在CI中运行,每个规范都携带一个已记录的突变(删除守卫),该突变必须使检查器变红。如果删除守卫没有使模型失败,那么该不变量就不是承重的。 范围说明,以免有人安装后期望更多:一个协调器,一个主机,并且只有通过它的写入者。跨主机未实现。我将其限制在有人真正需要时才开放。它运行在跨进程共享的普通文件上,带有针对 LangGraph、CrewAI、AutoGen 和 OpenAI Agents SDK 的适配器。仓库中有一个确定性的、无需键的丢失更新模式复现。 如今在生产环境中,人们如何处理对共享智能体状态的并发写入?重试和希望?架构上的单写入者?还是尚未遇到问题?同样好奇你们遇到了哪些这个方案无法捕获的故障模式。
查看原文

相似文章

以完全相同方式摧毁两个不同多智能体团队的无声故障

Reddit r/AI_Agents

两个不同多智能体系统团队遭遇了相同的无声故障,由智能体以不同格式写入同一键值引起,导致幽灵数据损坏。文章讨论了包括模式验证、写后读验证以及引入“未确认”状态用于不可验证操作的解决方案。

诊断资源受限视觉智能体中共享状态协作的失效模式

arXiv cs.AI

本文研究了资源受限视觉智能体中共享状态协作推理的失效模式,引入了CoSee审计框架,该框架形式化了读写验证循环。研究发现,简单的共享工作区可能会放大幻觉,并识别出噪声增强和策略崩溃是主要的失效模式。

构建多智能体系统让我意识到记忆比编排更难

Reddit r/AI_Agents

构建多智能体系统表明,管理共享记忆和上下文一致性比编排更具挑战性。作者使用 Statewave 进行的实验将记忆视为一个不断演化的生命周期,而非单纯的检索问题。

工作代理是否应直接写入内存?一种我正测试的策展-代理模式

Reddit r/AI_Agents

作者描述了一种模式,其中工作代理不直接写入共享内存,而是发出结构化内存事件,由内存策展人进行验证、去重并路由到适当的作用域,旨在防止多代理系统中的内存污染。他们将此方法与现有框架进行了比较,并征求社区反馈。