从单兵作战到团队协作

单个Agent的能力受限于单一模型的上下文窗口和推理能力。当任务复杂到需要多种专业能力时,多Agent协作成为必然选择。但如何编排多个Agent高效协作,是一个充满设计权衡的工程问题。

编排模式分类

1. 中心化编排(Orchestrator模式)

一个中心编排器分发任务给多个专业Agent:

class Orchestrator:
    def __init__(self):
        self.agents = {
            "researcher": ResearchAgent(),
            "writer": WriterAgent(),
            "reviewer": ReviewerAgent(),
            "fact_checker": FactCheckAgent(),
        }
        self.task_decomposer = TaskDecomposer()
    
    def execute(self, task):
        # 1. 任务分解
        subtasks = self.task_decomposer.decompose(task)
        
        # 2. 分配给合适的Agent
        results = {}
        for subtask in subtasks:
            agent = self._select_agent(subtask)
            result = agent.execute(subtask, context=results)
            results[subtask.id] = result
        
        # 3. 综合结果
        final = self._synthesize(results)
        return final
    
    def _select_agent(self, subtask):
        """根据子任务类型选择Agent"""
        if subtask.type == "research":
            return self.agents["researcher"]
        elif subtask.type == "writing":
            return self.agents["writer"]
        elif subtask.type == "fact_check":
            return self.agents["fact_checker"]
        # ...

优势

  • 控制流清晰,易于调试
  • 可以精确控制执行顺序
  • 中心节点维护全局状态

劣势

  • 中心节点是性能瓶颈
  • 所有通信经过中心,延迟高
  • 中心节点故障则全系统故障

2. 去中心化编排(P2P模式)

Agent之间直接通信,无中心节点:

class P2PAgent:
    def __init__(self, name, capabilities):
        self.name = name
        self.capabilities = capabilities
        self.peers = {}  # 已知的其他Agent
        self.message_queue = asyncio.Queue()
    
    async def run(self):
        """Agent主循环"""
        while True:
            message = await self.message_queue.get()
            
            if message.type == "task":
                # 处理任务
                if self._can_handle(message.task):
                    result = await self._handle(message.task)
                    await self._send(message.sender, "result", result)
                else:
                    # 转发给合适的peer
                    peer = self._find_capable_peer(message.task)
                    await self._send(peer, "task", message.task)
            
            elif message.type == "result":
                self._process_result(message)
    
    async def _send(self, peer_name, msg_type, content):
        """直接发送消息给peer"""
        peer = self.peers[peer_name]
        await peer.message_queue.put({
            "type": msg_type,
            "content": content,
            "sender": self.name
        })

优势

  • 无单点故障
  • 并行执行效率高
  • 可扩展性好

劣势

  • 协调复杂,容易混乱
  • 调试困难
  • 一致性保证难

3. 混合编排

结合中心化和去中心化的优点:

class HybridOrchestrator:
    def __init__(self):
        # 中心编排器管理高层流程
        self.workflow = WorkflowEngine()
        
        # Agent分组,组内P2P协作
        self.teams = {
            "research_team": Team([
                WebResearchAgent(),
                DocResearchAgent(),
                DataResearchAgent()
            ]),
            "writing_team": Team([
                OutlineAgent(),
                DraftAgent(),
                EditAgent()
            ])
        }
    
    def execute(self, task):
        # 1. 中心编排:确定高层流程
        plan = self.workflow.plan(task)
        
        # 2. 分阶段执行,每阶段委托给一个团队
        results = {}
        for phase in plan.phases:
            team = self.teams[phase.team]
            
            # 团队内部P2P协作完成阶段任务
            phase_result = team.collaborate(
                task=phase.task,
                context=results
            )
            results[phase.id] = phase_result
        
        return self._finalize(results)

Agent间通信协议

消息格式

class AgentMessage:
    def __init__(self, sender, receiver, msg_type, content):
        self.sender = sender        # 发送者ID
        self.receiver = receiver    # 接收者ID或"broadcast"
        self.type = msg_type        # 消息类型
        self.content = content      # 消息内容
        self.timestamp = datetime.now()
        self.correlation_id = None  # 关联ID(用于追踪对话链)
        self.priority = "normal"    # 优先级
    
    def to_dict(self):
        return {
            "sender": self.sender,
            "receiver": self.receiver,
            "type": self.type,
            "content": self.content,
            "timestamp": self.timestamp.isoformat(),
            "correlation_id": self.correlation_id,
            "priority": self.priority
        }

通信模式

class CommunicationPatterns:
    def request_response(self, sender, receiver, request):
        """请求-响应模式"""
        msg_id = generate_id()
        sender.send(receiver, "request", {
            "id": msg_id,
            "content": request
        })
        # 阻塞等待响应
        response = sender.wait_for_response(msg_id, timeout=30)
        return response
    
    def publish_subscribe(self, publisher, topic, message):
        """发布-订阅模式"""
        subscribers = self.topic_registry.get_subscribers(topic)
        for sub in subscribers:
            publisher.send(sub, "notification", {
                "topic": topic,
                "content": message
            })
    
    def blackboard(self, writer, key, value):
        """黑板模式:共享信息空间"""
        self.blackboard_store.set(key, value, writer=writer)
        # 通知关注该key的Agent
        for watcher in self.blackboard_store.get_watchers(key):
            self.notify(watcher, f"黑板更新: {key}")

任务分配策略

能力匹配

class CapabilityMatcher:
    def __init__(self):
        self.agent_capabilities = {}  # agent_id -> capability set
    
    def register(self, agent_id, capabilities):
        self.agent_capabilities[agent_id] = set(capabilities)
    
    def find_best_agent(self, task_requirements):
        """找到能力最匹配的Agent"""
        required = set(task_requirements)
        
        scores = []
        for agent_id, caps in self.agent_capabilities.items():
            # 覆盖率
            coverage = len(required & caps) / len(required)
            # 负载因子
            load = self._get_load(agent_id)
            # 综合评分
            score = coverage * 0.7 + (1 - load) * 0.3
            
            scores.append((agent_id, score, coverage))
        
        scores.sort(key=lambda x: x[1], reverse=True)
        
        if scores[0][2] < 0.5:  # 覆盖率不足50%
            return None  # 没有合适的Agent
        
        return scores[0][0]

负载均衡

class LoadBalancer:
    def __init__(self):
        self.agent_loads = {}  # agent_id -> current load
    
    def assign(self, task, candidates):
        """考虑负载的分配"""
        # 按负载排序
        sorted_agents = sorted(
            candidates,
            key=lambda a: self.agent_loads.get(a, 0)
        )
        
        # 选择负载最低的
        selected = sorted_agents[0]
        self.agent_loads[selected] = self.agent_loads.get(selected, 0) + 1
        
        return selected
    
    def complete(self, agent_id):
        """任务完成,减少负载"""
        self.agent_loads[agent_id] = max(0, self.agent_loads[agent_id] - 1)

冲突处理

结果冲突

当多个Agent给出不同结果时:

class ConflictResolver:
    def resolve(self, results):
        if len(results) == 1:
            return results[0]
        
        # 1. 投票
        vote_result = self._vote(results)
        if vote_result["confidence"] > 0.8:
            return vote_result["result"]
        
        # 2. 权威Agent裁决
        authority = max(results, key=lambda r: r.agent_authority)
        if authority.agent_authority > 0.9:
            return authority
        
        # 3. 升级到人工
        return self._escalate_to_human(results)
    
    def _vote(self, results):
        """多数投票"""
        votes = {}
        for r in results:
            key = hash(r.content)
            votes[key] = votes.get(key, 0) + r.agent_confidence
        
        best = max(votes.items(), key=lambda x: x[1])
        return {
            "result": best[0],
            "confidence": best[1] / sum(votes.values())
        }

实际案例:内容生产流水线

def build_content_pipeline():
    """构建多Agent内容生产流水线"""
    
    orchestrator = Orchestrator()
    
    # Agent团队
    orchestrator.register_agent("topic_analyst", TopicAnalysisAgent())
    orchestrator.register_agent("researcher", ResearchAgent())
    orchestrator.register_agent("outliner", OutlineAgent())
    orchestrator.register_agent("writer", WriterAgent())
    orchestrator.register_agent("fact_checker", FactCheckAgent())
    orchestrator.register_agent("editor", EditorAgent())
    orchestrator.register_agent("seo_optimizer", SEOAgent())
    
    # 工作流定义
    workflow = [
        {"step": "analyze_topic", "agent": "topic_analyst", "output": "topic_brief"},
        {"step": "research", "agent": "researcher", "input": "topic_brief", "output": "research_data"},
        {"step": "outline", "agent": "outliner", "input": ["topic_brief", "research_data"], "output": "outline"},
        {"step": "write_draft", "agent": "writer", "input": "outline", "output": "draft"},
        {"step": "fact_check", "agent": "fact_checker", "input": "draft", "output": "fact_report"},
        {"step": "edit", "agent": "editor", "input": ["draft", "fact_report"], "output": "final_draft"},
        {"step": "optimize", "agent": "seo_optimizer", "input": "final_draft", "output": "published_content"},
    ]
    
    orchestrator.set_workflow(workflow)
    return orchestrator

监控与可观测性

class AgentSystemMonitor:
    def __init__(self):
        self.metrics = {}
    
    def trace(self, agent_id, action):
        """追踪Agent行为"""
        trace_entry = {
            "agent_id": agent_id,
            "action": action,
            "timestamp": datetime.now(),
            "duration": None
        }
        return trace_entry
    
    def visualize(self):
        """可视化Agent协作流程"""
        return {
            "communication_graph": self._build_comm_graph(),
            "task_flow": self._build_task_flow(),
            "bottleneck_analysis": self._find_bottlenecks(),
            "agent_utilization": self._compute_utilization()
        }

结语

多Agent编排是AI系统从"助手"到"组织"的跃迁。就像人类组织中存在不同协作模式一样,AI Agent的编排也没有万能方案——中心化适合确定性流程,去中心化适合探索性任务,混合模式适合复杂业务。设计多Agent系统时,先明确任务的确定性程度、协作复杂度和容错要求,再选择合适的编排模式。记住:好的编排让1+1>2,差的编排让1+1<1。