CrewAI 实战03:多 Agent 协作与层级管理

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 参数)
  • ✅ 完整的实战项目
相关推荐
带娃的IT创业者5 分钟前
本地AI的觉醒:GitNexus如何让GenAI从云端走向你的口袋
人工智能·大模型·边缘计算·开源项目·genai·本地ai·gitnexus
火山引擎开发者社区23 分钟前
龙虾突然“罢工”?别慌,我们派出了“AI 医生”
人工智能
NQBJT27 分钟前
青鸾云步:基于 Cordova 的 AI 导盲机器人 APP 全栈开发实战
人工智能·app·导盲·轮足机器人·青鸾云步
深兰科技1 小时前
韩国KAIST AI半导体高管项目代表团到访深兰科技,聚焦AI算力与智能产业合作机会
人工智能·机器人·symfony·ai算力·深兰科技·韩国科学技术院·kaist
快乐on9仔1 小时前
NLP学习(一)transformers之pipeline体验
人工智能·深度学习
冬奇Lab1 小时前
Agent系列(六):记忆管理——让 Agent 记住重要的事
人工智能·agent
冬奇Lab1 小时前
一天一个开源项目(第113篇):notebooklm-py - 把 Google NotebookLM 变成可编程 API,还能接入 Claude Code
人工智能·google·开源
字节跳动开源2 小时前
Viking AI 搜索 CLI 正式发布:会说话,就能做搜索推荐
数据库·人工智能·开源
阿杰技术2 小时前
AI 编程助手落地实战:从提效到重构的全场景指南
人工智能·重构