CrewAI 基础概念 #

安装与配置 #

安装 CrewAI #

bash
# 基础安装
pip install crewai

# 安装完整版(包含工具)
pip install 'crewai[tools]'

# 使用 poetry 安装
poetry add crewai
poetry add 'crewai[tools]'

验证安装 #

python
import crewai
print(crewai.__version__)

创建项目 #

bash
# 使用 CLI 创建项目
crewai create crew my_crew

# 项目结构
my_crew/
├── src/
│   └── my_crew/
│       ├── config/
│       │   ├── agents.yaml
│       │   └── tasks.yaml
│       ├── tools/
│       │   └── custom_tool.py
│       ├── crew.py
│       └── main.py
├── pyproject.toml
└── README.md

配置语言模型 #

CrewAI 支持多种语言模型后端,配置方式统一且简单。

OpenAI 配置 #

python
import os
from crewai import Agent

os.environ["OPENAI_API_KEY"] = "your-api-key"
os.environ["OPENAI_MODEL_NAME"] = "gpt-4o"

agent = Agent(
    role="分析师",
    goal="分析数据",
    backstory="经验丰富的分析师"
)

Claude 配置 #

python
import os
from crewai import Agent, LLM

os.environ["ANTHROPIC_API_KEY"] = "your-api-key"

llm = LLM(model="anthropic/claude-3-opus-20240229")

agent = Agent(
    role="分析师",
    goal="分析数据",
    backstory="经验丰富的分析师",
    llm=llm
)

本地模型配置 #

python
from crewai import Agent, LLM

# Ollama
llm = LLM(
    model="ollama/llama3",
    base_url="http://localhost:11434"
)

# vLLM
llm = LLM(
    model="vllm/meta-llama/Llama-3-70b",
    base_url="http://localhost:8000"
)

agent = Agent(
    role="分析师",
    goal="分析数据",
    backstory="经验丰富的分析师",
    llm=llm
)

核心概念概览 #

text
┌─────────────────────────────────────────────────────────────┐
│                    CrewAI 核心概念                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Crew(团队)                                        │   │
│  │  协调多个 Agent 完成复杂任务                          │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                  │
│                           ▼                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Task(任务)                                        │   │
│  │  定义具体工作内容和预期输出                            │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                  │
│                           ▼                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Agent(智能体)                                     │   │
│  │  Role + Goal + Backstory + Tools                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                           │                                  │
│                           ▼                                  │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Tools(工具)                                       │   │
│  │  扩展 Agent 能力的函数和技能                          │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Agent(智能体) #

Agent 是 CrewAI 中最核心的概念,它是一个自主的执行单元。

Agent 的组成 #

python
from crewai import Agent

agent = Agent(
    role="数据分析师",           # 角色:定义职责
    goal="分析数据并提供洞察",    # 目标:指导决策
    backstory="拥有 10 年数据分析经验",  # 背景:塑造性格
    tools=[analysis_tool],       # 工具:扩展能力
    verbose=True                 # 详细输出
)

Agent 属性详解 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Agent 属性                                 │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  核心属性(必需):                                           │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ role      - 角色名称,定义 Agent 的职责              │   │
│  │ goal      - 目标,指导 Agent 的决策和行动            │   │
│  │ backstory - 背景故事,塑造 Agent 的性格和经验        │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  能力属性(可选):                                           │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ tools     - 可用工具列表                             │   │
│  │ llm       - 使用的语言模型                           │   │
│  │ memory    - 是否启用记忆                             │   │
│  │ verbose   - 是否输出详细日志                         │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  执行属性(可选):                                           │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ max_iter           - 最大迭代次数                    │   │
│  │ max_rpm            - 每分钟最大请求数                │   │
│  │ max_execution_time - 最大执行时间                    │   │
│  │ allow_delegation   - 是否允许委托任务                │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

创建 Agent #

python
from crewai import Agent
from crewai_tools import SerperDevTool

search_tool = SerperDevTool()

researcher = Agent(
    role="高级研究分析师",
    goal="发现 AI 行业的前沿趋势和发展",
    backstory="""你是一位经验丰富的研究分析师,
    擅长发现最新的技术趋势。你以能够找到最相关的信息
    并以清晰简洁的方式呈现而闻名。""",
    tools=[search_tool],
    verbose=True,
    allow_delegation=False
)

writer = Agent(
    role="技术内容作家",
    goal="创作关于 AI 行业的引人入胜的内容",
    backstory="""你是一位技术精湛的作家,
    对技术充满热情。你擅长将复杂的技术概念
    转化为易于理解的内容。""",
    verbose=True,
    allow_delegation=True
)

Task(任务) #

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

Task 的组成 #

python
from crewai import Task

task = Task(
    description="研究 AI 行业的最新趋势",  # 任务描述
    expected_output="包含 3 个主要趋势的报告",  # 预期输出
    agent=researcher,  # 负责的 Agent
    output_file="report.md"  # 输出文件
)

Task 属性详解 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Task 属性                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  核心属性:                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ description     - 任务描述,详细说明要做什么          │   │
│  │ expected_output - 预期输出,定义成功的标准            │   │
│  │ agent           - 负责执行任务的 Agent               │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  输出属性:                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ output_file     - 输出文件路径                       │   │
│  │ output_json     - JSON 格式输出                      │   │
│  │ output_pydantic - Pydantic 模型输出                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  执行属性:                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ tools           - 任务特定工具                       │   │
│  │ async_execution - 是否异步执行                       │   │
│  │ context         - 上下文任务                         │   │
│  │ callback        - 完成回调                           │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

创建 Task #

python
from crewai import Task

research_task = Task(
    description="""
    研究 AI 行业的最新趋势。
    重点关注:
    1. 大语言模型的发展
    2. 多模态 AI 的进展
    3. AI Agent 的应用
    
    提供每个趋势的详细分析和示例。
    """,
    expected_output="""
    一份包含 3 个主要趋势的详细报告,
    每个趋势包括:
    - 趋势描述
    - 关键技术
    - 主要玩家
    - 未来展望
    """,
    agent=researcher,
    output_file="research_report.md"
)

write_task = Task(
    description="""
    根据研究报告撰写一篇博客文章。
    文章应该引人入胜、信息丰富、易于理解。
    """,
    expected_output="""
    一篇 4 段落的 Markdown 格式博客文章,
    包含标题、引言、正文和结论。
    """,
    agent=writer,
    output_file="blog_post.md"
)

Crew(团队) #

Crew 协调多个 Agent 完成一系列任务。

Crew 的组成 #

python
from crewai import Crew, Process

crew = Crew(
    agents=[researcher, writer],  # Agent 列表
    tasks=[research_task, write_task],  # 任务列表
    process=Process.sequential,  # 执行流程
    verbose=True  # 详细输出
)

Crew 属性详解 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Crew 属性                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  核心属性:                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ agents  - Agent 列表                                │   │
│  │ tasks   - Task 列表                                 │   │
│  │ process - 执行流程(sequential/hierarchical)        │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  执行属性:                                                   │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ verbose       - 详细输出级别                         │   │
│  │ memory        - 是否启用记忆                         │   │
│  │ cache         - 是否启用缓存                         │   │
│  │ max_rpm       - 每分钟最大请求数                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  管理属性(层级模式):                                       │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ manager_llm   - 管理者使用的 LLM                     │   │
│  │ manager_agent - 自定义管理者 Agent                   │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

执行流程 #

python
from crewai import Crew, Process

# 顺序执行
sequential_crew = Crew(
    agents=[agent1, agent2, agent3],
    tasks=[task1, task2, task3],
    process=Process.sequential  # 任务按顺序执行
)

# 层级管理
hierarchical_crew = Crew(
    agents=[agent1, agent2, agent3],
    tasks=[task1, task2, task3],
    process=Process.hierarchical,  # Manager 协调执行
    manager_llm="gpt-4o"
)

第一个 CrewAI 程序 #

完整示例 #

python
import os
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool

os.environ["SERPER_API_KEY"] = "your-serper-key"
os.environ["OPENAI_API_KEY"] = "your-openai-key"

search_tool = SerperDevTool()

researcher = Agent(
    role="高级研究分析师",
    goal="发现 AI 行业的前沿趋势",
    backstory="""你是一位经验丰富的研究分析师,
    擅长发现最新的技术趋势。""",
    tools=[search_tool],
    verbose=True
)

writer = Agent(
    role="技术内容作家",
    goal="创作引人入胜的技术内容",
    backstory="""你是一位技术精湛的作家,
    对技术充满热情。""",
    verbose=True
)

research_task = Task(
    description="研究 2025 年 AI 行业的最新趋势",
    expected_output="包含 3 个主要趋势的详细报告",
    agent=researcher
)

write_task = Task(
    description="根据研究结果撰写一篇博客文章",
    expected_output="一篇 4 段落的 Markdown 格式博客文章",
    agent=writer
)

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

result = crew.kickoff()
print(result)

使用 YAML 配置 #

yaml
# config/agents.yaml
researcher:
  role: >
    {topic} 高级研究分析师
  goal: >
    发现 {topic} 的前沿趋势和发展
  backstory: >
    你是一位经验丰富的研究分析师,
    擅长发现最新的技术趋势。

writer:
  role: >
    {topic} 技术内容作家
  goal: >
    创作关于 {topic} 的引人入胜的内容
  backstory: >
    你是一位技术精湛的作家,对技术充满热情。
yaml
# config/tasks.yaml
research_task:
  description: >
    研究 {topic} 的最新趋势
  expected_output: >
    包含 3 个主要趋势的详细报告
  agent: researcher

write_task:
  description: >
    根据研究结果撰写一篇博客文章
  expected_output: >
    一篇 4 段落的 Markdown 格式博客文章
  agent: writer
python
# crew.py
from crewai import Agent, Crew, Task, Process
from crewai.project import CrewBase, agent, crew, task

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

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

    @agent
    def writer(self) -> Agent:
        return Agent(
            config=self.agents_config['writer'],
            verbose=True
        )

    @task
    def research_task(self) -> Task:
        return Task(
            config=self.tasks_config['research_task']
        )

    @task
    def write_task(self) -> Task:
        return Task(
            config=self.tasks_config['write_task']
        )

    @crew
    def crew(self) -> Crew:
        return Crew(
            agents=self.agents,
            tasks=self.tasks,
            process=Process.sequential,
            verbose=True
        )

# 运行
result = MyCrew().crew().kickoff(inputs={'topic': 'AI'})

执行与输出 #

启动 Crew #

python
# 同步执行
result = crew.kickoff()

# 带输入参数
result = crew.kickoff(inputs={'topic': 'AI'})

# 异步执行
result = await crew.kickoff_async()

# 批量执行
results = crew.kickoff_for_each([
    {'topic': 'AI'},
    {'topic': 'Blockchain'},
    {'topic': 'IoT'}
])

访问输出 #

python
result = crew.kickoff()

# 原始输出
print(result.raw)

# JSON 输出
if result.json_dict:
    print(result.json_dict)

# Pydantic 输出
if result.pydantic:
    print(result.pydantic)

# 任务输出列表
for task_output in result.tasks_output:
    print(f"Task: {task_output.description}")
    print(f"Output: {task_output.raw}")

# Token 使用情况
print(result.token_usage)

调试与日志 #

启用详细日志 #

python
agent = Agent(
    role="分析师",
    goal="分析数据",
    backstory="经验丰富的分析师",
    verbose=True  # 启用详细日志
)

crew = Crew(
    agents=[agent],
    tasks=[task],
    verbose=True  # 启用详细日志
)

保存日志 #

python
crew = Crew(
    agents=[agent],
    tasks=[task],
    output_log_file=True  # 保存为 logs.txt
)

# 或指定文件名
crew = Crew(
    agents=[agent],
    tasks=[task],
    output_log_file="execution.json"  # JSON 格式
)

最佳实践 #

1. Agent 设计 #

python
# 好的设计:明确的角色和目标
good_agent = Agent(
    role="市场研究分析师",
    goal="分析市场趋势,提供投资建议",
    backstory="""你有 10 年的市场研究经验,
    专注于科技行业。你擅长从海量数据中
    发现关键趋势和投资机会。"""
)

# 不好的设计:模糊的角色
bad_agent = Agent(
    role="助手",
    goal="帮助用户",
    backstory="我是一个 AI 助手"
)

2. Task 设计 #

python
# 好的设计:明确的描述和预期输出
good_task = Task(
    description="""
    分析 2025 年 AI 芯片市场:
    1. 主要厂商和产品
    2. 市场份额和趋势
    3. 技术发展方向
    """,
    expected_output="""
    一份结构化的报告,包含:
    - 市场概览
    - 竞争格局
    - 技术趋势
    - 投资建议
    """
)

# 不好的设计:模糊的任务
bad_task = Task(
    description="分析 AI 市场",
    expected_output="一份报告"
)

3. Crew 组织 #

python
# 好的设计:合理的团队结构
good_crew = Crew(
    agents=[
        researcher,  # 研究
        analyst,     # 分析
        writer,      # 写作
        editor       # 审核
    ],
    tasks=[
        research_task,
        analysis_task,
        write_task,
        edit_task
    ],
    process=Process.sequential
)

下一步 #

现在你已经掌握了 CrewAI 的基础概念,接下来学习 Agent 详解,深入了解 Agent 的高级用法!

最后更新:2026-04-04