本课讨论多个 AI 智能体如何同步工作、共享短期记忆并协调操作。在购物助手中,不同智能体可能负责商品搜索、库存检查、定价或推荐。有效协作需要高效共享当前会话的工作记忆。本课包括以下内容。
- 共享短期记忆的含义,与长期记忆的区别,以及多智能体参与时的挑战。
- 保证数据一致,处理竞态条件和更新冲突。
- 使用 Redis、LangGraph 状态、消息队列、锁机制和任务认领协调工作。
- 不同方法在一致性、延迟、容错、扩展能力和复杂度方面的取舍。
多智能体系统中的共享短期记忆
短期记忆保存当前会话或任务的临时上下文,例如对话历史、购物车内容和任务中间结果。它通常以会话线程为范围,通过消息历史跟踪正在进行的交互。长期记忆跨会话保存知识或用户资料;短期记忆主要服务当前交互。
多个智能体共同工作时,需要一致地了解最新状态。例如,Cart Agent 添加商品后,Shipping Agent 和 Inventory Agent 应能够获得更新后的购物车信息,虽然这两个角色在当前项目阶段尚未实现。如果各自维护互不交流的记忆,就可能出现库存智能体不知道商品已添加,或者两个智能体重复添加同一商品等问题。因此,需要共享存储或通信机制同步对环境的理解。
挑战:多个自主进程会遇到经典分布式问题,包括同时更新同一数据造成的资源争用,不知道其他智能体已经工作而重复执行,更新时间先后导致覆盖或冲突的竞态条件,以及因相互等待造成的停滞。例如,两个智能体同时向购物车应用优惠券,可能互相覆盖,或者依据旧数据计算总价。共享状态需要明确、权威的数据来源,并协调操作顺序。
同步的挑战与要求
同步意味着协调操作及数据访问,使整体状态保持一致。主要要求包括以下方面。
- 一致的记忆更新:一个智能体修改状态后,其他智能体应及时读取符合系统一致性要求的数据。例如,库存减少后,Cart Agent 应依据最新可用数量决策。可以通过共同存储或更新通知实现;具体可见时间取决于存储及同步设计。
- 写入互斥:多个智能体可以修改相同数据时,需要锁机制或明确唯一写入者,防止互相干扰。例如,两个定价智能体同时应用优惠,可能造成重复折扣。
- 顺序与依赖:付款应在确认库存及确定购物车内容之后执行。协调者或任务逻辑需要核查前置条件。
- 处理冲突操作:一个智能体移除商品,另一个同时添加时,需要冲突处理策略,例如按明确业务规则选择有效更新,或终止其中一项操作。某些数据可以采用最后写入生效,但应确认这符合业务要求。
控制策略决定智能体如何协调操作,记忆共享策略决定如何交换状态。前一课讨论了集中式与分布式控制,本课进一步介绍共享存储、发布订阅及锁机制。
共享记忆与同步的协调机制
常见机制包括以下三类。
- 共享记忆存储:所有智能体访问共同状态,形成 blackboard 或 scratchpad 式工作空间。
- 事件驱动消息:通过 Publish/Subscribe(Pub/Sub)广播变化,相关智能体订阅并响应,减少组件之间的直接依赖。
- 锁机制和原子操作:控制共享数据的并发访问,并通过任务调度或认领防止重复工作。
这些机制可以相互补充。例如,共享存储保存状态,事件通知告知其他智能体数据已经变化。
共享工作记忆
可以使用统一数据存储作为短期状态的权威来源,包括内存数据库、键值存储,或同一进程中的数据结构。这类 blackboard/scratchpad 架构允许智能体向共同工作区写入知识和部分结果,也能读取整体进度。在完全采用共享记事板的设计中,智能体可以仅通过该工作区交流,无需直接联系。
具体实现可以是数据库表、表示当前购物车或对话的 NoSQL 文档,或 Redis 等内存存储。例如,一个 Redis hash 或 DynamoDB item 保存购物车,需要读写时都访问同一记录。
也可以由流程框架管理共享状态。LangGraph 将工作流程表示为有状态的图,节点读取状态并返回更新,状态沿边传递。这个状态就是系统的工作记忆。多个节点并行执行时,可以使用 reducer 合并相应字段的更新。框架运行时负责状态处理,必要时通过数据库检查点持久保存,减少应用自行维护外部临时存储的工作。
维持一致性:共同来源便于统一数据视图,但多个智能体同时写入相同字段时,仍需并发控制。可以按职责规定,只有 Cart Agent 修改 cart_contents,只有 Inventory Agent 修改 inventory_status,其他智能体只读。也可以使用版本号、更新时间或历史日志,识别新旧状态。
共享记忆还应保存协作需要的背景信息。例如,可以记录“AgentA 于 10:00 将 Item X 加入购物车”,让其他智能体了解已发生的操作。
Redis 示例:一个 key 保存购物车 JSON,智能体通过 GET 或 SET 访问;另一个 list 或 stream 记录事件,例如使用 LPUSH 添加操作说明。单条 Redis 命令具有原子性,因此读取单次 SET 的结果时不会看到半写入的值。多条命令组成的读取、修改和写入流程仍需要额外控制;涉及多个 key 的整体更新,可以使用适当事务、Lua 脚本或其他正确的并发控制方案。锁机制也需要所有写入者共同遵循。
事件驱动通信:Pub/Sub
共享存储本身较为被动,智能体需要轮询才能发现变化。事件驱动消息可以补充这一点:智能体主动发布操作或重要变化,其他智能体订阅相关主题并接收通知。
例如,Cart Agent 添加商品后发布 cart.item_added,附带商品 ID 和数量。Inventory、Pricing 和 Shipping Agent 订阅这一主题,收到消息后分别检查库存、重新计算总价或处理配送信息。发布者只需发送事件,无需逐个调用接收者。
Pub/Sub 将信息生产者和使用者分开。新增智能体可以订阅已有事件,减少对其他组件的修改。即使底层使用中央消息代理,逻辑上的参与者仍保持相对独立。
实现方式:简单或本地系统可以采用 Redis Pub/Sub。较大系统可以使用 RabbitMQ、Apache Kafka,以及 Amazon SQS、Kinesis 或 EventBridge 等消息或事件服务。不同产品的持久化、重投递和顺序保证各不相同,应按需求选择。Redis Pub/Sub 采用至多一次投递,接收者离线或未收到的消息不会自动补发;需要保留及重放消息时,应采用支持相应能力的持久化机制。
事件示例:购物助手可以使用 product.search.completed、cart.item_added、inventory.out_of_stock 和 order.checkout.requested。各智能体遵循“收到事件 X,执行操作 Y”的逻辑。下一课将讨论 A2A 协议;Pub/Sub 也是组织智能体通信的一种方式。例如,Inventory Agent 订阅 item_added_to_cart,收到 Cart Agent 发布的事件后执行处理。
共享记忆与 Pub/Sub:消息系统传递变化,共享存储保留状态,两者常共同使用。也可以把完整购物车内容放入消息,仅通过消息同步;但离线智能体可能错过通知,因此通常保留持久存储,供后续加入的成员读取最新状态。
顺序与投递:消息可能重复、延迟或乱序,某些情况下也可能丢失。Kafka 在同一分区内保持顺序,SQS FIFO 则按消息组管理顺序。购物车事件需要顺序处理时,应选择适当机制,或在事件中加入序号、时间戳,并由接收者检查顺序。
过滤:智能体只应订阅相关主题。例如,Inventory Agent 关注 cart.item_added 和 cart.item_removed,无需处理每个 user.message。
直接消息与广播:Pub/Sub 常用于一对多通知,一对一任务可以使用任务队列或直接消息。例如,Planner 向 QA 的队列发送任务,或使用每个智能体独立主题及目标字段。Cart Agent 也可以直接请求 Inventory Agent“保留两件 Item123”。这种请求与结果交互类似 RPC,也可以建立在消息系统上。
锁机制、互斥与任务认领
并发控制保证共享数据更新安全,任务认领则减少重复执行。
即使使用共享存储或消息系统,两个智能体同时修改同一字段仍可能发生冲突。可以在关键区段使用 lock 或 mutex。例如,更新购物车时取得 cart_123_lock,读取数据、修改、写回,再释放锁;其他遵循同一锁机制的写入者等待完成后再执行。数据库事务等机制也可以用于保护相关更新。
严格加锁影响性能时,可以采用乐观并发控制。智能体提交更新时检查版本号,发现冲突则重试或执行冲突处理,类似版本管理中的合并冲突,以及数据库的并发版本检查。
任务认领:分布式系统中,多个智能体可能同时认为某项工作需要执行,例如同时处理一个含糊请求,或从待办任务中选择同一项。队列可以帮助将任务分配给一个使用者,处理期间限制其他使用者领取同一消息。例如,SQS 使用可见性超时,RabbitMQ 使用投递与确认机制。但失败恢复和重投递仍可能造成重复执行,业务处理应支持幂等。自行实现认领时,可以在共享存储中以原子方式设置 item_X_status = "in_progress_by_agentY",使其他成员看到当前负责人,并规定超时恢复方式。
购物助手同时收到两个修改购物车的请求时,可以按会话购物车串行处理,或使用锁及令牌管理。同样,两个智能体都发现新商品需要归纳时,其中一个先原子地认领任务,另一个就无需重复执行。
锁和任务认领可以限制同一时刻的更新者或执行者,有助于共享记忆一致性,但也会增加等待时间并形成瓶颈。因此,应将保护范围限制在确有需要的关键操作。
实时协作中的共享状态
多智能体系统可以通过共享状态存储、Pub/Sub、锁机制及任务认领协调行动。短期记忆提供共同工作背景,适当的同步和并发控制则帮助各智能体在生产环境中可靠地协作。