CrewAI 完整教程:从入门到实战
CrewAI 完整教程:从入门到实战
CrewAI 是一个流行的开源 AI Agent 框架,它让你能够轻松创建多个具有不同角色的智能体,让它们协同工作来完成复杂任务。本文将带你从零开始学习 CrewAI。
一、CrewAI 简介
CrewAI 的核心理念是角色化智能体协作。就像真实的工作团队一样,每个智能体都有:
- 角色:研究员、作家、评论家等
- 目标:每个智能体的具体任务
- 背景:智能体的专业知识和技能
- 工具:完成任务所需的能力
多个智能体可以组成一个"团队",按照预定义的流程协同工作。
二、安装与配置
2.1 环境准备
# 创建虚拟环境
python -m venv crewai_env
source crewai_env/bin/activate # Linux/Mac
# 或
crewai_env\Scripts\activate # Windows
# 升级 pip
pip install --upgrade pip
2.2 安装 CrewAI
# 安装 CrewAI 核心库
pip install crewai
# 如果需要使用 OpenAI,安装 OpenAI SDK
pip install openai
# 如果需要使用工具库
pip install crewai-tools
# 验证安装
python -c "import crewai; print(crewai.__version__)"
2.3 配置 API Key
CrewAI 支持 LLM 提供商。以 OpenAI 为例:
# 设置环境变量
export OPENAI_API_KEY="your-api-key-here"
# Windows PowerShell
set OPENAI_API_KEY=your-api-key-here
或者在代码中设置:
import os
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
三、快速开始:第一个 CrewAI 项目
3.1 创建简单任务
from crewai import Agent, Task, Crew, Process
# 定义智能体
researcher = Agent(
role="资深研究员",
goal="发现新兴技术趋势",
backstory="""你是一名资深的科技研究员,专注于
分析最新技术趋势和创新。你有深厚的行业知识
和敏锐的洞察力。""",
verbose=True,
allow_delegation=False
)
# 定义任务
research_task = Task(
description="研究 2024 年 AI Agent 技术的发展趋势",
expected_output="一份包含 3-5 个主要趋势的报告",
agent=researcher
)
# 创建团队
crew = Crew(
agents=[researcher],
tasks=[research_task],
verbose=2
)
# 执行任务
result = crew.kickoff()
print(result)
3.2 多智能体协作
from crewai import Agent, Task, Crew, Process
# 定义多个智能体
researcher = Agent(
role="研究员",
goal="收集和整理信息",
backstory="你是一名专业的研究员,擅长信息收集和分析。",
verbose=True
)
writer = Agent(
role="技术作家",
goal="将研究结果写成易懂的文章",
backstory="你是一名优秀的技术作家,擅长将复杂概念
用简单的语言表达清楚。",
verbose=True
)
# 定义任务
research_task = Task(
description="研究 Python 在 AI 开发中的最新应用",
agent=researcher,
expected_output="详细的研究笔记"
)
writing_task = Task(
description="根据研究笔记写一篇技术博客文章",
agent=writer,
expected_output="完整的博客文章",
context=[research_task] # 依赖上一个任务
)
# 创建团队
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, writing_task],
process=Process.sequential, # 顺序执行
verbose=2
)
# 执行
result = crew.kickoff()
print(result)
四、高级功能
4.1 使用工具
CrewAI 提供了丰富的工具,让智能体能够执行实际操作:
from crewai import Agent
from crewai_tools import (
SerperDevTool,
ScrapeWebsiteTool,
FileReadTool,
DirectoryReadTool
)
# 创建工具实例
search_tool = SerperDevTool()
scrape_tool = ScrapeWebsiteTool()
file_tool = FileReadTool()
# 智能体使用工具
web_researcher = Agent(
role="网络研究员",
goal="从网络收集最新信息",
backstory="你擅长使用搜索和网络爬虫工具获取信息。",
tools=[search_tool, scrape_tool],
verbose=True
)
task = Task(
description="搜索并阅读关于 CrewAI 的最新文章",
agent=web_researcher,
expected_output="总结文章内容"
)
4.2 分层流程
CrewAI 支持两种主要流程:
from crewai import Process
# 顺序流程(默认)
# 每个任务完成后,下一个任务才能开始
crew = Crew(
agents=[agent1, agent2],
tasks=[task1, task2],
process=Process.sequential
)
# 并行流程
# 所有任务同时开始,智能体独立工作
crew = Crew(
agents=[agent1, agent2, agent3],
tasks=[task1, task2, task3],
process=Process.hierarchical
)
4.3 使用本地 LLM
from langchain_community.llms import Ollama
from crewai import Agent
# 使用本地 Ollama
llm = Ollama(model="llama2")
researcher = Agent(
role="研究员",
goal="研究技术趋势",
backstory="你是一名技术研究员。",
llm=llm, # 使用本地 LLM
verbose=True
)
五、实战案例:新闻摘要团队
5.1 完整代码
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, ScrapeWebsiteTool
# 初始化工具
search_tool = SerperDevTool()
scrape_tool = ScrapeWebsiteTool()
# 定义智能体
news_finder = Agent(
role="新闻搜索员",
goal="找到最新的科技新闻",
backstory="你是一名新闻搜索专家,擅长找到
最新的科技新闻和重要事件。",
tools=[search_tool],
verbose=True
)
news_summarizer = Agent(
role="新闻编辑",
goal="总结新闻内容",
backstory="你是一名经验丰富的新闻编辑,
擅长快速提取新闻要点。",
verbose=True
)
blog_writer = Agent(
role="博客作家",
goal="写一篇吸引人的博客文章",
backstory="你是一名优秀的博客作家,
擅长用引人入胜的方式讲述技术新闻。",
verbose=True
)
# 定义任务
find_news = Task(
description="搜索今天的前 3 条 AI 相关科技新闻",
agent=news_finder,
expected_output="3 条新闻的标题和链接"
)
summarize_news = Task(
description="阅读并总结每条新闻的内容",
agent=news_summarizer,
expected_output="每条新闻的简短总结",
context=[find_news]
)
write_blog = Task(
description="根据新闻总结写一篇博客文章",
agent=blog_writer,
expected_output="完整的博客文章",
context=[summarize_news]
)
# 创建团队
crew = Crew(
agents=[news_finder, news_summarizer, blog_writer],
tasks=[find_news, summarize_news, write_blog],
process=Process.sequential,
verbose=2
)
# 执行
print("=== 开始生成新闻博客 ===")
result = crew.kickoff()
print("\n=== 生成结果 ===")
print(result)
六、最佳实践
6.1 智能体设计
# 好的智能体设计
good_agent = Agent(
role="数据分析专家", # 明确的角色
goal="分析数据并提供洞察", # 具体的目标
backstory="""你有 10 年的数据分析经验,
擅长使用 Python 进行数据处理和可视化。""", # 详细的背景
tools=[pandas_tool, matplotlib_tool], # 合适的工具
verbose=True,
allow_delegation=False # 根据需求设置
)
# 避免的设计
bad_agent = Agent(
role="专家", # 太模糊
goal="做事", # 不具体
backstory="你很厉害", # 无用信息
verbose=True
)
6.2 任务设计
# 好的任务设计
good_task = Task(
description="分析 sales.csv 文件,找出销售额最高的 5 个产品,
并计算它们占总销售额的百分比。",
expected_output="表格:产品名、销售额、百分比",
agent=data_analyst
)
# 避免的任务设计
bad_task = Task(
description="分析数据",
expected_output="结果",
agent=data_analyst
)
6.3 性能优化
# 1. 使用缓存
from crewai import Crew
from langchain.cache import InMemoryCache
import langchain
langchain.llm_cache = InMemoryCache()
# 2. 并行执行
crew = Crew(
agents=[agent1, agent2],
tasks=[task1, task2],
process=Process.hierarchical # 并行执行
)
# 3. 限制最大执行时间
crew = Crew(
agents=[agent1],
tasks=[task1],
max_execution_time=300 # 5 分钟
)
七、常见问题
7.1 API 调用失败
# 检查 API key 是否正确
import os
print(os.environ.get("OPENAI_API_KEY"))
# 使用重试机制
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def create_agent():
return Agent(...)
7.2 内存占用过高
# 限制 LLM 上下文长度
# 使用较小的模型
# 定期清理缓存
7.3 输出质量不稳定
# 1. 改进 prompt
researcher = Agent(
role="研究员",
goal="发现新兴技术趋势",
backstory="""你是一名资深的科技研究员。
你需要:
1. 收集至少 3 个可靠来源的信息
2. 验证信息的准确性
3. 提供具体的数据和案例
4. 给出清晰的分析结论"""
)
# 2. 使用温度参数控制随机性
llm = ChatOpenAI(temperature=0.3) # 更稳定的输出
八、进阶资源
8.1 官方资源
- GitHub: https://github.com/joaomdmoura/crewAI
- 文档: https://docs.crewai.com
- 示例: https://github.com/joaomdmoura/crewAI-examples
8.2 推荐学习路径
- 完成本文的示例代码
- 阅读官方文档的高级章节
- 查看官方示例项目
- 尝试构建自己的应用
- 参与社区讨论
九、总结
CrewAI 是一个强大且易用的 AI Agent 框架。通过本文,你学习了:
- CrewAI 的核心概念:智能体、任务、团队
- 如何创建和管理智能体
- 如何设计任务和工作流程
- 如何使用工具增强智能体能力
- 实战案例和最佳实践
下一步,尝试用 CrewAI 构建你自己的 AI Agent 应用吧!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。






