1. 多Agent协作系统概述
在人工智能领域,多Agent协作系统正成为解决复杂任务的有效范式。这种架构通过将不同功能的智能体(Agent)组织起来,让每个智能体专注于自己最擅长的子任务,最终协同完成整体目标。就像一支专业分工明确的团队,每个成员各司其职又相互配合。
1.1 核心概念解析
多Agent系统的核心在于"分工"与"协作"。每个Agent都具备特定的能力:
- 专业化:每个Agent只处理特定类型的任务(如数据查询、计算、图像识别等)
- 自治性:Agent能独立完成分配的任务并返回结果
- 协同性:通过消息传递和工作流协调实现任务接力
在我们的案例中,系统包含四个关键角色:
- 研究员(Researcher):负责数据查询
- 程序员(Coder):负责数值计算
- 项目经理(Supervisor):负责任务分配
- 总结者(Finish):负责结果汇总
1.2 典型应用场景
这种架构特别适合需要多步骤处理的复杂任务:
- 金融分析:查询数据→计算指标→生成报告
- 内容生产:素材收集→内容生成→排版优化
- 智能客服:问题分类→专业解答→满意度评估
提示:设计多Agent系统时,关键是要明确每个Agent的职责边界和交互协议,避免功能重叠或责任真空。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统实现详解
2.1 基础工具定义
系统首先需要定义各Agent使用的工具。工具是Agent能力的延伸,相当于给Agent配备的专业设备。
python复制@tool
def web_search(query: str):
"""用于查找最新的股票数据、公司财报信息。"""
results = []
if "阿里" in query: results.append("阿里巴巴(BABA) PE: 15.5")
if "腾讯" in query: results.append("腾讯控股(0700) PE: 18.2")
if "百度" in query: results.append("百度(BIDU) PE: 11.8")
if not results:
return "未找到数据"
return " ; ".join(results)
@tool
def python_calculator(code: str):
"""用于计算。输入必须是 python 代码。"""
try:
result = eval(code)
return f"计算结果: {result}"
except Exception as e:
return f"计算错误: {e}"
工具设计要点:
- 使用
@tool装饰器明确标识这是工具函数 - 文档字符串(Docstring)要详细说明功能和使用方法
- 输入输出要定义明确的格式规范
- 错误处理要完善,避免整个系统因单个工具失败而崩溃
2.2 Agent节点实现
每个Agent节点都需要定义其行为逻辑。我们使用统一的create_agent工厂函数来创建Agent实例。
python复制def create_agent(state: dict, llm, tools, system_prompt):
llm_tools = llm.bind_tools(tools)
prompt = [SystemMessage(content=system_prompt)] + state["messages"]
response = llm_tools.invoke(prompt)
results = [response]
for tool_call in response.tool_calls:
func_name = tool_call["name"]
args = tool_call["args"]
call_id = tool_call["id"]
func = next((t for t in tools if t.name == func_name), None)
if func:
tool_output = func.invoke(args)
tool_msg = ToolMessage(
content=str(tool_output),
name=func_name,
tool_call_id=call_id
)
results.append(tool_msg)
return {"messages": results}
关键参数说明:
state:包含当前对话历史和任务状态llm:底层的大语言模型实例tools:该Agent可使用的工具列表system_prompt:定义Agent角色和行为的提示词
2.3 工作流编排
系统的核心是使用StateGraph来定义各Agent之间的协作流程:
python复制def init_agent():
workflow = StateGraph(State)
# 添加节点
workflow.add_node("Researcher", researcher_node)
workflow.add_node("Coder", coder_node)
workflow.add_node("Supervisor", supervisor_node)
workflow.add_node("Finish", finish_node)
# 定义边
workflow.add_edge("Researcher", "Supervisor")
workflow.add_edge("Coder", "Supervisor")
workflow.add_edge("Finish", END)
# 条件边
workflow.add_conditional_edges(
"Supervisor",
lambda state: state["next"],
{
"Researcher": "Researcher",
"Coder": "Coder",
"FINISH": "Finish",
}
)
workflow.set_entry_point("Supervisor")
return workflow.compile()
工作流设计原则:
- 明确入口:
set_entry_point定义流程起点 - 顺序路径:
add_edge定义固定流转方向 - 条件分支:
add_conditional_edges实现动态路由 - 终止条件:
END表示流程正常结束
3. 核心组件深入解析
3.1 状态管理机制
系统使用State类来维护任务执行过程中的状态信息:
python复制class State(TypedDict):
messages: Annotated[List[BaseMessage], operator.add]
next: str
状态字段说明:
messages:累积的对话消息历史next:指示下一步应该执行哪个节点
状态对象会在整个工作流中传递,各节点可以读取和修改状态内容,但要注意保持状态的简洁和明确。
3.2 路由决策实现
Supervisor节点的核心职责是根据当前状态决定任务流向:
python复制def supervisor_node(state):
system_prompt = (
"你是项目经理。根据对话历史决定下一步交给谁。"
"查数据找 Researcher,计算找 Coder,识别图片找 Photographer。"
"如果任务完成,必须选择 FINISH。"
)
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
MessagesPlaceholder(variable_name="messages"),
("system", "根据以上情况,请做出选择。"),
])
class RouteResponse(BaseModel):
next: Literal["Researcher", "Coder", "FINISH"] = Field(
...,
description="下一步交给谁?如果任务完成请选 FINISH"
)
chain = prompt | llm.with_structured_output(RouteResponse)
response = chain.invoke(state)
return {"next": response.next}
关键技术点:
- 使用
with_structured_output确保LLM输出符合预定格式 Literal类型限定只能选择预定义的选项Field的描述文本会直接影响LLM的决策质量
3.3 消息类型系统
系统使用标准化的消息类型来保证Agent间通信的规范性:
| 消息类型 | 用途 | 关键字段 |
|---|---|---|
HumanMessage |
用户输入 | content |
SystemMessage |
系统指令 | content |
ToolMessage |
工具调用结果 | content, name, tool_call_id |
这种强类型的消息系统避免了通信过程中的歧义,也方便进行消息追踪和调试。
4. 实战案例演示
4.1 任务执行流程
让我们通过具体案例观察系统如何运作。用户输入请求:
code复制"查一下阿里、腾讯、百度的PE,并计算平均值。"
系统执行过程如下:
-
初始路由:
- 请求首先到达Supervisor
- 判断需要先获取数据,路由到Researcher
-
数据查询阶段:
python复制[Researcher] 回复: 阿里巴巴(BABA) PE: 15.5 ; 腾讯控股(0700) PE: 18.2 ; 百度(BIDU) PE: 11.8 -
二次路由:
- 数据返回后再次经过Supervisor
- 判断需要进行计算,路由到Coder
-
计算阶段:
python复制[Coder] 回复: 计算结果: 15.166666666666666 -
最终汇总:
python复制[Finish] 回复: 阿里、腾讯、百度的平均PE为15.17
4.2 执行过程可视化
通过打印日志可以清晰看到任务流转:
code复制[Supervisor] 去向: Researcher
[Researcher] 回复: 阿里巴巴(BABA) PE: 15.5 ; 腾讯控股(0700) PE: 18.2 ; 百度(BIDU) PE: 11.8
[Supervisor] 去向: Coder
[Coder] 回复: 计算结果: 15.166666666666666
[Supervisor] 去向: FINISH
[Finish] 回复: 阿里、腾讯、百度的平均PE为15.17
5. 开发经验与优化建议
5.1 常见问题排查
在实际开发中可能会遇到以下典型问题:
问题1:Agent陷入循环
- 现象:任务在不同Agent间来回传递无法终止
- 原因:Supervisor的路由逻辑存在缺陷
- 解决:加强终止条件判断,确保每个步骤都有明确的完成标准
问题2:工具调用失败
- 现象:Agent无法正确使用工具
- 原因:工具描述不清晰或参数格式不符
- 解决:完善工具文档字符串,添加参数校验
问题3:状态污染
- 现象:历史消息堆积导致后续处理出错
- 原因:未及时清理过期的状态信息
- 解决:实现状态压缩机制,只保留必要上下文
5.2 性能优化技巧
- 工具缓存:对耗时工具(如网络请求)实现结果缓存
- 异步处理:对独立任务使用异步执行提高吞吐量
- 消息精简:定期清理消息历史避免内存膨胀
- 超时控制:为每个工具调用设置合理的超时时间
5.3 扩展性设计
要使系统支持更多业务场景,可以考虑以下扩展方向:
- 动态Agent注册:允许运行时添加新的Agent节点
- 技能市场:建立可插拔的工具库,Agent按需加载
- 监控看板:实时可视化工作流执行状态
- 异常熔断:当错误率达到阈值时自动降级处理
6. 进阶应用场景
6.1 复杂任务编排
对于更复杂的业务场景,可以构建多层级的Agent系统:
code复制+------------------+
| 总控Agent |
+--------+---------+
|
v
+------------------+
| 领域专家Agent |
| (金融、医疗等) |
+--------+---------+
|
v
+------------------+
| 工具执行Agent |
+------------------+
这种架构可以实现:
- 顶层负责目标分解和结果整合
- 中层提供领域专业知识
- 底层执行具体操作
6.2 人机协作模式
将人类专家纳入协作系统:
- 人工审核节点:关键决策点引入人工确认
- 混合执行:部分子任务由人类完成
- 持续学习:记录人类操作作为训练数据
6.3 分布式部署方案
对于大规模应用,可以采用分布式架构:
- 每个Agent作为独立微服务
- 通过消息队列进行通信
- 使用服务发现机制动态定位Agent
这种架构的优势包括水平扩展能力和故障隔离性。
