从单 Agent 到多 Agent 系统——CrewAI、AutoGen、LangGraph 多 Agent 编排,以及生产环境的工作流最佳实践
每个 Agent 专注于自己擅长的领域,提高专业度
独立子任务可以同时执行,减少总耗时
单个 Agent 失败不影响其他 Agent 工作
按需增加新的专业 Agent,不影响现有系统
| 模式 | 结构 | 特点 | 适用场景 |
|---|---|---|---|
| Supervisor 主管调度 |
1个主管 + N个工人 | 中心化决策,全局视野 | 任务分配明确的场景 |
| Sequential 顺序流水线 |
A → B → C → D | 每个 Agent 改进前一个的输出 | 内容创作、代码审查 |
| Hierarchical 层级树 |
多层级 Agent 树 | 上层规划+下层执行 | 大型项目管理 |
| Debate 辩论 |
多 Agent 对等讨论 | 多视角验证,提升正确率 | 决策分析、推理验证 |
| Swarm 群体智能 |
动态 Agent 切换 | 按上下文自动路由 | 客服、多领域问答 |
CrewAI 是专为多 Agent 协作设计的框架,核心概念是用"团队"隐喻来组织 Agent:Agent(角色)、Task(任务)、Crew(团队)。
from crewai import Agent, Task, Crew, Process
# 定义 Agent(角色)
researcher = Agent(
role="资深研究员",
goal="深入调研给定主题,收集权威信息",
backstory="你拥有 20 年研究经验,擅长从海量信息中提取关键洞见。",
tools=[search_tool, wiki_tool],
verbose=True
)
writer = Agent(
role="技术写作专家",
goal="将研究成果转化为清晰易懂的技术文章",
backstory="你曾为 Google、Meta 撰写技术博客,文风简洁有力。",
verbose=True
)
editor = Agent(
role="主编",
goal="确保文章质量、准确性和可读性",
backstory="你是顶级科技媒体的主编,对内容质量有极高标准。",
verbose=True
)
# 定义 Task(任务)
research_task = Task(
description="调研 {topic},收集关键信息、数据和最新进展",
agent=researcher,
expected_output="包含关键发现的详细研究报告"
)
write_task = Task(
description="基于研究报告撰写一篇技术文章",
agent=writer,
expected_output="2000 字的技术文章",
context=[research_task] # 依赖研究任务的输出
)
edit_task = Task(
description="审查和润色文章",
agent=editor,
expected_output="润色后的最终版文章",
context=[write_task]
)
# 组建 Crew(团队)
crew = Crew(
agents=[researcher, writer, editor],
tasks=[research_task, write_task, edit_task],
process=Process.sequential, # 顺序执行
verbose=True
)
# 启动执行
result = crew.kickoff(inputs={"topic": "2026年AI Agent发展趋势"})
AutoGen 是微软研究院推出的多 Agent 对话框架,核心理念是基于对话的 Agent 协作——Agent 之间通过消息传递来协调工作。
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMentionTermination
# 创建 Agent
coder = AssistantAgent(
name="Coder",
model_client=model_client,
system_message="你是 Python 专家,负责编写代码。"
)
reviewer = AssistantAgent(
name="Reviewer",
model_client=model_client,
system_message="你是代码审查专家,检查代码质量和安全性。当代码合格时回复 APPROVE。"
)
# 组建团队
termination = TextMentionTermination("APPROVE")
team = RoundRobinGroupChat(
[coder, reviewer],
termination_condition=termination
)
# 运行
result = await team.run(
task="编写一个 Python 快速排序函数"
)
| 维度 | CrewAI | AutoGen |
|---|---|---|
| 设计哲学 | 角色驱动(Role-based) | 对话驱动(Conversation-based) |
| 编排方式 | Task → Agent 映射 | Agent 间消息传递 |
| 上手难度 | 简单直观 | 中等(灵活但配置多) |
| 代码执行 | 通过 Tool | 内置安全沙箱 |
| 适合场景 | 流程化任务 | 开放式对话协作 |
| 社区生态 | 快速增长 | 微软支持,学术背景强 |
LangGraph 是构建多 Agent 系统最灵活的选择——它不预设协作模式,而是让你用图结构自由定义 Agent 之间的通信和控制流。
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import create_react_agent
from typing import TypedDict, Literal
class TeamState(TypedDict):
messages: list
next_agent: str
results: dict
# 创建专业 Agent
search_agent = create_react_agent(llm, [tavily_tool])
code_agent = create_react_agent(llm, [python_repl])
write_agent = create_react_agent(llm, [])
# Supervisor 节点
async def supervisor(state: TeamState):
response = await llm.ainvoke(
f"""你是项目主管。根据对话决定下一步:
选项: search_agent, code_agent, write_agent, FINISH
当前消息: {state['messages'][-1]}
返回 JSON: {{"next": "..."}}"""
)
return {"next_agent": parse_json(response)["next"]}
# 路由函数
def route(state: TeamState) -> Literal[
"search_agent", "code_agent", "write_agent", "__end__"
]:
if state["next_agent"] == "FINISH":
return "__end__"
return state["next_agent"]
# 构建图
graph = StateGraph(TeamState)
graph.add_node("supervisor", supervisor)
graph.add_node("search_agent", search_node)
graph.add_node("code_agent", code_node)
graph.add_node("write_agent", write_node)
graph.add_edge(START, "supervisor")
graph.add_conditional_edges("supervisor", route)
# 所有 Agent 完成后都回到 Supervisor
for agent in ["search_agent", "code_agent", "write_agent"]:
graph.add_edge(agent, "supervisor")
app = graph.compile()
Agent 和 Workflow 是构建 LLM 应用的两种互补方式:
| 维度 | Workflow(编排) | Agent(自主) |
|---|---|---|
| 控制方式 | 预定义路径,代码控制流程 | LLM 自主决策路径 |
| 可预测性 | 高——路径确定 | 低——路径动态 |
| 灵活性 | 低——需改代码适应新场景 | 高——自动适应新需求 |
| 调试难度 | 容易 | 困难 |
| 适合场景 | 流程固定、可靠性要求高 | 任务开放、需要创造性 |
多个 LLM 调用串联,前一个输出作为后一个输入
根据输入类型路由到不同处理路径
多个子任务并行执行后聚合结果
编排者分配任务,工人执行后汇总
一个 LLM 生成,另一个评估和循环改进
关键决策点暂停等待人工审批
| 挑战 | 解决方案 | 工具 |
|---|---|---|
| 调试困难 | 全链路追踪、可视化执行图 | LangSmith, Arize Phoenix |
| 成本爆炸 | Token 预算、模型分级使用 | 小模型做简单任务 |
| 死循环 | 最大迭代次数、超时机制 | max_iterations, timeout |
| 输出矛盾 | 最终仲裁 Agent 或投票机制 | Supervisor 模式 |
| 高延迟 | 并行化、缓存、流式输出 | LangGraph 并行节点 |
max_iterations(建议 10-20)和timeout(建议 60-120秒),防止 Agent 无限循环导致成本失控。构建一个自动化内容生产系统:输入一个主题,输出一篇高质量的技术博客文章。