最佳实践 #

项目结构 #

推荐目录结构 #

text
my_crewai_project/
├── src/
│   └── my_crew/
│       ├── config/
│       │   ├── agents.yaml
│       │   └── tasks.yaml
│       ├── tools/
│       │   ├── __init__.py
│       │   └── custom_tool.py
│       ├── knowledge/
│       │   └── company_info.txt
│       ├── crew.py
│       └── main.py
├── tests/
│   ├── test_agents.py
│   └── test_crew.py
├── pyproject.toml
├── .env
└── README.md

配置分离 #

yaml
# config/agents.yaml
researcher:
  role: >
    {topic} 高级研究分析师
  goal: >
    发现 {topic} 的前沿趋势
  backstory: >
    你是一位经验丰富的研究分析师
python
# crew.py
from crewai.project import CrewBase, agent, crew

@CrewBase
class ResearchCrew:
    agents_config = 'config/agents.yaml'
    tasks_config = 'config/tasks.yaml'

    @agent
    def researcher(self) -> Agent:
        return Agent(config=self.agents_config['researcher'])

Agent 设计最佳实践 #

1. 角色定义清晰 #

python
# 好的设计
researcher = Agent(
    role="医疗数据研究分析师",
    goal="分析医疗数据,发现疾病模式和趋势",
    backstory="""你是一位拥有 15 年经验的医疗数据分析师,
    专注于流行病学和疾病预测。你擅长从复杂的医疗数据中
    发现隐藏的模式,并能将技术发现转化为可操作的建议。"""
)

# 不好的设计
researcher = Agent(
    role="分析师",
    goal="分析数据",
    backstory="我是一个分析师"
)

2. 合理的工具配置 #

python
# 根据任务需求选择工具
research_agent = Agent(
    role="研究员",
    goal="研究市场趋势",
    tools=[SerperDevTool(), WebsiteSearchTool()],
    verbose=True
)

file_agent = Agent(
    role="文档分析师",
    goal="分析文档内容",
    tools=[FileReadTool(), PDFSearchTool(), DirectoryReadTool()],
    verbose=True
)

code_agent = Agent(
    role="开发者",
    goal="编写和执行代码",
    tools=[CodeInterpreterTool()],
    allow_code_execution=True,
    code_execution_mode="safe",
    verbose=True
)

3. 性能优化配置 #

python
# 高效的 Agent 配置
efficient_agent = Agent(
    role="分析师",
    goal="快速分析数据",
    max_iter=15,
    max_rpm=30,
    cache=True,
    verbose=False
)

# 使用更便宜的模型进行工具调用
agent = Agent(
    role="分析师",
    llm="gpt-4o",
    function_calling_llm="gpt-4o-mini"
)

Task 设计最佳实践 #

1. 描述清晰具体 #

python
# 好的设计
research_task = Task(
    description="""
    研究 2025 年 AI 芯片市场:
    
    1. 识别主要厂商和产品
       - NVIDIA、AMD、Intel 等
       - 产品规格和性能
    
    2. 分析市场份额和趋势
       - 当前市场份额
       - 增长趋势
    
    3. 评估技术发展方向
       - 架构创新
       - 能效提升
    
    数据来源:公开报告、新闻、公司财报
    """,
    expected_output="""
    一份结构化的市场分析报告,包含:
    - 执行摘要(200 字以内)
    - 市场概览
    - 竞争格局分析
    - 技术趋势
    - 投资建议
    """
)

# 不好的设计
research_task = Task(
    description="分析市场",
    expected_output="报告"
)

2. 合理使用上下文 #

python
# 建立清晰的任务链
research = Task(
    description="研究主题",
    agent=researcher
)

analysis = Task(
    description="分析研究结果",
    agent=analyst,
    context=[research]
)

write = Task(
    description="撰写报告",
    agent=writer,
    context=[research, analysis]
)

edit = Task(
    description="审核和优化",
    agent=editor,
    context=[write]
)

3. 异步任务优化 #

python
# 并行执行独立任务
data_task_1 = Task(
    description="获取股票数据",
    agent=collector_1,
    async_execution=True
)

data_task_2 = Task(
    description="获取新闻数据",
    agent=collector_2,
    async_execution=True
)

data_task_3 = Task(
    description="获取社交媒体数据",
    agent=collector_3,
    async_execution=True
)

# 汇总任务
summary_task = Task(
    description="综合分析所有数据",
    agent=analyst,
    context=[data_task_1, data_task_2, data_task_3]
)

Crew 编排最佳实践 #

1. 选择合适的流程 #

python
# 简单线性任务:Sequential
simple_crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    process=Process.sequential
)

# 复杂协作任务:Hierarchical
complex_crew = Crew(
    agents=[researcher, analyst, writer, editor],
    tasks=[research_task, analysis_task, write_task, edit_task],
    process=Process.hierarchical,
    manager_llm="gpt-4o"
)

2. 合理的团队规模 #

python
# 小型团队(2-3 个 Agent):适合简单任务
small_crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task]
)

# 中型团队(4-6 个 Agent):适合复杂任务
medium_crew = Crew(
    agents=[researcher, analyst, writer, editor],
    tasks=[research_task, analysis_task, write_task, edit_task]
)

# 大型团队(7+ 个 Agent):需要层级管理
large_crew = Crew(
    agents=[manager, *specialists],
    tasks=tasks,
    process=Process.hierarchical,
    manager_llm="gpt-4o"
)

3. 启用必要功能 #

python
crew = Crew(
    agents=[agent],
    tasks=[task],
    memory=True,
    cache=True,
    verbose=True,
    output_log_file="logs/execution.json"
)

性能优化 #

1. 缓存策略 #

python
# Agent 级别缓存
agent = Agent(
    role="分析师",
    cache=True
)

# Crew 级别缓存
crew = Crew(
    agents=[agent],
    tasks=[task],
    cache=True
)

# 自定义缓存逻辑
def cache_func(args, result):
    return "error" not in result.lower()

tool.cache_function = cache_func

2. 速率限制 #

python
# Agent 级别
agent = Agent(
    role="分析师",
    max_rpm=30
)

# Crew 级别
crew = Crew(
    agents=[agent],
    tasks=[task],
    max_rpm=60
)

3. 执行时间控制 #

python
agent = Agent(
    role="分析师",
    max_iter=20,
    max_execution_time=300,
    max_retry_limit=2
)

4. 模型选择 #

python
# 复杂推理:使用高级模型
reasoning_agent = Agent(
    role="战略规划师",
    llm="gpt-4o",
    reasoning=True
)

# 简单任务:使用经济模型
simple_agent = Agent(
    role="数据收集员",
    llm="gpt-4o-mini"
)

# 工具调用:使用专用模型
agent = Agent(
    role="分析师",
    llm="gpt-4o",
    function_calling_llm="gpt-4o-mini"
)

错误处理 #

1. 基本错误处理 #

python
from crewai import Crew

try:
    result = crew.kickoff()
    print(result.raw)
except Exception as e:
    print(f"执行失败: {e}")
    log_error(e)

2. 重试机制 #

python
agent = Agent(
    role="分析师",
    max_retry_limit=3
)

3. 超时处理 #

python
import asyncio
from crewai import Crew

async def run_with_timeout(crew, inputs, timeout=300):
    try:
        result = await asyncio.wait_for(
            crew.akickoff(inputs=inputs),
            timeout=timeout
        )
        return result
    except asyncio.TimeoutError:
        print("执行超时")
        return None

4. 优雅降级 #

python
def run_crew_with_fallback(crew, inputs):
    try:
        result = crew.kickoff(inputs=inputs)
        return result
    except Exception as e:
        print(f"主流程失败: {e}")
        return fallback_process(inputs)

安全考虑 #

1. API 密钥管理 #

python
import os
from dotenv import load_dotenv

load_dotenv()

api_key = os.getenv("OPENAI_API_KEY")

2. 代码执行安全 #

python
# 生产环境:使用安全模式
agent = Agent(
    role="开发者",
    allow_code_execution=True,
    code_execution_mode="safe"
)

# 仅在受信任环境使用不安全模式
agent = Agent(
    role="开发者",
    allow_code_execution=True,
    code_execution_mode="unsafe"
)

3. 输入验证 #

python
from pydantic import BaseModel, Field, validator

class SafeInput(BaseModel):
    query: str = Field(..., max_length=1000)
    
    @validator('query')
    def sanitize(cls, v):
        return v.strip()

def safe_kickoff(crew, inputs):
    validated = SafeInput(**inputs)
    return crew.kickoff(inputs=validated.dict())

4. 敏感信息处理 #

python
import re

def sanitize_output(output):
    patterns = [
        r'\b\d{16}\b',  # 信用卡号
        r'\b\d{3}-\d{2}-\d{4}\b',  # SSN
        r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'  # 邮箱
    ]
    
    for pattern in patterns:
        output = re.sub(pattern, '[REDACTED]', output)
    
    return output

测试策略 #

1. 单元测试 #

python
import pytest
from crewai import Agent, Task

def test_agent_creation():
    agent = Agent(
        role="测试角色",
        goal="测试目标",
        backstory="测试背景"
    )
    assert agent.role == "测试角色"

def test_task_creation():
    task = Task(
        description="测试任务",
        expected_output="测试输出"
    )
    assert task.description == "测试任务"

2. 集成测试 #

python
def test_crew_execution():
    crew = Crew(
        agents=[test_agent],
        tasks=[test_task]
    )
    result = crew.kickoff()
    assert result.raw is not None

3. Mock 测试 #

python
from unittest.mock import patch

@patch('crewai.Agent.execute')
def test_agent_with_mock(mock_execute):
    mock_execute.return_value = "模拟结果"
    agent = Agent(role="测试", goal="测试", backstory="测试")
    result = agent.execute("测试输入")
    assert result == "模拟结果"

部署建议 #

1. 环境配置 #

python
import os

class Config:
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    SERPER_API_KEY = os.getenv("SERPER_API_KEY")
    LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
    MAX_RPM = int(os.getenv("MAX_RPM", "60"))

2. 日志配置 #

python
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('crewai.log'),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)

3. 监控指标 #

python
def track_metrics(crew, result):
    metrics = {
        "execution_time": result.execution_time,
        "token_usage": crew.usage_metrics,
        "task_count": len(crew.tasks),
        "agent_count": len(crew.agents)
    }
    save_metrics(metrics)

4. 容器化部署 #

dockerfile
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "main.py"]

成本优化 #

1. 模型选择 #

python
# 根据任务复杂度选择模型
def get_agent_for_task(complexity):
    if complexity == "high":
        return Agent(llm="gpt-4o")
    elif complexity == "medium":
        return Agent(llm="gpt-4o-mini")
    else:
        return Agent(llm="gpt-3.5-turbo")

2. 缓存利用 #

python
# 启用缓存减少重复调用
crew = Crew(
    agents=[agent],
    tasks=[task],
    cache=True
)

3. 批量处理 #

python
# 批量处理减少 API 调用
inputs_list = [input1, input2, input3]
results = crew.kickoff_for_each(inputs=inputs_list)

常见陷阱 #

1. 避免过度复杂的 Agent #

python
# 不好:一个 Agent 做所有事情
super_agent = Agent(
    role="全能助手",
    goal="完成所有任务",
    backstory="..."
)

# 好:专业分工
researcher = Agent(role="研究员", ...)
analyst = Agent(role="分析师", ...)
writer = Agent(role="作家", ...)

2. 避免模糊的任务描述 #

python
# 不好
task = Task(description="分析数据")

# 好
task = Task(
    description="""
    分析销售数据:
    1. 月度趋势
    2. 产品表现
    3. 区域分布
    """,
    expected_output="结构化分析报告"
)

3. 避免忽略错误处理 #

python
# 不好
result = crew.kickoff()

# 好
try:
    result = crew.kickoff()
    handle_result(result)
except Exception as e:
    handle_error(e)

总结 #

遵循这些最佳实践,可以帮助你:

  • 构建可维护、可扩展的 CrewAI 应用
  • 优化性能和成本
  • 确保安全性和可靠性
  • 提高开发和部署效率

持续学习和实践,你将能够熟练运用 CrewAI 构建生产级的多智能体协作系统!

最后更新:2026-04-04