Agent框架的核心问题
构建AI Agent需要解决三个核心问题:任务规划与分解、工具调用与执行、多Agent协作。不同的Agent框架对这些问题的回答各不相同,形成了截然不同的编程范式。
LangGraph:图驱动的精确控制
设计哲学
LangGraph将Agent工作流建模为有向图:节点是处理步骤,边是控制流。这种设计赋予了开发者对Agent行为的精确控制。
核心概念
from langgraph.graph import StateGraph, END
class AgentState(TypedDict):
messages: list
tool_results: list
next_step: str
# 定义图
graph = StateGraph(AgentState)
# 添加节点
graph.add_node("planner", plan_task)
graph.add_node("executor", execute_tools)
graph.add_node("reviewer", review_results)
# 添加边(控制流)
graph.add_edge("planner", "executor")
graph.add_conditional_edges(
"executor",
lambda state: "reviewer" if state["tool_results"] else END,
{True: "reviewer", False: END}
)
graph.add_conditional_edges(
"reviewer",
lambda state: "planner" if not state["success"] else END
)
优势
精确控制:图的拓扑结构让Agent的执行路径完全可见和可预测。这在需要审计和合规的场景中至关重要。
状态管理:LangGraph内置了检查点(checkpoint)机制,可以在任何节点暂停和恢复执行。这对于长时间运行的Agent任务非常有用。
人机协作:interrupt_before和interrupt_after参数允许在特定节点暂停,等待人类反馈:
graph.compile(
checkpointer=MemorySaver(),
interrupt_before=["executor"] # 执行前等待人类确认
)
局限
- 学习曲线陡峭,图思维需要适应
- 简单任务显得过度工程化
- 调试复杂图流程需要可视化工具辅助
AutoGen:多Agent对话的原生范式
设计哲学
AutoGen(微软研究院)将多Agent协作建模为对话。每个Agent有角色定义,通过消息传递完成协作。
核心模式
from autogen import AssistantAgent, UserProxyAgent, GroupChat
# 创建Agent
planner = AssistantAgent(
name="Planner",
system_message="你负责分析用户需求并制定执行计划",
llm_config=llm_config
)
coder = AssistantAgent(
name="Coder",
system_message="你负责根据计划编写代码",
llm_config=llm_config
)
reviewer = AssistantAgent(
name="Reviewer",
system_message="你负责审查代码质量",
llm_config=llm_config
)
user_proxy = UserProxyAgent(
name="User",
human_input_mode="NEVER",
code_execution_config={"work_dir": "workspace"}
)
# 创建群聊
group_chat = GroupChat(
agents=[user_proxy, planner, coder, reviewer],
messages=[],
max_round=15
)
manager = GroupChatManager(groupchat=group_chat, llm_config=llm_config)
user_proxy.initiate_chat(manager, message="实现一个用户注册API")
优势
对话式协作自然:多Agent之间的协作就像团队会议,每个Agent专注于自己的职责。
代码执行能力:UserProxyAgent可以自动执行代码并反馈结果,形成"写代码→运行→调试"的闭环。
灵活的对话模式:支持一对一对话、群聊、嵌套对话等多种模式。
局限
- 对话轮次控制不够精确,容易出现"对话跑偏"
- Agent之间的消息传递消耗大量token
- 缺乏全局状态管理,难以实现复杂控制流
CrewAI:角色驱动的团队协作
设计哲学
CrewAI(原Crewy)将Agent协作建模为"团队执行任务":定义角色、分配任务、遵循流程。
核心模式
from crewai import Agent, Task, Crew, Process
researcher = Agent(
role="AI研究员",
goal="收集和分析AI领域最新技术进展",
backstory="你是一位资深的AI研究员,擅长技术调研",
tools=[search_tool, web_scraper],
llm=llm
)
writer = Agent(
role="技术撰稿人",
goal="将研究结果转化为易读的技术文章",
backstory="你是一位经验丰富的技术作者",
llm=llm
)
research_task = Task(
description="调研RAG技术的最新进展",
agent=researcher,
expected_output="一份包含5个关键发现的研究报告"
)
write_task = Task(
description="基于研究报告撰写一篇技术博客",
agent=writer,
expected_output="一篇2000字的技术博客文章",
context=[research_task] # 依赖前一个任务
)
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
process=Process.sequential # 顺序执行
)
result = crew.kickoff()
优势
直观的角色模型:Agent定义包含角色、目标、背景故事,非常贴近真实团队结构。
任务依赖管理:通过context参数声明任务间的依赖关系,框架自动管理执行顺序。
工具集成简单:@tool装饰器让任何Python函数变成Agent可用的工具。
局限
- 底层基于ReAct模式,对复杂控制流支持有限
- 错误处理机制不够完善
- 社区规模和生态比LangGraph小
实战对比:同一任务三种实现
任务:“分析GitHub仓库的代码质量并生成报告”
LangGraph实现
图结构:
clone_repo → analyze_structure → analyze_quality →
check_security → generate_report → review → (pass: END / fail: regenerate)
- 控制精确,可以精确控制每个步骤
- 报告不满意时可以回到特定步骤重新执行
- 代码量最多,约150行
AutoGen实现
群聊:
CodeAnalyzer: "我来分析代码结构..."
SecurityExpert: "我发现潜在SQL注入..."
ReportWriter: "我来整合分析结果..."
User: "报告需要补充测试覆盖率分析"
- 多专家协作自然
- 可以动态调整分析方向
- 消耗token最多,约15轮对话
CrewAI实现
团队:
代码分析Agent → 任务:分析代码结构和质量
安全审计Agent → 任务:检查安全漏洞
报告撰写Agent → 任务:生成综合报告
- 定义最简洁,约50行
- 执行流程清晰
- 灵活性最低
选型决策
| 维度 | LangGraph | AutoGen | CrewAI |
|---|---|---|---|
| 控制精度 | ★★★★★ | ★★★ | ★★★ |
| 开发效率 | ★★★ | ★★★★ | ★★★★★ |
| 多Agent协作 | ★★★ | ★★★★★ | ★★★★ |
| 适合场景 | 生产级Agent | 研究探索 | 快速原型 |
| 学习曲线 | 陡峭 | 中等 | 平缓 |
| 社区活跃度 | 最高 | 高 | 中 |
具体建议
选LangGraph:需要精确控制Agent行为、有审计合规要求、长时间运行的任务。
选AutoGen:需要多专家协作、研究探索性任务、对话式交互自然。
选CrewAI:快速原型、任务流程清晰、团队规模小。
结语
Agent框架的竞争本质上是"控制力 vs 易用性"的权衡。LangGraph选择了最大控制力,CrewAI选择了最大易用性,AutoGen在中间找到了多Agent对话的独特位置。框架选型没有银弹,关键看你的应用场景更需要哪一端。