1. 项目背景
如果你是一家中型电商公司的技术负责人,你会发现团队正在经历一场"AI 焦虑"。运营部门希望用大模型自动生成商品文案,客服团队想要一个能回答 80% 常见问题的机器人,数据分析师则想把每周五的报表从"手动拖数——Excel 画图——写结论"压缩到一键生成。
于是你让团队各自尝试:运营用 GPT-4 写 prompt 生成文案,结果质量忽高忽低——同样的 prompt,有时输出惊艳,有时完全跑偏;客服用 LangChain 搭了一个问答链,发现一旦用户的问题涉及订单查询、退换货状态,模型就开始"一本正经地胡说八道";数据分析师用 Python 脚本调 API,每次都要手动拼接上下文,像在指挥一个"只会执行、不会思考"的工具人。
核心痛点:单一大模型只能在"给定上下文 + 给定问题"的范围内回答,但真实业务往往是"多步骤推理 + 多角色协作 + 多工具调用"的复合场景。比如"帮我分析竞品定价策略"这个需求,背后需要:信息检索员去搜索竞品官网和新闻 → 数据分析师整理价格区间 → 策略分析师输出结论和风险建议。这已经不是单个 Agent 能做的事。
你缺的不是大模型的能力,而是一个能把大模型能力编排成团队协作的框架——这就是 CrewAI 要解决的问题。
2. 项目设计
小胖(嘴里塞着薯片):“大师,这个 CrewAI 到底是个啥?我听名字还以为跟帆船运动有关。”
大师(推了推眼镜):“你可以把它想象成一个公司。Crew 是公司,Agent 是不同部门的员工,Task 是每个人手中的工作清单,Tool 是员工桌上的电话和电脑。而 Process,就是公司内部的工作流程——是按工位顺序传递,还是设个经理来分配任务。”
小胖:“哦……那不就是工作流引擎吗?跟 Jenkins pipeline 差不多?”
小白(放下书):“不对。Jenkins 是确定性流程——每个步骤的输入输出都是固定的。但 CrewAI 里的 Agent 是让大模型来’思考’下一步该做什么,输出是不确定的。这中间怎么保证质量?”
大师:“问得好。这就是 Guardrail 要解决的问题。工作流引擎的每一步结果是确定的二进制——成功或失败。但 Agent 的输出可能是’看起来对但实际有误’的,所以需要 Guardrail 来做格式校验、业务规则校验、安全校验。如果校验不通过,触发重试或人工接管。”
小胖:“那 Memory 又是什么?相当于员工的工作笔记本吗?”
大师:“差不多。Memory 分成三层——短期记忆记录当前对话的上下文,长期记忆保存用户的偏好和历史模式,实体记忆记录像’张三是 VIP 客户’这样的关系。但要注意,记忆多了会污染——就像笔记本上记的东西太多,翻回去找要花时间,还可能记错。”
小白:“我还有一个疑问。Knowledge 和 Memory 的区别在哪?听起来都是’存信息’。”
大师:“关键区别在于信息来源。Memory 是我执行任务过程中积累的经验;Knowledge 是外部知识——公司的制度文档、产品手册、技术规范。Memory 帮你记住’上次这么处理碰了壁’,Knowledge 帮你查到’公司规定退款时效是 7 天’。两者结合,Agent 才能既聪明又准确。”
小胖:“那 Flow 又是什么?听起来跟 Crew 差不多啊。”
大师:“Crew 是让 Agent 们协作完成一个目标,控制权在 Agent 手里——谁先做、谁后做,Process 定义了基调。Flow 不一样——Flow 是你用确定性的 Python 代码来控制流程走向。比如’识别工单类型 → 如果是退款,走退款分支;如果是投诉,走升级处理分支’——这种分支路由逻辑用 Flow 来控制,比让 Agent 自己判断更可靠。”
小白:“所以 Flow 是’确定性流程’,Crew 是’智能协作’,两者可以嵌套使用?”
大师:“Exactly。你可以把 Crew 嵌入到 Flow 的一个节点里,也可以让 Flow 中的某个步骤触发一个 Crew 执行。这是 CrewAI 最灵活的地方。”
技术映射总结:Agent 是执行单元,Task 是目标单元,Tool 是能力单元,Crew 是组织单元,Process 是协作模式,Flow 是控制流程,Memory 是经验存储,Knowledge 是外部知识,Guardrail 是质量关口,LLM 是推理引擎。理解这十个术语的职责分工,就理解了 CrewAI 的核心架构。
架构图
┌─────────────────────────────────────────────────────────────────────┐
│ 用户目标 / 业务需求 │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Crew / Flow(编排层) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ Sequential│ │Hierarchical│ │ Flow │ │ Flow + Crew │ │
│ │ Process │ │ Process │ │ (Router) │ │ (嵌套组合) │ │
│ └──────────┘ └──────────┘ └──────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Agent 智能体层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 研究员 Agent │ │ 分析师 Agent │ │ 审核员 Agent │ … │
│ │ role/goal/ │ │ role/goal/ │ │ role/goal/ │ │
│ │ backstory │ │ backstory │ │ backstory │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼─────────────────┼─────────────────┼──────────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ Task 任务 + Context 上下文 │
│ Task 1 ─────────────────────────────────────────────────────────────>
│ → Task 2 ─────────────────────────────────────────────────────>
│ → Task 3 ──────────────────────────────────────────>
│ { context: 前序任务的输出 } { expected_output: 结构化Schema }
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Tool 工具调用层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ WebSearch │ │ FileRead │ │ APICall │ │ DBQuery │ │ Custom │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Memory + Knowledge 存储层 │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Short-term Mem │ │ Long-term Mem │ │ Entity Memory │ │
│ │ (当前对话上下文) │ │ (用户偏好/历史) │ │ (实体关系) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────┘ │
│ ┌──────────────────────────────────────────────────────────────────┐│
│ │ Knowledge (RAG): 文档 → 切分 → 向量化 → 检索 → 增强生成 ││
│ └──────────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ LLM Provider 模型层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ OpenAI │ │ Azure OpenAI │ │ Ollama │ … │
│ │ (GPT-4o) │ │ (GPT-4/3.5) │ │ (本地模型) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ Guardrail 质量校验层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────────┐ │
│ │ 格式校验 │ │ 字段完整性│ │ 业务规则 │ │ 人工确认(Human-in- │ │
│ │ │ │ │ │ │ │ the-Loop) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
CrewAI 核心工作链路:
用户目标
→ (Flow/Crew) 任务拆解
→ (Agent) 角色匹配与推理
→ (Tool) 外部能力调用
→ (LLM) 模型推理
→ (Memory/Knowledge) 上下文增强
→ (Guardrail) 质量校验
→ 结果汇总与输出
三种编排思路的核心区别:
| 控制方式 | 按 Task 列表顺序执行 | Manager Agent 动态分配 | Python 代码确定性路由 |
| 适用场景 | 线性流水线(分析→写稿→审核) | 复杂协作,任务不确定(多轮讨论评审) | 条件分支多、需与外部系统交互 |
| 灵活性 | 低,但可预测 | 高,但需注意 Manager 失控 | 最高,可嵌入 Crew |
| 复杂度 | 简单 | 中等 | 较高 |
3. 项目实战
3.1 实战目标
用 Mermaid 和 Python 代码,画出"AI 市场调研小队"的 CrewAI 架构图,并运行一个最小化验证脚本来理解各组件的关系。
3.2 环境准备
# Python 版本要求:3.10 ~ 3.13
python –version
# 创建虚拟环境
python -m venv crewai-env
# 激活虚拟环境(Windows)
crewai-env\\Scripts\\activate
# 激活虚拟环境(macOS/Linux)
source crewai-env/bin/activate
# 安装依赖
pip install crewai crewai-tools python-dotenv
3.3 分步实现
步骤1:创建项目结构
目标:建立标准化的 CrewAI 项目目录。
market-research-crew/
├── .env # API Key 配置
├── main.py # 主入口
├── agents.py # Agent 定义
├── tasks.py # Task 定义
├── tools.py # 自定义 Tool
├── crew.py # Crew 编排
└── outputs/ # 输出目录
步骤2:配置 LLM Provider
目标:配置 OpenAI 兼容的 API 接口。
# .env
OPENAI_API_KEY=sk–your–api–key–here
OPENAI_API_BASE=https://api.openai.com/v1 # 或其他兼容端点
MODEL_NAME=gpt–4o–mini # 调试阶段推荐低成本模型
# main.py (最小化验证)
import os
from dotenv import load_dotenv
load_dotenv()
print(f"API Key loaded: {'Yes' if os.getenv('OPENAI_API_KEY') else 'No'}")
print(f"Model: {os.getenv('MODEL_NAME', 'gpt-4o-mini')}")
运行结果:
API Key loaded: Yes
Model: gpt-4o-mini
常见坑:Windows 用户可能会遇到编码问题。如果出现 Unicode 错误,在 .env 文件中确保使用 UTF-8 编码保存。
步骤3:定义三个 Agent
目标:为"AI 市场调研小队"定义三个角色。
# agents.py
from crewai import Agent
def create_researcher(llm):
"""信息检索员:负责搜索和收集市场信息"""
return Agent(
role="市场信息检索专家",
goal="搜索目标市场的竞品信息、行业报告和最新动态,不遗漏任何关键数据源",
backstory=(
"你曾在麦肯锡担任行业研究员,擅长从海量信息中快速定位关键数据。"
"你习惯先列检索策略,再逐一收集,最后按可靠性排序。"
),
llm=llm,
verbose=True,
allow_delegation=False # 研究员不委托任务,专注检索
)
def create_analyst(llm):
"""数据分析师:负责分析数据并提炼洞察"""
return Agent(
role="数据分析师",
goal="将原始市场数据转化为可落地洞察,输出价格区间、差异化卖点和风险预判",
backstory=(
"你有10年互联网行业数据分析经验,擅长从看似无关的数据中发现关联模式。"
"你对数字敏感,但从不满足于报表——你追问背后的'为什么'。"
),
llm=llm,
verbose=True,
allow_delegation=False
)
def create_strategist(llm):
"""策略分析师:负责输出最终结论和行动建议"""
return Agent(
role="策略分析师",
goal="基于数据分析结果,输出完整的竞争策略建议和执行路线图",
backstory=(
"你是一名资深产品战略顾问,为超过50家公司制定过市场进入策略。"
"你关注三件事:对手在做什么、我们有什么优势、接下来三个月该做什么。"
),
llm=llm,
verbose=True,
allow_delegation=True # 策略师可以委托任务给其他 Agent
)
步骤4:定义任务链
目标:把"竞品分析报告"拆成可执行的三步任务。
# tasks.py
from crewai import Task
def create_research_task(agent, product_name):
"""第一步:收集信息"""
return Task(
description=f"""
请搜索"{product_name}"相关的市场信息,包括:
1. 主要竞品名称、定价、核心功能
2. 近半年的行业报告和融资动态
3. 目标用户群体的痛点和未满足需求
数据来源优先级:官方网站 > 行业报告 > 科技媒体 > 社区讨论
""",
expected_output=(
"一份结构化的市场调研报告,包含:\\n"
"- 竞品列表(名称、定价、核心卖点、目标用户)\\n"
"- 市场规模估算和增速\\n"
"- 用户需求 Top5"
),
agent=agent,
output_file="outputs/research.md"
)
def create_analysis_task(agent, product_name):
"""第二步:分析对比"""
return Task(
description=f"""
基于上一步的调研数据,对"{product_name}"市场做深度分析:
1. 竞品定价策略对比(功能vs价格矩阵)
2. 各竞品的差异化优势和弱点
3. 我们的机会窗口和潜在威胁
""",
expected_output=(
"一份数据分析报告,包含:\\n"
"- 价格-功能对比表格\\n"
"- SWOT分析(优势/劣势/机会/威胁)\\n"
"- 3个月内的优先行动建议"
),
agent=agent,
context=[], # 将由 Crew 自动注入前序任务的输出
output_file="outputs/analysis.md"
)
def create_strategy_task(agent, product_name):
"""第三步:策略建议"""
return Task(
description=f"""
基于调研和分析结果,为"{product_name}"产品制定:
1. 差异化定位建议
2. 定价区间和理由
3. 市场进入路径(第一步做什么、第二步做什么)
4. 风险清单和应对预案
""",
expected_output=(
"一份可执行的策略文档,包含定位、定价、路径和风险四部分,"
"每部分有明确的理由和数据支撑。"
),
agent=agent,
context=[],
output_file="outputs/strategy.md"
)
步骤5:组装 Crew
目标:把 Agent 和 Task 组装成可执行的 Crew。
# crew.py
from crewai import Crew, Process
from crewai import LLM
from agents import create_researcher, create_analyst, create_strategist
from tasks import create_research_task, create_analysis_task, create_strategy_task
def create_market_research_crew(product_name):
# 1. 初始化 LLM
llm = LLM(
model="gpt-4o-mini", # 调试用低成本模型
temperature=0.7
)
# 2. 创建 Agent
researcher = create_researcher(llm)
analyst = create_analyst(llm)
strategist = create_strategist(llm)
# 3. 创建 Task
research_task = create_research_task(researcher, product_name)
analysis_task = create_analysis_task(analyst, product_name)
strategy_task = create_strategy_task(strategist, product_name)
# 4. 组装 Crew
return Crew(
agents=[researcher, analyst, strategist],
tasks=[research_task, analysis_task, strategy_task],
process=Process.sequential, # 按顺序执行
verbose=True
)
# main.py (最终版本)
from dotenv import load_dotenv
load_dotenv()
from crew import create_market_research_crew
if __name__ == "__main__":
crew = create_market_research_crew("AI代码助手")
result = crew.kickoff()
print("\\n" + "="*60)
print("最终输出:")
print("="*60)
print(result.raw)
3.4 运行结果
运行 python main.py 后,典型输出如下:
[2026-06-04 10:30:00][DEBUG]: == Working Agent: 市场信息检索专家
[2026-06-04 10:30:00][INFO]: == Starting Task: 请搜索"AI代码助手"相关的市场信息…
[2026-06-04 10:32:15][DEBUG]: == Agent: 市场信息检索专家 – Tool calling: None – Reasoning: None
[2026-06-04 10:32:45][INFO]: == Task completed successfully.
[2026-06-04 10:32:45][DEBUG]: == Working Agent: 数据分析师
[2026-06-04 10:32:45][INFO]: == Starting Task: 基于上一步的调研数据,对"AI代码助手"市场做深度分析…
[2026-06-04 10:34:30][INFO]: == Task completed successfully.
[2026-06-04 10:34:30][DEBUG]: == Working Agent: 策略分析师
[2026-06-04 10:34:30][INFO]: == Starting Task: 基于调研和分析结果…
[2026-06-04 10:36:00][INFO]: == Task completed successfully.
============================================================
最终输出:
============================================================
# AI代码助手市场策略报告
…
输出文件 outputs/ 目录下将生成三份报告:research.md、analysis.md、strategy.md。
3.5 测试验证
使用 pytest 验证核心组件:
# test_crew.py
import pytest
from agents import create_researcher, create_analyst, create_strategist
from crewai import LLM
from unittest.mock import MagicMock
def test_agent_creation():
"""测试 Agent 是否能正确创建"""
llm = LLM(model="gpt-4o-mini")
researcher = create_researcher(llm)
assert researcher.role == "市场信息检索专家"
assert researcher.allow_delegation == False
analyst = create_analyst(llm)
assert analyst.role == "数据分析师"
strategist = create_strategist(llm)
assert strategist.allow_delegation == True
def test_task_dependency():
"""测试 Task 上下文依赖配置"""
from tasks import create_analysis_task
from crewai import Agent
llm = LLM(model="gpt-4o-mini")
agent = Agent(role="test", goal="test", backstory="test", llm=llm)
task = create_analysis_task(agent, "test_product")
assert task.context == [] # 应为空列表,表示接收前序任务
assert "expected_output" in task.__dict__
运行测试:
pytest test_crew.py -v
test_crew.py::test_agent_creation PASSED
test_crew.py::test_task_dependency PASSED
4. 项目总结
4.1 优点与缺点
| 上手难度 | 低,角色-任务-工具三要素清晰 | 低,但扩展性差 | 中高,需理解链和图 |
| 多角色协作 | 原生支持,Process 自动编排 | 需手动编码协作逻辑 | 需手动定义节点和边 |
| 工具集成 | 内置工具 + 自定义简单 | 需自行封装 | 工具链丰富但复杂 |
| 输出控制 | expected_output + Guardrail | 靠 prompt 约束 | 需额外解析器 |
| 大型项目 | Flow 可编排多个 Crew | 难以管理 | Graph 适合复杂 DAG |
| 模型依赖度高时的不确定性 | 仍是挑战 | 同样 | 同样 |
4.2 适用场景
推荐使用 CrewAI 的场景:
不推荐使用的场景:
4.3 注意事项
4.4 常见踩坑经验
案例1:Agent 角色描述太泛导致输出空洞
现象:Agent 的 role 写成"AI 助手",输出总是一堆废话。 根因:role/goal/backstory 越具体,模型越有方向。角色描述实际上是在为模型的 System Prompt 提供上下文约束。 解决:将 role 改为"竞品定价分析师",goal 改为"对比 3 款竞品的定价策略并给出定价区间建议"。
案例2:Task context 不传导致信息断裂
现象:第二个 Task 的输出完全没有参考第一个 Task 的结果。 根因:Task 的 context 参数没有设置为接收前序任务输出。 解决:将 context=[] 配置好,Crew 会自动把前序 Task 的 output 注入当前 Task 的上下文。
案例3:Process.sequential 执行"卡住"
现象:Task 执行到一半长时间无响应。 根因:LLM API 超时或速率限制。 解决:在 LLM 初始化时设置 timeout=120 和 max_retries=3;检查 API 账户余额和速率限制。
4.5 思考题
如果让一个 Agent 同时承担"信息检索"和"数据分析"两个角色,会有什么问题?什么情况下这种设计反而是更好的选择?(提示:考虑 Token 成本、上下文长度限制、角色专注度)
Sequential Process 和 Hierarchical Process 的核心差异是什么?在什么业务场景下你会选择 Hierarchical?(提示:考虑任务的不确定性、Agent 之间的依赖关系、成本的差异)
答案将在第2章及后续章节中逐步揭晓。
延伸阅读与资源
10倍开发者的 Dify 魔法书:从零构建全栈 AI 应用 后端工程师转型AI第一课-Ollama 与私有化大模型实战 大型语言模型(LLM) vLLM 高性能推理落地实战 Agent开发之LlamaIndex 实战修炼与源码进阶 大语言模型Transformers 实战修炼与源码剖析
网硕互联帮助中心






评论前必须登录!
注册