并发智能体系统中的竞态条件:那些看起来像幻觉的 Bug
三个智能体并发处理同一个客户账户更新。三者都记录了成功。最终数据库状态同时出现了三处错误,且始终没有抛出任何异常。团队花了两周时间怪罪模型。
问题不在模型。是竞态条件。
这是生产环境多智能体系统中被误诊次数最多的故障模式:由并发状态访问引发的数据损坏,因为下游智能体会基于损坏的输入自信地进行推理,从而被误认为是幻觉。模型并没有在编造内容,它只是在忠实地处理垃圾数据。
读-改-写陷阱
核心漏洞是经典的读-改-写竞态。设想三个并行运行的智能体——一个处理账户状态,一个计算费用,一个执行合规检查。每个智能体读取当前账户记录,进行各自的修改,然后将结果写回。
智能体 A 读取:{status: "pending", fees_applied: false, compliance: "clean"}
智能体 B 读取相同内容:{status: "pending", fees_applied: false, compliance: "clean"}
智能体 C 读取相同内容:{status: "pending", fees_applied: false, compliance: "clean"}
智能体 A 率先写入:{status: "active", fees_applied: false, compliance: "clean"}
智能体 B 随后写入:{status: "pending", fees_applied: true, compliance: "clean"} — 这是完全覆盖写。智能体 A 的状态更新消失了。
智能体 C 最后写入:{status: "pending", fees_applied: false, compliance: "flagged"} — 智能体 A 和 B 的修改全部丢失。
每个智能体都成功了。日志干净无误。但最终账户状态只反映了智能体 C 对原始记录的孤立视图。三个语义操作被提交,只有一个幸存。
下游发生了什么?一个风险评分智能体读取了这条记录,并基于通过剥离三个并发更新中的两个而构造出的数据,生成了详尽且自信的分析。风险评分看起来合理,文字说明连贯流畅,却完全是错误的。
这正是竞态条件被误诊为幻觉的原因:损坏发生在状态层,而非生成层。LLM 做的完全正确——它在基于所获得的上下文进行推理。只是上下文本身错了。
为何这是分布式系统问题,而非 AI 问题
多智能体 LLM 系统继承了数十年数据库工程中的所有分布式系统故障模式,但构建这些系统的大多数工程师以前从未思考过因果一致性。
顺序切换的单线程智 能体很简单:智能体 A 运行并写入结果,智能体 B 读取该结果然后运行,以此类推。存在清晰的发生先后关系,状态绝不会同时被两个写入者访问。
并发多智能体系统立刻打破了这一切。一旦有两个智能体同时运行且可能触及相同状态,你就构建了一个分布式系统。所有分布式系统问题都适用:竞态条件、顺序违规、脑裂场景、局部故障恢复。技术栈的某一层是语言模型这一事实,与状态层是否正确完全无关。
生产故障数据印证了这一差距。跨生产多智能体部署的记录故障率从 41% 到 86% 不等,协调失败和状态损坏是主要原因。这些故障中绝大多数并非模型局限性所致,而是在陌生领域中出现的经典分布式系统 bug。
适用的分布式系统原语
乐观锁
防止覆盖模式最简单的手段是乐观锁。每条状态记录携带一个版本号。读操作捕获版本号,写操作仅在版本未变更时才成功。
每个智能体读取:{balance: 100, version: 3}。每个智能体尝试写入时,以 version == 3 作为前提条件。第一个写入成功并将版本提升至 4。所有后续写入立即失败——版本现在是 4,而非 3。写入失败的智能体必须重试:重新读取当前状态,基于最新数据重新计算修改,然后再次尝试。
关键特性:失败是显式的,并在写入时被检测到。没有静默覆盖,没有丢失的更新。当竞争激烈时代价是重试,但对于共享状态访问并非热点的大多数智能体工作负载而言,竞争程度低到重试很少发生。
DynamoDB 的条件表达式直接实现了这一模式。大多数数据库通过乐观锁中间件支持它。任何支持比较并交换语义的键值存储都能用不到五十行代码从头实现。
令人惊讶的是,智能体框架几乎从不鼓励这样做。大多数教程展示的智能体在没有版本断言的情况下读写状态,因为这样演示更简单。生产团队会在六个月后才明白这有多错。
向量时钟与因果排序
乐观锁处理了覆盖问题,但并未捕获更新冲突的原因。向量时钟捕获因果排序:智能体 B 的更新是否在因果上处于智能体 A 之后,或者它们真的是并发的,因此可能存在冲突。
每个智能体维护一个计数器向量——系统中每个智能体各一个。智能体的向量 [5, 1, 2] 表示"我已应用了自己的 5 个事件、智能体 B 的 1 个事件和智能体 C 的 2 个事件。"智能体发送状态更新时附带当前向量,接收智能体在应用更新时合并向量。
有用的特性:如果智能体 A 的向量在元素层面小于智能体 B 的向量,则 A 的更新在逻辑上先于 B 发生。如果两者在元素层面均不小于对方,则更新是并发的,需要合并策略。
这对调试比对防止损坏更有用。用向量时钟值注释的分布式追踪,使得在发生故障时能够精确重建智能体所相信的因果顺序。这能区分"智能体对什么先发生存在分歧"和"智能体在排序上达成一致,但其中一个产 生了错误结果"。
在拥有数百个智能体的系统中,向量时钟扩展性较差——向量大小随智能体数量增长。对于拥有有限数量不同智能体类型的大多数生产多智能体系统而言,这是可以接受的。
CRDT 与无冲突收敛
- https://galileo.ai/blog/multi-agent-ai-failures-prevention
- https://galileo.ai/blog/multi-agent-coordination-failure-mitigation
- https://www.getmaxim.ai/articles/multi-agent-system-reliability-failure-patterns-root-causes-and-production-validation-strategies
- https://machinelearningmastery.com/handling-race-conditions-in-multi-agent-orchestration/
- https://medium.com/@bharatraj1918/langgraph-state-management-part-1-how-langgraph-manages-state-for-multi-agent-workflows-da64d352c43b
- https://opentelemetry.io/blog/2025/ai-agent-observability/
- https://crdt.tech/
- https://www.microsoft.com/en-us/security/blog/2025/04/24/new-whitepaper-outlines-the-taxonomy-of-failure-modes-in-ai-agents/
- https://dev.to/chunxiaoxx/building-multi-agent-ai-systems-in-2026-a2a-observability-and-verifiable-execution-10gn
