CrewAI 实战:多 Agent 协作与层级管理
学习路径 : Day 4-5 | 难度 : ⭐⭐⭐ | 前置知识 : 自定义工具
🎯 两种协作模式对比
CrewAI 提供两种团队工作模式:
模式 1: 顺序协作(Sequential)
适用场景: 流水线作业、明确分工
研究员 → 作家 → 编辑
↓ ↓ ↓
研究报告 → 文章初稿 → 最终文章
模式 2: 层级管理(Hierarchical)
适用场景: 项目管理、灵活分工
项目经理
↙ ↓ ↘
开发 测试 文档
↓ ↓ ↓
代码 测试 手册
📝 顺序协作:内容创作工作室
场景设定
我们要创建一个内容创作团队:
- 📊 研究员: 搜集资料
- ✍️ 作家: 撰写文章
- ✏️ 编辑: 审核优化
完整代码
python
from crewai import Agent, Task, Crew, Process
llm = "deepseek/deepseek-chat"
# 1. 创建 Agent 团队
researcher = Agent(
role='首席研究员',
goal='搜集和整理主题相关的全面信息',
backstory='你是资深研究员,擅长从多个角度深入分析主题。',
verbose=True,
allow_delegation=False,
llm=llm,
)
writer = Agent(
role='资深技术作家',
goal='将研究内容转化为高质量文章',
backstory='你有 10 年技术写作经验,文风幽默风趣。',
verbose=True,
allow_delegation=True,
llm=llm,
)
editor = Agent(
role='主编',
goal='审核和优化文章质量',
backstory='你是杂志社主编,有 20 年编辑经验。',
verbose=True,
allow_delegation=True,
llm=llm,
)
# 2. 创建任务链
research_task = Task(
description="""
研究主题:{topic}
请搜集:
1. 核心概念和定义
2. 技术原理和特点
3. 应用场景和案例
4. 发展趋势和挑战
""",
expected_output="结构化的研究报告(1000字)",
agent=researcher,
)
writing_task = Task(
description="""
根据研究报告,撰写一篇技术文章。
要求:
1. 标题吸引人
2. 引言抓住读者
3. 正文结构清晰
4. 使用类比和例子
5. 1500-2000字
""",
expected_output="完整的技术文章",
agent=writer,
)
editing_task = Task(
description="""
审核文章,进行编辑优化。
请:
1. 检查逻辑是否清晰
2. 优化表达是否准确
3. 删除冗余内容
4. 增强可读性
""",
expected_output="经过编辑优化的最终文章",
agent=editor,
)
# 3. 创建 Crew(顺序模式)
crew = Crew(
agents=[researcher, writer, editor],
tasks=[research_task, writing_task, editing_task],
verbose=True,
process=Process.sequential, # ← 顺序执行
)
# 4. 执行
result = crew.kickoff(inputs={"topic": "AI 大模型的工作原理"})
print(result)
执行流程
步骤 1: 研究员工作
输入: topic = "AI 大模型的工作原理"
输出: 1000字研究报告
步骤 2: 作家工作(自动获取研究报告)
输入: 研究报告
输出: 1500字文章初稿
步骤 3: 编辑工作(自动获取文章初稿)
输入: 文章初稿
输出: 优化后的最终文章
👔 层级管理:项目管理团队
场景设定
我们要创建一个软件开发团队,由项目经理协调:
- 👨💼 项目经理: 任务分配和协调
- 👨💻 开发工程师: 编写代码
- 🧪 测试工程师: 测试代码
- 📝 文档工程师: 编写文档
完整代码
python
from crewai import Agent, Task, Crew, Process
llm = "deepseek/deepseek-chat"
# 1. 创建 Agent
# 经理(可以委派任务)
manager = Agent(
role='项目经理',
goal='协调团队完成项目,分配任务并审核质量',
backstory='你是资深项目经理,有 15 年管理经验。',
verbose=True,
allow_delegation=True, # ← 关键!可以委派
llm=llm,
)
# 员工(不能委派,只执行)
developer = Agent(
role='高级开发工程师',
goal='编写高质量代码',
backstory='你是全栈工程师,精通 Python/JavaScript。',
verbose=True,
allow_delegation=False, # ← 不能委派
llm=llm,
)
tester = Agent(
role='测试工程师',
goal='发现并报告软件缺陷',
backstory='你擅长设计测试用例和自动化测试。',
verbose=True,
allow_delegation=False,
llm=llm,
)
writer = Agent(
role='技术文档工程师',
goal='编写清晰的技术文档',
backstory='你擅长编写 API 文档和用户手册。',
verbose=True,
allow_delegation=False,
llm=llm,
)
# 2. 创建总体任务(给经理)
project_task = Task(
description="""
完成一个 Python 项目的开发:
项目名称:{project_name}
功能描述:{description}
需要完成:
1. 核心功能开发
2. 单元测试
3. 文档编写
""",
expected_output="完整的项目交付物(代码 + 测试 + 文档)",
agent=manager, # ← 经理负责
)
# 3. 创建 Crew(层级模式)
crew = Crew(
agents=[developer, tester, writer], # ← 只包含员工!
tasks=[project_task],
verbose=True,
process=Process.hierarchical, # ← 层级模式
manager_agent=manager, # ← 单独指定经理
)
# 4. 执行
result = crew.kickoff(inputs={
"project_name": "计算器应用",
"description": "实现加减乘除四则运算"
})
print(result)
⚠️ 重要注意事项
经理不能放在 agents 列表中!
python
# ❌ 错误
crew = Crew(
agents=[manager, developer, tester, writer], # 经理在这里
manager_agent=manager, # 又指定经理
)
# ✅ 正确
crew = Crew(
agents=[developer, tester, writer], # 只有员工
manager_agent=manager, # 经理单独指定
)
执行流程
步骤 1: 经理收到任务
"完成计算器应用开发"
步骤 2: 经理分解任务
- 需要写代码 → 委派给 developer
- 需要测试 → 委派给 tester
- 需要文档 → 委派给 writer
步骤 3: 经理依次委派
经理 → developer: "实现加减乘除功能"
developer 完成 → 返回代码给经理
经理审核 → ✅ 通过
经理 → tester: "测试这些代码"
tester 完成 → 返回测试结果
经理审核 → ✅ 通过
经理 → writer: "编写用户手册"
writer 完成 → 返回文档
经理审核 → ✅ 通过
步骤 4: 经理整合所有结果
输出: 完整项目交付物
🆚 两种模式对比
| 特性 | Sequential | Hierarchical |
|---|---|---|
| 任务数量 | 多个 Task | 通常 1 个总体 Task |
| 任务分配 | 代码中指定 | Manager 自主决定 |
| 执行顺序 | 固定顺序 | Manager 决定 |
| 灵活性 | 低 | 高 |
| 适用场景 | 流水线工作 | 项目管理 |
💡 实战技巧
1. 任务间传递数据
使用 context 参数:
python
task1 = Task(
description="研究 Python",
agent=researcher,
)
task2 = Task(
description="基于 Python 研究,继续研究 JavaScript",
agent=researcher,
context=[task1], # ← 传递 task1 的输出
)
2. 使用参数模板
python
task = Task(
description="""
分析 {industry} 行业
重点关注:
1. 市场规模
2. 竞争格局
3. 发展趋势
""",
agent=analyst,
)
# 传入参数
crew.kickoff(inputs={"industry": "AI"})
3. 选择合适的模式
用 Sequential 当:
- ✅ 工作流程固定
- ✅ 每个步骤负责人已确定
- ✅ 简单的流水线作业
用 Hierarchical 当:
- ✅ 需要灵活的任务分配
- ✅ 有明确的管理者角色
- ✅ 任务复杂,需要动态分解
🎓 完整实战项目:市场分析报告
结合所有知识,创建一个完整的市场分析系统:
python
from crewai import Agent, Task, Crew, Process
from crewai.tools import tool
# 自定义工具
@tool
def market_data_tool(industry: str) -> str:
"""获取市场数据和趋势"""
data = {
"AI": "2024年全球AI市场规模1500亿美元,年增长率35%",
"电动车": "2024年全球电动车销量1200万辆,渗透率18%",
}
return data.get(industry, "暂无数据")
# 创建 Agent
analyst = Agent(
role='高级市场分析师',
goal='分析目标行业的市场规模和趋势',
tools=[market_data_tool],
llm=llm,
)
competitor_analyst = Agent(
role='竞品分析专家',
goal='分析行业主要竞争对手',
llm=llm,
)
strategist = Agent(
role='战略顾问',
goal='制定进入策略和建议',
llm=llm,
)
# 创建任务
market_task = Task(
description="分析 {industry} 行业的市场情况",
agent=analyst,
)
competitor_task = Task(
description="分析 {industry} 行业的竞争格局",
context=[market_task], # ← 依赖市场分析
agent=competitor_analyst,
)
strategy_task = Task(
description="基于市场分析和竞品分析,制定战略建议",
context=[market_task, competitor_task], # ← 依赖前两个任务
agent=strategist,
)
# 创建 Crew
crew = Crew(
agents=[analyst, competitor_analyst, strategist],
tasks=[market_task, competitor_task, strategy_task],
process=Process.sequential,
)
# 执行
result = crew.kickoff(inputs={"industry": "AI"})
print(result)
📝 总结
通过本文,你学会了:
- ✅ 顺序协作模式(Sequential)的使用
- ✅ 层级管理模式(Hierarchical)的使用
- ✅ 两种模式的区别和适用场景
- ✅ 任务间数据传递(context 参数)
- ✅ 完整的实战项目