目录
- 1. CrewAI简介
- 1.1 CrewAI Crews
- 1.2 CrewAI Flows
- 1.3 Crews和Flows的使用情景
 
- 2. CrewAI安装
- 2.1 安装uv
- 2.2 安装CrewAI CLI
 
- 3. 官网QuickStart样例
- 3.1 创建CrewAI Crews项目
- 3.2 项目结构
- 3.3 .env
- 3.4 智能体角色及其任务
- 3.4.1 agents.yaml
- 3.4.2 tasks.yaml
 
- 3.5 crew.py
- 3.6 main.py
- 3.7 本地运行
 
- 参考
1. CrewAI简介
  CrewAI是一个精简、快如闪电的Python框架,完全独立于LangChain或其他Agent框架。它为开发者提供了高层次简洁性与精准低层次控制的双重优势,是创建适用于任何场景的自主AI代理的理想框架,存在如下的两种模式:
   1. CrewAI Crews:优化自主性与协作智能,使您能够创建具备特定角色、工具、目标的智能体团队。
   2. CrewAI Flows:支持细粒度的事件驱动控制,通过单一LLM调用实现精准任务编排,并原生支持智能体团队协作。
1.1 CrewAI Crews
  下图源自CrewAI。
 
| 组成 | 描述 | 作用 | 
|---|---|---|
| Crew | 最顶层的组织 | 1. 管理智能体团队 2. 监督工作流 3. 保证协作 4. 输出结果 | 
| AI Agents | 专业的团队成员 | 1. 有特定的角色 2. 使用指定的工具 3. 可以委派任务 4. 自主决策 | 
| Process | 工作流管理系统 | 1. 定义协作模式 2. 控制任务 3. 管理交互 4. 保证高效执行 | 
| Tasks | 个人任务 | 1. 有明确的目标 2. 使用特定的工具 3. 输入到更大的Process 4. 产生可行的结果 | 
1.2 CrewAI Flows
  下图源自CrewAI。
 
| 组成 | 描述 | 作用 | 
|---|---|---|
| Flow | 结构化工作流安排 | 1. 管理执行路径 2. 处理state 3. 控制任务顺序 4. 保证执行可靠 | 
| Events | 工作流行动的触发器 | 1. 启动特定Processes 2. 启用动态响应 3. 支持条件分支 4. 允许实时适应 | 
| States | 工作流执行上下文 | 1. 维持执行数据 2. 启用持久性 3. 支持可恢复性 4. 保证执行完整性 | 
| Crew Support | 增强工作流自动化 | 1. 在需要时注入Crew 2. 补充结构化工作流 3. 平衡自动化与智能 4. 支持自适应决策 | 
1.3 Crews和Flows的使用情景
| 情景 | 推荐方法 | 原因 | 
|---|---|---|
| 开放性研究 | Crews | 任务需要创造性思考、探索和适应 | 
| 生成内容 | Crews | 文章、报告和营销材料需要联合协作 | 
| 决策工作流 | Flows | 决策路径具备可预测性、审计性和精细控制 | 
| API编排 | Flows | 需要按照特定顺序对多个外部服务进行可靠的集成 | 
| 混合应用 | Crews、Flows | 使用Flows编排整个过程,同时使用Crews处理复杂子任务 | 
当你需要自主解决问题、合作创新或进行探索性任务时,应该选择Crews;当你需要确定性的结果、审计能力或对执行的精准控制,应该选择Flows;当你的应用需要结构化过程和一些自主智能时,应该联合Crews和Flows。
2. CrewAI安装
2.1 安装uv
  uv是用Rust编写的Python包管理器,目前使用Python的新项目基本上都使用它来对项目中的依赖进行管理。Windows上安装的命令:
   powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
2.2 安装CrewAI CLI
  安装CrewAI CLI的命令:
   uv tool install crewai
   配置CrewAI的路径:
   uv tool update-shell
   验证CrewAI安装:
   uv tool list
   更新CrewAI:
   uv tool install crewai --upgrade
3. 官网QuickStart样例
3.1 创建CrewAI Crews项目
  创建CrewAI Crews项目:
   crewai create crew <your-project-name>
3.2 项目结构
  项目结构图如下。
 
| 路径 | 作用 | 
|---|---|
| <your-project-name>/.venv | 项目下的Python环境 | 
| <your-project-name>/knowledge | 本地知识库目录 | 
| <your-project-name>/src/<your-project-name>/config/agents.yaml | 定义智能体及其角色 | 
| <your-project-name>/src/<your-project-name>/config/tasks.yaml | 设置智能体任务和工作流 | 
| <your-project-name>/src/<your-project-name>/tools | 自定义智能体工具的目录 | 
| <your-project-name>/src/crew.py | 协调、编排Crews | 
| <your-project-name>/src/main.py | 项目入口、执行流 | 
| <your-project-name>/tests | 测试目录 | 
| <your-project-name>/.env | 存放大模型API Keys和环境变量 | 
| <your-project-name>/.gitignore | 配置git忽略的文件或文件夹 | 
| <your-project-name>/pyproject.toml | Python项目配置 | 
| <your-project-name>/README.md | CrewAI官方给出的项目运行指导 | 
| <your-project-name>/uv.lock | uv锁定的Python依赖 | 
3.3 .env
CrewAI支持调用和OpenAI的API规范一致的大模型,这里我选择了deepseek-chat。
MODEL=openai/deepseek-chat
OPENAI_API_KEY="your-api-key"
OPENAI_API_BASE="https://api.deepseek.com/v1"
3.4 智能体角色及其任务
3.4.1 agents.yaml
样例中定义了两个智能体research和reporting_analyst,分别给它们定义了role、goal和backstory。此外,在role、goal和backstory中可以通过{变量名}的方式插入用户输入的内容。
researcher:
  role: >
    {topic}领域的高级数据研究员
  goal: >
    发掘{topic}领域的前沿发展
  backstory: >
    你是一位经验丰富的研究员,擅长发掘{topic}领域的最新进展。你能够找到最相关的信息并以清晰简洁的方式呈现。
    
reporting_analyst:
  role: >
    {topic}领域的报告分析师
  goal: >
    基于{topic}领域的数据分析和研究发现,创建详细的报告
  backstory: >
    你是一位细致入微的分析师,对细节有着敏锐的洞察力。你能够将复杂的数据转化为清晰简洁的报告,使他人能够轻松理解并基于你提供的信息采取行动。
3.4.2 tasks.yaml
tasks.yaml中给researcher和reporting_analyst分别分配了任务research_task和reporting_task,在每个任务中给出了任务描述description、任务输出expected_output和该任务所属的智能体agent。同样,在description、expected_output中可以通过{变量名}的方式插入用户的内容。
research_task:
  description: >
    对{topic}领域进行深入研究,确保在当前年份{current_year}下找到所有有趣且相关的信息。
  expected_output: >
    列出关于{topic}的10个要点,涵盖最相关的信息。
  agent: researcher
reporting_task:
  description: >
    审查获取的内容,并将每个主题扩展为完整的报告章节。确保报告详尽,包含所有相关信息。
  expected_output: >
    一份完整的报告,每个主要主题均包含详细的信息章节,以Markdown格式呈现(不包含代码块标记)。
  agent: reporting_analyst
3.5 crew.py
&emsp以下代码皆是创建项目时自动生成的,从下面的代码中可以看出FirstAgent类主要完成3个任务:1. 创建智能体Agent。2. 创建智能体的任务Task。3. 创建最顶层组织Crew。
from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task
# If you want to run a snippet of code before or after the crew starts,
# you can use the @before_kickoff and @after_kickoff decorators
# https://docs.crewai.com/concepts/crews#example-crew-class-with-decorators
@CrewBase
class FirstAgent():
    """FirstAgent crew"""
    # Learn more about YAML configuration files here:
    # Agents: https://docs.crewai.com/concepts/agents#yaml-configuration-recommended
    # Tasks: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended
    agents_config = 'config/agents.yaml'
    tasks_config = 'config/tasks.yaml'
    # If you would like to add tools to your agents, you can learn more about it here:
    # https://docs.crewai.com/concepts/agents#agent-tools
    @agent
    def researcher(self) -> Agent:
        return Agent(
            config=self.agents_config['researcher'],
            verbose=True
        )
    @agent
    def reporting_analyst(self) -> Agent:
        return Agent(
            config=self.agents_config['reporting_analyst'],
            verbose=True
        )
    # To learn more about structured task outputs,
    # task dependencies, and task callbacks, check out the documentation:
    # https://docs.crewai.com/concepts/tasks#overview-of-a-task
    @task
    def research_task(self) -> Task:
        return Task(
            config=self.tasks_config['research_task'],
        )
    @task
    def reporting_task(self) -> Task:
        return Task(
            config=self.tasks_config['reporting_task'],
            output_file='report.md'
        )
    @crew
    def crew(self) -> Crew:
        """Creates the FirstAgent crew"""
        # To learn how to add knowledge sources to your crew, check out the documentation:
        # https://docs.crewai.com/concepts/knowledge#what-is-knowledge
        return Crew(
            agents=self.agents, # Automatically created by the @agent decorator
            tasks=self.tasks, # Automatically created by the @task decorator
            process=Process.sequential,
            verbose=True,
            # process=Process.hierarchical, # In case you wanna use that instead https://docs.crewai.com/how-to/Hierarchical/
        )
3.6 main.py
main.py文件主要功能是让你在本地运行Crew,以达到测试的目的。以下代码也是在创建项目时自动生成的。
import sys
import warnings
from datetime import datetime
from first_agent.crew import FirstAgent
warnings.filterwarnings("ignore", category=SyntaxWarning, module="pysbd")
# This main file is intended to be a way for you to run your
# crew locally, so refrain from adding unnecessary logic into this file.
# Replace with inputs you want to test with, it will automatically
# interpolate any tasks and agents information
def run():
    """
    Run the crew.
    """
    inputs = {
        'topic': '大语言模型',
        'current_year': str(datetime.now().year)
    }
    
    try:
        FirstAgent().crew().kickoff(inputs=inputs)
    except Exception as e:
        raise Exception(f"An error occurred while running the crew: {e}")
def train():
    """
    Train the crew for a given number of iterations.
    """
    inputs = {
        "topic": "大语言模型"
    }
    try:
        FirstAgent().crew().train(n_iterations=int(sys.argv[1]), filename=sys.argv[2], inputs=inputs)
    except Exception as e:
        raise Exception(f"An error occurred while training the crew: {e}")
def replay():
    """
    Replay the crew execution from a specific task.
    """
    try:
        FirstAgent().crew().replay(task_id=sys.argv[1])
    except Exception as e:
        raise Exception(f"An error occurred while replaying the crew: {e}")
def test():
    """
    Test the crew execution and returns the results.
    """
    inputs = {
        "topic": "大语言模型",
        "current_year": str(datetime.now().year)
    }
    try:
        FirstAgent().crew().test(n_iterations=int(sys.argv[1]), openai_model_name=sys.argv[2], inputs=inputs)
    except Exception as e:
        raise Exception(f"An error occurred while testing the crew: {e}")
3.7 本地运行
在项目路径下先安装依赖,然后运行:
crewai install
crewai run
  从上面的Agents.yaml和Tasks.yaml中可以看出,该样例的目的是产出一份指定topic、指定年份year的报告,报告最终输出为Markdown文件。
   生成该报告的过程如下:
   1. research Agent查找关于指定主题topic、指定年份year的内容,并将其总结成10个要点。
 
 
 
   2. research Agent完成任务后,将得到10个要点交给reporting_analyst Agent。reporting_analyst审查获取的10个要点,并将其扩写成一份指定主题topic、指定年份year的报告,并以Markdown文件格式输出。
 
 
 
 
参考
https://docs.crewai.com/introduction
 https://docs.crewai.com/installation
 https://docs.crewai.com/quickstart



















