实战
用 CrewAI 搭一支「多智能体团队」:研究员 + 写手 + 审校角色分工
很多复杂任务,单个 Agent 一把梭容易「顾此失彼」:既要查资料、又要写得通顺、还得不出错。CrewAI 的解法是角色化多智能体——给每个 Agent 立人设、配工具、设协作 SOP,让一组「研究员 / 写手 / 审校」像真实团队一样把任务拆着干。它是最容易上手的多智能体框架,本教程从零搭一支「竞品调研小队」,30 分钟产出带引用的报告。
👥 本教程适合:想做「多人协作式」Agent 但被 LangGraph 学习曲线劝退的人。会 Python、装过 pip 即可,不需要图论基础。
先搞懂:CrewAI 的三个核心概念
用一句话理解:CrewAI 把「团队」拆成三个积木——Agent(人)、Task(活)、Crew(把人按流程组起来干活)。
| 概念 | 类比 | 你要填什么 |
|---|---|---|
| Agent | 团队里的一个角色 | 人设、目标、可用工具 |
| Task | 交给角色的一件活 | 描述、产出要求、负责 Agent |
| Crew | 项目组 + 流程 | 哪些 Agent、什么顺序 |
角色抽象快,但规模化后要换引擎。业内常见路径:先用 CrewAI 快速出原型,生产要精确路由控制时再迁 LangGraph。本教程聚焦把 CrewAI 跑顺。
Step 1:安装与准备 Key
1 装框架、配模型
pip install crewai crewai-tools
# 准备一个模型 Key(以 OpenAI 为例)
export OPENAI_API_KEY=sk-xxxxxxxx
# 可选:给研究员 Agent 接搜索工具
pip install duckduckgo-search
💡 CrewAI 模型中立,可换 LangChain 支持的任意模型。新手用 OpenAI 最省心;想降本可用国产模型适配层。
Step 2:定义三个 Agent 角色
2 立人设、定边界
from crewai import Agent
researcher = Agent(
role="竞品研究员",
goal="搜集目标产品的功能、定价、口碑",
backstory="资深行业分析师,只信有出处的信息",
tools=[DuckDuckGoSearchRun()],
verbose=True,
)
writer = Agent(
role="报告写手",
goal="把研究结果写成结构清晰的中文报告",
backstory="10 年科技媒体编辑,行文通俗",
)
reviewer = Agent(
role="事实审校",
goal="核对报告中的数字与引用是否准确",
backstory="严谨的核查编辑,零容忍编造",
)
人设写越具体,协作越稳。role/goal/backstory 就是给 Agent 的「岗位说明书」。含糊的人设会让 Agent 越界或偷懒。
Step 3:把活拆成 Task
3 一件活交给一个角色
from crewai import Task
t1 = Task(
description="调研竞品 {product} 的功能、定价、用户口碑,列出 5 条要点",
expected_output="带来源的要点清单",
agent=researcher,
)
t2 = Task(
description="基于调研结果,写一篇 800 字中文对比报告",
expected_output="Markdown 报告",
agent=writer,
context=[t1], # 依赖 t1 的产出
)
t3 = Task(
description="核对报告里的数字与引用,标出任何无法证实的说法",
expected_output="带修订建议的核查意见",
agent=reviewer,
context=[t2],
)
🔑 关键技巧:`context=[t1]` 表示「等 t1 干完,把它的产出喂给我」。这样任务自然形成流水线,不用你手动传参。
Step 4:组 Crew 并设定流程
4 把人按流程组起来
from crewai import Crew, Process
crew = Crew(
agents=[researcher, writer, reviewer],
tasks=[t1, t2, t3],
process=Process.sequential, # 顺序执行;也可 hierarchical 让经理 Agent 编排
)
result = crew.kickoff(inputs={"product": "龙虾智能体"})
print(result)
顺序 vs 层级。`sequential` 适合线性流水线;若任务间有分支,用 `hierarchical` 让一个「经理 Agent」动态派活,但成本更高。
Step 5:给研究员接真实工具
5 让 Agent 能上网/读文件
from crewai_tools import (
DuckDuckGoSearchRun, ScraperTool, FileReadTool
)
researcher.tools = [
DuckDuckGoSearchRun(), # 联网搜索
ScraperTool(), # 抓网页正文
FileReadTool(), # 读本地资料
]
🛠️ CrewAI 有几十种现成工具(GitHub、Notion、Slack…)。研究员能「自己查」,写手就有真料可写,审校也能对着来源核对。
Step 6:跑通并看过程日志
6 打开 verbose 看协作
# Agent 设了 verbose=True,运行时会打印每个角色的思考与动作
crew.kickoff(inputs={"product": "龙虾智能体"})
# 输出示例(节选):
# [研究员] 正在搜索 龙虾智能体 定价...
# [写手] 已收到 5 条要点,开始撰写...
# [审校] 发现第 3 条数字无出处,已标注待核实
👀 第一次跑一定开 verbose,你能清楚看到「谁在干什么、卡在哪」,方便调人设和任务描述。
Step 7:沉淀为可复用脚本
7 参数化,下次换产品直接跑
# 把上面封装成 research_crew.py,用命令行传产品名
import sys
from crewai import Crew
# ... 前面定义略 ...
if __name__ == "__main__":
prod = sys.argv[1]
print(crew.kickoff(inputs={"product": prod}))
# 使用:
# python research_crew.py "某竞品"
🎉 恭喜!你已拥有一支可复用的「竞品调研小队」。最大收获:把「一个人干三件事」拆成「三个角色各司其职」,产出更稳、更易审。
常见问题速查
| 你遇到的现象 | 大概率原因 & 解决 |
|---|---|
| 报告内容空洞 | 研究员人设/工具不够,或 Task 描述太笼统 |
| Agent 互相读不到对方产出 | 漏写 context=[上游 Task] |
| 费用飙升 | 开 hierarchical 或 verbose 太细,先 sequential 跑通 |
| 审校形同虚设 | reviewer 的 goal 没强调「零容忍编造」,强化 backstory |