CrewAI是一个开源的Python框架,旨在编排角色扮演的自主AI代理,这些代理相互协作以应对复杂任务。通过为每个代理分配特定的角色和目标,CrewAI能够实现无缝协作,从而提高各种应用中的效率和效果。
CrewAI的关键特性:
CrewAI入门指南:
安装:确保已安装Python(版本3.10至3.13)。使用pip安装CrewAI:
pip install crewai
如需额外工具,请使用以下命令安装:
pip install 'crewai[tools]'
CrewAI中的代理:
在CrewAI中,代理是一个基本组件,旨在多代理系统内执行特定任务。每个代理都有其角色、目标、背景故事,并且可以配备各种工具和配置以增强其功能。
CrewAI代理的关键组件:
在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类的关键特性:
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类提供了各种参数来微调模型的行为:
CrewAI中的Crew类:
在CrewAI中,Crew类负责协调多个代理和任务之间的协作,使复杂的工作流程得以执行。它是管理各种代理执行的任务顺序和交互的中央组件。
Crew类的关键组件:
定义Crew的示例:
任务被集成到一个团队中,该团队通过分配的代理来协调任务的执行。
from crewai import Crew, Process
my_crew = Crew(
agents=[researcher],
tasks=[research_task],
process=Process.sequential,
verbose=True
)
流程选项:
执行Crew:
要启动由团队定义的工作流:
# Start the crew's task execution
result = my_crew.kickoff()
print(result)
kickoff()方法会根据定义的工作流程触发任务的执行。
其他配置:
如何在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
)
工作原理
使用这些装饰器,你可以以模块化的方式高效地组织和管理代理、任务和团队。
构建研究代理的逐步说明:
第一步:定义配置文件
研究代理在agents.yaml文件中进行配置(在crew.py中引用):
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
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文件初始化并运行团队:
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
输出示例:
CrewAI的自定义和高级功能
自定义代理和任务
修改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
)
整合所有内容
CrewAI的灵活性使你能够构建适应复杂性和特定用例的定制工作流程。