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 推荐学习路径

  1. 完成本文的示例代码
  2. 阅读官方文档的高级章节
  3. 查看官方示例项目
  4. 尝试构建自己的应用
  5. 参与社区讨论

九、总结

CrewAI 是一个强大且易用的 AI Agent 框架。通过本文,你学习了:

  • CrewAI 的核心概念:智能体、任务、团队
  • 如何创建和管理智能体
  • 如何设计任务和工作流程
  • 如何使用工具增强智能体能力
  • 实战案例和最佳实践

下一步,尝试用 CrewAI 构建你自己的 AI Agent 应用吧!

发表回复

后才能评论