CrewAI与AutoGen
概述
CrewAI和AutoGen是两个专注于多智能体协作的框架。CrewAI采用角色扮演范式,而AutoGen采用可对话智能体范式。两者各有优势,适用于不同场景。
CrewAI
核心理念
CrewAI的设计灵感来自现实世界的团队协作——每个智能体扮演特定角色,共同完成任务。
graph TD
subgraph CrewAI
A[Crew 团队] --> B[Agent 1<br/>Researcher 研究员]
A --> C[Agent 2<br/>Writer 撰稿人]
A --> D[Agent 3<br/>Reviewer 审核员]
B --> E[Task 1<br/>研究主题]
C --> F[Task 2<br/>撰写文章]
D --> G[Task 3<br/>审核质量]
E --> F
F --> G
end
B --> B1[Tools: 搜索/RAG]
C --> C1[Tools: 写作辅助]
D --> D1[Tools: 质量检查]
Agent定义
from crewai import Agent, Task, Crew, Process
# 定义智能体角色
researcher = Agent(
role="Senior Research Analyst",
goal="Discover and analyze the latest trends in AI",
backstory="""You are a senior research analyst at a leading
tech think tank. You have a knack for identifying emerging
trends and extracting actionable insights from data.""",
tools=[search_tool, scrape_tool],
llm="gpt-4o",
verbose=True,
allow_delegation=True, # 允许委派任务给其他Agent
)
writer = Agent(
role="Technical Content Writer",
goal="Create compelling and accurate technical content",
backstory="""You are a skilled technical writer known for
making complex topics accessible. You excel at transforming
research into engaging articles.""",
tools=[],
llm="gpt-4o",
verbose=True,
)
reviewer = Agent(
role="Quality Assurance Editor",
goal="Ensure content accuracy and quality",
backstory="""You are a meticulous editor with expertise in
technical content. You ensure factual accuracy, readability,
and adherence to style guidelines.""",
tools=[fact_check_tool],
llm="gpt-4o",
verbose=True,
)
Task定义
# 定义任务
research_task = Task(
description="""Research the latest developments in AI agents.
Focus on:
1. New frameworks and tools
2. Research breakthroughs
3. Industry adoption trends
Provide a comprehensive research report with sources.""",
expected_output="A detailed research report with key findings and sources",
agent=researcher,
)
writing_task = Task(
description="""Based on the research report, write a 1500-word
article about AI agents. The article should be:
- Engaging and accessible
- Technically accurate
- Well-structured with clear sections""",
expected_output="A polished 1500-word article in markdown format",
agent=writer,
context=[research_task], # 依赖research_task的输出
)
review_task = Task(
description="""Review the article for:
1. Factual accuracy
2. Readability and flow
3. Technical depth
4. Grammar and style
Provide specific feedback and a final revised version.""",
expected_output="Reviewed and revised article with feedback notes",
agent=reviewer,
context=[writing_task],
)
Process类型
# 顺序执行
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[research_task, writing_task, review_task],
process=Process.sequential, # 按顺序执行
verbose=True,
)
# 层级执行(需要Manager Agent)
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[research_task, writing_task, review_task],
process=Process.hierarchical, # Manager分配任务
manager_llm="gpt-4o",
verbose=True,
)
# 运行
result = crew.kickoff()
print(result)
CrewAI工具
from crewai_tools import (
SerperDevTool, # 搜索引擎
ScrapeWebsiteTool, # 网页抓取
FileReadTool, # 文件读取
PDFSearchTool, # PDF搜索
CodeInterpreterTool, # 代码执行
)
# 自定义工具
from crewai.tools import tool
@tool("Database Query")
def query_database(sql: str) -> str:
"""Execute a SQL query against the analytics database.
Use this to get data for analysis."""
return db.execute(sql)
高级特性
记忆系统
crew = Crew(
agents=[...],
tasks=[...],
memory=True, # 启用记忆
embedder={
"provider": "openai",
"config": {"model": "text-embedding-3-small"}
}
)
# 支持短期记忆(当前任务)、长期记忆(跨任务)、实体记忆(实体知识)
委派机制
researcher = Agent(
role="Lead Researcher",
allow_delegation=True, # 可以将子任务委派给其他Agent
# 例如:researcher可以要求writer帮忙整理格式
)
AutoGen
核心理念
AutoGen(微软)基于可对话智能体(Conversable Agent)范式,智能体通过对话来协作。
graph TD
subgraph AutoGen
A[UserProxy<br/>用户代理] <-->|对话| B[Assistant<br/>AI助手]
B <-->|对话| C[Coder<br/>代码员]
A <-->|对话| C
D[GroupChat Manager<br/>群聊管理器]
D --> A
D --> B
D --> C
end
ConversableAgent
import autogen
# 配置LLM
config_list = [
{"model": "gpt-4o", "api_key": "..."}
]
llm_config = {"config_list": config_list, "temperature": 0}
# AI助手
assistant = autogen.AssistantAgent(
name="assistant",
system_message="""You are a helpful AI assistant.
Solve tasks using your coding and language skills.
When you need to execute code, write it in python code blocks.""",
llm_config=llm_config,
)
# 用户代理(可执行代码)
user_proxy = autogen.UserProxyAgent(
name="user_proxy",
human_input_mode="NEVER", # NEVER / TERMINATE / ALWAYS
max_consecutive_auto_reply=10,
is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
code_execution_config={
"work_dir": "coding",
"use_docker": False,
},
)
# 启动对话
user_proxy.initiate_chat(
assistant,
message="Write a Python script to analyze the top 10 most popular programming languages."
)
GroupChat
# 多智能体群聊
coder = autogen.AssistantAgent(
name="Coder",
system_message="You are a Python expert. Write clean, efficient code.",
llm_config=llm_config,
)
reviewer = autogen.AssistantAgent(
name="Reviewer",
system_message="""You review code for bugs, efficiency, and best practices.
Be specific in your feedback.""",
llm_config=llm_config,
)
tester = autogen.AssistantAgent(
name="Tester",
system_message="You write comprehensive test cases for the given code.",
llm_config=llm_config,
)
# 创建群聊
groupchat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer, tester],
messages=[],
max_round=12,
speaker_selection_method="auto", # auto / round_robin / random
)
# 群聊管理器
manager = autogen.GroupChatManager(
groupchat=groupchat,
llm_config=llm_config,
)
# 启动群聊
user_proxy.initiate_chat(
manager,
message="Create a REST API for a todo list application with proper error handling."
)
代码执行
AutoGen的一个核心能力是安全地执行代码:
user_proxy = autogen.UserProxyAgent(
name="executor",
code_execution_config={
"work_dir": "workspace",
"use_docker": True, # 使用Docker隔离
"timeout": 60, # 超时秒数
"last_n_messages": 3, # 从最近N条消息中提取代码
},
)
# 工作流程:
# 1. Assistant生成代码
# 2. UserProxy在Docker中执行
# 3. 执行结果反馈给Assistant
# 4. Assistant根据结果修改或继续
自定义Speaker选择
def custom_speaker_selection(last_speaker, groupchat):
"""自定义发言顺序"""
messages = groupchat.messages
if last_speaker.name == "Coder":
return reviewer # Coder之后是Reviewer
elif last_speaker.name == "Reviewer":
if "LGTM" in messages[-1]["content"]:
return tester # 审核通过后进入测试
else:
return coder # 审核未通过,回到Coder
elif last_speaker.name == "Tester":
if "all tests passed" in messages[-1]["content"].lower():
return user_proxy # 测试通过,结束
else:
return coder # 测试失败,回到Coder
return coder # 默认
groupchat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer, tester],
messages=[],
speaker_selection_method=custom_speaker_selection,
)
AutoGen的高级模式
嵌套对话
# Agent A 在处理过程中启动与Agent B的子对话
assistant.register_nested_chats(
[
{
"recipient": expert_agent,
"message": "I need expert advice on: {question}",
"max_turns": 3,
}
],
trigger=lambda sender: needs_expert_help(sender.last_message()),
)
可教学Agent
from autogen.agentchat.contrib.teachable_agent import TeachableAgent
teachable = TeachableAgent(
name="teachable_agent",
llm_config=llm_config,
teach_config={
"reset_db": False, # 保留之前学到的知识
"path_to_db_dir": "./teach_db",
},
)
# 用户可以教Agent新知识,Agent会记住并在未来使用
CrewAI vs AutoGen 对比
| 维度 | CrewAI | AutoGen |
|---|---|---|
| 范式 | 角色扮演+任务驱动 | 对话驱动 |
| 定义方式 | Agent + Task + Crew | Agent + Chat |
| 流程控制 | 顺序/层级 | 自由对话/自定义 |
| 代码执行 | 通过工具 | 原生Docker隔离 |
| 记忆 | 内置多层记忆 | 通过扩展 |
| 学习曲线 | 平缓 | 中等 |
| 灵活性 | 中等 | 高 |
| 适合场景 | 明确角色分工的工作流 | 探索性/研究性任务 |
| 社区 | 快速增长 | 稳定 |
| 维护方 | CrewAI Inc. | Microsoft Research |
何时选择CrewAI
- 角色和任务明确定义
- 需要可预测的工作流程
- 团队协作类比直观
- 快速原型开发
# CrewAI适合:角色明确的生产流水线
# 例如:内容创作团队
crew = Crew(
agents=[researcher, writer, editor, seo_specialist],
tasks=[research, draft, edit, optimize],
process=Process.sequential
)
何时选择AutoGen
- 需要灵活的对话交互
- 涉及代码生成和执行
- 探索性/研究性任务
- 需要人在回路中
# AutoGen适合:探索性的编程任务
# 例如:数据分析对话
user_proxy.initiate_chat(
analyst,
message="Explore this dataset and find interesting patterns"
)
# analyst可以自由地写代码、执行、观察结果、再调整
实际案例对比
案例:市场分析报告
CrewAI实现:
# 明确的角色和任务链
analyst = Agent(role="Market Analyst", ...)
researcher = Agent(role="Data Researcher", ...)
writer = Agent(role="Report Writer", ...)
crew = Crew(
agents=[analyst, researcher, writer],
tasks=[
Task(description="Identify key market trends", agent=analyst),
Task(description="Gather supporting data", agent=researcher),
Task(description="Write the final report", agent=writer),
],
process=Process.sequential
)
AutoGen实现:
# 自由的对话协作
analyst = AssistantAgent(name="analyst", ...)
data_agent = AssistantAgent(name="data_agent", ...)
writer = AssistantAgent(name="writer", ...)
groupchat = GroupChat(
agents=[user_proxy, analyst, data_agent, writer],
max_round=20,
speaker_selection_method="auto"
)
# 智能体自由讨论,动态决定下一步
总结
| 需要 | 选择 | 原因 |
|---|---|---|
| 结构化的团队工作流 | CrewAI | 角色和任务定义清晰 |
| 灵活的多智能体对话 | AutoGen | 对话范式更灵活 |
| 快速原型 | CrewAI | API更简洁 |
| 代码生成+执行 | AutoGen | Docker隔离的代码执行 |
| 可教学智能体 | AutoGen | 内置Teachable Agent |
| 生产部署 | CrewAI | 更可预测的行为 |
两个框架都在快速发展中,建议根据具体需求选择,并关注各自社区的最新动态。