CrewAI 实战:用角色扮演多智能体协作完成复杂任务

CrewAI 是一个以”角色扮演”为核心范式多智能体框架,它让你把复杂任务拆解成多个有明确职责的 Agent(如研究员、作家、审校),由它们像一支团队一样协作完成工作。相比把全部逻辑塞进单个大模型对话,角色化分工能显著提升输出的专业度与可控性。本文从核心抽象讲起,带你用 CrewAI 跑通第一个 Crew,并给出生产化与成本控制要点。

一、为什么需要角色化多智能体

1.1 单 Agent 的天花板

单个大模型对话在面对”既要检索资料、又要写报告、还要保证事实准确”的复合任务时,往往顾此失彼:它可能在同一个上下文里反复横跳,既当裁判又当运动员,结果要么遗漏关键信息,要么给出看似合理却经不起推敲的结论。人类团队之所以高效,是因为有分工——有人负责找资料,有人负责动笔,有人负责挑错。多智能体框架正是把这套组织方式搬到 AI 工作流里。

1.2 CrewAI 的核心抽象

CrewAI 把协作拆成四个清晰的层次:Agent(角色) 定义”谁来做”,包含角色定位(role)、目标(goal)与背景故事(backstory);Task(任务) 定义”做什么”,描述期望产出与可调用工具;Crew(团队) 把多个 Agent 与 Task 组合起来,并指定协作流程(顺序或层级);Flow(流程) 则进一步用代码编排多步、带状态的工作流。这种”角色—任务—团队”的抽象非常贴近真实团队,上手成本低、可读性高。它与 AutoGen 的群聊式编排、LangGraph 的状态图编排 思路不同,更强调”职责隔离”,适合流程相对固定的业务场景。

维度CrewAIAutoGenLangGraph
核心隐喻角色化团队可对话 Agent 群状态图/节点
擅长场景固定流程协作自由讨论求解复杂有环流程
上手难度低中较高
可控性高(角色约束)中高(显式图)
与业务耦合角色即岗位对话即逻辑图即流程

二、5 分钟跑通第一个 Crew

2.1 安装

# 安装核心与官方工具集
pip install crewai crewai-tools

# 如需联网检索等能力,再装具体工具依赖
pip install duckduckgo-search

2.2 定义角色与任务

下面用”调研一个技术趋势并产出简报”作为示例:研究员负责搜集信息,作家负责成文。

from crewai import Agent, Task, Crew

researcher = Agent(
    role="资深技术调研员",
    goal="搜集并核实关于 {topic} 的最新事实与数据",
    backstory="你拥有十年技术媒体经验,只输出可溯源的信息。",
    verbose=True,
)

writer = Agent(
    role="技术专栏作家",
    goal="把调研结果写成 800 字通俗易懂的简报",
    backstory="你擅长把复杂概念讲给工程师听。",
    verbose=True,
)

research_task = Task(
    description="调研 {topic} 的主流方案、优缺点与代表项目",
    expected_output="3-5 条带来源的事实要点",
    agent=researcher,
)

write_task = Task(
    description="基于调研要点撰写简报",
    expected_output="一篇结构清晰的简报",
    agent=writer,
    context=[research_task],  # 依赖上一个任务的结果
)

crew = Crew(agents=[researcher, writer], tasks=[research_task, write_task])
result = crew.kickoff(inputs={"topic": "向量数据库"})
print(result)

2.3 运行与观察

设置环境变量 OPENAI_API_KEY(或 CrewAI 支持的其它模型后端)后直接运行。开启 verbose=True 能在终端看到每个 Agent 的推理过程,便于调试分工是否合理。注意 context 参数让作家任务自动拿到调研任务的产出,这是多 Agent 协作的关键纽带。

三、给 Agent 装上工具

3.1 内置工具与自定义工具

没有工具的 Agent 只能凭记忆作答,容易编造。CrewAI 通过 tools 注入真实能力,例如联网搜索、读取文档、调用 API。也可以把任意 Python 函数包装成工具,让 Agent 在需要时调用。

from crewai_tools import SerperDevTool, ScraperTool

search = SerperDevTool()
scraper = ScraperTool()

researcher = Agent(
    role="资深技术调研员",
    goal="搜集并核实关于 {topic} 的最新事实",
    backstory="你只输出可溯源的信息。",
    tools=[search, scraper],   # 赋予联网检索与网页抓取能力
    verbose=True,
)

# 自定义工具:把内部 API 封装给 Agent 调用
from crewai.tools import tool

@tool("查询内部订单量")
def order_count(day: str) -> str:
    """根据日期返回当日订单总量,参数格式 YYYY-MM-DD。"""
    # 这里调用真实后端或数据库
    return f"{day} 订单量:12893"

四、用 Flow 编排多步流程

4.1 用 @CrewBase 组织项目

当任务从”跑一次 Crew”升级为”可复用的流水线”,可以用 CrewBase 把角色、任务、团队集中声明,配合 @agent、@task 装饰器管理依赖,代码结构更清晰、更易维护。下面给出一个最小骨架:

from crewai import Agent, Task, Crew, Process
from crewai.project import CrewBase, agent, task, crew

@CrewBase
class BriefCrew:
    agents_config = "config/agents.yaml"
    tasks_config = "config/tasks.yaml"

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

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

    @task
    def research(self) -> Task:
        return Task(config=self.tasks_config["research"])

    @task
    def write(self) -> Task:
        return Task(config=self.tasks_config["write"], context=[self.research()])

    @crew
    def crew(self) -> Crew:
        return Crew(agents=[self.researcher(), self.writer()],
                    tasks=[self.research(), self.write()],
                    process=Process.sequential)

五、生产化要点

5.1 成本控制与超时

多 Agent 意味着多次模型调用,token 消耗会成倍增长。务必给每个 Agent 设置 max_rpm(每分钟最大请求数)防止触发限流,给 Task 设置 max_retry_limit 避免单次失败拖垮整条链路。结合 vLLM/SGLang/Ollama 等推理引擎 把底层模型替换为自建或低价端点,是压低单位成本最直接的手段;若是本地场景,可参考 本地大模型量化部署 把 Agent 跑在自有算力上。

5.2 错误重试与人工介入

生产中不要假设模型永远稳定。对关键任务启用重试与回退(fallback)模型;对涉及写操作或对外发送的任务,预留人工确认(human-in-the-loop)断点。把每次运行的输入、中间产物、最终输出落库,方便复盘与审计。

生产检查项建议
速率限制设置 max_rpm,避免触发 429
失败重试Task 级 max_retry_limit + 回退模型
成本控制优先低价/本地推理端点
可观测开启 verbose 并持久化轨迹日志
人工介入写操作前加确认断点

六、与既有 AI 栈的协同

CrewAI 不是孤岛。它可与 Dify + Ollama 搭建的私有 Agent 平台 互补——Dify 负责可视化编排与知识库,CrewAI 负责代码侧精细化的角色协作;也能和 Semantic Kernel、Spring AI 在企业 Java 体系中各司其职。如果你的团队已经在用上述任一框架,引入 CrewAI 的成本主要是”把业务岗位翻译成角色定义”,而非重写基础设施。

七、什么时候该用 CrewAI

当你的任务满足”可拆成多个职责、彼此有先后依赖、且希望每个环节产出可控”时,CrewAI 是低门槛的好选择。例如竞品分析、周报生成、代码评审流水线、客服工单分类与回复起草,都非常契合角色化分工。反之,若任务高度动态、需要 Agent 之间自由辩论才能收敛,AutoGen 的群聊模式可能更合适;若流程充满条件分支与回环,LangGraph 的图编排会更顺手。先用 CrewAI 把一个固定流程跑顺,再按需升级复杂度,是最稳妥的落地节奏。把”让 AI 组队干活”从概念变成可运行的生产力,往往就从定义第一个角色开始。

上一篇 WireGuard 实战:用极简 VPN 打造安全的点对点隧道
下一篇 k3s 实战:用轻量级 Kubernetes 搭建边缘与开发集群
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]