纲要
- 组件概览:
Agent、Task、Crew、Flow、Knowledge、Memory Agent:团队中的最小执行单元- YAML 配置化定义
- 纯代码定义
- 工具集成
Task:智能体的工作任务- 配置与依赖关系
- 结构化输出
Crew:组建专业团队- 配置式与代码式两种风格
- 启动与输出
Flow:编排多个团队- 基于修饰符的事件驱动
- 状态管理
- 知识库与记忆
- 文本和 URL 加载
- 嵌入模型切换
- 短期、长期、实体、情境记忆
- 完整可运行示例:一个带搜索和报告的团队
- 总结与相关度说明
组件概览
CrewAI 框架围绕六个核心组件构建,各组件分工明确,层级关系清晰。下表简要概括了每个组件的角色及其现实类比:
| 组件 | 角色 | 类比 |
|---|---|---|
Agent | 执行具体工作的个体 | 员工 |
Task | 分配给 Agent 的工作项 | 任务单 |
Crew | 管理 Agent 和 Task 的团队 | 小组 |
Flow | 编排多个 Crew 的流水线 | 部门协作流程 |
Knowledge | 外挂知识库(RAG) | 参考资料库 |
Memory | 短期/长期/实体/情境记忆 | 工作笔记 |
这些组件共同构成了多智能体应用的基础模块,通过组合它们可以灵活构建从简单到复杂的智能体系统。
以下 Mermaid 类图展示了各组件之间的核心关系:
Agent:团队中的最小执行单元
Agent 是 CrewAI 的原子执行单元,每个智能体拥有独立的角色(role)、目标(goal)和背景故事(backstory),并可绑定工具、记忆以及特定的大语言模型。CrewAI 支持两种定义方式:YAML 配置化和纯代码。
YAML 配置式定义
在 src/config/agents.yaml 文件中声明智能体配置:
researcher:
role: "高级数据研究员"
goal: "发掘某一话题领域的前沿发展"
backstory: "你是一名经验丰富的研究员,擅长发现最新信息并以清晰简洁的方式呈现。"
reporting_analyst:
role: "报告分析师"
goal: "基于数据分析和研究发现创建详细报告"
backstory: "你是一位一丝不苟的分析师,能够将复杂数据转化为清晰简洁的报告。"
然后通过 @agent 装饰器在 CrewBase 类中引用:
from crewai import Agent, Crew, Task, Process
from crewai.project import CrewBase, agent, task, crew
@CrewBase
class MyCrew:
@agent
def researcher(self) -> Agent:
return Agent(
config=self.agents_config['researcher'],
verbose=True,
tools=[search_tool] # 可选:绑定搜索工具
)
@agent
def reporting_analyst(self) -> Agent:
return Agent(
config=self.agents_config['reporting_analyst'],
verbose=True
)
纯代码定义
若无需配置文件,可直接在代码中实例化 Agent:
from crewai import Agent
agent = Agent(
role="资深Python开发者",
goal="编写高质量、安全的Python代码",
backstory="你有十年Python开发经验,熟悉安全编码规范。",
allow_code_execution=True, # 允许执行代码
code_execution_mode="safe", # 安全沙箱模式
tools=[my_tool],
memory=True,
verbose=True
)
两种方式功能等价:配置式更适合规范化项目结构,便于团队协作;代码式则更灵活,适合快速原型验证。
Task:智能体的工作任务
每个 Task 描述一个具体的工作项,可指定负责的 Agent、依赖关系以及输出格式。
YAML 配置式定义
在 tasks.yaml 中声明任务:
research_task:
description: "对{topic}进行深入研究,找出有趣且相关的信息。当前年份是2025年。"
expected_output: "包含10个要点的列表,列出关于{topic}的相关信息"
agent: researcher
reporting_task:
description: "基于研究结果创建一份详细报告。"
expected_output: "一份完整的Markdown报告"
agent: reporting_analyst
output_file: "report.md"
context: [research_task] # 依赖 research_task 完成后执行
在代码中通过 @task 装饰器引用:
@task
def research_task(self) -> Task:
return Task(config=self.tasks_config['research_task'])
@task
def reporting_task(self) -> Task:
return Task(config=self.tasks_config['reporting_task'])
结构化输出
Task 支持 output_pydantic 或 output_json 参数,强制输出符合指定模式的数据结构:
from pydantic import BaseModel
from crewai import Task
class BlogPost(BaseModel):
title: str
content: str
blog_task = Task(
description="写一篇关于多智能体架构的博客",
agent=writer,
expected_output="结构化的博客文章",
output_pydantic=BlogPost
)
执行后,通过 task.output.pydantic 即可获得 BlogPost 实例,便于后续程序化处理。
Crew:组建专业团队
Crew 负责将 Agent 和 Task 组合为一个可执行的工作单元,并指定执行策略(顺序或层次化)。
配置式组合
在 CrewBase 类中,通过 @crew 装饰器定义团队:
@crew
def crew(self) -> Crew:
return Crew(
agents=[self.researcher(), self.reporting_analyst()],
tasks=[self.research_task(), self.reporting_task()],
process=Process.sequential, # 顺序执行
verbose=True,
memory=True, # 开启记忆
knowledge_sources=[...] # 挂载知识库
)
代码式组合
不依赖配置文件,直接构建 Crew 实例:
crew = Crew(
agents=[agent1, agent2],
tasks=[task1, task2],
process=Process.sequential,
verbose=True
)
result = crew.kickoff()
print(result)
kickoff() 方法启动执行,返回最终输出结果。
Flow:编排多个团队
Flow 用于串联多个 Crew 或复杂逻辑,形成端到端的业务流程。它基于事件驱动模型,通过修饰符定义节点间的依赖关系,类似于 LangGraph 的图结构。
from crewai.flow import Flow, start, listen
class CityFactFlow(Flow):
@start()
def generate_city(self):
city = "北京"
self.state["city"] = city
return city
@listen(generate_city)
def generate_fact(self, city):
# 根据城市生成有趣事实
return f"{city}是中国的首都,拥有超过3000年的历史。'
flow = CityFactFlow()
result = flow.kickoff()
@start标记入口节点,该节点无上游依赖。@listen标记监听其他节点的输出,参数为被监听的方法名,自动建立依赖关系并传递返回值。
Flow 内部维护 state 字典,可在不同节点间共享数据,适用于复杂的状态机场景。
知识库与记忆
知识库(Knowledge)
CrewAI 将 RAG(检索增强生成)封装为高级接口,支持从文本字符串或 URL 加载知识源。
字符串知识源:
from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource
content = "Tommy住在北京,今年25岁。"
source = StringKnowledgeSource(content=content)
crew = Crew(
agents=[qa_agent],
tasks=[qa_task],
knowledge_sources=[source],
embedder={
"provider": "openai",
"config": {
"model": "text-embedding-3-small",
"api_key": "your-api-key"
}
}
)
result = crew.kickoff()
URL 知识源(适用于网页或文档):
from crewai.knowledge.source.url_knowledge_source import URLKnowledgeSource
url_source = URLKnowledgeSource(urls=["https://example.com/doc.pdf"])
# 其他配置同字符串源
默认嵌入模型为 OpenAI 的 text-embedding-ada-002,若需切换至其他提供商(如 Ollama),通过 embedder 配置修改即可。
记忆(Memory)
在 Crew 中设置 memory=True 即可启用四种记忆类型:
| 记忆类型 | 作用 |
|---|---|
| 短期记忆 | 当前对话上下文,随会话结束而清除 |
| 长期记忆 | 跨会话持久化存储,依赖外部存储(默认 SQLite) |
| 实体记忆 | 自动抽取人物、地点、组织等实体信息 |
| 情境记忆 | 维护交互的连贯性,保持对话一致性 |
底层存储可通过 memory_config 进行配置,例如指定长期记忆的存储路径或切换至 Redis 等后端。
完整可运行示例:带搜索的研究团队
以下构建一个“新闻研究助手”团队:先搜索最新动态,再生成分析报告。
环境准备
pip install crewai crewai-tools python-dotenv
.env 配置
OPENAI_API_KEY=sk-xxxx
SERPAPI_API_KEY=your-serpapi-key
代码 research_crew.py
import os
from dotenv import load_dotenv
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool
load_dotenv()
# 1. 初始化搜索工具
search_tool = SerperDevTool()
# 2. 定义 Agent
researcher = Agent(
role="信息检索专家",
goal="查找关于指定主题的最新新闻和信息",
backstory="你擅长使用搜索引擎,能快速找到高质量的信息来源。",
tools=[search_tool],
verbose=True,
allow_delegation=False
)
analyst = Agent(
role="分析报告撰写人",
goal="基于搜索到的信息,撰写一份专业分析报告",
backstory="你善于提炼关键信息,并用清晰的结构呈现。",
verbose=True,
allow_delegation=False
)
# 3. 定义 Task
search_task = Task(
description="搜索关于'{topic}'的最新动态,找到至少5条相关信息。",
agent=researcher,
expected_output="包含5条以上新闻标题和摘要的列表"
)
write_task = Task(
description="根据搜索到的信息,写一份关于'{topic}'的300字分析报告。",
agent=analyst,
expected_output="一份结构完整的分析报告",
context=[search_task] # 依赖 search_task 完成
)
# 4. 组建团队
crew = Crew(
agents=[researcher, analyst],
tasks=[search_task, write_task],
process=Process.sequential,
verbose=True
)
# 5. 执行并输出结果
result = crew.kickoff(inputs={"topic": "2024人工智能发展趋势"})
print("\n===== 最终输出 =====\n")
print(result)
运行 python research_crew.py,控制台将依次展示搜索过程与报告生成过程,最终输出完整的分析报告。
总结
CrewAI 通过高度封装的组件体系,将多智能体开发简化为“配置角色、分配任务、组建团队、编排流程”四个核心步骤。相比 LangGraph,CrewAI 的学习曲线更加平滑,特别适合快速构建原型和业务流程自动化。然而,当需要细粒度控制底层行为(如自定义状态管理、复杂路由)时,LangGraph 仍具优势。两者并非互斥,可根据实际场景互补使用。
本文完整覆盖了 CrewAI 的 Agent、Task、Crew、Flow、知识库和记忆等核心组件,包括 YAML 配置与代码定义两种方式、结构化输出、任务依赖、嵌入模型切换等技术要点,并提供了完整的可运行示例,便于读者快速上手实践。
1013



被折叠的 条评论
为什么被折叠?



