CrewAI 多智能体协作开发完全教程

教程简介

零基础CrewAI多智能体协作开发完全教程,涵盖Agent智能体设计、Task任务编排、Tool工具系统、Crew团队协作、流程控制与记忆系统等核心技能,配有自动化研究报告生成、智能内容创作团队、代码审查系统三大实战项目,适合AI开发者系统学习。

CrewAI 多智能体协作开发完全教程

从零开始掌握 CrewAI 多智能体协作框架,构建专业的 AI Agent 团队


目录

  1. CrewAI 简介与核心概念
  2. 环境搭建与安装
  3. Agent 智能体详解
  4. Task 任务系统
  5. Tool 工具系统
  6. Crew 团队协作
  7. 流程控制与记忆系统
  8. 实战项目一:自动化研究报告生成
  9. 实战项目二:智能内容创作团队
  10. 实战项目三:代码审查与优化系统
  11. 高级技巧与最佳实践
  12. 常见问题与排错指南

1. CrewAI 简介与核心概念

1.1 什么是 CrewAI

CrewAI 是一个开源的多智能体协作框架,它让多个 AI Agent 像一个高效团队一样协同工作。与单一 AI Agent 不同,CrewAI 通过角色分工、任务委派和协作机制,让多个专业化 Agent 共同完成复杂任务。

想象一下,你有一个由 AI 专家组成的团队:一个负责研究,一个负责写作,一个负责审查——它们各司其职,互相配合,最终产出高质量的工作成果。这就是 CrewAI 的核心理念。

1.2 为什么选择 CrewAI

在 AI 应用开发领域,我们面临几个关键挑战:

单一 Agent 的局限性

当任务变得复杂时,单一 Agent 往往力不从心。比如,让它同时做市场调研、数据分析和报告撰写,效果通常不如让专业化的 Agent 分工协作。

CrewAI 的优势

  • 角色专业化:每个 Agent 有明确的角色、目标和专长
  • 任务编排:支持顺序、并行和层级等多种任务执行模式
  • 工具集成:内置丰富的工具支持,也支持自定义工具
  • 记忆系统:Agent 之间可以共享上下文和记忆
  • 简洁 API:设计优雅,上手快,代码量少

1.3 CrewAI 与其他框架对比

特性 CrewAI LangChain Agent AutoGen MetaGPT
多智能体协作 原生支持 需手动编排 原生支持 原生支持
角色定义 直观简洁 较复杂 中等 直观
任务编排 灵活 灵活 中等 结构化
学习曲线
社区活跃度 很高
适用场景 通用协作 链式调用 对话式 软件开发

1.4 核心概念一览

CrewAI 的核心概念包括四个部分:

Agent(智能体):具有特定角色和能力的 AI 实体,类似于团队中的成员。每个 Agent 都有自己的目标、背景故事和工具集。

Task(任务):需要完成的具体工作单元,包含描述、预期输出和负责的 Agent。

Tool(工具):Agent 可以使用的外部能力,如搜索、读写文件、调用 API 等。

Crew(团队):由多个 Agent 组成的协作单元,定义了协作策略和任务执行流程。


2. 环境搭建与安装

2.1 系统要求

在开始之前,确保你的环境满足以下要求:

  • Python 3.10 或更高版本
  • pip 包管理器
  • 至少一个 LLM API Key(OpenAI、Anthropic 等)

检查 Python 版本:

python3 --version
# 输出应为 Python 3.10.x 或更高

2.2 创建虚拟环境

推荐使用虚拟环境来管理依赖:

# 创建项目目录
mkdir crewai-project
cd crewai-project

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
# macOS/Linux:
source venv/bin/activate
# Windows:
# venv\Scripts\activate

2.3 安装 CrewAI

CrewAI 提供了简便的安装方式:

# 安装 CrewAI 核心包
pip install crewai

# 安装包含所有工具的完整版
pip install 'crewai[tools]'

# 或者使用 crewai 命令行工具创建项目
pip install crewai-tools

验证安装:

python3 -c "import crewai; print(f'CrewAI version: {crewai.__version__}')"

2.4 配置 API Key

CrewAI 支持多种 LLM 提供商。以下是配置方式:

方式一:环境变量(推荐)

# OpenAI
export OPENAI_API_KEY="your-openai-api-key"

# 或者使用其他提供商
export ANTHROPIC_API_KEY="your-anthropic-api-key"

方式二:.env 文件

在项目根目录创建 .env 文件:

OPENAI_API_KEY=your-openai-api-key
# OPENAI_BASE_URL=https://api.openai.com/v1  # 可选,自定义 API 端点

然后在代码中加载:

from dotenv import load_dotenv
load_dotenv()

方式三:直接在代码中指定模型

from crewai import Agent

agent = Agent(
    role="研究员",
    goal="深入研究指定主题",
    backstory="你是一位经验丰富的研究员",
    llm="gpt-4o"  # 或 "anthropic/claude-3-5-sonnet"
)

2.5 使用本地模型

如果你想使用本地部署的模型(如通过 Ollama),可以这样配置:

from crewai import Agent, LLM

# 使用 Ollama 本地模型
ollama_llm = LLM(
    model="ollama/qwen2.5:14b",
    base_url="http://localhost:11434"
)

agent = Agent(
    role="助手",
    goal="帮助用户解决问题",
    backstory="你是一个乐于助人的AI助手",
    llm=ollama_llm
)

2.6 验证环境

创建一个简单的测试脚本来验证环境配置:

# test_env.py
from crewai import Agent, Task, Crew

# 创建一个简单的 Agent
test_agent = Agent(
    role="测试助手",
    goal="验证环境配置是否正确",
    backstory="你负责测试 CrewAI 环境是否正常工作",
    verbose=True
)

# 创建一个简单的任务
test_task = Task(
    description="请用一句话介绍你自己",
    expected_output="一句话的自我介绍",
    agent=test_agent
)

# 创建 Crew 并执行
crew = Crew(
    agents=[test_agent],
    tasks=[test_task],
    verbose=True
)

result = crew.kickoff()
print(f"测试结果: {result}")

运行测试:

python3 test_env.py

如果看到正常的输出,说明环境配置成功。


3. Agent 智能体详解

3.1 Agent 的基本属性

Agent 是 CrewAI 的核心构建块。每个 Agent 都需要定义以下关键属性:

from crewai import Agent

researcher = Agent(
    role="高级研究员",           # 角色名称
    goal="发现并分析最新的行业趋势",  # 目标
    backstory="""                  # 背景故事
        你是一位拥有10年经验的高级研究员,
        专注于科技行业趋势分析。你善于从海量信息中
        提取关键洞察,并以清晰的方式呈现给决策者。
    """,
    verbose=True,                  # 是否输出详细日志
    allow_delegation=True,         # 是否允许委派任务
    max_iter=25,                   # 最大迭代次数
    max_rpm=10,                    # 每分钟最大请求数
    memory=True,                   # 是否启用记忆
)

3.2 角色设计原则

设计 Agent 角色时,遵循以下原则可以让协作效果更好:

明确性原则

角色描述应该具体而明确,避免模糊的定义。

# 不好的例子
bad_agent = Agent(
    role="助手",
    goal="帮忙做事",
    backstory="你是一个助手"
)

# 好的例子
good_agent = Agent(
    role="资深数据分析师",
    goal="通过数据挖掘发现业务增长机会",
    backstory="""
        你是一位在电商领域有8年经验的数据分析师。
        擅长使用 Python 进行数据清洗、统计分析和可视化。
        你特别关注用户行为数据,善于发现转化率优化的机会。
        你的分析风格是数据驱动、逻辑清晰,善于用图表说话。
    """
)

专业性原则

每个 Agent 应该有明确的专业领域和技能边界。

# 代码审查专家
code_reviewer = Agent(
    role="代码审查专家",
    goal="确保代码质量、安全性和最佳实践",
    backstory="""
        你是一位资深的软件工程师,拥有15年的代码审查经验。
        你精通 Python、JavaScript、Go 等主流语言,
        熟悉 OWASP 安全标准和常见漏洞模式。
        你注重代码的可读性、可维护性和性能优化。
        你的审查严格但建设性,总是提供具体的改进建议。
    """
)

3.3 委派机制

CrewAI 的委派机制允许 Agent 将子任务分配给其他 Agent:

# 允许委派的 Agent
manager = Agent(
    role="项目经理",
    goal="协调团队完成项目目标",
    backstory="你是一位经验丰富的项目经理,善于任务分配和进度管理",
    allow_delegation=True  # 启用委派
)

# 不允许委派的 Agent(专注于自己的任务)
writer = Agent(
    role="技术文档撰写者",
    goal="撰写清晰、准确的技术文档",
    backstory="你是一位专业的技术写作专家",
    allow_delegation=False  # 禁用委派
)

allow_delegation=True 时,Agent 可以:

  • 将不适合自己处理的子任务委派给其他 Agent
  • 请求其他 Agent 提供专业意见
  • 在执行过程中动态调整任务分配

3.4 Agent 配置文件管理

对于复杂项目,建议将 Agent 配置集中管理:

# agents.yaml
# 可以使用 YAML 文件来管理 Agent 配置

# agents_config.py
AGENTS_CONFIG = {
    "researcher": {
        "role": "高级研究员",
        "goal": "深入研究并分析指定主题",
        "backstory": """
            你是一位资深研究员,拥有跨学科的研究能力。
            你善于查阅学术论文、行业报告和技术文档,
            能够从多维度分析问题并提出独到见解。
        """
    },
    "writer": {
        "role": "内容创作者",
        "goal": "将研究成果转化为高质量的文章",
        "backstory": """
            你是一位经验丰富的技术作家,
            擅长将复杂的技术概念用通俗易懂的语言表达。
            你的文章结构清晰、逻辑严密、可读性强。
        """
    },
    "reviewer": {
        "role": "质量审查员",
        "goal": "确保输出内容的准确性和质量",
        "backstory": """
            你是一位严谨的质量控制专家,
            对细节有极高的要求。你擅长发现逻辑漏洞、
            事实错误和表达不清的地方,并提供改进建议。
        """
    }
}

使用配置创建 Agent:

from crewai import Agent

def create_agent(agent_type, llm=None, **kwargs):
    config = AGENTS_CONFIG[agent_type].copy()
    config.update(kwargs)
    if llm:
        config['llm'] = llm
    return Agent(**config)

# 使用
researcher = create_agent("researcher", verbose=True)
writer = create_agent("writer")
reviewer = create_agent("reviewer")

3.5 多模型支持

CrewAI 允许为不同的 Agent 配置不同的模型:

from crewai import Agent, LLM

# 强大的模型用于复杂推理
gpt4_llm = LLM(model="gpt-4o")

# 快速模型用于简单任务
gpt4_mini_llm = LLM(model="gpt-4o-mini")

# 本地模型用于隐私敏感任务
local_llm = LLM(
    model="ollama/qwen2.5:14b",
    base_url="http://localhost:11434"
)

# 研究员使用强模型
researcher = Agent(
    role="研究员",
    goal="深入分析问题",
    backstory="你是资深研究员",
    llm=gpt4_llm
)

# 写手使用中等模型
writer = Agent(
    role="写手",
    goal="撰写内容",
    backstory="你是专业写手",
    llm=gpt4_mini_llm
)

# 敏感数据处理使用本地模型
privacy_agent = Agent(
    role="隐私数据处理专家",
    goal="安全处理敏感数据",
    backstory="你专注于数据安全",
    llm=local_llm
)

4. Task 任务系统

4.1 Task 的基本结构

Task 定义了 Agent 需要完成的具体工作:

from crewai import Task

research_task = Task(
    description="""
        对"2024年AI行业发展趋势"进行全面调研,包括:
        1. 大语言模型的最新进展
        2. AI Agent 的发展方向
        3. 多模态AI的突破
        4. AI在各行业的应用案例
        5. 主要玩家的竞争格局
    """,
    expected_output="""
        一份结构化的研究报告,包含:
        - 各领域的关键发现
        - 数据支撑和案例分析
        - 未来趋势预测
        - 行动建议
    """,
    agent=researcher,
    output_file="research_report.md",  # 可选:输出到文件
)

4.2 任务描述技巧

好的任务描述应该包含以下要素:

具体性:明确说明要做什么,不要含糊。

# 不好的描述
bad_task = Task(
    description="分析数据",
    expected_output="分析报告",
    agent=analyst
)

# 好的描述
good_task = Task(
    description="""
        分析过去12个月的销售数据(sales_data.csv),具体包括:
        1. 月度销售额趋势分析
        2. 各产品类别占比变化
        3. 客户地域分布特征
        4. 复购率和客户留存分析
        5. 识别Top 10 畅销产品和滞销产品
    """,
    expected_output="""
        一份包含以下内容的数据分析报告:
        - 趋势图表(至少5张)
        - 关键数据指标汇总表
        - 洞察发现(至少3条可执行的建议)
        - 数据质量说明
    """,
    agent=analyst
)

约束条件:明确输出的格式、长度、风格等要求。

blog_task = Task(
    description="""
        撰写一篇关于"AI编程助手"的技术博客文章。
        
        约束条件:
        - 字数:2000-3000字
        - 风格:技术科普,面向有一定编程基础的读者
        - 结构:引言、技术原理、主流工具对比、使用技巧、展望
        - 语言:中文,专业术语需附英文原文
        - 需要包含实际代码示例
    """,
    expected_output="一篇完整的Markdown格式博客文章",
    agent=writer
)

4.3 任务间的依赖关系

在 CrewAI 中,任务可以有上下文依赖关系:

# 任务1:数据收集
collect_task = Task(
    description="收集指定主题的相关资料和数据",
    expected_output="结构化的原始资料集合",
    agent=researcher
)

# 任务2:基于任务1的输出进行分析
analyze_task = Task(
    description="""
        基于收集到的资料,进行深度分析。
        关注以下方面:
        - 关键趋势识别
        - 数据模式发现
        - 因果关系分析
    """,
    expected_output="分析报告",
    agent=analyst,
    context=[collect_task]  # 依赖任务1的输出
)

# 任务3:基于任务1和2的输出撰写报告
write_task = Task(
    description="基于研究资料和分析结果,撰写最终报告",
    expected_output="完整的最终报告",
    agent=writer,
    context=[collect_task, analyze_task]  # 依赖任务1和2的输出
)

4.4 异步任务

对于耗时较长的任务,可以使用异步执行:

async_task = Task(
    description="执行长时间运行的数据处理任务",
    expected_output="处理结果",
    agent=processor,
    async_execution=True  # 异步执行
)

# 其他任务可以并行执行
parallel_task = Task(
    description="同时执行另一个独立任务",
    expected_output="任务结果",
    agent=worker
)

4.5 输出验证

CrewAI 支持对任务输出进行验证:

from crewai import Task
from pydantic import BaseModel

# 定义输出结构
class ResearchOutput(BaseModel):
    title: str
    summary: str
    key_findings: list[str]
    sources: list[str]

validated_task = Task(
    description="执行研究任务",
    expected_output="符合结构要求的研究结果",
    agent=researcher,
    output_pydantic=ResearchOutput  # 输出必须符合此模型
)

5. Tool 工具系统

5.1 内置工具

CrewAI 提供了丰富的内置工具:

from crewai_tools import (
    SerperDevTool,          # 网络搜索
    WebsiteSearchTool,      # 网站内容搜索
    FileReadTool,           # 文件读取
    FileWriteTool,          # 文件写入
    DirectoryReadTool,      # 目录读取
    DirectorySearchTool,    # 目录搜索
    CodeInterpreterTool,    # 代码执行
    CSVSearchTool,          # CSV 搜索
    JSONSearchTool,         # JSON 搜索
    MDXSearchTool,          # MDX 搜索
    PDFSearchTool,          # PDF 搜索
    PGSearchTool,           # PostgreSQL 搜索
    ScrapeWebsiteTool,      # 网页抓取
    SeleniumScrapingTool,   # Selenium 抓取
    TXTSearchTool,          # 文本搜索
    XMLSearchTool,          # XML 搜索
    YoutubeChannelSearchTool,  # YouTube 频道搜索
    YoutubeVideoSearchTool,    # YouTube 视频搜索
)

# 创建工具实例
search_tool = SerperDevTool()
file_read_tool = FileReadTool()
website_tool = WebsiteSearchTool()

5.2 为 Agent 分配工具

from crewai import Agent
from crewai_tools import SerperDevTool, FileReadTool, FileWriteTool

# 创建工具
search = SerperDevTool()
file_reader = FileReadTool()
file_writer = FileWriteTool()

# 研究员配备搜索和文件读取工具
researcher = Agent(
    role="研究员",
    goal="深入研究指定主题",
    backstory="你是一位资深研究员",
    tools=[search, file_reader],
    verbose=True
)

# 写手配备文件读写工具
writer = Agent(
    role="写手",
    goal="撰写高质量内容",
    backstory="你是一位专业写手",
    tools=[file_reader, file_writer],
    verbose=True
)

5.3 自定义工具

创建自定义工具是 CrewAI 的强大功能之一:

方式一:使用 @tool 装饰器

from crewai import tool

@tool
def calculate_bmi(weight_kg: float, height_m: float) -> str:
    """计算BMI指数。输入体重(千克)和身高(米),返回BMI值和健康分类。"""
    bmi = weight_kg / (height_m ** 2)
    
    if bmi < 18.5:
        category = "偏瘦"
    elif bmi < 24:
        category = "正常"
    elif bmi < 28:
        category = "偏胖"
    else:
        category = "肥胖"
    
    return f"BMI: {bmi:.1f},分类:{category}"

# 使用
agent = Agent(
    role="健康顾问",
    goal="提供健康建议",
    backstory="你是健康领域专家",
    tools=[calculate_bmi]
)

方式二:继承 BaseTool 类

from crewai.tools import BaseTool
from pydantic import BaseModel, Field
from typing import Type

class StockPriceInput(BaseModel):
    """股票价格查询的输入参数"""
    symbol: str = Field(description="股票代码,如 AAPL、GOOGL")

class StockPriceTool(BaseTool):
    name: str = "股票价格查询"
    description: str = "查询指定股票的当前价格。输入股票代码,返回最新价格信息。"
    args_schema: Type[BaseModel] = StockPriceInput

    def _run(self, symbol: str) -> str:
        # 实际实现中,这里会调用股票 API
        # 这里用模拟数据演示
        mock_data = {
            "AAPL": {"price": 178.50, "change": "+2.3%"},
            "GOOGL": {"price": 142.80, "change": "+1.5%"},
            "MSFT": {"price": 378.90, "change": "-0.8%"},
        }
        
        if symbol.upper() in mock_data:
            data = mock_data[symbol.upper()]
            return f"{symbol}: ${data['price']} ({data['change']})"
        return f"未找到股票 {symbol} 的数据"

# 使用
stock_tool = StockPriceTool()
agent = Agent(
    role="金融分析师",
    goal="分析股票市场",
    backstory="你是金融分析专家",
    tools=[stock_tool]
)

5.4 工具组合使用

from crewai import Agent, Task, Crew
from crewai_tools import SerperDevTool, FileWriteTool

# 创建多种工具
search = SerperDevTool()
file_writer = FileWriteTool()

# 创建一个配备多种工具的 Agent
analyst = Agent(
    role="市场分析师",
    goal="分析市场竞争格局",
    backstory="你是一位资深市场分析师",
    tools=[search, file_writer]
)

# 创建任务
analysis_task = Task(
    description="""
        研究"AI编程助手"市场的竞争格局,包括:
        1. 主要玩家(GitHub Copilot, Cursor, Windsurf等)
        2. 各产品的核心特点和定价
        3. 市场份额估算
        4. 优劣势对比
        
        将分析结果保存到 market_analysis.md
    """,
    expected_output="一份详细的市场分析报告",
    agent=analyst,
    output_file="market_analysis.md"
)

6. Crew 团队协作

6.1 Crew 的基本配置

Crew 是将 Agent 和 Task 组织在一起的核心容器:

from crewai import Crew, Process

# 基本 Crew 配置
crew = Crew(
    agents=[researcher, writer, reviewer],
    tasks=[research_task, write_task, review_task],
    process=Process.sequential,  # 顺序执行
    verbose=True,
    memory=True,                 # 启用记忆系统
    max_rpm=10,                  # 每分钟最大请求数
    share_crew=False,            # 是否共享 Crew 状态
)

6.2 执行模式

CrewAI 支持多种任务执行模式:

顺序执行(Sequential)

任务按照定义的顺序依次执行,前一个任务的输出作为后一个任务的输入。

sequential_crew = Crew(
    agents=[researcher, writer, reviewer],
    tasks=[research_task, write_task, review_task],
    process=Process.sequential,
    verbose=True
)

# 执行顺序:research_task → write_task → review_task
result = sequential_crew.kickoff()

层级执行(Hierarchical)

由一个管理 Agent 协调其他 Agent 的工作:

from crewai import Crew, Process

manager_crew = Crew(
    agents=[researcher, writer, reviewer],
    tasks=[research_task, write_task, review_task],
    process=Process.hierarchical,
    manager_llm="gpt-4o",  # 管理者使用的模型
    verbose=True
)

# 管理者会自动决定任务分配和执行顺序
result = manager_crew.kickoff()

6.3 输入与输出

Crew 支持灵活的输入输出机制:

# 带输入参数的 Crew
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    verbose=True
)

# 传递输入参数
result = crew.kickoff(
    inputs={
        "topic": "2024年人工智能发展趋势",
        "depth": "深度分析",
        "language": "中文"
    }
)

# 输出结构
print(f"最终结果: {result.raw}")
print(f"Token 使用: {result.token_usage}")
print(f"任务输出列表: {result.tasks_output}")

6.4 回调机制

from crewai import Crew

def on_task_complete(task_output):
    """任务完成时的回调"""
    print(f"任务完成: {task_output.description[:50]}...")
    print(f"输出长度: {len(task_output.raw)} 字符")

def on_crew_complete(crew_output):
    """Crew 完成时的回调"""
    print(f"Crew 执行完成!")
    print(f"总 Token 使用: {crew_output.token_usage}")

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    task_callback=on_task_complete,
    step_callback=lambda step: print(f"步骤: {step}"),
    verbose=True
)

7. 流程控制与记忆系统

7.1 记忆系统

CrewAI 的记忆系统让 Agent 能够记住之前的交互和发现:

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    memory=True,           # 启用短期记忆
    embedder={             # 自定义嵌入模型
        "provider": "openai",
        "config": {
            "model": "text-embedding-3-small"
        }
    }
)

记忆系统包含三个层次:

  • 短期记忆:当前执行过程中的上下文
  • 长期记忆:跨执行的历史信息
  • 实体记忆:关于特定实体的知识

7.2 缓存机制

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    cache=True,             # 启用工具调用缓存
    max_rpm=10,             # 限制 API 调用频率
    verbose=True
)

7.3 错误处理

from crewai import Crew
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def safe_crew_execution(crew, inputs=None, max_retries=3):
    """带重试机制的安全 Crew 执行"""
    for attempt in range(max_retries):
        try:
            result = crew.kickoff(inputs=inputs or {})
            return result
        except Exception as e:
            logger.error(f"第 {attempt + 1} 次执行失败: {e}")
            if attempt == max_retries - 1:
                raise
            logger.info(f"正在重试...")

# 使用
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    verbose=True
)

result = safe_crew_execution(crew, {"topic": "AI发展"})

7.4 LangTrace 可观测性

集成 LangTrace 进行执行过程的可视化监控:

# 安装: pip install langtrace-python-sdk
from langtrace_python_sdk import langtrace

langtrace.init(api_key='your_langtrace_api_key')

# 之后的 CrewAI 执行都会自动记录到 LangTrace
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    verbose=True
)

result = crew.kickoff()

8. 实战项目一:自动化研究报告生成

8.1 项目目标

构建一个自动化研究系统,能够:

  • 自动搜索和收集指定主题的资料
  • 分析和整理收集到的信息
  • 生成结构化的研究报告
  • 对报告进行质量审查

8.2 完整代码实现

# research_crew.py
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, FileReadTool, FileWriteTool, WebsiteSearchTool
from dotenv import load_dotenv
import os

load_dotenv()

# ===== 工具准备 =====
search_tool = SerperDevTool()
file_write_tool = FileWriteTool()
website_tool = WebsiteSearchTool()

# ===== Agent 定义 =====

# 1. 首席研究员
lead_researcher = Agent(
    role="首席研究员",
    goal="制定研究计划并协调研究工作",
    backstory="""
        你是一位经验丰富的首席研究员,在科技行业有超过15年的研究经验。
        你善于制定系统性的研究计划,能够快速识别关键问题和研究方向。
        你的研究方法严谨,注重数据支撑和多方验证。
    """,
    tools=[search_tool, website_tool],
    verbose=True,
    allow_delegation=True,
    max_iter=30
)

# 2. 数据分析师
data_analyst = Agent(
    role="数据分析师",
    goal="从收集的数据中提取有价值的洞察",
    backstory="""
        你是一位专业的数据分析师,擅长从大量非结构化数据中
        提取关键信息和模式。你善于使用统计方法验证发现,
        并用数据可视化的方式呈现分析结果。
    """,
    tools=[search_tool, file_write_tool],
    verbose=True,
    allow_delegation=False
)

# 3. 技术写作专家
tech_writer = Agent(
    role="技术写作专家",
    goal="将研究成果转化为高质量的报告",
    backstory="""
        你是一位资深的技术写作专家,拥有将复杂技术概念
        转化为通俗易懂内容的特殊能力。你的报告结构清晰、
        逻辑严密、数据准确,深受读者好评。
    """,
    tools=[file_write_tool],
    verbose=True,
    allow_delegation=False
)

# 4. 质量审查员
quality_reviewer = Agent(
    role="质量审查员",
    goal="确保报告的准确性、完整性和可读性",
    backstory="""
        你是一位严格的质量审查专家,对细节有极高的要求。
        你擅长发现报告中的逻辑漏洞、数据错误、表述不清等问题,
        并能提供具体的修改建议。你的审查标准包括:
        - 事实准确性
        - 逻辑一致性
        - 数据可靠性
        - 表达清晰度
        - 结构合理性
    """,
    tools=[file_read_tool],
    verbose=True,
    allow_delegation=False
)

# ===== Task 定义 =====

# 任务1:制定研究计划
planning_task = Task(
    description="""
        针对主题"{topic}"制定详细的研究计划,包括:
        
        1. 研究范围界定
           - 核心问题定义
           - 子主题划分
           - 边界条件设定
        
        2. 信息源规划
           - 需要搜索的关键词列表
           - 目标网站和数据源
           - 需要验证的关键信息
        
        3. 时间和优先级
           - 各子任务的优先级排序
           - 预计工作量分配
        
        请将研究计划保存到文件 research_plan.md
    """,
    expected_output="一份详细的研究计划文档",
    agent=lead_researcher,
    output_file="research_plan.md"
)

# 任务2:执行研究和数据收集
research_task = Task(
    description="""
        按照研究计划,执行以下研究任务:
        
        1. 广度搜索
           - 使用多个关键词组合进行搜索
           - 覆盖技术文档、行业报告、新闻资讯、学术论文等多种来源
           - 记录每个来源的URL和关键信息
        
        2. 深度挖掘
           - 对重要发现进行深入调查
           - 访问相关网页获取详细信息
           - 交叉验证关键数据
        
        3. 信息整理
           - 将收集到的信息分类整理
           - 标记信息的可靠程度
           - 识别信息之间的关联
        
        主题:{topic}
    """,
    expected_output="结构化的原始研究资料,包含分类整理的信息和来源",
    agent=lead_researcher,
    context=[planning_task]
)

# 任务3:数据分析
analysis_task = Task(
    description="""
        对收集到的研究资料进行深入分析:
        
        1. 趋势分析
           - 识别主要发展趋势
           - 分析发展动因
           - 预测未来走向
        
        2. 对比分析
           - 主要参与者/产品对比
           - 技术方案对比
           - 市场表现对比
        
        3. 洞察提取
           - 提炼关键洞察
           - 识别潜在机会和风险
           - 总结核心发现
        
        请将分析结果保存到 analysis_result.md
    """,
    expected_output="深入的分析报告,包含趋势、对比和洞察",
    agent=data_analyst,
    context=[planning_task, research_task],
    output_file="analysis_result.md"
)

# 任务4:撰写报告
writing_task = Task(
    description="""
        基于研究计划、研究资料和分析结果,撰写完整的研究报告:
        
        报告结构要求:
        1. 执行摘要(200-300字)
        2. 研究背景与目的
        3. 方法论说明
        4. 主要发现(分章节详细展开)
        5. 深度分析与洞察
        6. 趋势预测与建议
        7. 结论
        8. 参考资料
        
        写作要求:
        - 语言:专业但易懂的中文
        - 数据:所有关键数据需要注明来源
        - 图表:描述性文字中需要建议插入图表的位置
        - 字数:5000-8000字
        
        主题:{topic}
    """,
    expected_output="一份完整、专业的研究报告",
    agent=tech_writer,
    context=[planning_task, research_task, analysis_task],
    output_file="final_report.md"
)

# 任务5:质量审查
review_task = Task(
    description="""
        对最终报告进行全面质量审查:
        
        审查维度:
        1. 事实准确性
           - 关键数据是否准确
           - 引用是否正确
           - 是否存在过时信息
        
        2. 逻辑一致性
           - 论证逻辑是否严密
           - 各章节是否连贯
           - 结论是否有数据支撑
        
        3. 内容完整性
           - 是否覆盖了所有重要方面
           - 是否有遗漏的关键信息
           - 参考资料是否充分
        
        4. 表达质量
           - 语言是否清晰准确
           - 结构是否合理
           - 是否有错别字或语法错误
        
        输出审查报告,包含发现的问题和修改建议。
    """,
    expected_output="详细的审查报告,列出所有问题和改进建议",
    agent=quality_reviewer,
    context=[writing_task]
)

# ===== Crew 组装 =====
research_crew = Crew(
    agents=[lead_researcher, data_analyst, tech_writer, quality_reviewer],
    tasks=[planning_task, research_task, analysis_task, writing_task, review_task],
    process=Process.sequential,
    memory=True,
    cache=True,
    max_rpm=10,
    verbose=True
)

# ===== 执行 =====
if __name__ == "__main__":
    topic = "2024年大语言模型技术发展趋势与应用前景"
    
    result = research_crew.kickoff(
        inputs={"topic": topic}
    )
    
    print("\n" + "="*60)
    print("研究报告生成完成!")
    print("="*60)
    print(f"\n审查结果:\n{result.raw}")
    print(f"\nToken 使用统计:{result.token_usage}")

8.3 运行与输出

# 运行研究报告生成系统
python3 research_crew.py

运行后,系统会在当前目录生成以下文件:

  • research_plan.md - 研究计划
  • analysis_result.md - 分析结果
  • final_report.md - 最终报告

9. 实战项目二:智能内容创作团队

9.1 项目目标

构建一个内容创作团队,能够:

  • 根据热点话题生成内容创意
  • 撰写多平台适配的内容
  • 进行SEO优化
  • 内容质量审核

9.2 完整代码实现

# content_crew.py
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, FileWriteTool, WebsiteSearchTool
from dotenv import load_dotenv
from datetime import datetime

load_dotenv()

# ===== 工具 =====
search = SerperDevTool()
writer_tool = FileWriteTool()
web_search = WebsiteSearchTool()

# ===== Agent 定义 =====

trend_spotter = Agent(
    role="趋势发现者",
    goal="发现和分析当前热门话题和内容趋势",
    backstory="""
        你是一位敏锐的趋势分析师,擅长在社交媒体、
        新闻和行业论坛中发现正在崛起的话题。
        你对内容传播规律有深刻理解,
        能够预测哪些话题会成为爆款。
    """,
    tools=[search, web_search],
    verbose=True
)

content_strategist = Agent(
    role="内容策略师",
    goal="制定有吸引力的内容策略和创意方案",
    backstory="""
        你是一位创意内容策略师,拥有丰富的营销和内容创作经验。
        你善于将热门话题转化为有吸引力的内容创意,
        并能根据不同平台的特点制定差异化的内容策略。
    """,
    tools=[search],
    verbose=True
)

blog_writer = Agent(
    role="博客写手",
    goal="撰写高质量、有深度的博客文章",
    backstory="""
        你是一位资深的技术博客写手,文章风格深入浅出,
        既有技术深度又有可读性。你善于用故事和案例
        来解释复杂概念,让读者容易理解和记忆。
    """,
    tools=[writer_tool],
    verbose=True
)

social_media_writer = Agent(
    role="社交媒体文案",
    goal="创作适合社交媒体传播的短内容",
    backstory="""
        你是一位社交媒体内容专家,精通各平台的内容特点:
        - 微博:简短有力,带话题标签
        - 知乎:专业深入,引发讨论
        - 小红书:生活化,图文并茂描述
        你的文案总能获得高互动率。
    """,
    tools=[writer_tool],
    verbose=True
)

seo_specialist = Agent(
    role="SEO优化专家",
    goal="优化内容的搜索引擎可见性",
    backstory="""
        你是一位SEO专家,精通搜索引擎优化策略。
        你能够分析关键词竞争度、搜索意图,
        并提供标题、元描述、关键词布局等优化建议。
    """,
    tools=[search],
    verbose=True
)

# ===== Task 定义 =====

trend_research = Task(
    description="""
        调研当前"{niche}"领域的热门话题,找出3-5个值得创作内容的方向。
        
        调研维度:
        1. 搜索引擎热门查询
        2. 社交媒体热议话题
        3. 行业最新动态
        4. 用户痛点和需求
        
        对每个方向评估:
        - 热度指数(高/中/低)
        - 竞争程度(高/中/低)
        - 内容缺口(是否存在优质内容)
        - 推荐指数(1-5星)
    """,
    expected_output="3-5个经过评估的内容方向,附带分析依据",
    agent=trend_spotter
)

content_planning = Task(
    description="""
        基于趋势调研结果,制定详细的内容创作计划:
        
        1. 选择最有价值的2-3个话题
        2. 为每个话题设计:
           - 核心观点和角度
           - 目标受众画像
           - 内容大纲
           - 平台适配方案(博客/社交媒体)
           - 预期效果评估
        
        3. 制定发布时间建议
    """,
    expected_output="详细的内容创作计划,包含话题选择、大纲和平台策略",
    agent=content_strategist,
    context=[trend_research]
)

blog_writing = Task(
    description="""
        根据内容计划,撰写一篇高质量的博客文章。
        
        写作要求:
        - 字数:3000-5000字
        - 结构:引言、正文(3-5个主要部分)、总结
        - 风格:专业但易读,有案例和数据支撑
        - 需要包含代码示例或实操步骤(如果适用)
        - 使用Markdown格式
        
        需要包含的内容:
        - 引人入胜的开头
        - 清晰的小标题结构
        - 实用的信息和建议
        - 有说服力的结论
        
        将文章保存为 blog_article.md
    """,
    expected_output="一篇完整的、可直接发布的博客文章",
    agent=blog_writer,
    context=[content_planning],
    output_file="blog_article.md"
)

social_media_content = Task(
    description="""
        根据博客文章内容,创作社交媒体版本:
        
        1. 微博文案(3条,每条不超过140字)
           - 包含相关话题标签
           - 风格各异(提问式、数据式、故事式)
        
        2. 知乎回答(1条,500-800字)
           - 专业深入的风格
           - 引用博客中的核心观点
           - 适合知乎社区调性
        
        3. 小红书笔记(1条)
           - 生活化表达
           - 包含emoji和分段
           - 适合小红书用户习惯
        
        保存为 social_media_content.md
    """,
    expected_output="各平台的社交媒体内容",
    agent=social_media_writer,
    context=[blog_writing],
    output_file="social_media_content.md"
)

seo_optimization = Task(
    description="""
        对博客文章进行SEO优化审查:
        
        1. 关键词分析
           - 主关键词建议(搜索量、竞争度)
           - 长尾关键词建议(5-10个)
           - 关键词密度检查
        
        2. 标题优化
           - SEO友好的标题建议(3个备选)
           - 元描述建议(150字以内)
        
        3. 内容优化建议
           - 内链/外链建议
           - 图片Alt标签建议
           - H1/H2/H3标签优化
           - URL slug建议
        
        4. 竞争分析
           - 同类内容的排名情况
           - 差异化建议
        
        保存为 seo_report.md
    """,
    expected_output="详细的SEO优化报告",
    agent=seo_specialist,
    context=[blog_writing],
    output_file="seo_report.md"
)

# ===== Crew =====
content_crew = Crew(
    agents=[trend_spotter, content_strategist, blog_writer, 
            social_media_writer, seo_specialist],
    tasks=[trend_research, content_planning, blog_writing, 
           social_media_content, seo_optimization],
    process=Process.sequential,
    memory=True,
    verbose=True
)

if __name__ == "__main__":
    result = content_crew.kickoff(
        inputs={"niche": "AI编程助手与开发工具"}
    )
    
    print("\n" + "="*60)
    print("内容创作完成!")
    print("="*60)
    print(f"生成的文件:")
    print(f"  - blog_article.md (博客文章)")
    print(f"  - social_media_content.md (社交媒体内容)")
    print(f"  - seo_report.md (SEO优化报告)")

10. 实战项目三:代码审查与优化系统

10.1 项目目标

构建一个自动化代码审查系统,能够:

  • 分析代码质量和潜在问题
  • 检查安全漏洞
  • 提供性能优化建议
  • 生成审查报告

10.2 完整代码实现

# code_review_crew.py
from crewai import Agent, Task, Crew, Process
from crewai_tools import FileReadTool, FileWriteTool, DirectoryReadTool
from dotenv import load_dotenv

load_dotenv()

# ===== 工具 =====
file_read = FileReadTool()
file_write = FileWriteTool()
dir_read = DirectoryReadTool()

# ===== Agent 定义 =====

code_analyst = Agent(
    role="代码分析师",
    goal="深入分析代码结构、质量和潜在问题",
    backstory="""
        你是一位拥有12年经验的高级代码分析师。
        你精通多种编程语言(Python、JavaScript、Java、Go等),
        擅长代码静态分析、架构评估和复杂度分析。
        你总是能发现别人忽略的代码问题。
    """,
    tools=[file_read, dir_read],
    verbose=True
)

security_expert = Agent(
    role="安全专家",
    goal="识别代码中的安全漏洞和风险",
    backstory="""
        你是一位资深的应用安全专家,
        精通OWASP Top 10、常见漏洞模式和安全编码实践。
        你曾为多家知名公司进行安全审计,
        能够准确识别SQL注入、XSS、CSRF等安全风险。
    """,
    tools=[file_read],
    verbose=True
)

performance_engineer = Agent(
    role="性能工程师",
    goal="分析代码性能瓶颈并提供优化建议",
    backstory="""
        你是一位性能优化专家,
        擅长识别算法复杂度问题、内存泄漏、
        数据库查询优化和并发处理等性能相关问题。
        你的优化建议总是有具体的数据支撑。
    """,
    tools=[file_read],
    verbose=True
)

review_reporter = Agent(
    role="审查报告撰写者",
    goal="整合各专家意见,生成清晰的审查报告",
    backstory="""
        你是一位技术文档专家,
        擅长将复杂的技术审查结果转化为
        清晰、可操作的报告。你的报告总是
        结构清晰、优先级明确、建议具体。
    """,
    tools=[file_write],
    verbose=True
)

# ===== Task =====

code_analysis_task = Task(
    description="""
        对指定目录的代码进行全面分析:
        
        1. 代码结构分析
           - 目录结构合理性
           - 模块划分清晰度
           - 依赖关系复杂度
        
        2. 代码质量分析
           - 命名规范性
           - 注释质量
           - 代码重复度
           - 函数/方法复杂度
        
        3. 设计模式检查
           - 是否遵循SOLID原则
           - 设计模式使用是否恰当
           - 是否有代码异味
        
        分析目录:{code_directory}
    """,
    expected_output="详细的代码质量分析报告",
    agent=code_analyst
)

security_audit_task = Task(
    description="""
        对代码进行安全审查:
        
        1. 输入验证
           - 是否有适当的输入校验
           - 是否存在注入风险(SQL、NoSQL、命令注入)
        
        2. 认证与授权
           - 认证机制是否安全
           - 权限控制是否完善
           - Session管理是否安全
        
        3. 数据保护
           - 敏感数据是否加密
           - 是否有硬编码的密钥/密码
           - 日志是否泄露敏感信息
        
        4. 常见漏洞
           - XSS风险
           - CSRF防护
           - 文件上传安全
           - 依赖包安全
        
        检查目录:{code_directory}
    """,
    expected_output="安全审查报告,列出所有发现的安全问题和风险等级",
    agent=security_expert,
    context=[code_analysis_task]
)

performance_analysis_task = Task(
    description="""
        对代码进行性能分析:
        
        1. 算法复杂度
           - 识别O(n²)或更高复杂度的代码
           - 循环嵌套问题
           - 递归深度问题
        
        2. 资源使用
           - 内存使用模式
           - 连接池管理
           - 文件句柄管理
        
        3. 数据库相关
           - N+1查询问题
           - 索引使用建议
           - 查询优化建议
        
        4. 并发处理
           - 是否有竞态条件
           - 线程安全问题
           - 异步处理建议
        
        检查目录:{code_directory}
    """,
    expected_output="性能分析报告,包含具体的优化建议和预期效果",
    agent=performance_engineer,
    context=[code_analysis_task]
)

report_generation_task = Task(
    description="""
        整合所有审查结果,生成最终的代码审查报告:
        
        报告结构:
        1. 执行摘要
           - 总体评价(1-10分)
           - 主要发现概述
           - 关键风险提示
        
        2. 问题清单
           - 严重问题(必须修复)
           - 重要问题(建议修复)
           - 改进建议(可选优化)
        
        3. 详细分析
           - 代码质量详细分析
           - 安全问题详细说明
           - 性能问题详细说明
        
        4. 优化路线图
           - 短期修复建议(1-2周)
           - 中期改进计划(1-3个月)
           - 长期优化方向
        
        5. 最佳实践建议
        
        保存为 code_review_report.md
    """,
    expected_output="完整、专业的代码审查报告",
    agent=review_reporter,
    context=[code_analysis_task, security_audit_task, performance_analysis_task],
    output_file="code_review_report.md"
)

# ===== Crew =====
review_crew = Crew(
    agents=[code_analyst, security_expert, performance_engineer, review_reporter],
    tasks=[code_analysis_task, security_audit_task, 
           performance_analysis_task, report_generation_task],
    process=Process.sequential,
    memory=True,
    verbose=True
)

if __name__ == "__main__":
    result = review_crew.kickoff(
        inputs={"code_directory": "./src"}
    )
    
    print("\n" + "="*60)
    print("代码审查完成!")
    print(f"审查报告已保存到 code_review_report.md")

11. 高级技巧与最佳实践

11.1 角色设计最佳实践

明确的角色边界

每个 Agent 应该有清晰的职责边界,避免角色重叠:

# 好的设计:职责清晰
researcher = Agent(
    role="市场研究员",
    goal="收集和分析市场数据",
    backstory="专注市场调研,不负责写作",
    allow_delegation=False
)

writer = Agent(
    role="内容写手",
    goal="基于研究结果撰写内容",
    backstory="专注内容创作,不负责数据收集",
    allow_delegation=False
)

互补的技能组合

# 互补的团队组合
analyst = Agent(
    role="定量分析师",
    goal="通过数据分析发现问题",
    backstory="擅长数字和统计分析"
)

psychologist = Agent(
    role="用户心理专家",
    goal="理解用户行为背后的心理动因",
    backstory="擅长用户研究和心理学分析"
)

# 两者结合可以提供更全面的用户洞察

11.2 任务设计最佳实践

渐进式任务分解

# 从宏观到微观的渐进式任务
overview_task = Task(
    description="从宏观角度概述主题全貌",
    expected_output="主题概述",
    agent=researcher
)

deep_dive_task = Task(
    description="基于概述,对关键领域进行深入研究",
    expected_output="深度分析报告",
    agent=researcher,
    context=[overview_task]
)

actionable_task = Task(
    description="基于深度分析,制定具体可执行的建议",
    expected_output="行动建议清单",
    agent=strategist,
    context=[overview_task, deep_dive_task]
)

任务描述的SMART原则

# Specific(具体)
# Measurable(可衡量)
# Achievable(可实现)
# Relevant(相关)
# Time-bound(有时限)

smart_task = Task(
    description="""
        在30分钟内,分析过去7天的GitHub Trending页面,
        识别出Star数增长最快的5个AI相关项目。
        对每个项目提供:
        - 项目简介(100字以内)
        - 核心技术栈
        - 为什么受欢迎的分析(200字以内)
        - 是否值得关注的建议
    """,
    expected_output="5个项目的结构化分析报告",
    agent=researcher
)

11.3 性能优化

减少API调用

# 使用缓存减少重复调用
crew = Crew(
    agents=[agent1, agent2],
    tasks=[task1, task2],
    cache=True,  # 启用缓存
    max_rpm=10   # 控制调用频率
)

# 使用更小的模型处理简单任务
from crewai import LLM

fast_llm = LLM(model="gpt-4o-mini")  # 简单任务用小模型
strong_llm = LLM(model="gpt-4o")     # 复杂任务用强模型

simple_agent = Agent(
    role="格式化助手",
    goal="格式化输出内容",
    backstory="负责内容格式化",
    llm=fast_llm  # 使用快速模型
)

complex_agent = Agent(
    role="高级分析师",
    goal="进行深度分析",
    backstory="负责复杂推理",
    llm=strong_llm  # 使用强模型
)

异步执行

# 独立任务使用异步执行
task1 = Task(
    description="独立任务1",
    expected_output="结果1",
    agent=agent1,
    async_execution=True  # 异步执行
)

task2 = Task(
    description="独立任务2",
    expected_output="结果2",
    agent=agent2,
    async_execution=True  # 异步执行
)

task3 = Task(
    description="依赖任务1和2的结果",
    expected_output="最终结果",
    agent=agent3,
    context=[task1, task2]  # 等待前两个任务完成
)

11.4 调试与监控

import logging

# 配置详细日志
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# 自定义回调来监控执行
class CrewMonitor:
    def __init__(self):
        self.task_times = {}
        self.token_usage = {}
    
    def on_task_start(self, task):
        import time
        self.task_times[task.description[:30]] = time.time()
        print(f"▶ 任务开始: {task.description[:50]}...")
    
    def on_task_complete(self, task_output):
        import time
        task_key = task_output.description[:30]
        if task_key in self.task_times:
            duration = time.time() - self.task_times[task_key]
            print(f"✓ 任务完成: {task_key}... (耗时: {duration:.1f}秒)")
        print(f"  输出长度: {len(task_output.raw)} 字符")

monitor = CrewMonitor()

crew = Crew(
    agents=[agent1, agent2],
    tasks=[task1, task2],
    step_callback=lambda x: monitor.on_task_complete(x) if hasattr(x, 'raw') else None,
    verbose=True
)

11.5 错误处理与恢复

from crewai import Crew
import json
from datetime import datetime

class CrewExecutor:
    def __init__(self, crew, checkpoint_file="crew_checkpoint.json"):
        self.crew = crew
        self.checkpoint_file = checkpoint_file
    
    def save_checkpoint(self, completed_tasks, current_result):
        checkpoint = {
            "timestamp": datetime.now().isoformat(),
            "completed_tasks": completed_tasks,
            "last_result": current_result
        }
        with open(self.checkpoint_file, 'w') as f:
            json.dump(checkpoint, f, ensure_ascii=False, indent=2)
    
    def execute_with_recovery(self, inputs=None, max_retries=3):
        for attempt in range(max_retries):
            try:
                result = self.crew.kickoff(inputs=inputs or {})
                return result
            except Exception as e:
                print(f"执行失败 (尝试 {attempt + 1}/{max_retries}): {e}")
                if attempt == max_retries - 1:
                    print("已达到最大重试次数")
                    raise
                print("正在重试...")

12. 常见问题与排错指南

12.1 API Key 相关问题

问题:API Key 未设置或无效

错误信息: AuthenticationError: Incorrect API key provided

解决方案:

# 检查环境变量
import os
print(f"OPENAI_API_KEY: {'已设置' if os.getenv('OPENAI_API_KEY') else '未设置'}")

# 确保正确加载 .env 文件
from dotenv import load_dotenv
load_dotenv(override=True)  # override=True 确保覆盖已有变量

12.2 模型选择问题

问题:某些模型不可用

# 检查模型是否可用
from openai import OpenAI
client = OpenAI()

try:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": "test"}],
        max_tokens=5
    )
    print("GPT-4o 可用")
except Exception as e:
    print(f"GPT-4o 不可用: {e}")

12.3 执行超时问题

问题:任务执行时间过长

# 设置合理的超时和迭代限制
agent = Agent(
    role="研究员",
    goal="研究主题",
    backstory="你是研究员",
    max_iter=15,     # 限制最大迭代次数
    max_rpm=5        # 限制每分钟请求数
)

# 使用更具体、更聚焦的任务描述
task = Task(
    description="请在5分钟内完成以下分析...",  # 添加时间约束
    expected_output="简洁的分析结果",
    agent=agent
)

12.4 输出质量问题

问题:Agent 输出不够详细或准确

# 1. 提供更详细的背景故事
agent = Agent(
    role="分析师",
    goal="提供深入的分析",
    backstory="""
        你是一位资深分析师,拥有10年经验。
        你的分析特点:
        - 数据驱动,所有结论都有数据支撑
        - 逻辑严密,每一步推理都有依据
        - 结论明确,不使用模糊表述
        - 建议具体,每条建议都可执行
    """
)

# 2. 使用更具体的期望输出描述
task = Task(
    description="分析市场趋势",
    expected_output="""
        请提供以下内容:
        1. 市场规模数据(最近3年)
        2. 增长率计算
        3. Top 3 驱动因素
        4. Top 3 风险因素
        5. 未来12个月预测(含置信区间)
        
        所有数据需要注明来源。
    """,
    agent=agent
)

# 3. 使用验证确保输出质量
from pydantic import BaseModel

class AnalysisOutput(BaseModel):
    summary: str
    key_findings: list[str]
    data_sources: list[str]
    confidence_level: str

validated_task = Task(
    description="执行分析",
    expected_output="符合结构要求的分析结果",
    agent=agent,
    output_pydantic=AnalysisOutput
)

12.5 委派机制问题

问题:Agent 之间的委派不生效

# 确保至少有一个 Agent 允许委派
manager = Agent(
    role="项目经理",
    goal="协调团队工作",
    backstory="你是项目经理",
    allow_delegation=True  # 必须设置为 True
)

# 确保 Crew 中有多个 Agent 供委派
crew = Crew(
    agents=[manager, worker1, worker2],  # 需要至少2个 Agent
    tasks=[task1, task2],
    process=Process.hierarchical  # 层级模式更适合委派
)

12.6 内存和性能问题

问题:长时间运行后变慢

# 1. 定期清理不需要的文件
import os
import glob

def cleanup_temp_files():
    for f in glob.glob("temp_*"):
        os.remove(f)

# 2. 使用缓存减少重复计算
crew = Crew(
    agents=[agent1, agent2],
    tasks=[task1, task2],
    cache=True  # 启用工具缓存
)

# 3. 控制并发和请求频率
crew = Crew(
    agents=[agent1, agent2],
    tasks=[task1, task2],
    max_rpm=10  # 控制每分钟请求数
)

总结

CrewAI 是一个强大而灵活的多智能体协作框架,通过本教程,你已经学习了:

  1. 核心概念:Agent、Task、Tool、Crew 的基本概念和使用方法
  2. 环境搭建:从零开始配置 CrewAI 开发环境
  3. Agent 设计:如何设计专业的、互补的 Agent 角色
  4. 任务编排:如何设计和编排复杂的任务流程
  5. 工具集成:如何使用内置工具和创建自定义工具
  6. 实战项目:三个完整的实战项目展示了 CrewAI 的实际应用
  7. 最佳实践:性能优化、调试监控、错误处理等高级技巧

下一步学习建议

  1. 实践为主:尝试修改本教程中的示例,添加自己的 Agent 和 Task
  2. 探索社区:关注 CrewAI GitHub 仓库,了解最新功能
  3. 结合其他工具:将 CrewAI 与 LangChain、向量数据库等工具结合使用
  4. 生产部署:学习如何将 CrewAI 应用部署到生产环境

参考资源

  • CrewAI 官方文档:https://docs.crewai.com
  • CrewAI GitHub:https://github.com/crewAIInc/crewAI
  • CrewAI 示例库:https://github.com/crewAIInc/crewAI-examples
  • CrewAI Discord 社区:https://discord.com/invite/crewai

本教程由 AI 辅助生成,内容仅供学习参考。如有疑问或建议,欢迎交流讨论。

最后更新:2026年5月

内容声明

本文内容为AI技术学习教程,仅供学习参考。如涉及技术问题,欢迎通过 xurj005@163.com 与我们交流。

目录