使用CrewAI构建AI代理的分步指南

2024年11月28日 由 alex 发表 94 0

CrewAI是一个开源的Python框架,旨在编排角色扮演的自主AI代理,这些代理相互协作以应对复杂任务。通过为每个代理分配特定的角色和目标,CrewAI能够实现无缝协作,从而提高各种应用中的效率和效果。


CrewAI的关键特性:

  • 基于角色的架构:代理被赋予不同的角色和目标,从而实现专业化的任务执行。
  • 代理编排:促进多个代理之间的协调,确保它们能够朝着共同的目标协同工作。
  • 工具集成:支持整合各种工具,扩展代理的能力,使其能够与外部系统交互并执行多样化的功能。
  • 可扩展性:设计用于处理简单和复杂的多代理系统,使其能够适应各种项目规模和复杂性。


CrewAI入门指南:

安装:确保已安装Python(版本3.10至3.13)。使用pip安装CrewAI:


pip install crewai 


如需额外工具,请使用以下命令安装:


pip install 'crewai[tools]'


10


CrewAI中的代理

在CrewAI中,代理是一个基本组件,旨在多代理系统内执行特定任务。每个代理都有其角色、目标、背景故事,并且可以配备各种工具和配置以增强其功能。


CrewAI代理的关键组件:

  1. 角色:定义代理在系统中的功能或位置。例如,一个代理可能被赋予“数据研究员”或“报告分析师”的角色。
  2. 目标:指定代理旨在实现的目标。这为代理的行动和决策提供了方向。
  3. 背景故事:提供可能影响代理行为和交互的上下文信息或叙述。
  4. 工具:代理可以配备工具来扩展其功能,如网络搜索引擎或数据分析实用程序。
  5. 配置:代理使用YAML文件进行配置,允许进行模块化和灵活的设置。


在CrewAI中定义代理的示例:


from crewai import Agent
researcher = Agent(
    role="Senior Data Researcher",
    goal="Uncover cutting-edge developments in AI",
    backstory="A seasoned researcher with a knack for uncovering the latest developments in AI.",
    tools=[SerperDevTool()],
    verbose=True
)


在这个例子中,研究人员代理被赋予了特定的角色、目标、背景故事,并配备了SerperDevTool以增强其研究能力。


通过YAML配置代理:

代理也可以在YAML配置文件()中定义agents.yaml,这样可以实现清晰且有条理的结构。


researcher:
  role: "Senior Data Researcher"
  goal: "Uncover cutting-edge developments in AI"
  backstory: "A seasoned researcher with a knack for uncovering the latest developments in AI."
  tools:
    - SerperDevTool


在CrewAI中,任务类(Task class)定义了代理执行的工作单元。每个任务都具有描述、预期输出、分配代理以及可选配置(如工具和执行设置)等属性。


任务类的关键属性:

  • 描述:对任务的目的和要求进行详细解释。
  • 预期输出:指定任务应产生的期望结果或格式。
  • 代理:负责执行任务的代理。
  • 工具:代理为完成任务可以选择使用的工具。
  • 异步执行:指示任务是否应异步执行。
  • 上下文:为当前任务提供上下文的其他任务的附加信息或输出。


在CrewAI中定义任务的示例:


from crewai import Task
research_task = Task(
    description="Conduct comprehensive research on the latest AI developments.",
    expected_output="A summary report highlighting key advancements in AI.",
    agent=researcher_agent,
    tools=[search_tool],
    async_execution=True
)


在这个例子中,research_task 被清晰地定义了描述、预期输出、分配的代理(researcher_agent)、一个工具(search_tool),并且被设置为异步执行。


通过YAML配置任务:

任务也可以在YAML配置文件(tasks.yaml)中定义,这样可以实现有序且模块化的设置。


research_task:
  description: "Conduct comprehensive research on the latest AI developments."
  expected_output: "A summary report highlighting key advancements in AI."
  agent: researcher_agent
  tools:
    - search_tool
  async_execution: true


这个YAML配置可以被加载到CrewAI框架中以实例化任务。


CrewAI中的LLM类:

在CrewAI中,LLM(大型语言模型)类是配置代理用于处理和生成文本的语言模型的关键。这个类提供了连接到各种LLM提供商的灵活性,包括通过Ollama连接到OpenAI兼容的模型和本地模型。


LLM类的关键特性:

  • 模型规范:定义模型名称,如“gpt-4”、“gpt-3.5-turbo”或“ollama/llama3.1”。
  • 提供商配置:设置与不同LLM提供商的连接,包括指定API密钥和基础URL。
  • 参数自定义:调整温度、最大令牌数、top_p等参数,以控制模型的输出行为。


from crewai import LLM
# Connecting to an OpenAI-compatible LLM
openai_llm = LLM(
    model="gpt-4",
    api_key="your-openai-api-key",
    api_base="https://api.openai.com/v1"
)
# Connecting to a local LLM via Ollama
ollama_llm = LLM(
    model="ollama/llama3.1",
    base_url="http://localhost:11434"
)


在CrewAI中将LLM与代理集成:

CrewAI中的代理可以被分配特定的LLM来执行它们的任务。


from crewai import Agent
researcher = Agent(
    role="Researcher",
    goal="Conduct in-depth research on AI developments.",
    llm=openai_llm
)


通过环境变量配置LLM:

或者,也可以使用环境变量来配置LLM。


import os
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
os.environ["OPENAI_API_BASE"] = "https://api.openai.com/v1"


这种方法允许进行动态配置,而无需硬编码敏感信息。


其他配置选项:

LLM类提供了各种参数来微调模型的行为:

  • temperature:控制输出的随机性。
  • max_tokens:设置生成响应中的最大令牌数。
  • top_p:应用核采样来限制令牌选择池。


CrewAI中的Crew类:

在CrewAI中,Crew类负责协调多个代理和任务之间的协作,使复杂的工作流程得以执行。它是管理各种代理执行的任务顺序和交互的中央组件。


Crew类的关键组件:

  1. 代理:定义团队内角色和职责的代理实例列表。
  2. 任务:概述要执行的具体动作的任务实例列表。
  3. 流程:确定任务的执行策略,如顺序或分层流程。
  4. 详细模式:启用对团队操作的详细记录,以便进行监控和调试。


定义Crew的示例:

任务被集成到一个团队中,该团队通过分配的代理来协调任务的执行。


from crewai import Crew, Process
my_crew = Crew(
    agents=[researcher],
    tasks=[research_task],
    process=Process.sequential,
    verbose=True
)


流程选项:

  • 顺序执行:任务以线性顺序一个接一个地执行。
  • 分层执行:一个管理代理协调整个团队,分配任务并在继续之前验证结果。这需要指定一个manager_agent或manager_llm。


执行Crew:

要启动由团队定义的工作流:


# Start the crew's task execution
result = my_crew.kickoff()
print(result)


kickoff()方法会根据定义的工作流程触发任务的执行。


其他配置:

  • 输出日志记录:指定一个输出日志文件来记录团队的执行细节。
  • 令牌使用监控:执行后访问usage_metrics属性以查看语言模型的使用情况指标。
  • 内存利用:实现内存机制以提高团队随时间的性能。


如何在CrewAI中使用类装饰器:

在CrewAI中,像@agent、@task和@crew这样的装饰器被用来直接在扩展自CrewBase的类中定义代理、任务和团队。这些装饰器会自动为工作流程注册组件。


CrewAI中的关键装饰器:

@agent:定义一个具有特定配置的代理。


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


@agent:自动将此代理添加到Crew的agents属性中。


@task:定义一个使用代理来执行的任务。


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


@crew:将代理和任务组合成一个团队以便执行。


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


工作原理

  • 这些装饰器将逻辑和配置(来自YAML或内联)与CrewAI框架连接起来。
  • 它们通过自动在CrewBase类中注册组件来简化工作流的创建。


使用这些装饰器,你可以以模块化的方式高效地组织和管理代理、任务和团队。


构建研究代理的逐步说明:


第一步:定义配置文件

研究代理在⁣agents.yaml文件中进行配置(在crew.py中引用):

  • 此文件包含诸如代理的角色、目标和背景故事等属性。
  • 研究代理的配置在运行时动态加载到Agent实例中。


researcher:
  role: >
    {topic} Senior Data Researcher
  goal: >
    Uncover cutting-edge developments in {topic}
  backstory: >
    You're a seasoned researcher with a knack for uncovering the latest
    developments in {topic}. Known for your ability to find the most relevant
    information and present it in a clear and concise manner.
reporting_analyst:
  role: >
    {topic} Reporting Analyst
  goal: >
    Create detailed reports based on {topic} data analysis and research findings
  backstory: >
    You're a meticulous analyst with a keen eye for detail. You're known for
    your ability to turn complex data into clear and concise reports, making
    it easy for others to understand and act on the information you provide.


研究代理负责执行初步研究(research_task),并生成关于给定主题的10个要点摘要。


tasks.yaml文件包含任务描述和预期输出。


research_task:
  description: >
    Conduct a thorough research about {topic}
    Make sure you find any interesting and relevant information given
    the current year is 2024.
  expected_output: >
    A list with 10 bullet points of the most relevant information about {topic}
  agent: researcher
reporting_task:
  description: >
    Review the context you got and expand each topic into a full section for a report.
    Make sure the report is detailed and contains any and all relevant information.
  expected_output: >
    A fully fledge reports with the mains topics, each with a full section of information.
    Formatted as markdown without '```'
  agent: reporting_analyst


第二步:定义crew.py文件:

crew.py文件将agents.yaml中的配置与研究代理连接起来:


LLM初始化:

创建一个LLM类的实例(ollama_llm)来定义代理所使用的语言模型。


ollama_llm = LLM(
    model='ollama/llama3.2',
    base_url='http://localhost:11434',
)


定义研究代理:

  • 使用@agent装饰器来定义researcher方法,该方法用于设置代理。
  • 代理通过self.agents_config['researcher']从YAML文件中拉取其配置。
  • 将ollama_llm实例分配给llm参数,使代理能够使用指定的语言模型来执行任务。


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


定义报告代理:


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


定义任务:


@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 AiLatestDevelopment crew"""
  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/
  )


完整的crew.py文件:


from crewai import Agent, Crew, Process, Task, LLM
from crewai.project import CrewBase, agent, crew, task
from dotenv import load_dotenv
load_dotenv()
# Uncomment the following line to use an example of a custom tool
# from ai_latest_development.tools.custom_tool import MyCustomTool
# Check our tools documentations for more information on how to use them
# from crewai_tools import SerperDevTool
@CrewBase
class AiLatestDevelopment():
 """AiLatestDevelopment crew"""
 agents_config = 'config/agents.yaml'
 tasks_config = 'config/tasks.yaml'
 ollama_llm = LLM(
  model='ollama/llama3.2',
  base_url='http://localhost:11434',
 )
 @agent
 def researcher(self) -> Agent:
  return Agent(
   config=self.agents_config['researcher'],
   # tools=[MyCustomTool()], # Example of custom tool, loaded on the beginning of file
   verbose=True,
   llm=self.ollama_llm
  )
 @agent
 def reporting_analyst(self) -> Agent:
  return Agent(
   config=self.agents_config['reporting_analyst'],
   verbose=True,
   llm=self.ollama_llm
  )
 @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 AiLatestDevelopment crew"""
  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/
  )


在main.py中执行工作流

main.py文件初始化并运行团队:

  • 定义了工作流的输入(例如,'topic': 'AI LLMs')。
  • kickoff()方法执行团队,从分配给研究代理的研究任务开始。


import sys
import warnings
from crew import AiLatestDevelopment
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': 'AI LLMs'
    }
    AiLatestDevelopment().crew().kickoff(inputs=inputs)
run()


项目文件结构概述:


├── crew.py
├── main.py
├── config/
    ├── agents.yaml
    ├── tasks.yaml


输出示例:


11


12


CrewAI的自定义和高级功能


自定义代理和任务

修改YAML配置:

  • 更新agents.yaml和tasks.yaml文件,以调整代理角色、目标和任务描述。


集成自定义工具

CrewAI支持集成工具以扩展代理功能。


示例:添加用于高级数据抓取的工具:

  • 导入并配置工具:


切换流程模式

CrewAI允许以两种模式执行任务:顺序模式和层次模式。

  • 顺序执行:
  • 任务以线性顺序一个接一个地执行。
  • 适用于每个任务都依赖于前一个任务输出的工作流程。


层次执行:

  • 管理代理负责监督工作流程,动态分配任务。
  • 适用于需要验证或灵活任务分配的工作流程。


@crew
def crew(self) -> Crew:
    return Crew(
        agents=self.agents,
        tasks=self.tasks,
        process=Process.hierarchical,
        manager_agent=self.manager,  # Define a manager agent
        verbose=True
    )
@agent
def manager(self) -> Agent:
    return Agent(
        config=self.agents_config['manager'],
        llm=self.ollama_llm,
        verbose=True
    )


整合所有内容

  • 将自定义的代理、任务和工具组合成一个团队。
  • 根据工作流程需求选择适当的流程模式(顺序或层次)。
  • 迭代地修改YAML和Python配置以满足项目目标。


CrewAI的灵活性使你能够构建适应复杂性和特定用例的定制工作流程。

文章来源:https://medium.com/@sahin.samia/building-ai-agents-with-crewai-a-step-by-step-guide-172627e110c5
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消