大模型应用技术之 Agent框架 CrewAI
1. CrewAI 原理与介绍
1.1 什么是 CrewAI
CrewAI 是一个开源的多智能体(Multi-Agent)编排框架,专为构建自主协作的 AI 智能体团队而设计。它提供了一种结构化的方法来创建、管理和协调多个专业化的 AI 智能体,使它们能够协作完成复杂的任务,而无需人工干预。
1.2 核心设计理念
CrewAI 基于以下核心设计理念:
- 基于角色的代理设计(Role-Based Agent Design):每个智能体通过定义特定的角色、目标、背景故事和专业知识来实现专业化分工
- 自主任务委派(Autonomous Task Delegation):框架内置智能任务分配机制,根据智能体的能力和角色自动将任务分配给最合适的智能体
- 智能体协作(Agent Collaboration):提供框架支持智能体之间的自主通信、知识共享和结果传递,实现真正的团队协作
- 简化编排(Simplified Orchestration):通过直观的 API 和抽象层,简化多智能体系统的构建和管理复杂度
1.3 技术架构
CrewAI 采用分层架构设计:
┌─────────────────────────────────────┐
│ 应用层 (Application) │
│ 用户定义 Crew、Agent、Task │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 编排层 (Orchestration) │
│ 任务分配、流程控制、结果聚合 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 执行层 (Execution) │
│ LLM 调用、工具执行、状态管理 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 基础设施层 (Infrastructure) │
│ LLM Provider、Memory、Storage │
└─────────────────────────────────────┘
1.4 版本信息
数据来源:PyPI (2025-12)
- CrewAI 最新版本:
1.7.2 - LangGraph 最新版本:
1.0.5 - Python 版本要求:Python 3.10+
- 主要依赖:LangChain, Pydantic, OpenAI/Anthropic 等
2. CrewAI 数据流向
2.1 整体数据流架构
CrewAI 的数据流向遵循以下流程:
2.2 详细数据流说明
阶段 1:任务接收与分解
- 输入:用户请求(自然语言或结构化任务)
- 处理:Crew 接收任务,根据任务复杂度进行分解
- 输出:任务列表(Task List)
阶段 2:任务分配
- 输入:任务列表
- 处理:任务分配器根据 Agent 的角色、能力和当前负载进行智能分配
- 输出:Agent-Task 映射关系
阶段 3:并行执行
- 输入:分配给各 Agent 的任务
- 处理:
- Agent 接收任务上下文
- 调用 LLM 进行推理和决策
- 根据需要调用工具(Tools)
- 生成执行结果
- 输出:各 Agent 的执行结果
阶段 4:结果聚合
- 输入:各 Agent 的执行结果
- 处理:
- 结果聚合器收集所有 Agent 的输出
- 根据任务依赖关系进行结果整合
- 检查任务完成度
- 输出:聚合后的结果
阶段 5:迭代与输出
- 输入:聚合结果
- 处理:
- 任务协调器评估任务完成情况
- 如未完成,生成新的子任务并返回阶段 2
- 如已完成,生成最终输出
- 输出:最终结果返回给用户
2.3 Agent 内部数据流
单个 Agent 执行任务时的内部数据流:
3. CrewAI 核心组件
3.1 Agent(智能体)
Agent 是 CrewAI 的核心执行单元,代表一个具有特定角色和专业能力的 AI 智能体。
关键属性
- role(角色):定义 Agent 的专业角色,如"数据分析师"、“内容撰写者”
- goal(目标):Agent 的长期目标
- backstory(背景故事):描述 Agent 的专业背景和经验,帮助 LLM 更好地理解其角色
- llm(语言模型):指定 Agent 使用的 LLM 实例
- tools(工具):Agent 可调用的工具列表
- verbose(详细模式):是否输出详细的执行日志
- allow_delegation(允许委派):是否允许 Agent 将任务委派给其他 Agent
代码示例 (CrewAI v1.7.2)
from crewai import Agent
from langchain_openai import ChatOpenAI
# 创建 LLM 实例
llm = ChatOpenAI(model="gpt-4", temperature=0.7)
# 定义数据分析师 Agent
data_analyst = Agent(
role='数据分析师',
goal='分析数据并提供有价值的洞察',
backstory='你是一位经验丰富的数据分析师,擅长从复杂数据中提取关键信息。',
llm=llm,
verbose=True,
allow_delegation=False
)
3.2 Task(任务)
Task 定义了 Agent 需要完成的具体工作单元。
关键属性
- description(描述):任务的详细描述
- agent(智能体):负责执行该任务的 Agent
- expected_output(预期输出):描述任务的预期输出格式
- context(上下文):指定该任务依赖的前序任务
- async_execution(异步执行):是否异步执行任务
代码示例
from crewai import Task
# 定义数据分析任务
analysis_task = Task(
description='分析过去6个月的销售数据,识别趋势和异常',
agent=data_analyst,
expected_output='一份包含趋势分析、异常识别和建议的数据分析报告'
)
3.3 Crew(团队)
Crew 是由多个 Agent 组成的协作团队,负责协调和管理任务的执行。
关键属性
- agents(智能体列表):组成团队的 Agent 列表
- tasks(任务列表):需要执行的任务列表
- process(流程):定义任务执行流程(Process.sequential / Process.hierarchical)
- memory(记忆):是否启用记忆功能(ShortTerm/LongTerm/Entity Memory)
- planning(规划):是否启用自动规划功能 (CrewAI 新特性)
代码示例
from crewai import Crew, Process
# 创建团队
crew = Crew(
agents=[data_analyst, content_writer],
tasks=[analysis_task, writing_task],
process=Process.sequential, # 顺序执行
verbose=True,
memory=True,
planning=True # 启用规划能力
)
# 执行任务
result = crew.kickoff(inputs={'topic': '销售数据分析'})
3.4 Tool(工具)
Tool 扩展了 Agent 的能力,允许 Agent 调用外部功能和服务。
内置工具
- SerperDevTool:网络搜索
- FileReadTool:文件读取
- FileWriteTool:文件写入
- DirectoryReadTool:目录读取
- WebsiteSearchTool:网站搜索
自定义工具
from crewai.tools import tool
@tool("计算器工具")
def calculator(expression: str) -> str:
"""计算数学表达式"""
try:
result = eval(expression)
return str(result)
except Exception as e:
return f"错误: {str(e)}"
# 使用自定义工具
data_analyst.tools.append(calculator)
3.5 Flow(流程)
Flow 是 CrewAI 的高级特性(CrewAI Flows),提供了类似 LangGraph 的状态驱动工作流控制。
Flow 的特点
- 基于装饰器:通过
@start和@listen装饰器定义流程 - 状态管理:内置状态传递
- 灵活路由:支持基于代码逻辑的条件路由
代码示例
from crewai.flow.flow import Flow, start, listen
class AnalysisFlow(Flow):
@start()
def gather_data(self):
# 步骤 1: 收集数据
return "raw_data"
@listen(gather_data)
def analyze_data(self, data):
# 步骤 2: 分析数据
return f"analyzed_{data}"
# 执行流程
flow = AnalysisFlow()
flow.kickoff()
4. CrewAI vs LangGraph 对比分析
4.1 框架概述对比
| 特性 | CrewAI | LangGraph |
|---|---|---|
| 最新版本 | 1.7.2 |
1.0.5 |
| 核心抽象 | Agent, Task, Crew, Flow | Graph, Node, Edge, State |
| 设计理念 | 高层抽象:专注"角色"与"协作",开箱即用的多智能体团队 | 底层控制:专注"状态"与"图",极度灵活的计算图编排 |
| 学习曲线 | 低:类似搭积木,定义角色和任务即可 | 中/高:需要理解图论、状态机和 Reducer |
| 任务编排 | 自动规划、顺序/层级处理、简单装饰器 Flow | 显式定义图结构、循环、条件分支、中断与恢复 |
| 状态管理 | 隐式管理(通过 Context 传递) | 显式管理(全局 State Schema) |
4.2 CrewAI 的优势 (v1.7.2)
1. 开箱即用的多智能体协作
CrewAI 内置了复杂的协作模式(如层级管理、自动规划),你不需要自己写循环来让 Agent 互相聊天。
# CrewAI: 一行开启层级管理模式(Manager 自动分配任务)
crew = Crew(
agents=[...],
tasks=[...],
process=Process.hierarchical, # 自动启用 Manager Agent
manager_llm=gpt4
)
2. 专注于"人"的设计
CrewAI 强迫你思考 Agent 的"人设"(Role, Backstory),这通常能激发 LLM 更好的表现。
3. 极速原型开发
对于大多数标准的"流水线"或"协作"任务,CrewAI 的代码量通常是 LangGraph 的 1/3。
4.3 LangGraph 的优势 (v1.0.5)
1. 极致的控制力
LangGraph 允许你用“状态图”的方式精确控制执行路径(循环、分支、人工介入 Human-in-the-loop 的时机等),适合把复杂业务流程显式化。
# LangGraph: 显式定义图结构(伪代码,见下方“最小可运行示例”)
workflow = StateGraph(State)
workflow.add_node("research", research_node)
workflow.add_node("review", review_node)
workflow.add_conditional_edges("review", should_continue, {"accept": END, "revise": "research"})
2. 持久化与状态回溯
LangGraph (配合 LangGraph Cloud/Studio) 提供了强大的 Checkpoint 机制,可以保存当前运行状态,随时暂停、恢复或修改状态后再继续运行。
3. 复杂非线性逻辑
对于非线性的、充满不确定性的业务逻辑(例如:复杂的客服多轮对话跳转),图(Graph)是比链(Chain)更自然的表达方式。
4.4 选择建议
✅ 选择 CrewAI 当…
- 任务是"协作型"的:你需要一群"专家"互相配合(写代码+测试+文档)。
- 需要快速落地:你不想花时间设计复杂的状态机,只想让 AI 把活干完。
- 流程相对确定:虽然支持 Flow,但 CrewAI 最擅长的还是线性和层级任务。
- 关注结果优于过程:你更在乎 Agent 产出的内容质量,而不是它中间怎么跳转的。
✅ 选择 LangGraph 当…
- 任务是"流程型"的:业务逻辑极其复杂,有大量的
if-else、循环和状态判断。 - 需要人工介入:需要在流程中间暂停,让人类审核,然后修改状态继续运行。
- 需要生产级可观测性:需要对每一步的状态进行精细的监控、持久化和调试。
- 构建单一超级 Agent:例如构建一个像 ChatGPT 那样的全能助手,通常 LangGraph 更合适。
4.5 LangGraph v1.0.5 最小可运行示例(同一任务:研究→审阅→可能返工)
说明:LangGraph 采用“状态 + 节点函数 + 边”的方式组织流程。下面示例可直接运行,并演示
add_conditional_edges形成循环。
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, END
from langgraph.version import __version__ as langgraph_version
print("LangGraph version:", langgraph_version)
class State(TypedDict, total=False):
topic: str
research: str
draft: str
review: str
def research_node(state: State) -> State:
topic = state["topic"]
return {"research": f"研究要点:关于 {topic} 的3个关键点..."}
def review_node(state: State) -> State:
# 真实场景:这里可接入 LLM 做审阅,或接入人工审核
research = state.get("research", "")
ok = len(research) > 10
return {"review": "accept" if ok else "revise"}
def should_continue(state: State) -> Literal["accept", "revise"]:
return "accept" if state.get("review") == "accept" else "revise"
workflow = StateGraph(State)
workflow.add_node("research", research_node)
workflow.add_node("review", review_node)
workflow.set_entry_point("research")
workflow.add_edge("research", "review")
workflow.add_conditional_edges("review", should_continue, {"accept": END, "revise": "research"})
app = workflow.compile()
result = app.invoke({"topic": "AI Agents"})
print(result)
5. CrewAI 适用场景
5.1 内容生成工厂
多个 Agent(策划、写手、编辑、SEO专家)流水线式作业,生产高质量文章。
5.2 自动化调研分析
Agent A 搜索信息,Agent B 阅读网页,Agent C 总结数据,Agent D 生成报告。
5.3 辅助编程团队
架构师设计接口,开发者写代码,测试工程师写用例,技术作家写文档。
5.4 智能客服分类与处理
分类 Agent 识别意图,分发给售后 Agent 或 售前 Agent 处理。
6. 快速开始指南
6.1 安装
# 安装最新版 CrewAI
pip install crewai==1.7.2
# 安装最新版 LangGraph
pip install langgraph==1.0.5
6.2 完整代码示例 (v1.7.2)
import os
from crewai import Agent, Task, Crew, Process
# 假设已设置 OPENAI_API_KEY 环境变量
# 1. 定义 Agents
researcher = Agent(
role='高级技术研究员',
goal='发现 AI 领域的最新突破',
backstory='你是一名专注于大语言模型的研究员,擅长从复杂的论文中提取关键创新点。',
verbose=True
)
writer = Agent(
role='技术博主',
goal='将复杂的技术概念转化为通俗易懂的文章',
backstory='你擅长科普技术,你的文章风格幽默风趣,深受开发者喜爱。',
verbose=True
)
# 2. 定义 Tasks
task1 = Task(
description='研究关于 "AI Agents" 的最新趋势,列出3个关键突破。',
expected_output='一份包含3个AI Agent关键突破的简报列表。',
agent=researcher
)
task2 = Task(
description='基于研究员的简报,写一篇博客文章介绍这些突破。',
expected_output='一篇不少于500字的Markdown格式博客文章。',
agent=writer,
context=[task1] # 显式依赖 task1 的结果
)
# 3. 定义 Crew
crew = Crew(
agents=[researcher, writer],
tasks=[task1, task2],
process=Process.sequential,
verbose=True,
planning=True # 启用规划以优化执行路径
)
# 4. 执行
result = crew.kickoff()
print("######################")
print(result)
6.3 LangGraph 最小示例(版本检查)
from langgraph.version import __version__ as langgraph_version
print("LangGraph version:", langgraph_version)
7. 最佳实践
- 善用
context:在 Task 中显式指定context=[prev_task],这能让下游 Agent 精确获取上游的信息,而不是依赖模糊的隐式传递。 - 精细化
Role和Backstory:不要偷懒,越详细的背景故事,LLM 的角色扮演效果越好,幻觉越少。 - 使用
Memory:在 Crew 初始化时开启memory=True,对于长任务链非常有用,可以避免 Agent 遗忘之前的关键信息。 - 工具单一职责:自定义 Tool 时,功能越单一越好,Agent 更容易学会何时调用。
- 从 Sequential 开始:先用顺序模式跑通流程,只有在非常复杂且需要动态调整时,才考虑 Hierarchical 模式。
更多推荐

所有评论(0)