当前位置: 首页 > news >正文

第十章:CrewAI - 面向流程的多 Agent 结构化协作

章节引导:在体验了 AutoGen 自由对话式的多 Agent 协作后,我们可能会遇到一些挑战:对话有时难以控制,流程不够明确,对于目标清晰、步骤固定的任务,自由对话可能效率不高。本章我们将转向另一种多 Agent 范式,介绍 CrewAI 框架。CrewAI 专注于结构化协作与流程自动化,它不依赖于开放式的对话,而是强调通过明确定义角色 (Agent)任务 (Task)执行流程 (Process) 来组织多个 Agent 高效地协同工作。我们将深入其核心构建块,探索如何定义 Agent 专长、分配具体任务、编排执行顺序,并通过构建一个自动化市场研究报告生成系统,掌握如何运用 CrewAI 设计和执行目标明确、流程清晰的多 Agent 工作流。

重要提示:相关库与版本
CrewAI 是一个独立的库 (pip install crewai crewai[tools])。本章示例基于 CrewAI 的较新版本,请确保环境已安装。同时,需要安装 LangChain 的相关 LLM 库(如 langchain-openai)并配置 API Keys。

10.1 CrewAI 核心构建块:定义角色、任务与流程

在这里插入图片描述

CrewAI 的设计哲学是面向流程、任务驱动、角色明确。理解它的关键在于掌握其定义协作的五大核心元素:

  1. Agent (特工/执行者):

    • 代表一个具有特定专长和目标的执行者。
    • 关键属性:
      • role: (核心) Agent 的角色名称 (例如,“市场研究员”)。
      • goal: Agent 的具体工作目标。
      • backstory: Agent 的背景故事/人设,有助于 LLM 代入角色。
      • tools: (可选) 该 Agent 可使用的 Tool 对象列表。
      • llm: (可选) 驱动该 Agent 的 LLM 实例(默认使用全局配置)。
      • verbose: 是否打印详细日志。
      • allow_delegation: (重要) 是否允许该 Agent 将任务委派给其他 Agent (主要用于 Hierarchical 流程)。
    • 角色定义的重要性: 清晰、具体的 role, goal, backstory 对 Agent 能否有效执行任务至关重要。
  2. Task (任务):

    • 定义一个具体、独立的工作单元
    • 关键属性:
      • description: (核心) 对任务的清晰、详细描述,支持 f-string 格式化。
      • expected_output: (核心) 对任务预期产出格式、内容或标准的明确说明。
      • agent: (可选) 指定执行该任务的 Agent 实例(若不指定,Crew 会尝试根据描述分配)。
      • context: (可选) 一个 Task 列表,其输出将作为上下文信息传递给当前任务,实现依赖。
      • tools: (可选) 指定供当前 Task 使用的特定工具列表,覆盖 Agent 的默认工具。
  3. Tool (工具):

    • 定义 Agent 可使用的外部功能。CrewAI 工具与 LangChain 工具兼容,可用 @tool 装饰器定义,或使用 crewai_tools 及 LangChain Community 提供的预定义工具。
  4. Process (流程):

    • (关键) 定义多个 Task执行策略和顺序
    • 主要类型:
      • Process.sequential: 顺序执行。任务按列表顺序依次执行。简单直接。
      • Process.hierarchical: 层级化执行。需要指定 manager_llm。由管理者 Agent 动态决定任务顺序和委派。更灵活但也更复杂。
  5. Crew (团队/剧组):

    • 将所有组件组合在一起的协作单元。
    • 关键属性:
      • agents: Agent 实例列表。
      • tasks: Task 实例列表。
      • process: 使用的 Process (e.g., Process.sequential)。
      • memory: (可选) 是否启用短时记忆在任务间共享信息。
      • manager_llm: (可选, Hierarchical 必需) 指定管理流程的 LLM。
    • 启动执行: 调用 crew.kickoff() 方法启动工作流。

10.2 CrewAI 高级特性深入

在这里插入图片描述

除了核心构建块,CrewAI 还提供了一些高级特性:

  • 上下文传递 (Context Passing):
    • 主要通过 Taskcontext 属性实现。上游任务的输出(expected_output)会自动注入到下游任务的 Prompt 上下文中。清晰的 expected_output 对此至关重要。
  • 工具使用与配置:
    • 可以在 Agent 级别定义通用工具,在 Task 级别定义特定工具(覆盖 Agent 级)。
  • Memory / 状态管理:
    • 提供短时记忆 (memory=True),尝试在任务间传递信息。
    • 局限性: 目前缺乏内置的长期记忆或复杂状态管理。对于需要跨多次 kickoff 或复杂共享状态的应用,需自行实现外部记忆或结合 LangGraph 等框架。
  • 回调函数 (Callbacks):
    • 支持 step_callback 等,允许在任务步骤前后执行自定义逻辑(日志、监控、干预)。
  • 模型配置与优化:
    • 可为不同 Agent 指定不同 llm,优化成本与性能。

10.3 动手实验:构建自动化市场研究报告生成 Crew

  • 目标:实践定义多个具有不同专长的 Agent 和依赖关系的 Task,配置执行流程 (Sequential),并集成多种工具完成一个端到端的自动化报告生成任务。

场景: 自动化生成一份关于“AI Agent 技术”的市场研究报告。

前置准备:

  • 安装 crewai, crewai[tools], langchain-openai, python-dotenv, duckduckgo-search
  • .env 文件中设置 OPENAI_API_KEY
import os
from dotenv import load_dotenv
from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI
# from crewai_tools import SerperDevTool # Option 1: Use Serper tool if you have API key
from langchain_community.tools import DuckDuckGoSearchRun # Option 2: Use DuckDuckGo# 加载环境变量 (需要 .env 文件包含 OPENAI_API_KEY)
load_dotenv()# --- 0. 配置 LLM ---
# 可以全局配置,或在 Agent 初始化时传入
# 建议使用能力较强的模型如 gpt-4o 或 gpt-4-turbo
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)# --- 1. 定义工具 ---
# 使用 DuckDuckGo 作为免费搜索工具示例
search_tool = DuckDuckGoSearchRun()# 如果使用 Serper (通常效果更好,但需要 API Key)
# os.environ["SERPER_API_KEY"] = "YOUR_SERPER_API_KEY"
# search_tool = SerperDevTool()# --- 2. 定义 Agents ---
market_researcher = Agent(role='市场研究员 (Market Researcher)',goal='查找关于 AI Agent 技术的最新发展、主要参与者和市场趋势的信息。',backstory=('你是一名经验丰富的市场研究员,擅长利用网络搜索工具''快速准确地收集、整理和总结行业信息。''你需要提供简洁、相关的信息摘要。'),verbose=True,allow_delegation=False,tools=[search_tool], # 授权使用搜索工具llm=llm
)data_analyst = Agent(role='数据分析师 (Data Analyst)',goal='分析市场研究员提供的原始数据,识别关键趋势、挑战和机遇。',backstory=('你是一名数据分析专家,具有敏锐的洞察力。你能从杂乱的信息中''提取关键数据点,发现模式,并用简洁的语言总结核心发现。'),verbose=True,allow_delegation=False,# 分析师在此示例中不直接使用外部工具,依赖 LLM 分析能力llm=llm
)report_writer = Agent(role='报告撰稿人 (Report Writer)',goal='基于研究和分析结果,撰写一份结构清晰、语言专业、内容全面的市场研究报告。',backstory=('你是一名专业的商业报告撰稿人,写作风格清晰、简洁、有条理。''你能将复杂的信息整合成易于理解的报告,并确保所有关键点都得到覆盖。'),verbose=True,allow_delegation=False,llm=llm
)# --- 3. 定义 Tasks ---
# 任务 1: 市场研究
research_task = Task(description=('收集关于 AI Agent 技术领域的最新信息(重点关注过去 6-12 个月)。''关键点应包括:1. 主要的技术突破或新方法。 ''2. 领先的开源项目和商业公司。 ''3. 预测的市场增长率和关键应用领域。''使用你的搜索工具查找这些信息。'),expected_output=('一份信息摘要报告 (Markdown 格式),清晰地列出以下部分:''\n1. 技术突破总结 (要点)。''\n2. 主要参与者列表 (公司/项目 + 简述)。''\n3. 市场趋势与应用预测 (要点)。'),agent=market_researcher
)# 任务 2: 数据分析
analysis_task = Task(description=('基于提供的市场研究信息摘要,进行深入分析。''识别出 AI Agent 技术领域当前面临的至少 2 个主要挑战,''至少 2 个潜在机遇,以及 3 个最关键的未来增长趋势。'),expected_output=('一份简洁的分析总结 (Markdown 格式),包含:''\n- 主要挑战: \n  - [挑战1]\n  - [挑战2]''\n- 潜在机遇: \n  - [机遇1]\n  - [机遇2]''\n- 关键增长趋势: \n  - [趋势1]\n  - [趋势2]\n  - [趋势3]'),agent=data_analyst,context=[research_task] # **依赖于研究任务的输出**
)# 任务 3: 报告撰写
writing_task = Task(description=('使用市场研究摘要和数据分析总结作为输入信息,撰写一份完整的市场研究报告。''报告需要结构化,包含引言、技术发展、主要参与者、市场趋势(含挑战与机遇)和结论。''语言要求专业、客观、流畅。报告长度约 500-800 字。'),expected_output=('一份格式规范、内容完整的市场研究报告 (Markdown 格式)。''报告结构应包含明确的标题和以下部分:''\n1. 引言 (Introduction)''\n2. 技术发展现状 (Technological Developments)''\n3. 主要参与者 (Key Players)''\n4. 市场趋势、挑战与机遇 (Market Trends, Challenges & Opportunities)''\n5. 结论 (Conclusion)'),agent=report_writer,context=[research_task, analysis_task] # **依赖于前两个任务的输出**
)# --- 4. 配置 Process ---# 使用顺序流程,因为任务之间存在明确的线性依赖
report_process_sequential = Process.sequential# --- 对比说明:Hierarchical Process ---
# 如果任务流程更复杂,例如需要根据研究结果动态决定是深入分析某个特定领域,
# 还是先进行竞品对比,这时可以考虑 Process.hierarchical。
# 它需要指定一个 manager_llm,由这个“经理”LLM 来决定任务的执行顺序和委派。
# 示例: process=Process.hierarchical, manager_llm=ChatOpenAI(model="gpt-4o")
# 对于本实验的线性流程,Sequential 更合适。# --- 5. 构建并启动 Crew ---
market_report_crew = Crew(agents=[market_researcher, data_analyst, report_writer],tasks=[research_task, analysis_task, writing_task],process=report_process_sequential, # 指定使用顺序流程verbose=2 # 打印详细过程: 1=基本信息, 2=详细调试信息# memory=True # 可选:启用短时记忆
)print("\n--- Kicking off the Market Report Crew ---")
# 启动任务!
try:report_result = market_report_crew.kickoff()print("\n" + "="*50)print("--- Market Report Crew Finished ---")print("="*50 + "\n")print("Final Report Output:")# 结果是最后一个任务 (writing_task) 的输出print(report_result)# --- 关于错误处理的说明 ---
# 以上代码是理想情况下的执行流程。在实际运行中,某个任务可能失败
# (例如,工具调用出错、LLM 输出不符合预期等)。
# CrewAI 默认会尝试处理错误,但可能不足以应对所有情况。
# 对于生产环境,建议:
# 1. 在自定义工具中实现更健壮的错误处理。
# 2. 利用 CrewAI 的回调函数 (`step_callback` 等) 监控任务状态,并在失败时触发告警或备用逻辑。
# 3. 对于关键流程,可能需要设计更复杂的重试机制或人工介入环节。except Exception as e:print(f"\nAn error occurred during crew execution: {e}")# 打印更详细的错误追踪信息可能有助于调试import tracebacktraceback.print_exc()

逐步代码讲解与分析:

  1. 定义 Agent: 创建了三个具有明确 role, goal, backstory 的 Agent,研究员配置了搜索工具。
  2. 定义 Task: 创建了三个 Task,description 清晰,expected_output 定义了产出标准。context 参数是关键,它建立了 analysis_taskresearch_taskwriting_task 对前两者的依赖关系。
  3. 配置 Process: 选择了 Process.sequential 保证任务按研究->分析->写作的顺序执行。
  4. 构建 Crew: 将 Agents 和 Tasks 组装进 Crew
  5. 启动执行 (kickoff()): CrewAI 自动按顺序执行任务,并将前序任务的结果作为上下文传递给后续任务。
  6. 观察输出: verbose=2 会展示每个 Agent 的思考过程、工具调用(如果有)和任务产出。最终结果是 writing_task 生成的报告。

10.4 CrewAI 在企业工作流中的应用与集成

CrewAI 面向流程、结构化的特性使其非常适合企业的自动化工作流:

  • 自动化内容营销: 文章选题 -> 写作 -> SEO 优化 -> 发布。
  • 自动化软件开发辅助: 需求分析 -> 架构设计 -> 编码 -> 测试。
  • 自动化招聘流程: 筛选简历 -> 安排面试 -> 发送通知。
  • 自动化客户支持: 工单分类 -> 信息检索 -> 生成回复 -> 分派/升级。
  • 自动化报告生成: 市场分析、财务摘要、竞品分析等。

集成探讨:

  • API 封装:crew.kickoff() 包装成 API,由外部系统触发。
  • 输入/输出处理: API 接收参数,并将 Crew 结果写回企业系统 (CRM, DB)。
  • 状态同步与监控: 使用回调或日志监控长时间运行 Crew 的状态。
  • 挑战: 保证事务性、处理失败逻辑、安全认证等。

10.5 章节总结与框架对比

本章,我们学习了 CrewAI,一个专注于结构化协作与流程自动化的多 Agent 框架。

  • 核心优势总结: CrewAI 通过强制定义角色 (Agent)、任务 (Task) 和流程 (Process),提供了一种清晰、可控、易于理解的方式来构建目标明确的多 Agent 工作流。

  • 关键技术回顾: 我们掌握了 CrewAI 的五大核心元素,学会了如何定义 Agent 专长、分配具体任务(含上下文依赖)、配置执行流程(Sequential),并实践了构建自动化报告生成的 Crew。

  • 对比分析:

    • vs AutoGen (Ch9):
      • CrewAI: 结构化、流程驱动、角色明确。适用于目标明确、步骤清晰的任务。更易于预测和控制流程
      • AutoGen: 对话驱动、更灵活、动态。适用于开放式探索、需要灵活代码执行或模拟自由讨论的场景。代码执行能力更突出,但流程控制较弱
    • vs LangGraph (Ch8):
      • CrewAI: 专注于多 Agent 协作顶层流程编排。抽象层次较高。
      • LangGraph: 更底层、更通用,可以精细控制单个 Agent 内部的状态转换或任何图结构流程。
      • 结合可能性: 可以用 LangGraph 实现 CrewAI 中某个 Agent 的复杂内部逻辑,然后将这个强大的 Agent 作为 Crew 的一员参与顶层协作。
  • 展望: 学习了 LangChain Agent, LangGraph, AutoGen, CrewAI 后,我们对不同类型的 Agent 框架有了全面的认识。后续章节将探索更前沿的多模态应用,以及将这些 RAG 和 Agent 应用推向生产所需的评估、部署和运维实践。


相关文章:

  • 【分享】音频音乐剪辑[特殊字符]人声分离伴奏提取[特殊字符]拼接合并
  • KUKA机器人快速启动设置
  • MCP 架构全解析:Host、Client 与 Server 的协同机制
  • CSRF(cross-site request forgery)跨域请求访问
  • Spark 配置 YARN 模式
  • Python数据容器:数据容器的分类、数据容器特点总结、各数据容器遍历的特点、数据容器通用操作(统计,转换,排序)
  • C++ 中自主内存管理 new/delete 与 malloc/free 完全详解
  • 如何搭建spark yarn 模式的集群集群
  • 贝叶斯优化RF预测模型
  • MYSQL三大日志、隔离级别(MVCC+锁机制实现)
  • 【深度学习与大模型基础】第14章-分类任务与经典分类算法
  • Vue2 相关知识点整理
  • 数据结构---单链表的增删查改
  • 第十六届蓝桥杯 2025 C/C++组 25之和
  • 【Bash】可以请您解释性地说明一下“2>1”这个语法吗?
  • 基于tabula对pdf中多个excel进行识别并转换成word中的优化(四)
  • 关于插值和拟合(数学建模实验课)
  • 【记】Laya2.x数字末尾导致换行异常问题
  • C# 14 field keyword:属性简化新利器
  • 基于PyTorch的Fashion-MNIST图像分类数据集处理与可视化
  • 神舟十九号载人飞船因东风着陆场气象原因推迟返回
  • 王毅:坚持金砖团结合作,改革完善全球治理
  • 太好玩了!坐进大卫·霍克尼的敞篷车进入他画笔下的四季
  • 商务部:4月份以来的出口总体延续平稳增长态势
  • 云南舞蹈大家跳暨2025年牟定“三月会”昨天开幕
  • 对排出黑烟车辆出具合格报告,广州南沙一检测公司被罚十万元