CrewAI 多智能体协作框架完全教程
一、CrewAI框架概述:多Agent协作的简洁方案
在大语言模型(LLM)应用开发领域,单一Agent的能力已经相当强大,但面对复杂任务时,单个Agent往往力不从心。想象一个真实的企业场景:完成一份市场研究报告,需要有人负责数据收集、有人负责分析、有人负责撰写报告、有人负责审校——这正是多智能体协作的核心思想。
CrewAI 是一个开源的 Python 框架,专门用于编排多个 AI Agent 协同工作。它的设计理念可以用一句话概括:像组建一个真实团队一样组建 AI 团队。与 AutoGen、LangGraph 等框架相比,CrewAI 的最大优势在于其极简的 API 设计和直觉化的角色定义方式。
为什么选择 CrewAI?
- 简洁优雅的 API:用极少的代码就能定义复杂的多Agent工作流
- 角色驱动设计:每个 Agent 都有明确的角色、目标和背景故事
- 灵活的编排模式:支持顺序执行、层级管理等多种协作模式
- 丰富的工具生态:内置大量工具,并支持自定义工具扩展
- 记忆系统:支持短期、长期和实体记忆,让 Agent 具备学习能力
- 人类介入:天然支持 Human-in-the-loop,适合需要人工审核的场景
与其他框架的对比
| 特性 | CrewAI | AutoGen | LangGraph |
|---|---|---|---|
| 学习曲线 | 低 | 中 | 高 |
| 角色定义 | 直觉化 | 配置化 | 图节点 |
| 编排模式 | 多种预设 | 对话驱动 | 自定义图 |
| 工具集成 | 原生支持 | 需适配 | LangChain |
| 记忆系统 | 内置 | 基础 | 需扩展 |
| 适用场景 | 通用任务 | 对话任务 | 复杂流程 |
二、核心概念:Agent、Task、Crew、Process
CrewAI 的核心由四个概念构成,理解它们是掌握整个框架的基础。
2.1 Agent(智能体)
Agent 是 CrewAI 中的基本执行单元。每个 Agent 都是一个具有特定角色的 AI 实体,它拥有:
- role(角色):Agent 的身份标识,如"资深数据分析师"
- goal(目标):Agent 需要达成的目标
- backstory(背景故事):为 Agent 提供上下文和行为动机
- tools(工具):Agent 可以使用的工具列表
- llm:Agent 使用的语言模型
- memory(记忆):是否启用记忆系统
- allow_delegation(允许委派):是否可以将子任务委派给其他 Agent
from crewai import Agent
researcher = Agent(
role="资深市场研究员",
goal="深入分析目标市场的最新趋势和竞争格局",
backstory="""你是一位拥有10年市场研究经验的资深分析师。
你擅长从海量数据中提取关键洞察,对科技行业有深刻理解。
你的分析报告曾多次帮助企业做出正确的战略决策。""",
verbose=True,
allow_delegation=False,
tools=[search_tool, scrape_tool],
llm=my_llm
)
2.2 Task(任务)
Task 是分配给 Agent 的具体工作单元。每个 Task 包含:
- description(描述):任务的详细说明
- expected_output(期望输出):对输出结果的期望描述
- agent(执行者):负责执行此任务的 Agent
- context(上下文):来自其他 Task 的输出作为输入
- output_file(输出文件):结果保存的文件路径
from crewai import Task
research_task = Task(
description="""对2024年全球AI芯片市场进行全面调研,
包括主要厂商的市场份额、技术路线、产品布局等。
重点关注NVIDIA、AMD、Intel以及新兴玩家的动态。""",
expected_output="""一份结构清晰的市场调研报告,包含:
1. 市场规模与增长预测
2. 主要厂商竞争分析
3. 技术趋势与创新方向
4. 投资建议""",
agent=researcher,
output_file="market_research.md"
)
2.3 Crew(团队)
Crew 是 Agent 和 Task 的容器,负责协调整个工作流程:
- agents:团队成员列表
- tasks:任务列表
- process:执行流程类型
- verbose:是否输出详细日志
- memory:是否启用团队记忆
from crewai import Crew, Process
crew = Crew(
agents=[researcher, analyst, writer],
tasks=[research_task, analysis_task, writing_task],
process=Process.sequential,
verbose=True,
memory=True
)
2.4 Process(流程)
Process 定义了任务的执行方式:
- Process.sequential:任务按顺序依次执行,前一个任务的输出作为后一个的输入
- Process.hierarchical:由一个 Manager Agent 协调任务分配,支持动态任务规划
三、Agent角色设计:目标、背景、工具、记忆
设计好的 Agent 角色是 CrewAI 项目成功的关键。一个角色定义良好的 Agent,其表现可以远超通用的 LLM 调用。
3.1 角色设计原则
原则一:角色要具体
# ❌ 不好的角色定义
agent = Agent(
role="助手",
goal="帮助用户",
backstory="你是一个AI助手"
)
# ✅ 好的角色定义
agent = Agent(
role="Python性能优化专家",
goal="通过代码分析和重构,将Python应用的性能提升至少50%",
backstory="""你是一位在Python性能优化领域深耕15年的工程师。
你熟悉CPython内部机制、GIL的影响、内存管理和各种性能分析工具。
你曾为多家知名科技公司优化核心服务,将响应时间从秒级降低到毫秒级。
你信奉'测量先行'的原则,绝不凭直觉优化。"""
)
原则二:目标要可衡量
模糊的目标会导致 Agent 行为不确定。给 Agent 明确的成功标准:
analyst = Agent(
role="财务数据分析师",
goal="从提供的财务数据中识别出至少3个关键风险指标,并给出量化评估",
# ...
)
原则三:背景故事要提供上下文
背景故事不是装饰,它为 Agent 提供了决策框架:
editor = Agent(
role="科技媒体主编",
goal="确保文章质量达到发表标准",
backstory="""你是一位严格的科技媒体主编,拥有计算机科学博士学位。
你坚持技术准确性第一的原则,对代码示例要求能直接运行。
你的编辑风格是:去掉所有废话,让每个词都有价值。
你特别关注:数据来源是否可靠、技术细节是否准确、逻辑是否自洽。""",
# ...
)
3.2 高级角色配置
多模型混合使用:不同 Agent 可以使用不同的 LLM,根据任务特点选择最合适的模型。
from langchain_openai import ChatOpenAI
# 用GPT-4处理复杂推理
analyst = Agent(
role="战略分析师",
llm=ChatOpenAI(model="gpt-4o"),
# ...
)
# 用GPT-3.5处理信息整理
organizer = Agent(
role="信息整理员",
llm=ChatOpenAI(model="gpt-3.5-turbo"),
# ...
)
委派机制:允许 Agent 将子任务委派给团队中的其他 Agent。
manager = Agent(
role="项目经理",
goal="确保项目按时高质量完成",
allow_delegation=True, # 允许委派
# ...
)
四、Task定义与依赖管理
4.1 Task 的高级用法
上下文传递:Task 之间可以通过 context 参数传递信息。
research = Task(
description="调研AI Agent框架市场现状",
expected_output="详细的市场调研报告",
agent=researcher
)
analysis = Task(
description="基于调研结果,分析各框架的优劣势",
expected_output="对比分析表和推荐方案",
agent=analyst,
context=[research] # 将research任务的输出作为输入
)
report = Task(
description="撰写最终的技术选型报告",
expected_output="完整的Markdown格式报告",
agent=writer,
context=[research, analysis] # 可以接收多个任务的输出
)
4.2 异步执行 Task
对于耗时较长的 Task,可以使用异步执行:
task = Task(
description="分析大规模数据集",
expected_output="分析报告",
agent=analyst,
async_execution=True # 异步执行
)
4.3 条件执行与回调
def task_callback(task_output):
"""Task完成后的回调函数"""
print(f"任务完成,输出长度: {len(task_output.raw)}")
# 可以在这里做日志记录、数据持久化等
task = Task(
description="生成报告摘要",
expected_output="简洁的摘要文本",
agent=writer,
callback=task_callback,
output_file="summary.md"
)
4.4 Task 输出类型
CrewAI 支持多种输出格式:
from crewai import Task
# 默认输出
task = Task(
description="分析数据",
expected_output="分析结果",
agent=analyst
)
# JSON输出
task = Task(
description="提取结构化信息",
expected_output="JSON格式的结构化数据",
agent=analyst,
output_json=True
)
# Pydantic模型输出
from pydantic import BaseModel
class AnalysisResult(BaseModel):
summary: str
key_findings: list[str]
risk_level: str
task = Task(
description="分析风险",
expected_output="结构化的风险分析结果",
agent=analyst,
output_pydantic=AnalysisResult
)
五、Crew编排:顺序执行、层级管理、共识机制
5.1 顺序执行(Sequential Process)
最简单的编排模式,适合有明确先后顺序的工作流:
from crewai import Crew, Process
crew = Crew(
agents=[researcher, analyst, writer, reviewer],
tasks=[research_task, analysis_task, writing_task, review_task],
process=Process.sequential,
verbose=True
)
# 执行流程:researcher → analyst → writer → reviewer
result = crew.kickoff()
适用场景:
- 内容生产流水线(调研 → 写作 → 编辑 → 审核)
- 数据处理管道(采集 → 清洗 → 分析 → 可视化)
- 代码开发流程(需求分析 → 编码 → 测试 → 部署)
5.2 层级管理(Hierarchical Process)
由一个 Manager Agent 自动协调任务分配:
from crewai import Crew, Process
manager = Agent(
role="项目总监",
goal="高效协调团队完成项目目标",
backstory="你是一位经验丰富的项目经理...",
allow_delegation=True,
verbose=True
)
crew = Crew(
agents=[researcher, analyst, writer],
tasks=[research_task, analysis_task, writing_task],
process=Process.hierarchical,
manager_llm=ChatOpenAI(model="gpt-4o"),
verbose=True
)
在层级模式下,Manager Agent 会:
- 分析所有任务
- 决定任务执行顺序
- 将任务分配给最合适的 Agent
- 监控执行进度
- 必要时重新分配或调整
5.3 共识机制
CrewAI 支持通过设计实现简单的共识机制:
# 设计一个需要多方确认的流程
validator1 = Agent(
role="技术审核员",
goal="从技术角度验证方案的可行性",
# ...
)
validator2 = Agent(
role="业务审核员",
goal="从业务角度验证方案的合理性",
# ...
)
consensus_task = Task(
description="综合技术审核和业务审核的意见,给出最终结论",
expected_output="综合评估报告",
agent=decision_maker,
context=[tech_review_task, biz_review_task]
)
六、工具集成:自定义工具、第三方工具库
6.1 使用 CrewAI 内置工具
CrewAI 提供了丰富的内置工具:
from crewai_tools import (
SerperDevTool, # 搜索工具
ScrapeWebsiteTool, # 网页抓取
FileReadTool, # 文件读取
FileWriteTool, # 文件写取
DirectoryReadTool, # 目录读取
CodeInterpreterTool, # 代码执行
CSVSearchTool, # CSV搜索
PDFSearchTool, # PDF搜索
WebsiteSearchTool, # 网站搜索
YoutubeVideoSearchTool, # YouTube搜索
)
# 创建搜索工具
search_tool = SerperDevTool()
# 创建网页抓取工具
scrape_tool = ScrapeWebsiteTool()
# 创建文件读取工具
file_tool = FileReadTool(file_path="data/report.txt")
6.2 自定义工具
方式一:使用 @tool 装饰器
from crewai_tools import tool
@tool("股票价格查询工具")
def get_stock_price(symbol: str) -> str:
"""查询指定股票的实时价格。
Args:
symbol: 股票代码,如 AAPL, GOOGL
Returns:
股票价格信息
"""
# 这里可以调用真实的股票API
import yfinance as stock_ticker
stock = stock_ticker.Ticker(symbol)
price = stock.info.get("currentPrice", "N/A")
return f"{symbol} 当前价格: ${price}"
# 使用自定义工具
agent = Agent(
role="投资分析师",
tools=[get_stock_price],
# ...
)
方式二:继承 BaseTool 类
from crewai_tools import BaseTool
from pydantic import BaseModel, Field
from typing import Type
class DatabaseQueryInput(BaseModel):
query: str = Field(..., description="SQL查询语句")
database: str = Field(default="main", description="数据库名称")
class DatabaseQueryTool(BaseTool):
name: str = "数据库查询工具"
description: str = "执行SQL查询并返回结果"
args_schema: Type[BaseModel] = DatabaseQueryInput
def _run(self, query: str, database: str = "main") -> str:
# 实际的数据库查询逻辑
import sqlite3
conn = sqlite3.connect(f"{database}.db")
cursor = conn.execute(query)
results = cursor.fetchall()
conn.close()
return str(results)
db_tool = DatabaseQueryTool()
6.3 集成第三方工具
# 集成LangChain工具
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
wikipedia_tool = WikipediaQueryRun(
api_wrapper=WikipediaAPIWrapper()
)
# 将LangChain工具适配到CrewAI
from crewai_tools import tool
@tool("Wikipedia搜索")
def search_wikipedia(query: str) -> str:
"""在Wikipedia上搜索相关信息"""
return wikipedia_tool.run(query)
七、记忆与学习:短期、长期、实体记忆
CrewAI 的记忆系统是其最强大的特性之一,让 Agent 能够从历史交互中学习。
7.1 记忆系统架构
CrewAI 的记忆系统包含三个层次:
- 短期记忆(Short-term Memory):当前任务执行中的临时记忆
- 长期记忆(Long-term Memory):跨任务、跨会话的持久化记忆
- 实体记忆(Entity Memory):对特定实体(人物、组织、概念)的记忆
7.2 启用记忆系统
from crewai import Crew
crew = Crew(
agents=[researcher, analyst],
tasks=[research_task, analysis_task],
memory=True, # 启用记忆系统
verbose=True
)
7.3 自定义记忆存储
from crewai import Crew
from crewai.memory import LongTermMemory, ShortTermMemory, EntityMemory
from crewai.memory.storage import (
SQLiteStorage,
RAGStorage
)
# 使用SQLite存储长期记忆
long_term_storage = SQLiteStorage(db_path="./memory/long_term.db")
# 使用RAG存储实体记忆(基于向量数据库)
entity_storage = RAGStorage(
embedder_config={
"provider": "openai",
"config": {
"model": "text-embedding-3-small"
}
}
)
crew = Crew(
agents=[researcher, analyst],
tasks=[research_task, analysis_task],
memory=True,
long_term_memory=LongTermMemory(storage=long_term_storage),
entity_memory=EntityMemory(storage=entity_storage),
verbose=True
)
7.4 记忆的实际应用
# 场景:多轮研究任务
# 第一轮:研究AI行业
crew1 = Crew(
agents=[researcher],
tasks=[ai_research_task],
memory=True,
verbose=True
)
result1 = crew1.kickoff()
# 第二轮:基于第一轮记忆,研究云计算行业
# Agent会记住之前的研究方法和发现
crew2 = Crew(
agents=[researcher],
tasks=[cloud_research_task],
memory=True,
verbose=True
)
result2 = crew2.kickoff()
# researcher会利用之前学到的研究方法和分析框架
八、与LangChain/LlamaIndex集成
8.1 与 LangChain 集成
CrewAI 底层使用 LangChain 作为 LLM 接口,因此天然支持 LangChain 生态。
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_community.tools import DuckDuckGoSearchRun
# 使用不同的LLM provider
openai_llm = ChatOpenAI(model="gpt-4o", temperature=0.7)
anthropic_llm = ChatAnthropic(model="claude-3-opus-20240229")
# 为不同Agent分配不同模型
researcher = Agent(
role="研究员",
llm=openai_llm,
# ...
)
writer = Agent(
role="撰稿人",
llm=anthropic_llm,
# ...
)
# 使用LangChain工具
ddg_search = DuckDuckGoSearchRun()
@tool("网页搜索")
def search_web(query: str) -> str:
"""搜索网页获取最新信息"""
return ddg_search.run(query)
8.2 与 LlamaIndex 集成
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from crewai_tools import tool
# 创建LlamaIndex查询引擎
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
@tool("知识库查询")
def query_knowledge_base(question: str) -> str:
"""从本地知识库中查询信息"""
response = query_engine.query(question)
return str(response)
# 将知识库工具分配给Agent
analyst = Agent(
role="知识分析师",
tools=[query_knowledge_base],
# ...
)
8.3 自定义LLM Provider
from langchain_openai import ChatOpenAI
# 使用本地部署的模型
local_llm = ChatOpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama",
model="qwen2.5:72b",
temperature=0.3
)
# 使用vLLM部署的模型
vllm_llm = ChatOpenAI(
base_url="http://localhost:8000/v1",
api_key="token-abc123",
model="meta-llama/Llama-3-70b-chat-hf",
temperature=0.5
)
九、人类介入机制(Human-in-the-loop)
9.1 为什么需要人类介入?
在很多场景中,完全自动化是不够的:
- 关键决策:投资建议、合同审核等需要人工确认
- 质量控制:发布前的内容审核
- 异常处理:当 Agent 不确定时请求人类指导
9.2 启用人类介入
from crewai import Agent, Task, Crew
# 在Agent级别启用人类介入
reviewer = Agent(
role="内容审核员",
goal="确保内容质量",
human_input=True, # 启用人类输入
# ...
)
# 在Task级别启用人类介入
final_review = Task(
description="对最终报告进行审核",
expected_output="审核意见",
agent=reviewer,
human_input=True # 此任务需要人类确认
)
9.3 实现审批流程
from crewai import Crew, Task, Agent
# 定义一个需要多级审批的流程
writer = Agent(role="撰稿人", goal="撰写高质量文章", ...)
editor = Agent(role="编辑", goal="确保文章质量", ...)
approver = Agent(role="总编", goal="做出最终发布决定", human_input=True, ...)
draft_task = Task(
description="撰写初稿",
expected_output="文章初稿",
agent=writer
)
edit_task = Task(
description="编辑和修改文章",
expected_output="修改后的文章",
agent=editor,
context=[draft_task]
)
approval_task = Task(
description="审核文章是否可以发布",
expected_output="发布决定和修改建议",
agent=approver,
context=[edit_task],
human_input=True # 需要人类总编确认
)
crew = Crew(
agents=[writer, editor, approver],
tasks=[draft_task, edit_task, approval_task],
verbose=True
)
9.4 人类反馈的处理
# CrewAI会在human_input为True时暂停执行,等待输入
# 人类的反馈会被注入到Agent的上下文中,影响后续行为
result = crew.kickoff()
# 执行流程:
# 1. writer撰写初稿
# 2. editor编辑文章
# 3. 暂停,等待人类输入审核意见
# 4. approver根据人类意见做出决定
十、性能优化与调试技巧
10.1 Token 使用优化
# 1. 使用更小的模型处理简单任务
from langchain_openai import ChatOpenAI
fast_llm = ChatOpenAI(model="gpt-3.5-turbo", max_tokens=500)
smart_llm = ChatOpenAI(model="gpt-4o", max_tokens=2000)
formatter = Agent(
role="格式化助手",
llm=fast_llm, # 简单任务用小模型
# ...
)
strategist = Agent(
role="战略顾问",
llm=smart_llm, # 复杂任务用大模型
# ...
)
# 2. 控制输出长度
task = Task(
description="用不超过500字总结报告要点",
expected_output="500字以内的摘要",
agent=writer
)
10.2 调试技巧
# 1. 启用详细日志
crew = Crew(
agents=[...],
tasks=[...],
verbose=True # 输出详细的执行过程
)
# 2. 使用step_callback监控每一步
def step_callback(step_output):
"""每步执行后的回调"""
print(f"Step输出: {step_output}")
# 可以记录到文件或监控系统
crew = Crew(
agents=[...],
tasks=[...],
step_callback=step_callback
)
# 3. 使用LangChain的调试模式
import langchain
langchain.debug = True
10.3 错误处理
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
try:
result = crew.kickoff()
except Exception as e:
logger.error(f"Crew执行失败: {e}")
# 可以实现重试逻辑
for attempt in range(3):
try:
result = crew.kickoff()
break
except Exception as retry_error:
logger.warning(f"重试 {attempt + 1} 失败: {retry_error}")
10.4 并发与异步优化
import asyncio
from crewai import Crew
async def run_crew_async():
"""异步执行Crew"""
crew = Crew(
agents=[researcher, analyst],
tasks=[research_task, analysis_task],
verbose=True
)
result = await crew.kickoff_async()
return result
# 并行执行多个独立的Crew
async def run_parallel_crews():
tasks = [
run_crew_async(),
run_crew_async(),
run_crew_async()
]
results = await asyncio.gather(*tasks)
return results
十一、实战项目:构建自动化研究分析团队
11.1 项目概述
我们将构建一个完整的自动化研究分析团队,能够:
- 自动搜索和收集指定主题的信息
- 对收集到的数据进行深度分析
- 生成结构化的研究报告
- 对报告进行质量审核
11.2 完整代码实现
"""
CrewAI 自动化研究分析团队
功能:自动完成从信息收集到报告生成的全流程
"""
import os
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, ScrapeWebsiteTool, FileReadTool, FileWriteTool
from langchain_openai import ChatOpenAI
# ==================== 环境配置 ====================
os.environ["OPENAI_API_KEY"] = "your-api-key"
os.environ["SERPER_API_KEY"] = "your-serper-key"
# ==================== 工具准备 ====================
search_tool = SerperDevTool()
scrape_tool = ScrapeWebsiteTool()
file_write_tool = FileWriteTool()
# ==================== LLM配置 ====================
# 使用GPT-4o处理复杂分析
smart_llm = ChatOpenAI(model="gpt-4o", temperature=0.3)
# 使用GPT-3.5处理信息整理
fast_llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.5)
# ==================== Agent定义 ====================
# 信息收集专家
collector = Agent(
role="信息收集专家",
goal="高效收集指定主题的全面、准确、最新的信息",
backstory="""你是一位资深的信息收集专家,擅长使用各种搜索工具和数据源。
你有极强的信息筛选能力,能快速识别高质量、可靠的信息来源。
你特别擅长:
- 使用精确的搜索关键词找到最相关的信息
- 从大量网页中提取关键数据点
- 识别信息的可信度和时效性
- 整理和归类收集到的信息""",
tools=[search_tool, scrape_tool],
llm=smart_llm,
verbose=True,
allow_delegation=False,
max_iter=15
)
# 数据分析师
analyst = Agent(
role="高级数据分析师",
goal="从收集到的信息中提取深度洞察和趋势分析",
backstory="""你是一位拥有统计学和计算机科学双学位的高级数据分析师。
你擅长从非结构化数据中提取结构化信息,发现隐藏的模式和趋势。
你的分析方法包括:
- SWOT分析
- 趋势分析
- 竞争格局分析
- 技术路线图分析
- 市场规模预测""",
llm=smart_llm,
verbose=True,
allow_delegation=False
)
# 报告撰写专家
writer = Agent(
role="专业报告撰写专家",
goal="将分析结果转化为清晰、专业、有说服力的研究报告",
backstory="""你是一位资深的技术写作者,曾为多家顶级咨询公司撰写研究报告。
你的写作风格:清晰、简洁、有逻辑、数据驱动。
你的报告特点:
- 结构清晰,使用标准的研究报告框架
- 数据准确,每个结论都有数据支撑
- 观点明确,给出可操作的建议
- 语言专业但不晦涩""",
tools=[file_write_tool],
llm=smart_llm,
verbose=True,
allow_delegation=False
)
# 质量审核员
reviewer = Agent(
role="质量审核专家",
goal="确保报告的准确性、完整性和专业性",
backstory="""你是一位严谨的质量审核专家,拥有多年学术论文和商业报告的审核经验。
你对报告的要求极为严格:
- 逻辑链条必须完整
- 数据必须有来源
- 结论必须有依据
- 格式必须规范
- 语言必须专业""",
llm=smart_llm,
verbose=True,
allow_delegation=False,
human_input=True # 审核结果需要人类确认
)
# ==================== Task定义 ====================
def create_research_tasks(topic: str):
"""根据研究主题创建完整的任务链"""
# 任务1:信息收集
collection_task = Task(
description=f"""对以下主题进行全面的信息收集:
研究主题:{topic}
要求:
1. 搜索至少5个不同的信息来源
2. 收集的信息应包括:背景概述、最新发展、主要参与者、技术趋势、市场数据
3. 标注每个信息的来源和可信度
4. 整理成结构化的信息汇编""",
expected_output="""一份结构化的信息汇编,包含:
- 背景概述(500字以上)
- 最新发展动态(至少5条)
- 主要参与者列表及简介
- 关键数据点汇总
- 信息来源标注""",
agent=collector
)
# 任务2:深度分析
analysis_task = Task(
description=f"""基于收集到的信息,对"{topic}"进行深度分析:
分析维度:
1. 市场/行业现状分析
2. 竞争格局分析
3. 技术发展趋势
4. 机遇与挑战分析(SWOT)
5. 未来发展趋势预测""",
expected_output="""一份深度分析报告,包含:
- 市场现状概述
- 竞争格局图表描述
- 技术演进路线
- SWOT分析矩阵
- 未来3-5年发展预测""",
agent=analyst,
context=[collection_task]
)
# 任务3:报告撰写
writing_task = Task(
description=f"""将分析结果撰写成一份完整的研究报告:
主题:{topic}
报告结构要求:
1. 执行摘要(200-300字)
2. 研究背景与方法
3. 市场/行业分析
4. 深度洞察
5. 机遇与挑战
6. 战略建议
7. 结论与展望
8. 参考文献
格式要求:
- 使用Markdown格式
- 适当使用标题、列表、表格
- 语言专业、简洁""",
expected_output="一份完整的、可直接使用的Markdown格式研究报告",
agent=writer,
context=[collection_task, analysis_task],
output_file="research_report.md"
)
# 任务4:质量审核
review_task = Task(
description="对研究报告进行全面质量审核",
expected_output="""审核报告,包含:
- 整体评分(1-10分)
- 优点列表
- 需改进的地方
- 最终发布建议(发布/修改后发布/重写)""",
agent=reviewer,
context=[writing_task],
human_input=True
)
return [collection_task, analysis_task, writing_task, review_task]
# ==================== 执行 ====================
def run_research_team(topic: str):
"""运行研究团队"""
tasks = create_research_tasks(topic)
crew = Crew(
agents=[collector, analyst, writer, reviewer],
tasks=tasks,
process=Process.sequential,
memory=True,
verbose=True
)
print(f"🚀 开始研究: {topic}")
print("=" * 60)
result = crew.kickoff()
print("=" * 60)
print("✅ 研究完成!")
print(f"📄 报告已保存到: research_report.md")
return result
# ==================== 主程序 ====================
if __name__ == "__main__":
# 运行研究团队
topic = "2024年全球人工智能芯片市场发展趋势分析"
result = run_research_team(topic)
print(result)
11.3 运行与测试
# 安装依赖
pip install crewai crewai-tools langchain-openai
# 设置环境变量
export OPENAI_API_KEY="your-api-key"
export SERPER_API_KEY="your-serper-key"
# 运行
python research_team.py
11.4 扩展建议
- 添加更多专业Agent:如行业专家、法务顾问等
- 集成更多数据源:如数据库、API、PDF文档等
- 添加缓存机制:避免重复搜索相同内容
- 实现并行执行:对独立任务使用异步执行
- 添加Web界面:使用 Streamlit 或 Gradio 构建交互界面
总结
CrewAI 通过其直觉化的角色定义和灵活的编排模式,让多智能体协作变得简单而强大。本教程从核心概念到实战项目,系统地介绍了 CrewAI 的方方面面。
关键要点回顾:
- Agent 设计是核心:好的角色定义决定了团队的表现
- Task 依赖管理很重要:合理设计任务间的数据流
- 工具是 Agent 的手脚:根据任务需求选择合适的工具
- 记忆让 Agent 成长:启用记忆系统提升长期表现
- 人类介入保质量:关键环节加入人工审核
CrewAI 正在快速发展,新特性不断推出。建议持续关注官方文档和社区动态,将最新的最佳实践应用到你的项目中。
本教程由 AI 教程助手生成,内容基于 CrewAI 框架的核心设计理念和实践经验编写。