当前位置: 首页 > 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 应用推向生产所需的评估、部署和运维实践。


内容同步在我的公众号:智语Bot

http://www.xdnf.cn/news/220303.html

相关文章:

  • Andorid车机UI适配,AndroidUI图px的单位,如何适配1920x720,PPI100的屏幕设备
  • 【GESP】C++三级练习 luogu-B2117 整理药名
  • Rockchip Android平台打开GKI无法开机问题
  • 应用服务器-IIS
  • 推荐系统中 Label 回收机制之【时间窗口设计】
  • 基于Lucene的多场景检索系统开发指南
  • [按键安卓ios脚本辅助插件开发]数组排序函数例子
  • 明远智睿SSD2351开发板:开启嵌入式开发新篇程
  • C#实现对达索(Dassault)SolidWorks中3D图纸转化为手机可直接查看预览图纸格式
  • 高级项目管理
  • 巧记英语四级单词 Unit6-下【晓艳老师版】
  • C++程序退出时的对象析构陷阱:深度解析与避坑指南
  • mysql 事务中如果有sql语句出错,会导致自动回滚吗?
  • 力扣刷题总表
  • 【Vue】 实现TodoList案例(待办事项)
  • Java高频面试之并发编程-10
  • C++之string
  • 如何在本地部署小智服务器:从源码到全模块运行的详细步骤
  • CA校验主辅小区配置及UE能力
  • 首发记忆行车方案与座舱智能管家,佑驾创新“抢跑”驾舱融合市场
  • 恒流恒压直流充电测试负载设计:构建精准化检测体系
  • 计算机基础:二进制基础14,二进制加法
  • 如何将二叉树展开为链表?两种Java实现方法对比
  • FPGA 38 ,FPGA 网络通信协议栈基础,ARP 协议深度解析与模块划分( ARP与以太网帧,以及ARP模块常用文件 )
  • 细说STM32单片机FreeRTOS互斥量及其编程实例
  • C# 导入EXCEL 报错外部表不是预期的格式错误指南方案
  • C++中的vector和list有什么区别?
  • Launcher3-实现家长管控-儿童模式-老人模式
  • 机器学习第四篇 线性回归-最小二乘法
  • 案例分享|20倍提效!水力设备电磁仿真的云端实战