🎯 核心主题:深入解析CrewAI框架的核心架构与设计理念,掌握多智能体协作系统的构建方法


📑 目录

  1. 引言:为什么需要CrewAI
  2. CrewAI核心架构概览
  3. 核心组件深度解析
  4. 角色定义与设计艺术
  5. 工作流编排实战
  6. Flows:事件驱动的高级编排
  7. 状态管理与持久化
  8. 实战案例:构建AI研究团队
  9. 高级特性与最佳实践
  10. CrewAI与其他框架对比
  11. 总结与展望
  12. 参考文献

1. 引言:为什么需要CrewAI 🤔

在这里插入图片描述

1.1 多智能体系统的崛起

在人工智能领域,单一模型的能力边界正在被不断突破,但现实世界的复杂任务往往需要多种专业技能的协同配合。想象一下:

  • 一个内容创作项目需要研究员收集资料、作家撰写内容、编辑校对润色
  • 一个软件开发任务需要架构师设计系统、开发者编写代码、测试员验证功能
  • 一个商业分析项目需要数据分析师处理数据、市场专家解读趋势、战略顾问制定方案

这些场景都有一个共同点:需要不同角色的专家协同工作

💡 思考:如何让多个AI Agent像人类团队一样协作?

🤔 解答:CrewAI正是为解决这个问题而生的框架。它引入了"角色扮演"的核心理念,让每个Agent都有明确的角色、目标和背景故事,从而实现更自然、更高效的团队协作。

1.2 CrewAI的诞生背景

CrewAI是一个精简、快速的Python框架,完全从零开始构建——完全独立于LangChain或其他Agent框架。它赋予开发者高层次的简洁性和精确的底层控制,非常适合创建针对任何场景的自主AI Agent。

┌─────────────────────────────────────────────────────────────────┐
│                    CrewAI 设计哲学                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   🎭 角色扮演 (Role-Playing)                                    │
│      ↓                                                          │
│   🎯 目标驱动 (Goal-Oriented)                                   │
│      ↓                                                          │
│   🤝 协作智能 (Collaborative Intelligence)                      │
│      ↓                                                          │
│   ⚡ 高性能执行 (High Performance)                               │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

1.3 核心优势

特性 描述
独立框架 完全独立,不依赖LangChain,执行更快、资源占用更少
灵活精确 通过Crews(自主性)或Flows(精确控制)轻松编排Agent
无缝集成 Crews和Flows可以完美结合,创建复杂的真实世界自动化
深度定制 从高层工作流到底层内部提示和Agent行为,全面可定制
可靠性能 从简单任务到复杂企业级自动化,表现一致

2. CrewAI核心架构概览 🏗️

2.1 整体架构图

┌───────────────────────────────────────────────────────────────────────────┐
│                           CrewAI 架构总览                                  │
├───────────────────────────────────────────────────────────────────────────┤
│                                                                           │
│  ┌─────────────────────────────────────────────────────────────────────┐  │
│  │                         Flows Layer (事件驱动层)                      │  │
│  │   ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐     │  │
│  │   │  @start  │───▶│ @listen  │───▶│ @router  │───▶│ @listen  │     │  │
│  │   └──────────┘    └──────────┘    └──────────┘    └──────────┘     │  │
│  │         │              │               │               │            │  │
│  │         ▼              ▼               ▼               ▼            │  │
│  │   ┌─────────────────────────────────────────────────────────────┐  │  │
│  │   │                    State Management (状态管理)               │  │  │
│  │   └─────────────────────────────────────────────────────────────┘  │  │
│  └─────────────────────────────────────────────────────────────────────┘  │
│                                    │                                      │
│                                    ▼                                      │
│  ┌─────────────────────────────────────────────────────────────────────┐  │
│  │                         Crew Layer (团队协作层)                       │  │
│  │                                                                     │  │
│  │   ┌─────────────┐         ┌─────────────────────────────────┐      │  │
│  │   │    Crew     │────────▶│           Process               │      │  │
│  │   │   (团队)    │         │   ┌───────────┬───────────┐    │      │  │
│  │   └─────────────┘         │   │Sequential │Hierarchical│    │      │  │
│  │         │                 │   │  (顺序)   │  (层级)    │    │      │  │
│  │         │                 │   └───────────┴───────────┘    │      │  │
│  │         ▼                 └─────────────────────────────────┘      │  │
│  │   ┌─────────────────────────────────────────┐                      │  │
│  │   │              Agents (智能体群)           │                      │  │
│  │   │  ┌───────┐  ┌───────┐  ┌───────┐       │                      │  │
│  │   │  │Agent 1│  │Agent 2│  │Agent 3│  ...  │                      │  │
│  │   │  │ Role  │  │ Role  │  │ Role  │       │                      │  │
│  │   │  │ Goal  │  │ Goal  │  │ Goal  │       │                      │  │
│  │   │  │Backsty│  │Backsty│  │Backsty│       │                      │  │
│  │   │  └───┬───┘  └───┬───┘  └───┬───┘       │                      │  │
│  │   └──────┼──────────┼─────────┼────────────┘                      │  │
│  │          │          │         │                                    │  │
│  │          ▼          ▼         ▼                                    │  │
│  │   ┌─────────────────────────────────────────┐                      │  │
│  │   │              Tasks (任务队列)            │                      │  │
│  │   │  ┌──────┐  ┌──────┐  ┌──────┐          │                      │  │
│  │   │  │Task 1│─▶│Task 2│─▶│Task 3│   ...    │                      │  │
│  │   │  └──────┘  └──────┘  └──────┘          │                      │  │
│  │   └─────────────────────────────────────────┘                      │  │
│  └─────────────────────────────────────────────────────────────────────┘  │
│                                    │                                      │
│                                    ▼                                      │
│  ┌─────────────────────────────────────────────────────────────────────┐  │
│  │                      Foundation Layer (基础设施层)                    │  │
│  │                                                                     │  │
│  │   ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐          │  │
│  │   │   LLM    │  │  Tools   │  │  Memory  │  │Knowledge │          │  │
│  │   │  连接器  │  │  工具库  │  │  记忆系统 │  │ 知识库   │          │  │
│  │   └──────────┘  └──────────┘  └──────────┘  └──────────┘          │  │
│  │                                                                     │  │
│  └─────────────────────────────────────────────────────────────────────┘  │
│                                                                           │
└───────────────────────────────────────────────────────────────────────────┘

2.2 核心概念关系图

                    ┌─────────────────┐
                    │      Crew       │
                    │     (团队)      │
                    └────────┬────────┘
                             │
              ┌──────────────┼──────────────┐
              │              │              │
              ▼              ▼              ▼
        ┌──────────┐   ┌──────────┐   ┌──────────┐
        │  Agent   │   │   Task   │   │ Process  │
        │ (智能体) │   │  (任务)  │   │  (流程)  │
        └────┬─────┘   └────┬─────┘   └────┬─────┘
             │              │              │
    ┌────────┼────────┐     │      ┌───────┴───────┐
    │        │        │     │      │               │
    ▼        ▼        ▼     │      ▼               ▼
┌──────┐ ┌──────┐ ┌──────┐  │  ┌────────┐    ┌────────┐
│ Role │ │ Goal │ │Back- │  │  │Sequential│   │Hierarchical│
│      │ │      │ │story │  │  │ 顺序执行 │   │ 层级执行 │
└──────┘ └──────┘ └──────┘  │  └────────┘    └────────┘
                            │
              ┌─────────────┼─────────────┐
              │             │             │
              ▼             ▼             ▼
         ┌────────┐   ┌────────┐   ┌────────┐
         │Description│ │Expected│   │Context │
         │  描述    │ │ Output │   │ 上下文 │
         └────────┘   └────────┘   └────────┘

2.3 两种编排范式

CrewAI提供两种强大而互补的方法来构建AI应用:

2.3.1 Crews(团队自主协作)
┌────────────────────────────────────────────────────────────┐
│                    Crews 特点                              │
├────────────────────────────────────────────────────────────┤
│                                                            │
│  ✅ 自然的自主决策                                          │
│  ✅ 动态任务委派和协作                                      │
│  ✅ 具有明确目标和专业知识的专门角色                        │
│  ✅ 灵活的问题解决方法                                      │
│                                                            │
│  适用场景:需要Agent自主协作、动态决策的复杂任务            │
│                                                            │
└────────────────────────────────────────────────────────────┘
2.3.2 Flows(精确事件驱动)
┌────────────────────────────────────────────────────────────┐
│                    Flows 特点                              │
├────────────────────────────────────────────────────────────┤
│                                                            │
│  ✅ 对执行路径的精细控制                                    │
│  ✅ 任务间安全、一致的状态管理                              │
│  ✅ AI Agent与生产Python代码的无缝集成                      │
│  ✅ 复杂业务逻辑的条件分支                                  │
│                                                            │
│  适用场景:需要精确控制执行流程的生产级应用                 │
│                                                            │
└────────────────────────────────────────────────────────────┘

💡 思考:什么时候用Crews,什么时候用Flows?

🤔 解答

  • 当任务需要创造性协作动态决策时,使用Crews
  • 当需要精确的执行控制复杂的业务逻辑时,使用Flows
  • 最佳实践是结合使用:Flows控制整体流程,在关键节点调用Crews执行复杂的协作任务

3. 核心组件深度解析 🔍

3.1 Agent(智能体)

Agent是CrewAI框架中的核心自主单元,它可以:

  • 执行特定任务
  • 基于角色和目标做出决策
  • 使用工具完成目标
  • 与其他Agent通信协作
  • 维护交互记忆
  • 在允许时委派任务
3.1.1 Agent核心属性
from crewai import Agent

# 完整的Agent定义示例
agent = Agent(
    # 🎭 核心身份三要素(必填)
    role="高级数据科学家",                    # 角色定义
    goal="分析和解读复杂数据集,提供可操作的洞察",  # 目标
    backstory="""
        你拥有超过10年的数据科学和机器学习经验,
        擅长在复杂数据集中发现模式。你曾在多家
        财富500强企业担任首席数据科学家。
    """,                                      # 背景故事
    
    # 🤖 LLM配置
    llm="gpt-4",                              # 默认:OPENAI_MODEL_NAME 或 "gpt-4"
    function_calling_llm=None,                # 用于工具调用的专用LLM
    
    # ⚙️ 执行控制
    verbose=True,                             # 启用详细日志
    allow_delegation=False,                   # 是否允许委派任务
    max_iter=20,                              # 最大迭代次数
    max_rpm=None,                             # API调用速率限制
    max_execution_time=None,                  # 最大执行时间(秒)
    max_retry_limit=2,                        # 错误重试次数
    
    # 🛠️ 工具配置
    tools=[],                                 # 可用工具列表
    allow_code_execution=False,               # 是否允许执行代码
    code_execution_mode="safe",               # 代码执行模式:"safe"(Docker)或"unsafe"
    
    # 🧠 记忆与上下文
    memory=True,                              # 启用记忆功能
    respect_context_window=True,              # 自动处理上下文窗口
    knowledge_sources=None,                   # 知识源配置
    
    # 🎨 高级特性
    reasoning=False,                          # 启用推理规划
    max_reasoning_attempts=None,              # 推理尝试次数
    multimodal=False,                         # 多模态支持
    inject_date=False,                        # 自动注入日期
    
    # 📝 自定义模板
    system_template=None,                     # 自定义系统提示
    prompt_template=None,                     # 自定义提示模板
    response_template=None,                   # 自定义响应模板
    
    # 📊 回调与监控
    step_callback=None,                       # 步骤回调函数
    cache=True,                               # 启用工具缓存
)
3.1.2 Agent属性详解表
属性 类型 默认值 描述
role str 必填 定义Agent在团队中的功能和专业领域
goal str 必填 指导Agent决策的个人目标
backstory str 必填 为Agent提供背景和个性,丰富交互内容
llm str/LLM gpt-4 驱动Agent的语言模型
tools List[BaseTool] [] Agent可使用的能力或功能
verbose bool False 启用详细执行日志
allow_delegation bool False 允许Agent将任务委派给其他Agent
max_iter int 20 Agent必须给出最佳答案前的最大迭代次数
memory bool False 启用交互记忆
reasoning bool False 启用执行前的反思和规划
multimodal bool False 支持多模态能力
3.1.3 不同类型Agent的设计模式

研究型Agent

research_agent = Agent(
    role="研究分析师",
    goal="查找并总结特定主题的信息",
    backstory="你是一位经验丰富的研究员,注重细节",
    tools=[SerperDevTool()],
    verbose=True
)

代码开发Agent

dev_agent = Agent(
    role="高级Python开发者",
    goal="编写和调试Python代码",
    backstory="拥有10年经验的Python专家开发者",
    allow_code_execution=True,
    code_execution_mode="safe",      # 使用Docker保证安全
    max_execution_time=300,          # 5分钟超时
    max_retry_limit=3                # 复杂代码任务允许更多重试
)

推理规划Agent

strategic_agent = Agent(
    role="战略规划师",
    goal="分析复杂问题并创建详细的执行计划",
    backstory="擅长系统性分解复杂挑战的专家战略规划师",
    reasoning=True,                  # 启用推理和规划
    max_reasoning_attempts=3,        # 限制推理尝试次数
    max_iter=30,                     # 复杂规划允许更多迭代
    verbose=True
)

3.2 Task(任务)

Task是Agent执行的具体工作单元,提供执行所需的所有必要细节。

3.2.1 Task核心属性
from crewai import Task

task = Task(
    # 📋 核心定义(必填)
    description="""
        对人工智能最新发展进行深入研究。
        确保找到任何有趣且相关的信息,
        当前年份是2025年。
    """,
    expected_output="""
        一份包含10个要点的列表,
        记录关于AI最相关的信息
    """,
    
    # 👤 执行者
    agent=research_agent,              # 负责执行任务的Agent
    
    # 🛠️ 工具配置
    tools=[search_tool],               # 任务特定的工具
    
    # 🔗 依赖与上下文
    context=[previous_task],           # 依赖的其他任务输出
    
    # ⚙️ 执行控制
    async_execution=False,             # 是否异步执行
    human_input=False,                 # 是否需要人工审核
    
    # 📤 输出配置
    output_file="report.md",           # 输出文件路径
    output_json=None,                  # JSON输出的Pydantic模型
    output_pydantic=None,              # Pydantic输出模型
    markdown=True,                     # 启用Markdown格式化
    
    # 🛡️ 验证与回调
    guardrail=validate_function,       # 输出验证函数
    guardrails=[],                     # 多重验证器
    guardrail_max_retries=3,           # 验证失败最大重试次数
    callback=callback_function,        # 完成后的回调函数
)
3.2.2 Task属性详解表
属性 类型 描述
description str 任务内容的清晰简明陈述
expected_output str 任务完成的详细描述
agent Agent 负责执行任务的Agent
tools List[BaseTool] Agent可用于此任务的工具
context List[Task] 将用作此任务上下文的其他任务
async_execution bool 是否异步执行任务
human_input bool 是否需要人工审核最终答案
output_file str 存储任务输出的文件路径
output_pydantic Type[BaseModel] 用于任务输出的Pydantic模型
output_json Type[BaseModel] 用于结构化JSON输出的Pydantic模型
guardrail Callable 验证任务输出的函数
callback Callable 任务完成后执行的函数
3.2.3 任务依赖与上下文
# 任务1:研究任务
research_task = Task(
    description="研究AI领域的最新发展",
    expected_output="近期AI发展列表",
    agent=researcher
)

# 任务2:分析任务(依赖于研究任务)
analysis_task = Task(
    description="分析研究发现并识别关键趋势",
    expected_output="AI趋势分析报告",
    agent=analyst,
    context=[research_task]  # 此任务将等待research_task完成
)
┌─────────────────────────────────────────────────────────────┐
│                    任务执行流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌──────────────┐                                          │
│   │ Research Task│                                          │
│   │   研究任务   │                                          │
│   └──────┬───────┘                                          │
│          │                                                  │
│          │ output (输出作为上下文)                          │
│          ▼                                                  │
│   ┌──────────────┐                                          │
│   │Analysis Task │◀─── context=[research_task]             │
│   │   分析任务   │                                          │
│   └──────┬───────┘                                          │
│          │                                                  │
│          │ output                                           │
│          ▼                                                  │
│   ┌──────────────┐                                          │
│   │ Report Task  │◀─── context=[analysis_task]             │
│   │   报告任务   │                                          │
│   └──────────────┘                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘
3.2.4 Task Guardrails(任务护栏)

Guardrails提供了在将任务输出传递给下一个任务之前验证和转换的方法:

函数式Guardrail

from typing import Tuple, Any
from crewai import TaskOutput

def validate_blog_content(result: TaskOutput) -> Tuple[bool, Any]:
    """验证博客内容是否符合要求"""
    try:
        word_count = len(result.raw.split())
        if word_count > 200:
            return (False, "博客内容超过200字")
        return (True, result.raw.strip())
    except Exception as e:
        return (False, "验证过程中发生意外错误")

blog_task = Task(
    description="写一篇关于AI的博客文章",
    expected_output="200字以内的博客文章",
    agent=blog_agent,
    guardrail=validate_blog_content
)

LLM式Guardrail(字符串描述)

research_task = Task(
    description="研究量子计算的最新发展",
    expected_output="一份全面的研究报告",
    agent=researcher_agent,
    guardrail="""
        研究报告必须:
        - 至少1000字
        - 包含至少5个可信来源
        - 涵盖技术和实际应用
        - 采用专业、学术的语气
        - 避免推测或未经验证的声明
    """
)
3.2.5 结构化输出
from pydantic import BaseModel
from crewai import Agent, Crew, Process, Task

class Blog(BaseModel):
    title: str
    content: str

blog_agent = Agent(
    role="博客内容生成Agent",
    goal="生成博客标题和内容",
    backstory="你是一位专业的内容创作者,擅长撰写引人入胜的博客文章。",
    llm="gpt-4o",
)

task = Task(
    description="创建一个关于给定主题的博客标题和内容,确保内容在200字以内。",
    expected_output="引人注目的博客标题和精心撰写的内容。",
    agent=blog_agent,
    output_pydantic=Blog,  # 使用Pydantic模型确保结构化输出
)

crew = Crew(
    agents=[blog_agent],
    tasks=[task],
    process=Process.sequential,
)

result = crew.kickoff()

# 访问结构化输出
print("标题:", result.pydantic.title)
print("内容:", result.pydantic.content)

3.3 Crew(团队)

Crew代表一组协作工作的Agent团队,定义任务执行策略、Agent协作方式和整体工作流程。

3.3.1 Crew核心属性
from crewai import Crew, Process

crew = Crew(
    # 📋 核心配置(必填)
    agents=[agent1, agent2],           # 团队成员列表
    tasks=[task1, task2],              # 任务列表
    
    # ⚙️ 流程控制
    process=Process.sequential,        # 执行流程:sequential或hierarchical
    
    # 🤖 管理配置(层级流程需要)
    manager_llm="gpt-4o",              # 管理Agent使用的LLM
    manager_agent=None,                # 自定义管理Agent
    
    # 🧠 记忆与缓存
    memory=True,                       # 启用记忆(短期、长期、实体记忆)
    cache=True,                        # 启用工具执行结果缓存
    embedder={"provider": "openai"},   # 嵌入器配置
    
    # 📊 监控与日志
    verbose=True,                      # 详细日志
    output_log_file="logs.txt",        # 日志文件
    step_callback=None,                # 步骤回调
    task_callback=None,                # 任务回调
    
    # 🔧 高级配置
    max_rpm=None,                      # 最大请求速率
    planning=False,                    # 启用规划能力
    planning_llm=None,                 # 规划使用的LLM
    knowledge_sources=None,            # 团队级知识源
    
    # 📡 输出配置
    stream=False,                      # 启用流式输出
)
3.3.2 Crew属性详解表
属性 参数 描述
tasks tasks 分配给团队的任务列表
agents agents 团队成员Agent列表
process process 执行流程(sequential或hierarchical),默认sequential
verbose verbose 执行期间的日志详细程度,默认False
manager_llm manager_llm 层级流程中管理Agent使用的语言模型
memory memory 用于存储执行记忆(短期、长期、实体记忆)
cache cache 是否缓存工具执行结果,默认True
planning planning 启用规划能力,在每次迭代前发送数据给AgentPlanner
stream stream 启用流式输出,实时接收更新
3.3.3 使用YAML配置(推荐方式)

agents.yaml

# src/my_project/config/agents.yaml
researcher:
  role: >
    {topic} 高级数据研究员
  goal: >
    发掘 {topic} 领域的前沿发展
  backstory: >
    你是一位经验丰富的研究员,擅长发现 {topic} 领域的最新发展。
    以能够找到最相关的信息并以清晰简洁的方式呈现而闻名。

reporting_analyst:
  role: >
    {topic} 报告分析师
  goal: >
    基于 {topic} 数据分析和研究发现创建详细报告
  backstory: >
    你是一位注重细节的分析师。以能够将复杂数据转化为清晰
    简洁的报告而闻名,使他人易于理解和采取行动。

tasks.yaml

# src/my_project/config/tasks.yaml
research_task:
  description: >
    对 {topic} 进行深入研究
    确保找到任何有趣且相关的信息,当前年份是2025年。
  expected_output: >
    一份包含10个要点的列表,记录关于 {topic} 最相关的信息
  agent: researcher

reporting_task:
  description: >
    审查你获得的上下文,并将每个主题扩展为报告的完整章节。
    确保报告详尽,包含所有相关信息。
  expected_output: >
    一份完整的报告,包含主要主题,每个主题都有完整的信息章节。
    格式为markdown,不带 '```'
  agent: reporting_analyst
  markdown: true
  output_file: report.md

crew.py

# src/my_project/crew.py
from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task
from crewai_tools import SerperDevTool

@CrewBase
class LatestAiDevelopmentCrew():
    """最新AI发展研究团队"""
    
    agents_config = 'config/agents.yaml'
    tasks_config = 'config/tasks.yaml'

    @agent
    def researcher(self) -> Agent:
        return Agent(
            config=self.agents_config['researcher'],
            verbose=True,
            tools=[SerperDevTool()]
        )

    @agent
    def reporting_analyst(self) -> Agent:
        return Agent(
            config=self.agents_config['reporting_analyst'],
            verbose=True
        )

    @task
    def research_task(self) -> Task:
        return Task(
            config=self.tasks_config['research_task'],
        )

    @task
    def reporting_task(self) -> Task:
        return Task(
            config=self.tasks_config['reporting_task'],
            output_file='report.md'
        )

    @crew
    def crew(self) -> Crew:
        """创建最新AI发展团队"""
        return Crew(
            agents=self.agents,
            tasks=self.tasks,
            process=Process.sequential,
            verbose=True,
        )
3.3.4 Crew输出结构
# 执行Crew
crew_output = crew.kickoff()

# 访问输出
print(f"原始输出: {crew_output.raw}")

# JSON格式输出
if crew_output.json_dict:
    print(f"JSON输出: {json.dumps(crew_output.json_dict, indent=2)}")

# Pydantic模型输出
if crew_output.pydantic:
    print(f"Pydantic输出: {crew_output.pydantic}")

# 各任务输出
print(f"任务输出: {crew_output.tasks_output}")

# Token使用统计
print(f"Token使用: {crew_output.token_usage}")

3.4 Process(流程)

Process定义了团队中任务的执行方式,决定了Agent之间的协作模式。

3.4.1 流程类型
┌─────────────────────────────────────────────────────────────────────┐
│                       Process 流程类型                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                  Sequential (顺序流程)                       │   │
│  │                                                             │   │
│  │   Task 1 ───▶ Task 2 ───▶ Task 3 ───▶ Task 4              │   │
│  │     │           │           │           │                  │   │
│  │     ▼           ▼           ▼           ▼                  │   │
│  │  Agent A     Agent B     Agent C     Agent D              │   │
│  │                                                             │   │
│  │  特点:任务按顺序执行,前一任务的输出作为下一任务的上下文     │   │
│  │                                                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                Hierarchical (层级流程)                       │   │
│  │                                                             │   │
│  │                  ┌──────────────┐                           │   │
│  │                  │   Manager    │                           │   │
│  │                  │   (管理者)   │                           │   │
│  │                  └──────┬───────┘                           │   │
│  │                         │                                   │   │
│  │         ┌───────────────┼───────────────┐                  │   │
│  │         │               │               │                  │   │
│  │         ▼               ▼               ▼                  │   │
│  │    ┌────────┐     ┌────────┐     ┌────────┐               │   │
│  │    │Agent A │     │Agent B │     │Agent C │               │   │
│  │    │ Task 1 │     │ Task 2 │     │ Task 3 │               │   │
│  │    └────────┘     └────────┘     └────────┘               │   │
│  │                                                             │   │
│  │  特点:管理者Agent协调团队,根据能力分配任务,验证结果       │   │
│  │                                                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │               Consensual (共识流程) [计划中]                 │   │
│  │                                                             │   │
│  │  特点:Agent之间协作决策,民主化的任务管理方式               │   │
│  │  状态:计划中,尚未实现                                      │   │
│  │                                                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
3.4.2 顺序流程(Sequential)
from crewai import Crew, Process

# 创建顺序执行的团队
crew = Crew(
    agents=my_agents,
    tasks=my_tasks,
    process=Process.sequential  # 默认值
)

特点:

  • 任务按照定义的顺序依次执行
  • 前一任务的输出自动成为下一任务的上下文
  • 适用于线性工作流
3.4.3 层级流程(Hierarchical)
from crewai import Crew, Process

# 创建层级执行的团队
crew = Crew(
    agents=my_agents,
    tasks=my_tasks,
    process=Process.hierarchical,
    manager_llm="gpt-4o"  # 必须指定manager_llm或manager_agent
    # 或者使用自定义管理Agent
    # manager_agent=my_manager_agent
)

特点:

  • 自动创建或使用指定的管理Agent
  • 管理者负责任务规划、委派和验证
  • 任务不预先分配,由管理者根据Agent能力动态分配
  • 适用于复杂的多步骤任务

💡 思考:层级流程中的管理者Agent是如何工作的?

🤔 解答:管理者Agent会:

  1. 分析所有待完成的任务
  2. 评估每个Agent的角色、目标和能力
  3. 将任务委派给最合适的Agent
  4. 审查任务输出,评估完成质量
  5. 在必要时重新分配或调整任务

4. 角色定义与设计艺术 🎭

4.1 角色设计的三要素

┌─────────────────────────────────────────────────────────────────┐
│                    角色设计三要素                                │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   ┌─────────────────────────────────────────────────────────┐  │
│   │                    Role (角色)                          │  │
│   │                                                         │  │
│   │  定义Agent的职能和专业领域                               │  │
│   │  例如:"高级数据科学家"、"内容策略师"                    │  │
│   │                                                         │  │
│   └─────────────────────────────────────────────────────────┘  │
│                          │                                      │
│                          ▼                                      │
│   ┌─────────────────────────────────────────────────────────┐  │
│   │                    Goal (目标)                          │  │
│   │                                                         │  │
│   │  指导Agent决策的个人目标                                 │  │
│   │  例如:"分析复杂数据集并提供可操作的洞察"                │  │
│   │                                                         │  │
│   └─────────────────────────────────────────────────────────┘  │
│                          │                                      │
│                          ▼                                      │
│   ┌─────────────────────────────────────────────────────────┐  │
│   │                  Backstory (背景故事)                    │  │
│   │                                                         │  │
│   │  为Agent提供上下文和个性                                 │  │
│   │  例如:"你拥有10年数据科学经验,曾在多家                 │  │
│   │        财富500强企业担任首席数据科学家..."               │  │
│   │                                                         │  │
│   └─────────────────────────────────────────────────────────┘  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

4.2 角色设计最佳实践

4.2.1 明确且具体的角色定义
# ❌ 不推荐:模糊的角色定义
bad_agent = Agent(
    role="助手",
    goal="帮助完成任务",
    backstory="一个有用的助手"
)

# ✅ 推荐:具体明确的角色定义
good_agent = Agent(
    role="金融科技领域高级市场研究分析师",
    goal="识别金融科技市场的新兴趋势和投资机会,为战略决策提供数据驱动的洞察",
    backstory="""
        你是一位在金融服务行业拥有15年经验的市场研究专家。
        你曾在高盛和摩根士丹利的研究部门工作,专注于金融科技
        和数字银行领域。你以对市场趋势的敏锐洞察和对复杂数据
        的深入分析而闻名。你发表过多篇关于支付技术、区块链
        和数字货币的行业报告。
    """
)
4.2.2 角色协作设计
# 研究团队的角色设计示例
researcher = Agent(
    role="首席研究员",
    goal="收集和验证来自多个来源的高质量研究数据",
    backstory="""
        你是一位资深的学术研究员,拥有博士学位和20年的研究经验。
        你以严谨的研究方法和对信息准确性的执着追求而闻名。
        你的研究被顶级期刊引用超过1000次。
    """,
    tools=[SerperDevTool(), WikipediaTools()],
    allow_delegation=True
)

analyst = Agent(
    role="数据分析专家",
    goal="对研究数据进行深入分析,发现隐藏的模式和洞察",
    backstory="""
        你是一位数据科学专家,擅长统计分析和机器学习。
        你曾帮助多家《财富》500强企业从数据中提取商业价值。
        你特别擅长将复杂的分析结果转化为易于理解的洞察。
    """,
    tools=[],
    allow_delegation=False
)

writer = Agent(
    role="技术写作专家",
    goal="将研究发现转化为清晰、专业的书面报告",
    backstory="""
        你是一位获奖的技术作家,拥有工程学位和新闻学背景。
        你擅长将复杂的技术概念解释给非专业读者。你的文章
        以清晰、准确和引人入胜而著称。
    """,
    tools=[],
    allow_delegation=False
)

4.3 常见角色模板

# 📊 数据分析师
data_analyst = Agent(
    role="高级数据分析师",
    goal="从数据中提取有价值的洞察,支持业务决策",
    backstory="精通SQL、Python和各种数据可视化工具的分析专家"
)

# 💻 软件开发者
developer = Agent(
    role="全栈软件开发工程师",
    goal="设计和实现高质量、可维护的软件解决方案",
    backstory="拥有多年企业级应用开发经验的资深工程师"
)

# 📝 内容创作者
content_creator = Agent(
    role="内容策略师",
    goal="创作引人入胜的内容,提升品牌影响力",
    backstory="曾为多个知名品牌打造成功内容营销策略的专家"
)

# 🔍 质量检查员
qa_specialist = Agent(
    role="质量保证专家",
    goal="确保输出符合最高质量标准",
    backstory="对细节有极致追求的质量控制专家"
)

# 🎯 项目经理
project_manager = Agent(
    role="项目管理专家",
    goal="协调资源、管理进度,确保项目成功交付",
    backstory="PMP认证的项目管理专家,曾成功交付数百个项目"
)

5. 工作流编排实战 ⚡

5.1 顺序工作流

from crewai import Agent, Task, Crew, Process

# 步骤1:定义Agent
researcher = Agent(
    role="AI研究员",
    goal="研究AI领域的最新进展",
    backstory="经验丰富的AI研究专家"
)

writer = Agent(
    role="技术作家",
    goal="撰写易于理解的技术文章",
    backstory="擅长将复杂概念简单化的作家"
)

editor = Agent(
    role="编辑",
    goal="确保内容质量和准确性",
    backstory="严谨的内容编辑专家"
)

# 步骤2:定义任务
research_task = Task(
    description="研究大语言模型的最新发展趋势",
    expected_output="包含5个关键发现的研究摘要",
    agent=researcher
)

writing_task = Task(
    description="基于研究摘要撰写一篇技术博客",
    expected_output="1500字的技术博客文章",
    agent=writer,
    context=[research_task]  # 依赖研究任务的输出
)

editing_task = Task(
    description="编辑和优化博客文章",
    expected_output="经过润色的最终文章",
    agent=editor,
    context=[writing_task],  # 依赖写作任务的输出
    output_file="final_article.md"
)

# 步骤3:创建团队
content_crew = Crew(
    agents=[researcher, writer, editor],
    tasks=[research_task, writing_task, editing_task],
    process=Process.sequential,
    verbose=True
)

# 步骤4:启动执行
result = content_crew.kickoff()
print(result)

5.2 层级工作流

from crewai import Agent, Task, Crew, Process

# 定义专家Agent
market_analyst = Agent(
    role="市场分析师",
    goal="分析市场数据和趋势",
    backstory="拥有10年金融市场分析经验"
)

financial_analyst = Agent(
    role="财务分析师",
    goal="评估财务数据和风险",
    backstory="CFA持证人,专注于投资分析"
)

strategy_consultant = Agent(
    role="战略顾问",
    goal="制定投资策略建议",
    backstory="顶级咨询公司合伙人背景"
)

# 定义任务(不预先分配Agent)
market_analysis = Task(
    description="分析科技行业2024年的市场表现和趋势",
    expected_output="详细的市场分析报告"
)

financial_assessment = Task(
    description="评估目标公司的财务健康状况",
    expected_output="财务评估报告,包含关键指标分析"
)

strategy_recommendation = Task(
    description="基于市场和财务分析,制定投资建议",
    expected_output="投资策略建议书"
)

# 创建层级团队
investment_crew = Crew(
    agents=[market_analyst, financial_analyst, strategy_consultant],
    tasks=[market_analysis, financial_assessment, strategy_recommendation],
    process=Process.hierarchical,
    manager_llm="gpt-4o",  # 管理Agent使用的模型
    verbose=True
)

result = investment_crew.kickoff()

5.3 异步任务执行

# 异步执行多个独立任务
research_ai_task = Task(
    description="研究AI领域的最新发展",
    expected_output="AI发展报告",
    async_execution=True,  # 异步执行
    agent=research_agent
)

research_blockchain_task = Task(
    description="研究区块链技术的最新应用",
    expected_output="区块链应用报告",
    async_execution=True,  # 异步执行
    agent=research_agent
)

# 汇总任务等待异步任务完成
summary_task = Task(
    description="整合AI和区块链研究,撰写综合分析报告",
    expected_output="技术趋势综合分析报告",
    agent=writer_agent,
    context=[research_ai_task, research_blockchain_task]  # 等待两个异步任务
)
┌─────────────────────────────────────────────────────────────────┐
│                    异步任务执行流程                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│      ┌────────────────┐       ┌────────────────┐               │
│      │ AI Research    │       │ Blockchain     │               │
│      │ (async=True)   │       │ Research       │               │
│      │                │       │ (async=True)   │               │
│      └───────┬────────┘       └───────┬────────┘               │
│              │                        │                        │
│              │     并行执行           │                        │
│              │◀───────────────────────│                        │
│              │                        │                        │
│              ▼                        ▼                        │
│      ┌─────────────────────────────────────────┐               │
│      │              Summary Task               │               │
│      │    context=[ai_task, blockchain_task]   │               │
│      │           等待所有异步任务完成           │               │
│      └─────────────────────────────────────────┘               │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

5.4 带回调的工作流

from crewai import TaskOutput

def task_completed_callback(output: TaskOutput):
    """任务完成后的回调函数"""
    print(f"""
    ✅ 任务完成!
    📋 任务描述: {output.description}
    📄 输出结果: {output.raw}
    🤖 执行Agent: {output.agent}
    """)
    # 可以在这里发送通知、记录日志等

def step_callback(step_output):
    """每个步骤完成后的回调"""
    print(f"步骤输出: {step_output}")

# 创建带回调的任务
research_task = Task(
    description="研究AI最新进展",
    expected_output="研究报告",
    agent=researcher,
    callback=task_completed_callback  # 任务完成回调
)

# 创建带回调的团队
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    process=Process.sequential,
    step_callback=step_callback,      # 步骤回调
    task_callback=task_completed_callback  # 任务回调
)

6. Flows:事件驱动的高级编排 🌊

6.1 Flows概述

CrewAI Flows是一个强大的功能,专为简化AI工作流的创建和管理而设计。Flows允许开发者高效地组合和协调编码任务和Crews。

┌─────────────────────────────────────────────────────────────────────┐
│                       Flows 核心特点                                │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   🔗 简化的工作流创建                                               │
│      轻松链接多个Crews和任务,创建复杂的AI工作流                    │
│                                                                     │
│   📊 状态管理                                                       │
│      Flows使工作流中不同任务之间的状态管理和共享变得超级简单        │
│                                                                     │
│   ⚡ 事件驱动架构                                                   │
│      基于事件驱动模型构建,实现动态和响应式的工作流                 │
│                                                                     │
│   🔀 灵活的控制流                                                   │
│      在工作流中实现条件逻辑、循环和分支                             │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

6.2 核心装饰器

from crewai.flow.flow import Flow, start, listen, router

class MyFlow(Flow):
    
    @start()  # 标记流程入口点
    def begin_flow(self):
        """流程开始"""
        return "开始数据"
    
    @listen(begin_flow)  # 监听begin_flow的输出
    def process_data(self, data):
        """处理数据"""
        return f"处理后: {data}"
    
    @router(process_data)  # 基于输出进行路由
    def route_decision(self):
        """决定下一步"""
        if self.state.success:
            return "success_path"
        return "failure_path"
    
    @listen("success_path")  # 监听路由结果
    def handle_success(self):
        """处理成功情况"""
        pass
    
    @listen("failure_path")
    def handle_failure(self):
        """处理失败情况"""
        pass

6.3 完整Flow示例

from crewai.flow.flow import Flow, listen, start
from litellm import completion

class ResearchFlow(Flow):
    model = "gpt-4o-mini"

    @start()
    def generate_topic(self):
        """生成研究主题"""
        print("开始Flow...")
        print(f"Flow状态ID: {self.state['id']}")

        response = completion(
            model=self.model,
            messages=[{
                "role": "user",
                "content": "生成一个有趣的AI研究主题",
            }],
        )

        topic = response["choices"][0]["message"]["content"]
        self.state["topic"] = topic
        print(f"研究主题: {topic}")
        return topic

    @listen(generate_topic)
    def research_topic(self, topic):
        """研究选定的主题"""
        response = completion(
            model=self.model,
            messages=[{
                "role": "user",
                "content": f"提供关于'{topic}'的5个关键研究发现",
            }],
        )

        findings = response["choices"][0]["message"]["content"]
        self.state["findings"] = findings
        return findings

    @listen(research_topic)
    def generate_summary(self, findings):
        """生成研究摘要"""
        response = completion(
            model=self.model,
            messages=[{
                "role": "user",
                "content": f"基于以下发现撰写简短摘要:\n{findings}",
            }],
        )

        summary = response["choices"][0]["message"]["content"]
        self.state["summary"] = summary
        return summary

# 运行Flow
flow = ResearchFlow()
flow.plot("research_flow")  # 生成可视化图表
result = flow.kickoff()
print(f"最终结果: {result}")

6.4 条件控制:or_ 和 and_

from crewai.flow.flow import Flow, start, listen, or_, and_

class ConditionalFlow(Flow):
    
    @start()
    def start_method(self):
        return "开始"
    
    @start()
    def another_start(self):
        return "另一个开始"
    
    # or_: 任一方法完成即触发
    @listen(or_(start_method, another_start))
    def log_any(self, result):
        """任意一个start方法完成就执行"""
        print(f"收到结果: {result}")
    
    # and_: 所有方法完成才触发
    @listen(and_(start_method, another_start))
    def log_all(self, results):
        """两个start方法都完成后执行"""
        print(f"所有结果: {results}")

6.5 路由器模式

from crewai.flow.flow import Flow, start, listen, router
from random import random

class RouterFlow(Flow):
    
    @start()
    def analyze_data(self):
        """分析数据并设置置信度"""
        confidence = random()
        self.state["confidence"] = confidence
        return {"confidence": confidence}
    
    @router(analyze_data)
    def route_by_confidence(self):
        """根据置信度路由"""
        if self.state["confidence"] > 0.8:
            return "high_confidence"
        elif self.state["confidence"] > 0.5:
            return "medium_confidence"
        return "low_confidence"
    
    @listen("high_confidence")
    def handle_high_confidence(self):
        print("置信度高,直接执行策略")
        return "执行策略A"
    
    @listen("medium_confidence")
    def handle_medium_confidence(self):
        print("置信度中等,需要进一步分析")
        return "执行策略B"
    
    @listen("low_confidence")
    def handle_low_confidence(self):
        print("置信度低,收集更多数据")
        return "执行策略C"
┌─────────────────────────────────────────────────────────────────┐
│                    Router 路由流程                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│              ┌─────────────────┐                                │
│              │  analyze_data   │                                │
│              │    @start()     │                                │
│              └────────┬────────┘                                │
│                       │                                         │
│                       ▼                                         │
│              ┌─────────────────┐                                │
│              │ route_by_       │                                │
│              │ confidence      │                                │
│              │   @router()     │                                │
│              └────────┬────────┘                                │
│                       │                                         │
│         ┌─────────────┼─────────────┐                          │
│         │             │             │                          │
│         ▼             ▼             ▼                          │
│  ┌────────────┐ ┌────────────┐ ┌────────────┐                  │
│  │   "high    │ │  "medium   │ │   "low     │                  │
│  │ confidence"│ │ confidence"│ │ confidence"│                  │
│  └─────┬──────┘ └─────┬──────┘ └─────┬──────┘                  │
│        │              │              │                          │
│        ▼              ▼              ▼                          │
│  ┌────────────┐ ┌────────────┐ ┌────────────┐                  │
│  │  handle_   │ │  handle_   │ │  handle_   │                  │
│  │   high     │ │  medium    │ │   low      │                  │
│  │ @listen()  │ │ @listen()  │ │ @listen()  │                  │
│  └────────────┘ └────────────┘ └────────────┘                  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

6.6 在Flow中集成Crew

from crewai.flow.flow import Flow, listen, start
from crewai import Crew, Agent, Task, Process
from pydantic import BaseModel

class AnalysisState(BaseModel):
    topic: str = ""
    research_result: str = ""
    analysis_result: str = ""

class ResearchAnalysisFlow(Flow[AnalysisState]):
    
    @start()
    def initialize(self):
        """初始化研究主题"""
        print(f"开始研究: {self.state.topic}")
        return {"topic": self.state.topic}
    
    @listen(initialize)
    def research_with_crew(self, data):
        """使用Crew进行研究"""
        
        # 创建研究Agent
        researcher = Agent(
            role="高级研究员",
            goal=f"深入研究{self.state.topic}",
            backstory="经验丰富的领域研究专家"
        )
        
        # 创建研究任务
        research_task = Task(
            description=f"全面研究{self.state.topic}的最新发展",
            expected_output="详细的研究报告",
            agent=researcher
        )
        
        # 创建并执行Crew
        research_crew = Crew(
            agents=[researcher],
            tasks=[research_task],
            process=Process.sequential,
            verbose=True
        )
        
        result = research_crew.kickoff()
        self.state.research_result = result.raw
        return result.raw
    
    @listen(research_with_crew)
    def analyze_with_crew(self, research_data):
        """使用另一个Crew进行分析"""
        
        analyst = Agent(
            role="数据分析专家",
            goal="分析研究数据并提取洞察",
            backstory="专注于数据分析和趋势预测"
        )
        
        analysis_task = Task(
            description=f"分析以下研究数据并提供关键洞察:\n{research_data}",
            expected_output="分析报告和行动建议",
            agent=analyst
        )
        
        analysis_crew = Crew(
            agents=[analyst],
            tasks=[analysis_task],
            process=Process.sequential
        )
        
        result = analysis_crew.kickoff()
        self.state.analysis_result = result.raw
        return result.raw
    
    @listen(analyze_with_crew)
    def generate_report(self, analysis):
        """生成最终报告"""
        print("=== 最终报告 ===")
        print(f"主题: {self.state.topic}")
        print(f"研究结果: {self.state.research_result[:200]}...")
        print(f"分析结果: {analysis}")
        return analysis

# 运行Flow
async def run_flow():
    flow = ResearchAnalysisFlow()
    flow.plot("research_analysis_flow")
    result = await flow.kickoff_async(inputs={"topic": "人工智能在医疗领域的应用"})
    return result

# asyncio.run(run_flow())

7. 状态管理与持久化 💾

7.1 非结构化状态管理

from crewai.flow.flow import Flow, listen, start

class UnstructuredFlow(Flow):
    
    @start()
    def first_method(self):
        # 状态自动包含'id'字段
        print(f"状态ID: {self.state['id']}")
        
        # 动态添加任意属性
        self.state['counter'] = 0
        self.state['message'] = "Hello"
        self.state['data'] = {"key": "value"}
    
    @listen(first_method)
    def second_method(self):
        # 更新状态
        self.state['counter'] += 1
        self.state['message'] += " - 已更新"
        
    @listen(second_method)
    def third_method(self):
        print(f"最终状态: {self.state}")

特点:

  • 灵活性高,可动态添加属性
  • 适合简单或高度动态的工作流
  • 快速原型开发友好

7.2 结构化状态管理

from crewai.flow.flow import Flow, listen, start
from pydantic import BaseModel

class WorkflowState(BaseModel):
    # 注意:'id'字段会自动添加到所有状态
    counter: int = 0
    message: str = ""
    completed_steps: list = []

class StructuredFlow(Flow[WorkflowState]):
    
    @start()
    def first_method(self):
        # 访问自动生成的ID
        print(f"状态ID: {self.state.id}")
        
        # 类型安全的状态更新
        self.state.message = "开始结构化流程"
        self.state.completed_steps.append("first_method")
    
    @listen(first_method)
    def second_method(self):
        self.state.counter += 1
        self.state.message += " - 第二步"
        self.state.completed_steps.append("second_method")
    
    @listen(second_method)
    def third_method(self):
        self.state.counter += 1
        self.state.completed_steps.append("third_method")
        print(f"最终状态: {self.state}")

特点:

  • 类型安全,IDE支持良好
  • 验证确保数据一致性
  • 适合需要严格状态结构的应用

7.3 状态持久化

from crewai.flow.flow import Flow, start, listen
from crewai.flow.persistence import persist

# 类级别持久化 - 所有方法状态自动持久化
@persist  # 默认使用SQLiteFlowPersistence
class PersistentFlow(Flow):
    
    @start()
    def initialize(self):
        self.state["counter"] = 1
        print(f"初始化。状态ID: {self.state['id']}")
    
    @listen(initialize)
    def increment(self):
        self.state["counter"] += 1
        print(f"计数器: {self.state['counter']}")

# 方法级别持久化 - 更精细的控制
class SelectivePersistFlow(Flow):
    
    @persist  # 仅此方法持久化
    @start()
    def critical_step(self):
        if "runs" not in self.state:
            self.state["runs"] = 0
        self.state["runs"] += 1
        print(f"关键步骤执行次数: {self.state['runs']}")
┌─────────────────────────────────────────────────────────────────┐
│                    状态持久化工作原理                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   ┌──────────────┐                                              │
│   │  Flow 执行   │                                              │
│   └──────┬───────┘                                              │
│          │                                                      │
│          ▼                                                      │
│   ┌──────────────┐    ┌─────────────────────────────────┐      │
│   │ 状态更新     │───▶│  SQLite数据库                    │      │
│   └──────────────┘    │  - 唯一状态ID                    │      │
│          │            │  - 序列化的状态数据              │      │
│          ▼            │  - 时间戳                        │      │
│   ┌──────────────┐    └─────────────────────────────────┘      │
│   │ 系统重启     │                                              │
│   └──────┬───────┘                  │                          │
│          │                          │                          │
│          ▼                          ▼                          │
│   ┌──────────────┐    ┌─────────────────────────────────┐      │
│   │ 状态恢复     │◀───│  从数据库加载状态                │      │
│   └──────────────┘    └─────────────────────────────────┘      │
│          │                                                      │
│          ▼                                                      │
│   ┌──────────────┐                                              │
│   │ 继续执行     │                                              │
│   └──────────────┘                                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

8. 实战案例:构建AI研究团队 🎯

8.1 项目结构

ai_research_team/
├── src/
│   └── ai_research_team/
│       ├── __init__.py
│       ├── main.py
│       ├── crew.py
│       ├── config/
│       │   ├── agents.yaml
│       │   └── tasks.yaml
│       └── tools/
│           └── custom_tool.py
├── pyproject.toml
├── README.md
└── .env

8.2 配置文件

agents.yaml

# src/ai_research_team/config/agents.yaml

lead_researcher:
  role: >
    首席AI研究员
  goal: >
    领导{topic}领域的前沿研究,发现突破性的技术洞察
  backstory: >
    你是人工智能领域的顶尖研究员,拥有MIT博士学位和15年研究经验。
    你曾在DeepMind和OpenAI工作,发表过多篇顶级会议论文。
    你以敏锐的洞察力和严谨的研究方法著称,善于发现技术发展的
    关键趋势和潜在突破点。

data_analyst:
  role: >
    高级数据分析师
  goal: >
    分析{topic}相关数据,提供量化洞察和趋势预测
  backstory: >
    你是一位数据科学专家,精通统计分析、机器学习和数据可视化。
    你曾帮助多家科技巨头从海量数据中提取关键洞察。你的分析报告
    以数据驱动、逻辑严密而闻名。

technical_writer:
  role: >
    技术内容专家
  goal: >
    将复杂的{topic}研究转化为清晰、专业的书面报告
  backstory: >
    你是一位获奖的技术作家,拥有计算机科学和新闻学双重背景。
    你擅长将复杂的技术概念转化为易于理解的内容,你的文章
    被《MIT Technology Review》和《Wired》等媒体转载。

quality_reviewer:
  role: >
    质量审核专家
  goal: >
    确保关于{topic}的所有输出内容准确、完整、专业
  backstory: >
    你是一位严谨的技术审核专家,拥有10年的学术审稿经验。
    你以对细节的极致追求和对质量的严格要求而闻名,
    没有任何错误能逃过你的审查。

tasks.yaml

# src/ai_research_team/config/tasks.yaml

comprehensive_research:
  description: >
    对{topic}进行全面深入的研究。
    
    要求:
    1. 收集最新的学术论文、行业报告和技术博客
    2. 分析当前的技术发展状态和关键突破
    3. 识别主要玩家和他们的技术路线
    4. 预测未来12-24个月的发展趋势
    
    当前年份是{year},确保所有信息都是最新的。
  expected_output: >
    一份结构化的研究报告,包含:
    - 技术概述和发展历程
    - 当前最先进技术分析
    - 关键玩家和竞争格局
    - 10个关键发现
    - 未来趋势预测
  agent: lead_researcher

data_analysis:
  description: >
    基于研究报告,进行深入的数据分析。
    
    要求:
    1. 量化分析{topic}的市场规模和增长趋势
    2. 分析技术采用率和应用场景分布
    3. 评估投资和资金流向
    4. 进行竞争力量化对比
  expected_output: >
    一份数据分析报告,包含:
    - 市场规模和增长预测(带数据支持)
    - 技术采用率分析
    - 投资趋势分析
    - 竞争格局量化评估
    - 至少3个数据可视化描述
  agent: data_analyst

report_writing:
  description: >
    整合研究和分析结果,撰写专业的技术报告。
    
    要求:
    1. 结构清晰,逻辑严密
    2. 语言专业但易于理解
    3. 包含执行摘要和详细章节
    4. 提供可操作的建议
  expected_output: >
    一份3000字左右的专业技术报告,包含:
    - 执行摘要(300字)
    - 技术背景介绍
    - 当前发展状态
    - 数据分析洞察
    - 未来趋势预测
    - 战略建议
    - 参考文献
  agent: technical_writer
  markdown: true
  output_file: research_report.md

quality_review:
  description: >
    对研究报告进行全面的质量审核。
    
    审核要点:
    1. 事实准确性检验
    2. 逻辑一致性检查
    3. 内容完整性评估
    4. 语言质量和专业性审核
    5. 格式规范性检查
  expected_output: >
    质量审核报告,包含:
    - 整体质量评分(1-10分)
    - 发现的问题列表
    - 改进建议
    - 最终审核意见
    
    如果报告质量达标(8分以上),输出"APPROVED";
    否则提供详细的改进建议。
  agent: quality_reviewer

8.3 团队实现

# src/ai_research_team/crew.py

from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task, before_kickoff, after_kickoff
from crewai_tools import SerperDevTool, WebsiteSearchTool
from datetime import datetime

@CrewBase
class AIResearchTeam():
    """AI研究团队"""
    
    agents_config = 'config/agents.yaml'
    tasks_config = 'config/tasks.yaml'
    
    @before_kickoff
    def prepare_inputs(self, inputs):
        """准备输入数据"""
        inputs['year'] = datetime.now().year
        print(f"🚀 启动AI研究团队 - 主题: {inputs.get('topic', '未指定')}")
        return inputs
    
    @after_kickoff
    def process_output(self, output):
        """处理输出"""
        print("✅ 研究任务完成!")
        return output
    
    @agent
    def lead_researcher(self) -> Agent:
        """首席研究员"""
        return Agent(
            config=self.agents_config['lead_researcher'],
            verbose=True,
            tools=[SerperDevTool(), WebsiteSearchTool()],
            allow_delegation=True,
            memory=True
        )
    
    @agent
    def data_analyst(self) -> Agent:
        """数据分析师"""
        return Agent(
            config=self.agents_config['data_analyst'],
            verbose=True,
            tools=[SerperDevTool()],
            memory=True
        )
    
    @agent
    def technical_writer(self) -> Agent:
        """技术作家"""
        return Agent(
            config=self.agents_config['technical_writer'],
            verbose=True,
            memory=True
        )
    
    @agent
    def quality_reviewer(self) -> Agent:
        """质量审核员"""
        return Agent(
            config=self.agents_config['quality_reviewer'],
            verbose=True,
            memory=True
        )
    
    @task
    def comprehensive_research(self) -> Task:
        """综合研究任务"""
        return Task(
            config=self.tasks_config['comprehensive_research']
        )
    
    @task
    def data_analysis(self) -> Task:
        """数据分析任务"""
        return Task(
            config=self.tasks_config['data_analysis'],
            context=[self.comprehensive_research()]
        )
    
    @task
    def report_writing(self) -> Task:
        """报告撰写任务"""
        return Task(
            config=self.tasks_config['report_writing'],
            context=[self.comprehensive_research(), self.data_analysis()]
        )
    
    @task
    def quality_review(self) -> Task:
        """质量审核任务"""
        return Task(
            config=self.tasks_config['quality_review'],
            context=[self.report_writing()]
        )
    
    @crew
    def crew(self) -> Crew:
        """创建AI研究团队"""
        return Crew(
            agents=self.agents,
            tasks=self.tasks,
            process=Process.sequential,
            verbose=True,
            memory=True,
            cache=True,
            output_log_file="research_logs.json"
        )

8.4 主程序入口

# src/ai_research_team/main.py

import sys
from ai_research_team.crew import AIResearchTeam

def run():
    """运行AI研究团队"""
    inputs = {
        'topic': 'Large Language Models and AI Agents'
    }
    
    try:
        result = AIResearchTeam().crew().kickoff(inputs=inputs)
        print("\n" + "="*60)
        print("📊 研究报告生成完成")
        print("="*60)
        print(result)
        return result
    except Exception as e:
        print(f"❌ 执行出错: {e}")
        raise

def plot():
    """生成团队工作流可视化图"""
    AIResearchTeam().crew().plot("research_team_workflow")
    print("📈 工作流图已生成: research_team_workflow.html")

if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] == "plot":
        plot()
    else:
        run()

8.5 运行项目

# 安装依赖
crewai install

# 激活虚拟环境
source .venv/bin/activate

# 运行研究团队
crewai run

# 或者直接运行
python src/ai_research_team/main.py

# 生成工作流可视化
python src/ai_research_team/main.py plot

9. 高级特性与最佳实践 🌟

9.1 记忆系统

CrewAI支持三种类型的记忆:

┌─────────────────────────────────────────────────────────────────┐
│                    CrewAI 记忆系统                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                 短期记忆 (Short-term)                    │   │
│  │                                                         │   │
│  │  - 存储当前对话/任务的上下文                             │   │
│  │  - 帮助Agent保持对话连贯性                               │   │
│  │  - 任务结束后清除                                        │   │
│  │                                                         │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                 长期记忆 (Long-term)                     │   │
│  │                                                         │   │
│  │  - 存储跨会话的知识和经验                                │   │
│  │  - 帮助Agent从过去的任务中学习                           │   │
│  │  - 持久化存储                                            │   │
│  │                                                         │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                 实体记忆 (Entity)                        │   │
│  │                                                         │   │
│  │  - 存储关于特定实体的信息                                │   │
│  │  - 如人物、地点、概念等                                  │   │
│  │  - 跨任务保持实体信息一致性                              │   │
│  │                                                         │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
# 启用记忆的Crew
crew = Crew(
    agents=[agent1, agent2],
    tasks=[task1, task2],
    memory=True,  # 启用记忆系统
    embedder={
        "provider": "openai",
        "config": {
            "model": "text-embedding-3-small"
        }
    }
)

9.2 知识源集成

from crewai import Agent, Crew, Task
from crewai.knowledge.source import TextKnowledgeSource, PDFKnowledgeSource

# 创建知识源
text_knowledge = TextKnowledgeSource(
    content="这是一些专业领域知识...",
    metadata={"domain": "AI"}
)

pdf_knowledge = PDFKnowledgeSource(
    file_path="research_paper.pdf"
)

# Agent使用知识源
expert_agent = Agent(
    role="领域专家",
    goal="回答专业问题",
    backstory="拥有深厚专业知识的专家",
    knowledge_sources=[text_knowledge, pdf_knowledge]
)

# 或在Crew级别共享
crew = Crew(
    agents=[expert_agent],
    tasks=[...],
    knowledge_sources=[text_knowledge, pdf_knowledge]  # 所有Agent可访问
)

9.3 人机协作(Human-in-the-Loop)

from crewai import Task

# 需要人工审核的任务
review_task = Task(
    description="撰写重要的客户提案",
    expected_output="专业的商业提案文档",
    agent=proposal_writer,
    human_input=True  # 启用人工审核
)

# 使用Guardrail进行验证
def human_approval(result):
    print(f"请审核以下内容:\n{result.raw}")
    approval = input("是否批准?(yes/no): ")
    if approval.lower() == "yes":
        return (True, result.raw)
    return (False, "内容需要修改,请重新生成")

approval_task = Task(
    description="生成营销文案",
    expected_output="吸引人的营销文案",
    agent=copywriter,
    guardrail=human_approval
)

9.4 流式输出

# 启用流式输出
crew = Crew(
    agents=[researcher],
    tasks=[task],
    stream=True  # 启用流式输出
)

# 迭代接收输出
streaming = crew.kickoff(inputs={"topic": "AI"})
for chunk in streaming:
    print(chunk.content, end="", flush=True)

# 获取最终结果
result = streaming.result

9.5 错误处理与重试

from crewai import Agent, Task

# 配置重试机制
robust_agent = Agent(
    role="可靠执行者",
    goal="完成任务并处理错误",
    backstory="经验丰富的执行专家",
    max_retry_limit=3,          # 最大重试3次
    max_iter=25,                # 最大迭代25次
    max_execution_time=300,     # 5分钟超时
    respect_context_window=True # 自动处理上下文溢出
)

# 任务级别的Guardrail重试
task = Task(
    description="执行关键任务",
    expected_output="符合要求的输出",
    agent=robust_agent,
    guardrail=validation_function,
    guardrail_max_retries=5  # Guardrail失败最多重试5次
)

9.6 性能优化建议

# 1. 使用缓存减少重复计算
crew = Crew(
    agents=[...],
    tasks=[...],
    cache=True  # 启用工具结果缓存
)

# 2. 合理设置速率限制
agent = Agent(
    role="API调用者",
    goal="调用外部API",
    backstory="...",
    max_rpm=10  # 限制每分钟最多10次请求
)

# 3. 异步执行独立任务
task1 = Task(
    description="独立任务1",
    async_execution=True,
    agent=agent1
)

task2 = Task(
    description="独立任务2", 
    async_execution=True,
    agent=agent2
)

# 4. 使用function_calling_llm优化成本
agent = Agent(
    role="研究员",
    goal="...",
    backstory="...",
    llm="gpt-4",              # 主要推理用高端模型
    function_calling_llm="gpt-4o-mini"  # 工具调用用低成本模型
)

# 5. 上下文窗口管理
agent = Agent(
    role="分析师",
    goal="...",
    backstory="...",
    respect_context_window=True  # 自动压缩超长上下文
)

10. CrewAI与其他框架对比 ⚔️

10.1 对比总览

┌─────────────────────────────────────────────────────────────────────────┐
│                      多Agent框架对比分析                                │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌───────────────────────────────────────────────────────────────────┐ │
│  │                      CrewAI                                       │ │
│  │                                                                   │ │
│  │  ✅ 独立框架,不依赖LangChain                                      │ │
│  │  ✅ 角色扮演设计,自然的团队协作                                    │ │
│  │  ✅ Crews + Flows 双重编排模式                                     │ │
│  │  ✅ 高性能,资源占用低                                             │ │
│  │  ✅ 企业级就绪                                                     │ │
│  │                                                                   │ │
│  │  适用:需要团队协作的复杂任务                                       │ │
│  │                                                                   │ │
│  └───────────────────────────────────────────────────────────────────┘ │
│                                                                         │
│  ┌───────────────────────────────────────────────────────────────────┐ │
│  │                      LangGraph                                    │ │
│  │                                                                   │ │
│  │  ✅ 灵活的图结构定义                                               │ │
│  │  ✅ 与LangChain生态深度集成                                        │ │
│  │  ⚠️ 需要较多样板代码                                               │ │
│  │  ⚠️ 状态管理模式复杂                                               │ │
│  │                                                                   │ │
│  │  适用:需要复杂图结构的工作流                                       │ │
│  │                                                                   │ │
│  └───────────────────────────────────────────────────────────────────┘ │
│                                                                         │
│  ┌───────────────────────────────────────────────────────────────────┐ │
│  │                      AutoGen                                      │ │
│  │                                                                   │ │
│  │  ✅ 对话式Agent协作                                                │ │
│  │  ✅ 微软背景,企业支持                                             │ │
│  │  ⚠️ 缺乏内置流程概念                                               │ │
│  │  ⚠️ 大规模任务编排复杂                                             │ │
│  │                                                                   │ │
│  │  适用:对话为主的Agent协作                                          │ │
│  │                                                                   │ │
│  └───────────────────────────────────────────────────────────────────┘ │
│                                                                         │
│  ┌───────────────────────────────────────────────────────────────────┐ │
│  │                      ChatDev                                      │ │
│  │                                                                   │ │
│  │  ✅ 首创流程概念                                                   │ │
│  │  ✅ 软件开发场景优化                                               │ │
│  │  ⚠️ 实现较为刚性                                                   │ │
│  │  ⚠️ 定制化困难                                                     │ │
│  │                                                                   │ │
│  │  适用:代码生成和软件开发任务                                       │ │
│  │                                                                   │ │
│  └───────────────────────────────────────────────────────────────────┘ │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

10.2 性能对比

根据官方benchmarks,CrewAI在某些任务上的性能优势:

  • QA任务:比LangGraph快5.76倍(参考对比
  • 代码任务:更快的完成时间和更高的评估分数(详细分析

10.3 选择建议

场景 推荐框架 原因
团队协作任务 CrewAI 角色扮演设计,自然协作
复杂图工作流 LangGraph 灵活的图结构定义
对话式协作 AutoGen 对话驱动设计
软件开发 ChatDev/CrewAI 专门优化
企业生产环境 CrewAI 企业级就绪,高性能

11. 总结与展望 🔮

11.1 核心要点回顾

┌─────────────────────────────────────────────────────────────────┐
│                    CrewAI 核心要点                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  🎭 角色设计                                                    │
│     - Role + Goal + Backstory 三要素定义Agent身份              │
│     - 明确具体的角色描述带来更好的执行效果                      │
│                                                                 │
│  📋 任务定义                                                    │
│     - 清晰的description和expected_output                       │
│     - 使用context建立任务依赖关系                               │
│     - Guardrails确保输出质量                                    │
│                                                                 │
│  👥 团队协作                                                    │
│     - Sequential流程适合线性工作流                              │
│     - Hierarchical流程适合复杂决策任务                          │
│     - 合理分配Agent能力和职责                                   │
│                                                                 │
│  🌊 高级编排                                                    │
│     - Flows提供事件驱动的精确控制                               │
│     - Crews + Flows组合实现最大灵活性                           │
│     - 状态管理和持久化确保可靠性                                │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

11.2 最佳实践总结

  1. 角色设计

    • 每个Agent应有明确、具体的角色定义
    • 背景故事应该丰富且相关
    • 目标应该清晰且可衡量
  2. 任务规划

    • 将复杂任务分解为可管理的子任务
    • 建立清晰的任务依赖关系
    • 使用Guardrails确保输出质量
  3. 流程选择

    • 简单线性流程用Sequential
    • 需要动态决策时用Hierarchical
    • 复杂业务逻辑用Flows
  4. 性能优化

    • 启用缓存减少重复计算
    • 合理设置速率限制
    • 使用异步执行并行任务

11.3 未来展望

CrewAI正在快速发展,未来值得期待的方向:

  • Consensual Process:计划中的共识流程,实现Agent之间的民主决策
  • 更强大的记忆系统:增强跨会话学习能力
  • 企业级功能增强:更多的可观测性、安全性和合规性功能
  • 多模态支持深化:更好的图像、音频处理能力

💡 思考:多Agent系统的未来是什么?

🤔 解答:随着LLM能力的不断提升和Agent框架的成熟,我们正在迈向一个AI团队可以自主完成复杂任务的时代。CrewAI代表了这一趋势的最佳实践——通过角色扮演和团队协作,让AI不仅仅是工具,而是真正的协作伙伴。


12. 参考文献 📚

官方资源

  1. CrewAI官方文档

    • https://docs.crewai.com/
    • 最权威的CrewAI学习资源
  2. CrewAI GitHub仓库

    • https://github.com/crewAIInc/crewAI
    • 源代码和最新更新
  3. CrewAI示例仓库

    • https://github.com/crewAIInc/crewAI-examples
    • 丰富的实战案例

学习资源

  1. DeepLearning.AI课程

  2. CrewAI社区

    • https://community.crewai.com
    • 社区讨论和问题解答

相关工具

  1. CrewAI Tools

    • https://github.com/joaomdmoura/crewai-tools
    • 官方工具集
  2. LiteLLM

    • https://github.com/BerriAI/litellm
    • 统一的LLM调用接口

📝 作者说明:本文基于CrewAI官方文档和GitHub仓库编写,力求准确全面地介绍CrewAI框架。由于框架持续更新,建议读者参考官方文档获取最新信息。


如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、评论💬!有任何问题也欢迎在评论区讨论。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐