多用户共享智能体状态:你真正需要的并发原语
每篇智能体教程都从单个用户、单个会话和单个上下文窗口开始。智能体读取状态、推理、行动、写回。清晰、确定。对于团队实际使用的场景来说,这种假设完全错误。
真实的协作产品——共享规划看板、多用户支持队列、文档协作副驾驶、团队项目助手——需要多个用户同时与同一个智能体交互。当两个人在同一秒内向智能体发出相互矛盾的指令时,其中一个人的修改就会消失。智能体不会告诉他们,甚至自己都不知道发生了什么。
这就是多用户共享智能体状态问题,它是一个披着AI外衣的分布式系统问题。
规模化时崩溃的假设
根本原因是大多数智能体框架早期做出的一个隐性架构决策:智能体状态是一个单一的可变对象,会话是隔离的单位。
这种设计对单用户场景完美适用。但对共享工作区却会失效,因为 它将智能体的工作内存视为单线程变量。当用户A读取当前规划文档状态、通过智能体修改它并写回——而用户B在400毫秒后做了同样的事情——B的写入会无声地覆盖A的修改。没有冲突通知,没有合并逻辑,没有报错。从智能体自身角度来看,它正确地处理了两条指令。
这是经典的最后写入优先(last-write-wins)问题。分布式数据库已经解决了这个问题。AI智能体基础设施中这个问题基本上仍未得到解决。大多数团队在生产环境中才发现它,那时用户已经在抱怨他们的修改"一直在丢失",而要将这个投诉与竞态条件而非模型失败联系起来,往往需要数周时间。
解决方案不是更聪明的提示词。解决方案是像对待分布式数据存储的并发写入一样对待智能体状态更新:使用适当的并发控制。
乐观锁:最低成本的安全保障
最廉价的正确性改进是乐观并发控制。与其在读取前锁定状态,不如自由地读取,然后在写入时验证自读取以来没有发生任何变化。
机制很简单:每个智能体状态都带有版本号。当用户A读取状态时,他们得到 {..., version: 42}。当他们的智能体操作尝试写回时,它包含这个版本号:"仅当当前版本仍为42时才应用此更改。"如果用户B的写入已经将状态提升到版本43,A的写入将被拒绝,系统可以用最新状态重试。
在实践中,这意味着:
- 智能体的工具调用在实际更新负载旁边包含一个
state_version参数。
