多 Agent 编排中的状态一致性:从并行任务到共享状态的同步协议
多 Agent 编排中的状态一致性从并行任务到共享状态的同步协议一、生活场景中的 Agent 协作冲突AI 生活助手由三个 Agent 协作完成一次规划周末出行任务日程 Agent 检查时间空档天气 Agent 分析预报数据预算 Agent 计算费用。三个 Agent 并行执行后日程 Agent 建议周六出发天气 Agent 提示周六有暴雨预算 Agent 确认费用合理。如果三个 Agent 各自独立修改共享的出行计划状态可能出现日程 Agent 先写入周六出发天气 Agent 紧接着覆写为取消周六预算 Agent 还在基于周六计算费用。状态不一致导致最终计划混乱。多 Agent 编排的核心挑战是并行执行提高效率但共享状态的并发修改引入冲突。二、Agent 状态机与并发同步协议解决 Agent 间状态冲突的方案是引入状态机模型和操作锁协议。出行计划的状态从规划中→待确认→已确认→已取消每个状态只允许特定类型的修改状态机的关键规则是Agent 在规划中状态只写入各自的分析结果日程有空档、天气有暴雨不直接修改最终决策出发或取消。最终决策由汇总 Agent 在待确认状态中综合三方结果后提出用户确认后状态才推进到已确认。这种设计将 Agent 的写入权限限制在各自的子空间避免并发修改冲突。三、状态一致性协议的代码实现# Agent 状态机与并发同步协议 import asyncio from dataclasses import dataclass, field from typing import Dict, Optional, Callable from enum import Enum class PlanState(Enum): 出行计划状态枚举 PLANNING planning PENDING_CONFIRM pending_confirm CONFIRMED confirmed CANCELLED cancelled dataclass class AgentResult: 单个 Agent 的分析结果 agent_name: str conclusion: str confidence: float # 0.0~1.0 details: dict dataclass class TravelPlan: 出行计划状态容器 设计意图分离 Agent 分析结果空间和最终决策空间 Agent 只能写入自己的结果槽位不能修改决策字段。 plan_id: str state: PlanState PlanState.PLANNING # 各 Agent 的独立结果槽位 agent_results: Dict[str, AgentResult] field(default_factorydict) # 最终决策只有汇总 Agent 和用户可以修改 final_decision: Optional[str] None required_agents: list field(default_factorylist) class PlanStateMachine: 出行计划状态机 设计意图状态转换受严格规则约束 防止 Agent 在错误状态下修改数据。 # 定义合法的状态转换路径 TRANSITIONS { PlanState.PLANNING: [PlanState.PENDING_CONFIRM], PlanState.PENDING_CONFIRM: [PlanState.CONFIRMED, PlanState.PLANNING], PlanState.CONFIRMED: [PlanState.CANCELLED], PlanState.CANCELLED: [PlanState.PLANNING], } # 定义每个状态下允许的操作 ALLOWED_WRITES { PlanState.PLANNING: [agent_result], # Agent 可写入分析结果 PlanState.PENDING_CONFIRM: [final_decision], # 汇总/用户可写决策 PlanState.CONFIRMED: [], # 确认后禁止修改 PlanState.CANCELLED: [], # 取消后禁止修改 } def __init__(self): self._plans: Dict[str, TravelPlan] {} self._lock asyncio.Lock() async def create_plan( self, plan_id: str, required_agents: list ) - TravelPlan: 创建新的出行计划 async with self._lock: plan TravelPlan( plan_idplan_id, required_agentsrequired_agents ) self._plans[plan_id] plan return plan async def write_agent_result( self, plan_id: str, result: AgentResult ) - None: Agent 写入分析结果 设计意图仅在 PLANNING 状态下允许写入 且每个 Agent 只写入自己的槽位互不干扰。 async with self._lock: plan self._plans.get(plan_id) if not plan: raise ValueError(f计划不存在: {plan_id}) if agent_result not in self.ALLOWED_WRITES[plan.state]: raise StateError( f当前状态 {plan.state.value} 不允许 Agent 写入结果 ) plan.agent_results[result.agent_name] result # 检查是否所有必要 Agent 都完成了分析 if self._all_agents_completed(plan): plan.state PlanState.PENDING_CONFIRM async def write_final_decision( self, plan_id: str, decision: str, author: str ) - None: 写入最终决策 设计意图只有汇总 Agent 或用户可以写最终决策 且仅在 PENDING_CONFIRM 状态下允许。 async with self._lock: plan self._plans.get(plan_id) if not plan: raise ValueError(f计划不存在: {plan_id}) if final_decision not in self.ALLOWED_WRITES[plan.state]: raise StateError( f当前状态 {plan.state.value} 不允许写入决策 ) plan.final_decision decision def _all_agents_completed(self, plan: TravelPlan) - bool: 检查所有必要 Agent 是否完成分析 return all( agent in plan.agent_results for agent in plan.required_agents ) class StateError(Exception): 状态操作违规异常 # Agent 执行框架每个 Agent 在独立协程中运行 class AgentExecutor: Agent 执行器 设计意图Agent 通过回调机制向状态机写入结果 不直接持有计划对象的引用避免绕过状态约束。 def __init__( self, name: str, analyze_fn: Callable, state_machine: PlanStateMachine ): self.name name self.analyze_fn analyze_fn self.sm state_machine async def execute(self, plan_id: str, context: dict) - None: 执行 Agent 分析并将结果写入状态机 try: result await self.analyze_fn(context) agent_result AgentResult( agent_nameself.name, conclusionresult[conclusion], confidenceresult.get(confidence, 0.8), detailsresult.get(details, {}) ) await self.sm.write_agent_result(plan_id, agent_result) except Exception as exc: # Agent 执行失败时写入低置信度的失败结果 failure_result AgentResult( agent_nameself.name, conclusionf分析失败: {exc}, confidence0.0, details{error: str(exc)} ) await self.sm.write_agent_result(plan_id, failure_result)四、状态机方案在复杂 Agent 网络中的局限状态机方案适合 3~5 个 Agent 的线性协作场景但面对更复杂的 Agent 网络超过 10 个 Agent、多层级嵌套任务时存在局限。状态数量指数增长10 个 Agent 各有 3 种结果组合状态达 59049 种状态机无法枚举所有合法路径。嵌套任务间的状态依赖也很棘手出行计划包含预订酒店子任务酒店预订有自己的状态机两个状态机之间的推进需要协调——出行计划取消时酒店预订也应自动取消。嵌套状态机的实现复杂度远超单层状态机。对于超过 5 个 Agent 的场景更务实的方案是事件驱动架构Agent 完成分析后发布事件汇总服务订阅所有事件后统一决策不依赖状态机枚举。状态机仅在核心决策节点使用Agent 间的信息传递通过事件总线完成。五、总结多 Agent 编排状态一致性的关键要点状态隔离Agent 只写入各自的子空间分析结果不直接修改共享决策字段状态机约束严格定义合法状态转换路径和每个状态的允许操作防止越权写入汇总决策所有 Agent 完成分析后状态推进到待确认汇总服务综合三方结果提决策异步锁保护asyncio.Lock 保证状态转换的原子性避免并发修改冲突规模边界3~5 个 Agent 适用状态机方案超过 5 个建议事件驱动架构生产落地步骤定义计划状态枚举 → 设计状态转换规则 → 实现状态机与写入权限约束 → 配置 Agent 执行器回调 → 并行启动多 Agent → 汇总决策写入 → 用户确认推进状态。