Day 42 / 共 68 天 · 阶段 7 编排框架

CrewAI 像带团队

前两天(Day 40-41)你学的 LangGraph 是"亲手画流程图"的路子,控制力强但要操心每条边。今天换个完全不同的风味:CrewAI——你不画图,而是像组建一支团队那样声明"有哪几个角色、每人干哪个任务、按什么流程协作",框架自动让他们接力。感受"画电路图"和"带团队"两种编排思路的差别。明天(Day 43)看 Go 生态的 eino。

📍 你在阶段 7(编排框架 D39-44)的位置
D39 为什么要框架 D40 LangGraph① D41 LangGraph② D42 CrewAI D43 eino D44 选型
💡 用一个类比兜住今天(今天全程沿用「开一家内容工作室、带一支团队」的世界观) 用 CrewAI 搭 Agent = 开一家小型内容工作室,招人干活Agent = 一名员工,你给他写"岗位说明":叫什么角色(role)、目标是什么(goal)、什么背景性格(backstory);Task = 一张任务单(干什么、交付什么);Crew = 把员工和任务单凑成一支团队,喊一声"开工";Process = 团队的协作方式:sequential流水线接力(研究员→写手→审校,一棒接一棒),hierarchical有个项目经理分派、验收。今天你从"自己画流程"升级成"当老板招人组队"。
L01

和 LangGraph 完全不同的一种思路

🤔 痛点LangGraph 什么都要你自己画:节点、边、条件、循环……表达力强,但小项目里会觉得"就想让三个 Agent 接力写篇报告,至于画这么细吗?"
💡 本质CrewAI 把抽象层抬高:你不描述"怎么流转",只描述"有谁、干什么、怎么配合",剩下的接力、传结果、调工具由框架安排。像开公司:你只招人、派活、定协作方式,不用规定每个人几点几分把文件递给谁。上手快、代码短、贴近"多智能体协作"的直觉,代价是对细节流程的控制没 LangGraph 那么精细。
👶 一句话对比LangGraph = 你是工程师,画电路图,每根线自己连;CrewAI = 你是老板,招几个人、派活、说清怎么配合,人怎么干他们自己商量。没有谁更好,看场景(Day44 专门讲选型)。
👶 装一下练习前:pip install crewai(虚拟环境里)。它需要配一个 LLM 的 key(回忆 Day11、Day15),因为每个"员工"的脑子都是大模型。
L02

Agent:给每名"员工"写岗位说明

🤔 痛点怎么让一个 Agent "专注干好一件事、有稳定的人设"?光丢个 prompt 太随意,多个 Agent 时更难管。
💡 本质CrewAI 的 Agent = 一份结构化的岗位说明书,三要素:role(角色/职位)、goal(这个岗位要达成什么)、backstory(背景设定,让它入戏、行为更稳定)。这其实是把 Day16-17 学的"角色设定 + 目标"提示词工程,变成了填表格——比裸写 prompt 更规整、更好复用。
from crewai import Agent

研究员 = Agent(
    role="资料研究员",                      # 职位
    goal="就给定主题,查全、查准关键事实",    # 这个岗位的目标
    backstory="你是严谨的调研专家,只相信有出处的信息,讨厌空话。",  # 人设,让它入戏
    verbose=True,                          # 打开话痨模式,能看到它思考过程(学习期很有用)
)

写手 = Agent(
    role="科普写手",
    goal="把研究员给的资料,写成通俗易懂的短文",
    backstory="你擅长打比方,能把复杂概念讲给外行听懂。",
)
verbose=True 会把每个 Agent "怎么想、调了什么"打印出来——学习阶段强烈建议开,它就是你观察 Agent 内心戏的窗口(呼应 Day39 的"可观测")。上线时可关掉。
L03

Task:派一张"任务单"

🤔 痛点光有员工不干活,得给他们具体任务。任务怎么写才让 Agent 明白"要交什么、交成什么样"?
💡 本质Task = 一张任务单:description(干什么,写清楚)、expected_output(期望交付物长啥样,越具体越好)、agent(派给哪名员工)。关键点:后一个任务能自动拿到前一个任务的产出当输入——就像流水线上,上一环节的半成品自动传到下一环节手里,不用你手动搬。
from crewai import Task

调研任务 = Task(
    description="研究「为什么天空是蓝色的」,列出3个关键科学事实。",
    expected_output="3条带简短解释的事实清单",   # 讲清交付标准
    agent=研究员,                                 # 派给研究员
)

写作任务 = Task(
    description="根据研究员给的事实,写一段150字左右的科普短文。",
    expected_output="一段通俗、有比喻的科普短文",
    agent=写手,          # 派给写手;它会自动收到"调研任务"的产出作为素材
)
📝 举个例子:任务单之间怎么接力 研究员完成"调研任务",产出 3 条事实 → 框架把这 3 条自动喂给写手的"写作任务"当背景 → 写手基于事实写短文。你没写一行"把结果传给下一个人"的代码,接力是框架默认行为。这正是 CrewAI 省心的地方。
L04

Crew:把人和任务凑成团队,喊"开工"

🤔 痛点员工有了、任务单有了,谁来把他们组织起来、按顺序跑?
💡 本质Crew(团队)= 把 agents(有哪些人) + tasks(有哪些任务单) 打包,再调 crew.kickoff() = 喊一声"开工"。框架就按任务顺序,让员工一个接一个干,自动传结果,最后把成品还给你。一行 kickoff,整支团队就转起来了。
from crewai import Crew, Process

团队 = Crew(
    agents=[研究员, 写手],           # 团队成员
    tasks=[调研任务, 写作任务],       # 要完成的任务单(默认按顺序)
    process=Process.sequential,     # 协作方式:流水线接力(下一讲细说)
    verbose=True,
)

结果 = 团队.kickoff()               # 开工!框架自动跑完整条流水线
print(结果)                         # → 最后一个任务(写作)的产出:科普短文
sequential 流水线:研究员 → 写手 → 审校,产出自动接力 🔍 研究员产出:事实清单 ✍️ 写手产出:科普短文 🔎 审校产出:定稿 交棒 交棒
图注:kickoff 之后,团队像接力赛,上一棒的产出自动成为下一棒的输入,你只等最终成品。
L05

Process:接力 vs 有个经理

🤔 痛点"一棒接一棒"够用吗?有时任务不是死顺序,而是"经理看情况决定谁先干、干几轮、要不要返工"——这种怎么办?
💡 本质CrewAI 有两种协作流程:sequential(顺序) = 流水线接力,按任务列表一个接一个,简单可预测;hierarchical(层级) = 多一个项目经理(manager),由它来分派任务、决定顺序、验收成果、必要时要求返工——更灵活,适合任务多、需要动态调度的场景。用哪种,就是把 process= 换一个值,再指定 manager 的模型。
hierarchical:经理居中分派、验收 🧑‍💼 项目经理分派+验收 研究员 写手 审校
图注:sequential 是"排好队接力",hierarchical 是"经理动态调度"。任务简单用前者,任务多变用后者。

👶 小白:这个"经理"是我写的另一个 Agent 吗?它会不会也不靠谱?

👨‍🏫 老师:经理是框架帮你生成的一个调度 Agent(你给它指定一个 LLM 当脑子)。它确实也可能判断失误——所以 hierarchical 更强大但更难预测、也更费 token。新手建议先用 sequential 把流程跑顺,等确实需要"动态决定谁干、要不要返工"时再上 hierarchical。这也是评测(阶段 9)为什么重要:多智能体越灵活,越要用数据盯住它靠不靠谱。

L06

完整示例:研究员 + 写手,两人接力出稿

💡 本质把前面几讲拼成一个能跑的最小 Crew。对照 LangGraph 的写法你会明显感到:这里没有节点、边、路由——全是"招人、派活、开工"的大白话
from crewai import Agent, Task, Crew, Process

# 1) 招两名员工(写岗位说明书)
研究员 = Agent(role="资料研究员",
    goal="查全查准关于主题的关键事实",
    backstory="严谨的调研专家,只信有出处的信息。", verbose=True)
写手 = Agent(role="科普写手",
    goal="把资料写成通俗短文",
    backstory="擅长打比方,能把复杂事讲给外行听。", verbose=True)

# 2) 派两张任务单(后一张自动拿到前一张的产出)
t1 = Task(description="研究「为什么天空是蓝色的」,列3条关键事实。",
          expected_output="3条带解释的事实", agent=研究员)
t2 = Task(description="据上面的事实,写150字左右科普短文。",
          expected_output="通俗有比喻的短文", agent=写手)

# 3) 组队 + 开工
团队 = Crew(agents=[研究员, 写手], tasks=[t1, t2],
           process=Process.sequential, verbose=True)
结果 = 团队.kickoff()          # 一行,整条流水线跑完
print("最终稿:\n", 结果)
📝 举个例子:跑起来大概发生什么 研究员先上工,想一想→查资料→交出 3 条事实;框架把事实递给写手;写手基于事实写出科普短文;kickoff() 返回最后这段短文。开了 verbose 的话,你能看到两人各自的"内心戏"。三行核心代码(招人/派活/开工),一个多智能体协作就跑起来了。
🔗 想吃透 Agent/Task/Crew/Process 和给员工配工具的实战?去看《CrewAI 20 天精讲》→(学完回来继续 Day 43)
L07

今日小结 + 动手 10 分钟

🧠 今天你应该能回答

  • CrewAI 和 LangGraph 的思路差在哪?(带团队 vs 画流程图;声明"有谁干啥" vs 声明"怎么流转")
  • Agent 的三要素是什么?(role / goal / backstory)
  • Task 里的 descriptionexpected_output 各写什么?任务之间怎么接力?
  • Crewkickoff() 分别是什么?(组队 / 开工)
  • sequentialhierarchical 两种 Process 分别适合什么场景?

✋ 动手 10 分钟:给团队加个"审校员"

在 L06 基础上,招第三个员工 + 派第三张任务单,让流水线变成"研究→写作→审校"三棒:

审校 = Agent(role="文字审校",
    goal="检查短文有无事实错误和啰嗦,给出干净定稿",
    backstory="你眼里揉不得沙子,专治车轱辘话。", verbose=True)

t3 = Task(description="审校上一步的短文,改掉错误和啰嗦,输出定稿。",
          expected_output="一段干净、准确的定稿", agent=审校)

团队 = Crew(agents=[研究员, 写手, 审校], tasks=[t1, t2, t3],
           process=Process.sequential, verbose=True)
print(团队.kickoff())
# 进阶:把 process 换成 Process.hierarchical(需按文档给 manager 配一个 LLM),
#      观察"经理"是怎么分派和验收的,和 sequential 对比感受差别。

体会:扩团队 = 多招一个人 + 多派一张单。这种"组织人"的手感,正是多智能体(阶段 8)的预演。

明日预告 · Day 43:再看一个不同生态的编排框架——eino(字节 CloudWeGo 出品,Go 语言)。它用 Chain(链)/Graph(图)组织流程,思路和 LangGraph 神似但落在 Go 世界里。你不必会写 Go,重点是看出"编排"的套路是相通的——学完你会发现,不管哪门框架,底层都是你 Day38 手写的那个循环 + Day39 列的那些痛点的解法。这一天是选修,轻松看即可。
← Day 41 · LangGraph② Day 43 · eino(可选)→