AI Agent多智能体协作已成为大模型应用开发的核心范式。单个Agent受限于上下文窗口和工具调用能力,面对复杂业务流程时难以高效完成多步骤任务。多智能体框架通过角色分工、任务拆解和消息传递机制,将复杂工作流分解为多个子Agent并行或串行执行,显著提升整体任务完成率和响应效率。本文从框架选型、工具注册、任务编排三个层面拆解多智能体协作的关键实现细节。
多智能体协作框架选型与架构对比
当前主流多智能体框架包括LangGraph、AutoGen、CrewAI和MetaGPT。LangGraph基于图结构定义Agent状态流转,支持条件分支和循环,适合需要精确控制执行流程的场景。AutoGen采用对话驱动模式,Agent之间通过消息交互完成协作,上手门槛低但流程可控性较弱。CrewAI以角色定义为核心,每个Agent绑定特定角色和工具集,通过顺序或层级模式组织任务。MetaGPT则模拟软件公司组织架构,Product Manager、Architect、Engineer各司其职,输出标准化文档。
选型时需要关注三个维度:流程可控性、工具扩展性和错误恢复能力。LangGraph在这方面表现突出,其StateGraph机制允许开发者明确定义状态节点和边,每一步的输入输出类型都可通过TypedDict约束:
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
class AgentState(TypedDict):
messages: Annotated[list, operator.add]
next_agent: str
task_output: str
def router_node(state: AgentState):
task = state["messages"][-1]
if "code" in task.lower():
return {"next_agent": "developer"}
elif "review" in task.lower():
return {"next_agent": "reviewer"}
return {"next_agent": "coordinator"}
def developer_node(state: AgentState):
code = generate_code(state["messages"])
return {"messages": [("developer", code)], "task_output": code}
graph = StateGraph(AgentState)
graph.add_node("router", router_node)
graph.add_node("developer", developer_node)
graph.add_node("reviewer", reviewer_node)
graph.add_edge("router", "developer")
graph.add_edge("router", "reviewer")
graph.add_conditional_edges("developer", route_after_dev, {"review": "reviewer", "end": END})
graph.set_entry_point("router")
app = graph.compile()
工具注册与调用机制设计
多智能体协作中,工具管理直接影响Agent的能力边界。每个Agent需要绑定专属工具集,避免工具冲突和权限越界。工具注册推荐采用装饰器模式,将函数签名、参数描述和返回值类型自动提取为OpenAI Function Calling格式:
from typing import List
from pydantic import BaseModel, Field
class ToolRegistry:
def __init__(self):
self._tools = {}
self._schemas = []
def register(self, name: str, description: str):
def decorator(func):
schema = {
"type": "function",
"function": {
"name": name,
"description": description,
"parameters": extract_params(func)
}
}
self._tools[name] = func
self._schemas.append(schema)
return func
return decorator
def get_schemas(self, agent_role: str) -> list:
allowed = ROLE_TOOLS.get(agent_role, [])
return [s for s in self._schemas if s["function"]["name"] in allowed]
def execute(self, tool_name: str, **kwargs):
return self._tools[tool_name](**kwargs)
registry = ToolRegistry()
@registry.register("search_database", "Query database with SQL")
def search_database(query: str, limit: int = 10) -> List[dict]:
return execute_sql(query, limit)
工具权限隔离通过ROLE_TOOLS映射表控制,每个角色只能访问其授权范围内的工具。Coordinator可调用task_decompose和result_merge,Researcher可调用web_search和data_query,Developer可调用code_execute和file_write。这种设计防止了Agent越权操作,也降低了工具选择时的Token消耗。
任务拆解与分发策略
复杂任务拆解遵循MECE原则,确保子任务之间无重叠、无遗漏。拆解策略分为静态拆解和动态拆解两种。静态拆解在任务开始前由Coordinator Agent一次性规划全部分支,适合流程固定的场景。动态拆解让Coordinator根据中间结果实时调整后续分支,适合探索性任务。
动态拆解的关键是维护全局任务状态树,每个子任务标记为pending、running、completed或failed。Coordinator在每次决策时读取状态树,选择下一个可执行的子任务分配给对应Agent:
class TaskTree:
def __init__(self, root_task: str):
self.root = TaskNode(task=root_task, status="pending")
self.lock = asyncio.Lock()
async def decompose(self, parent_id: str, subtasks: list):
async with self.lock:
parent = self.find_node(parent_id)
for t in subtasks:
parent.children.append(TaskNode(task=t, status="pending"))
async def get_next_runnable(self):
async with self.lock:
for node in self.traverse(self.root):
if node.status == "pending":
deps_ok = all(c.status == "completed" for c in node.children)
if deps_ok:
return node
return None
async def coordinator_loop(tree: TaskTree, agents: dict):
while True:
task = await tree.get_next_runnable()
if task is None:
if tree.root.status == "completed":
break
await asyncio.sleep(1)
continue
task.status = "running"
agent = select_agent(task, agents)
result = await agent.execute(task)
task.status = "completed" if result.success else "failed"
task.output = result.data
消息传递与上下文隔离
Agent间通信有两种模式:共享黑板和直接消息。共享黑板模式下,所有Agent读写同一个状态空间,实现简单但存在并发冲突风险。直接消息模式下,Agent之间通过结构化消息传递中间结果,每个Agent维护独立上下文窗口,避免信息过载。
推荐采用混合策略:任务状态和全局参数放在共享黑板,中间计算结果通过消息传递。消息格式统一为JSON,包含sender、receiver、content、timestamp和priority字段。高优先级消息(如错误通知)插入队列头部,确保及时处理。
错误恢复与重试机制
多Agent协作中的错误传播是隐蔽的,一个Agent的输出偏差可能导致下游Agent连锁失败。需要在每个Agent执行后增加校验节点,验证输出格式和内容完整性。校验失败时触发重试,重试次数上限为3次,超过则标记任务失败并通知Coordinator重新规划。
async def execute_with_retry(agent, task, max_retries=3):
for attempt in range(max_retries):
try:
result = await agent.execute(task)
validation = validate_output(result, task.expected_format)
if validation.passed:
return result
if attempt < max_retries - 1:
feedback = f"Output validation failed: {validation.reason}"
task.context.append({"role": "user", "content": feedback})
except Exception as e:
if attempt == max_retries - 1:
raise AgentExecutionError(f"{agent.name} failed: {e}")
await asyncio.sleep(2 ** attempt)
raise AgentExecutionError(f"{agent.name} exhausted retries")
多智能体协作框架的搭建需要围绕流程可控、工具隔离和错误恢复三个核心目标展开。LangGraph提供了图结构的状态管理能力,配合工具注册表和任务状态树,可以构建出稳定可控的Agent协作系统。实际部署中建议从两个Agent的简单协作开始,逐步增加角色和工具,验证每个环节的可靠性后再扩展到更复杂的多Agent拓扑。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/aiagent-duo-zhi-neng-ti-xie-zuo-kuang-jia-gong-ju-diao-yong/