CrewAI框架-角色协作式多Agent开发
> **时效说明**:本文内容以 2026 年 3 月为基准。CrewAI 是截至 2026 年 3 月最流行的角色协作式多 Agent 框架之一,API 持续演进,使用前建议查阅最新文档。
CrewAI 框架:角色协作式多 Agent 开发
时效说明:本文内容以 2026 年 3 月为基准。CrewAI 是截至 2026 年 3 月最流行的角色协作式多 Agent 框架之一,API 持续演进,使用前建议查阅最新文档。
Multi-Agent 系统的核心挑战是协作:多个 Agent 如何分工、如何传递信息、谁来决定任务顺序。LangGraph 用图结构解决这个问题,适合需要精细控制流程的场景。CrewAI 选择了另一个方向:用"团队管理"的比喻来组织 Agent,让开发者像搭建工作团队一样搭建 Agent 系统。
一个 CrewAI 项目就像管理一支真实的团队:有研究员、有写手、有编辑,每个人有自己的角色和职责,经理负责协调任务分配,最终共同产出一份成果。
1.1 核心概念
Crew 统领多个 Agent(各含 Role/Goal/Backstory),通过 Tasks 和 Process 协作完成目标
Agent(角色):一个 Agent 对应一个有具体职责的角色,由 role(职位)、goal(目标)、backstory(背景故事)三要素定义。背景故事不是摆设,它会注入 prompt,让 LLM 更好地扮演该角色。
Task(任务):一件具体的工作,包含任务描述、期望输出格式、负责执行的 Agent。Task 之间可以有依赖关系(context 参数)。
Crew(团队):把 Agent 和 Task 组装在一起的容器,决定执行流程(Sequential 或 Hierarchical)。
Process(流程):
Sequential(顺序执行):任务按顺序执行,前一个任务的输出自动传给下一个任务作为上下文。适合有明确前后依赖的流水线。Hierarchical(层级管理):引入一个"经理 Agent"负责任务分配和质量把控,其他 Agent 向经理汇报。适合需要动态调度的复杂任务。
1.2 安装与基础配置
pip install crewai crewai-tools
# 设置 LLM(CrewAI 默认使用 OpenAI,也支持本地模型)
import os
os.environ["OPENAI_API_KEY"] = "your_api_key"
# 如果要用 Ollama 本地模型:
# os.environ["OPENAI_API_BASE"] = "http://localhost:11434/v1"
# os.environ["OPENAI_MODEL_NAME"] = "qwen2.5:7b"
1.3 完整示例:内容创作团队
场景:给定一个技术主题,自动完成"研究 → 撰写 → 审核"三步流程,产出一篇高质量的技术文章。
# content_crew.py
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, FileReadTool
from langchain_openai import ChatOpenAI
# 初始化 LLM,所有 Agent 共享同一个 LLM 实例(也可以为不同 Agent 指定不同模型)
llm = ChatOpenAI(model="gpt-4o", temperature=0.3)
# 初始化工具
search_tool = SerperDevTool() # Google 搜索工具,需要 SERPER_API_KEY
# ==================== 定义 Agent ====================
researcher = Agent(
role="技术研究员",
goal="收集关于 {topic} 的最新、准确的技术信息,包括核心概念、实际应用案例和业界观点",
backstory="""
你是一位拥有 10 年经验的技术研究员,专注于 AI 和软件工程领域。
你擅长从复杂的技术文档中提炼出关键信息,善于识别哪些内容对开发者真正有价值。
你的研究报告以准确性和实用性著称,不堆砌概念,每个技术点都有具体例子支撑。
""",
tools=[search_tool],
llm=llm,
# 允许 Agent 在任务执行过程中自主决定是否调用工具、调用几次
allow_delegation=False, # 研究员不把任务转包给其他 Agent
verbose=True, # 打印执行过程,便于调试
max_iter=5, # 最多迭代 5 次,防止无限循环
)
writer = Agent(
role="技术写手",
goal="基于研究员提供的资料,撰写一篇面向中高级开发者的技术教程",
backstory="""
你是《Python Cookbook》风格的技术作者,擅长把复杂的技术概念用清晰直接的语言解释清楚。
你的写作原则:代码示例优先,理论为辅;每个知识点都配有可运行的代码;
避免泛泛而谈,聚焦于开发者实际工作中会遇到的场景。
""",
tools=[], # 写手不需要搜索工具,专注于内容创作
llm=llm,
allow_delegation=False,
verbose=True,
)
editor = Agent(
role="技术编辑",
goal="审核并完善文章,确保技术准确性、逻辑连贯性和阅读体验",
backstory="""
你是一位严苛的技术编辑,同时具备扎实的技术背景和出色的写作能力。
你的审核标准:技术描述是否准确,代码示例是否能运行,
文章结构是否清晰,读者读完是否真的有所收获。
你不只是挑错,还会提出具体的改进建议。
""",
tools=[],
llm=llm,
allow_delegation=False,
verbose=True,
)
# ==================== 定义 Task ====================
research_task = Task(
description="""
研究 {topic} 这一技术主题,重点收集以下信息:
1. 核心概念和工作原理(用开发者能理解的方式解释)
2. 主要应用场景和真实案例
3. 与相关技术的对比(优势和局限)
4. 最佳实践和常见坑
5. 最新动态(近 6 个月的重要更新)
输出格式:结构化的研究报告,每个部分清晰标注,总长 800-1200 字。
""",
expected_output="一份结构清晰的技术研究报告,涵盖核心概念、应用场景、最佳实践",
agent=researcher,
)
writing_task = Task(
description="""
基于研究报告,撰写一篇面向中高级开发者的技术教程,主题为 {topic}。
写作要求:
- 开篇直接切入问题,不要废话
- 至少包含 2 个可运行的代码示例,代码注释解释"为什么"
- 包含对比表格(如适用)
- 结尾有明确的小结和下一步建议
- 总字数 1500-2000 字,中文写作
""",
expected_output="一篇符合要求的技术教程,包含代码示例和清晰的结构",
agent=writer,
# context 表示这个 Task 依赖 research_task 的输出作为输入
# CrewAI 会自动把 research_task 的结果注入到这个 Task 的 prompt 中
context=[research_task],
)
editing_task = Task(
description="""
审核写手提交的技术文章,从以下维度进行评估和改进:
技术准确性:
- 核心概念解释是否正确
- 代码示例是否有明显错误
- 技术对比是否公平客观
内容质量:
- 结构是否清晰,读者容易理解
- 是否有冗余或跑题的内容
- 小结和下一步建议是否有实际价值
直接输出修改后的完整文章,在文末附上一段编辑说明,列出主要修改点。
""",
expected_output="修改后的完整文章 + 编辑说明",
agent=editor,
context=[writing_task], # 编辑任务依赖写作任务的输出
)
# ==================== 组建 Crew ====================
content_crew = Crew(
agents=[researcher, writer, editor],
tasks=[research_task, writing_task, editing_task],
process=Process.sequential, # 顺序执行:研究 → 撰写 → 编辑
verbose=True,
# memory=True, # 开启后 Agent 会记住跨任务的上下文(需要额外配置)
)
# ==================== 运行 ====================
if __name__ == "__main__":
result = content_crew.kickoff(
inputs={"topic": "vLLM 生产部署"}
# inputs 中的变量会替换 Task description 中的 {topic} 占位符
)
print("\n" + "="*60)
print("最终输出:")
print(result.raw)
1.4 Hierarchical Process:引入经理 Agent
当任务之间的依赖关系复杂,或者需要动态决定哪个 Agent 处理哪个子任务时,使用 Hierarchical Process。
from crewai import Agent, Task, Crew, Process
# 经理 Agent:不直接做任务,负责协调和质量把控
# CrewAI 会自动创建经理,也可以自定义
manager = Agent(
role="项目经理",
goal="确保团队高效协作,产出高质量的内容",
backstory="经验丰富的技术项目经理,擅长任务分解和质量把控",
llm=llm,
allow_delegation=True, # 经理必须开启委托权限
)
hierarchical_crew = Crew(
agents=[researcher, writer, editor],
tasks=[research_task, writing_task, editing_task],
process=Process.hierarchical,
manager_agent=manager, # 指定自定义经理,不指定则 CrewAI 自动创建
verbose=True,
)
1.5 内置工具概览
| 工具 | 用途 | 适合 Agent |
|---|---|---|
| SerperDevTool | Google 搜索 | 研究员 |
| FileReadTool | 读取本地文件 | 分析师 |
| DirectoryReadTool | 列出目录文件 | 代码审查员 |
| CodeInterpreterTool | 执行 Python 代码 | 数据分析师 |
| BrowserbaseLoadTool | 抓取网页内容 | 研究员 |
| GithubSearchTool | 搜索 GitHub 仓库 | 技术研究员 |
自定义工具也很简单,CrewAI 工具本质上就是带描述的 LangChain Tool:
from crewai_tools import BaseTool
from pydantic import BaseModel, Field
class DatabaseQueryInput(BaseModel):
"""工具的输入 Schema,CrewAI 用它生成参数说明给 LLM。"""
query: str = Field(description="SQL 查询语句")
database: str = Field(description="目标数据库名称", default="production")
class DatabaseQueryTool(BaseTool):
name: str = "数据库查询工具"
description: str = "执行 SQL 查询,从业务数据库中检索数据"
args_schema: type[BaseModel] = DatabaseQueryInput
def _run(self, query: str, database: str = "production") -> str:
"""实际执行逻辑。返回字符串,CrewAI 会把结果注入 Agent 的上下文。"""
# 实际实现:连接数据库,执行查询,返回结果
return f"查询结果(模拟):{query} 在 {database} 中返回 42 条记录"
1.6 CrewAI vs LangGraph 选型
| 维度 | CrewAI | LangGraph |
|---|---|---|
| 上手难度 | 低,声明式配置 | 高,需要理解图结构 |
| 流程控制 | 有限,Sequential/Hierarchical | 灵活,任意图结构 |
| 适合场景 | 固定流水线,角色分工明确 | 复杂条件分支,循环,状态机(State Machine,根据当前状态和输入决定下一步行为的控制模型) |
| 调试体验 | verbose 日志,直观 | 需要可视化工具辅助 |
| 生产稳定性 | 相对较好 | 取决于图设计质量 |
| 定制化空间 | 中等 | 极高 |
选型原则很简单:如果能把任务明确地分解为"谁做什么、按什么顺序",用 CrewAI;如果流程里有复杂的条件判断、循环迭代、动态路由,用 LangGraph。
1.7 小结
CrewAI 的核心价值是降低 Multi-Agent 开发的认知成本。用"团队管理"的比喻替代"状态机"(State Machine)和"图结构",让开发者可以用直觉来设计 Agent 系统。
实际使用中要注意几点:Task 的 expected_output 描述越具体,Agent 的输出质量越稳定;max_iter 要设置合理上限,防止 Agent 陷入无意义的循环;生产环境建议关掉 verbose 日志,改用结构化日志记录关键信息。
下一章介绍 vLLM 生产部署,解决 Ollama 无法支撑高并发场景的问题,让本地 LLM 也能服务真实流量。