一个研究员、一个撰稿人,两个 AI Agent 接力协作,自动产出一篇科普文章。本文完整拆解 CrewAI 的核心概念与实战代码。
一、为什么需要"AI 团队"?
CrewAI 核心由 智能体(Agent)、任务(Task)、团队(Crew)、流程(Process) 四部分组成,支持两种运行模式:顺序模式(sequential) 和层级模式(hierarchical) 。
CrewAI 的设计思想就是模拟组织协作:每个 Agent 拥有角色、目标、人设背景;Task 代表分配给 Agent 的具体工作;Crew 则在指定 Process 规则下调度整套智能体与任务。
本文目标很清晰:使用顺序模式搭建第一个 AI 智能体团队,把真实工作流程转化为可运行代码。
二、选一个贴近业务的场景
我们从一个常见的写作场景入手,搭建一个简易写作团队,包含两个角色:
- 行业资料研究员:围绕指定主题,梳理客观资料,提炼核心要点
- 科普撰稿人:基于调研摘要,产出通俗易懂的科普短文
两个角色职责解耦、分工独立,工作流程为接力模式:研究员先输出调研摘要,摘要作为输入交给撰稿人,撰稿人基于摘要完成文章撰写。
这就是顺序模式:任务按先后次序串行执行,上一个任务的输出自动作为下一个任务的上下文。在顺序流程中,每个任务绑定一个 Agent,上游结果驱动下游任务执行。
三、六步实现流程
整个案例落地分为 6 个步骤:
| 步骤 | 做什么 |
|---|---|
| 1. 准备环境 | 安装依赖、创建项目与环境变量文件 |
| 2. 接入模型 | 定义 LLM,配置模型名称、密钥、接口地址、温度 |
| 3. 定义智能体 | 实例化研究员、撰稿人两个 Agent |
| 4. 定义任务 | 定义调研任务、写作任务两个 Task |
| 5. 组建团队 | 通过 Crew 组装并启动智能体团队 |
| 6. 终端交互 | 输入主题,运行整套流程 |
第 1 步:准备环境
安装依赖:crewai、crewai-tools,搭配 python-dotenv 读取环境变量。本案例采用单文件开发,密钥统一放在 .env,官方安装命令:
pip install crewai
第 2 步:接入大模型
⚠️ 重点:CrewAI 只负责调度流程,真正负责推理生成的是大语言模型。
从 crewai 导入 LLM,传入模型名称、密钥、接口地址、温度参数。
一个实用技巧:根据角色差异化设置 temperature
# 研究员:追求严谨稳定 → 低温
researcher_llm = LLM(model="deepseek-chat", api_key=..., base_url=..., temperature=0.3)
# 撰稿人:需要创意表达 → 高温
writer_llm = LLM(model="deepseek-chat", api_key=..., base_url=..., temperature=0.8)
公共参数一致,只有温度不同,可以封装成函数动态传入。低温可以让调研结果稳定可控;更高温度给撰稿人留出表达发挥空间。
第 3 步:定义两个智能体
Agent 核心由 role、goal、backstory 三个属性定义,backstory 用来塑造智能体的身份风格。
from crewai import Agent
researcher = Agent(
role="行业资料研究员",
goal="围绕指定主题,梳理已掌握的客观资料,提取要点",
backstory="严谨且专业,基于事实,不自由创作",
llm=researcher_llm,
verbose=True, # 打印思考链路,方便调试
max_rpm=20, # 限流:每分钟最多 20 次请求
max_iter=3, # 限制最大迭代次数,避免死循环
)
writer = Agent(
role="科普撰稿人",
goal="基于调研摘要,写出通俗易懂的科普短文",
backstory="擅长转换专业信息,不添加摘要以外的内容",
llm=writer_llm,
verbose=True,
max_rpm=20,
max_iter=3,
)
除角色配置外,还有三个很关键的运行控制参数:
- verbose:True 时打印智能体思考过程,调试阶段开启;正式部署建议关闭,避免日志过多
- max_rpm:请求限流,防止调用接口触发平台频率限制
- max_iter:最大迭代次数,防止智能体卡在任务里无限重试
第 4 步:定义两个工作任务
Agent 相当于岗位人员,Task 就是分配给它的工作。一个 Task 需要明确三件事:做什么、交付物是什么、由谁执行。
from crewai import Task
research_task = Task(
description="围绕 {topic},整理核心知识点,输出要点",
expected_output="调研摘要,语言简洁客观,不确定内容标注「待核实」",
agent=researcher,
)
write_task = Task(
description="参考调研摘要,围绕 {topic} 撰写通俗易懂的科普短文",
expected_output="Markdown 格式科普文章,约 800 字,含标题",
agent=writer,
context=[research_task], # 依赖上游任务结果作为上下文
output_file="article.md", # 结果自动写入文件
)
写作任务额外增加两个参数:
- context:显式声明任务依赖,把调研任务的输出传给写作任务。顺序模式下不写也能自动传递,但显式声明依赖关系可读性更好;任务复杂、非线性依赖时这个参数尤其重要。
- output_file:将输出持久化保存为 md 文件。
{topic} 是变量占位符,支持动态传入主题,提升任务复用能力。
第 5 步:组建并启动团队
from crewai import Crew, Process
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
process=Process.sequential, # 顺序串行执行
verbose=True,
)
result = crew.kickoff(inputs={"topic": user_topic})
print(result.raw)
Crew 作为团队容器,传入智能体列表、任务列表,指定执行流程 Process.sequential。顺序模式也是 CrewAI 默认执行方式,任务按照列表顺序依次跑。调用 kickoff 启动流程并传入变量。
第 6 步:终端交互
读取终端输入的文章主题,做简单判空和退出判断,调用 crew.kickoff() 启动整套智能体流水线,主题会自动填充到任务里的 {topic} 占位符。
四、执行链路与实测结果
整体执行链路:研究员先执行调研输出摘要,摘要自动作为上下文传给撰稿人;撰稿人基于摘要完成科普文章,内容保存到 article.md,同时控制台输出结果。
测试输入主题:写一篇关于开发智能体不同模式的文章
- 研究员输出结构化调研摘要
- 撰稿人基于摘要生成科普文章《智能体不是越自主越好。一篇文章看懂开发智能体的几种模式》
- 成品自动落盘为 article.md
五、小结与扩展思路
本文通过一个写作案例搭建了 CrewAI 多智能体团队,梳理核心要点:
- 四大核心组件:Agent(角色+目标+背景)、Task(描述+预期输出+执行者)、Crew(团队容器)、Process(顺序/层级)
- 顺序模式本质:接力串行,上游产出作为下游上下文
- 三个实用控制参数:verbose(可观测调试)、max_rpm(接口限流)、max_iter(防死循环)
- 温度调优思路:严谨类任务低温,创意写作类任务高温
你可以跟着代码动手复现,理解 CrewAI 多智能体调度逻辑;这套模式也可以迁移到数据整理、报表生成、内容审核等其他业务场景。