课程0基础Agent开发课 / 前沿方向 / CrewAI框架-角色协作式多Agent开发
— 12 min read

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 核心概念

CrewAI角色协作架构图
Crew 统领多个 Agent(各含 Role/Goal/Backstory),通过 Tasks 和 Process 协作完成目标

Crew
团队

Process
执行流程

Agents
角色集合

Tasks
任务集合

Sequential
顺序执行

Hierarchical
层级管理

Agent 1
研究员

Agent 2
写手

Agent 3
编辑

Task 1
信息检索

Task 2
内容撰写

Task 3
质量审核

Agent(角色):一个 Agent 对应一个有具体职责的角色,由 role(职位)、goal(目标)、backstory(背景故事)三要素定义。背景故事不是摆设,它会注入 prompt,让 LLM 更好地扮演该角色。

Task(任务):一件具体的工作,包含任务描述、期望输出格式、负责执行的 Agent。Task 之间可以有依赖关系(context 参数)。

Crew(团队):把 Agent 和 Task 组装在一起的容器,决定执行流程(Sequential 或 Hierarchical)。

Process(流程)

  • Sequential(顺序执行):任务按顺序执行,前一个任务的输出自动传给下一个任务作为上下文。适合有明确前后依赖的流水线。
  • Hierarchical(层级管理):引入一个"经理 Agent"负责任务分配和质量把控,其他 Agent 向经理汇报。适合需要动态调度的复杂任务。

1.2 安装与基础配置

bash
pip install crewai crewai-tools
python
# 设置 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 完整示例:内容创作团队

场景:给定一个技术主题,自动完成"研究 → 撰写 → 审核"三步流程,产出一篇高质量的技术文章。

python
# 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。

python
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:

python
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 也能服务真实流量。

本页目录