团队
什么是团队?¶
在 crewAI 中,团队代表一个协作的代理组,他们共同努力以完成一系列任务。每个团队定义了任务执行、代理协作和整体工作流程的策略。
Crew属性¶
属性 | 参数 | 描述 |
---|---|---|
任务 | tasks |
分配给Crew的任务列表。 |
代理 | agents |
属于Crew的代理列表。 |
过程 (可选) | process |
Crew遵循的过程流程(例如,顺序、层级)。 |
详细程度 (可选) | verbose |
执行期间记录的详细程度。 |
管理者 LLM (可选) | manager_llm |
管理代理在层级过程中使用的语言模型。在使用层级过程时必需。 |
功能调用 LLM (可选) | function_calling_llm |
如果传递,Crew将使用此 LLM 为Crew中的所有代理进行工具的功能调用。每个代理可以拥有自己的 LLM,这将覆盖Crew的功能调用 LLM。 |
配置 (可选) | config |
Crew的可选配置设置,格式为 Json 或 Dict[str, Any] 。 |
最大请求速率 (可选) | max_rpm |
Crew在执行期间遵循的每分钟最大请求数。 |
语言 (可选) | language |
Crew使用的语言,默认为英语。 |
语言文件 (可选) | language_file |
用于Crew的语言文件路径。 |
记忆 (可选) | memory |
用于存储执行记忆(短期、长期、实体记忆)。 |
缓存 (可选) | cache |
指定是否使用缓存来存储工具执行的结果。 |
嵌入器 (可选) | embedder |
Crew使用的嵌入器的配置。当前主要用于记忆。 |
完整输出 (可选) | full_output |
Crew是否应返回包含所有任务输出的完整输出,或仅返回最终输出。 |
步骤回调 (可选) | step_callback |
每个代理每一步之后调用的函数。可用于记录代理的操作或执行其他操作;它不会覆盖代理特定的 step_callback 。 |
任务回调 (可选) | task_callback |
每个任务完成后调用的函数。用于监控或任务执行后的额外操作。 |
共享Crew (可选) | share_crew |
是否希望与 crewAI 团队共享完整的Crew信息和执行,以改善库,并允许我们训练模型。 |
输出日志文件 (可选) | output_log_file |
是否希望拥有一个包含完整Crew输出和执行的文件。您可以使用 True 设置它,它将默认为您当前所在的文件夹,并命名为 logs.txt,或者传递一个字符串,包含文件的完整路径和名称。 |
管理者代理 (可选) | manager_agent |
manager 设置将用作管理者的自定义代理。 |
管理者回调 (可选) | manager_callbacks |
manager_callbacks 接受一个回调处理程序的列表,当使用层级过程时由管理代理执行。 |
提示文件 (可选) | prompt_file |
用于Crew的提示 JSON 文件路径。 |
规划 (可选) | planning |
为Crew添加规划能力。在每次Crew迭代之前激活时,所有Crew数据将发送到 AgentPlanner,AgentPlanner 将规划任务,并将此计划添加到每个任务描述中。 |
规划 LLM (可选) | planning_llm |
在规划过程中,AgentPlanner 使用的语言模型。 |
Crew最大请求速率
max_rpm
属性设置Crew每分钟可以执行的最大请求数,以避免速率限制,如果您设置它,将覆盖单个代理的 max_rpm
设置。
创建团队¶
在组建团队时,您需要将具有互补角色和工具的代理组合在一起,分配任务,并选择一个决定它们执行顺序和互动的流程。
示例:组建团队¶
from crewai import Crew, Agent, Task, Process
from langchain_community.tools import DuckDuckGoSearchRun
from crewai_tools import tool
@tool('DuckDuckGoSearch')
def search(search_query: str):
"""Search the web for information on a given topic"""
return DuckDuckGoSearchRun().run(search_query)
# 定义具有特定角色和工具的代理
researcher = Agent(
role='高级研究分析师',
goal='发现创新的人工智能技术',
backstory="""你是一家大公司的高级研究分析师。
你负责分析数据并为业务提供洞察。
你目前正在进行一个项目,分析人工智能领域的趋势和创新。""",
tools=[search]
)
writer = Agent(
role='内容撰写者',
goal='撰写关于人工智能发现的引人入胜的文章',
backstory="""你是一家大公司的高级撰写者。
你负责为业务创建内容。
你目前正在进行一个项目,为下次会议撰写关于人工智能领域趋势和创新的内容。""",
verbose=True
)
# 为代理创建任务
research_task = Task(
description='识别突破性的人工智能技术',
agent=researcher,
expected_output='前5个最重要的人工智能新闻的要点总结'
)
write_article_task = Task(
description='撰写关于最新人工智能技术的文章',
agent=writer,
expected_output='关于最新人工智能技术的3段博客文章'
)
# 通过顺序流程组建团队
my_crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_article_task],
process=Process.sequential,
full_output=True,
verbose=True,
)
Crew Output¶
理解 Crew 输出
在 crewAI 框架中,团队的输出封装在 CrewOutput
类中。
该类提供了一种结构化的方式来访问团队执行的结果,包括原始字符串、JSON 和 Pydantic 模型等多种格式。
CrewOutput
包含最终任务输出、令牌使用情况和各个任务输出的结果。
Crew输出属性¶
属性 | 参数 | 类型 | 描述 |
---|---|---|---|
原始 | raw |
str |
Crew的原始输出。这是输出的默认格式。 |
Pydantic | pydantic |
Optional[BaseModel] |
一个 Pydantic 模型对象,表示Crew的结构化输出。 |
JSON 字典 | json_dict |
Optional[Dict[str, Any]] |
一个表示Crew JSON 输出的字典。 |
任务输出 | tasks_output |
List[TaskOutput] |
一个 TaskOutput 对象的列表,每个对象表示Crew中一个任务的输出。 |
令牌使用 | token_usage |
Dict[str, Any] |
令牌使用的摘要,提供有关语言模型在执行过程中的性能的见解。 |
Crew输出方法和属性¶
方法/属性 | 描述 |
---|---|
json | 如果输出格式为 JSON,则返回Crew输出的 JSON 字符串表示。 |
to_dict | 将 JSON 和 Pydantic 输出转换为字典。 |
**str** | 返回Crew输出的字符串表示,优先考虑 Pydantic,然后是 JSON,最后是原始格式。 |
访问团队输出¶
一旦团队执行完毕,可以通过 Crew
对象的 output
属性访问其输出。CrewOutput
类提供了多种方式与该输出进行交互和展示。
示例¶
# Example crew execution
crew = Crew(
agents=[research_agent, writer_agent],
tasks=[research_task, write_article_task],
verbose=2
)
crew_output = crew.kickoff()
# Accessing the crew output
print(f"Raw Output: {crew_output.raw}")
if crew_output.json_dict:
print(f"JSON Output: {json.dumps(crew_output.json_dict, indent=2)}")
if crew_output.pydantic:
print(f"Pydantic Output: {crew_output.pydantic}")
print(f"Tasks Output: {crew_output.tasks_output}")
print(f"Token Usage: {crew_output.token_usage}")
内存利用率¶
工作人员可以利用内存(短期内存、长期内存和实体内存)来增强他们的执行和学习能力。此功能允许工作人员存储和回忆执行记忆,从而帮助决策和任务执行策略。
Cache Utilization¶
Caching can be used to store the results of tool executions, making the process more efficient by reducing the need to re-execute the same tasks.
团队使用指标¶
在团队执行后,您可以访问 usage_metrics
属性,以查看团队执行的所有任务的语言模型(LLM)使用指标。这提供了对运营效率和改进领域的洞察。
# Access the crew's usage metrics
crew = Crew(agents=[agent1, agent2], tasks=[task1, task2])
crew.kickoff()
print(crew.usage_metrics)
Crew Execution Process¶
- 顺序流程: 任务一个接一个地执行,允许工作线性流动。
- 层级流程: 一名经理代理协调团队,分配任务并在继续之前验证结果。 注意: 此流程需要一个
manager_llm
或manager_agent
,并且对验证流程至关重要。
启动团队¶
一旦您的团队组建完成,使用 kickoff()
方法启动工作流程。这将根据定义的流程开始执行过程。
不同的团队启动方式¶
一旦您的团队组建完成,使用适当的启动方法来启动工作流程。CrewAI 提供了几种方法以更好地控制启动过程:kickoff()
, kickoff_for_each()
, kickoff_async()
和 kickoff_for_each_async()
。
kickoff()
:根据定义的流程启动执行过程。
kickoff_for_each()
:为每个代理单独执行任务。
kickoff_async()
:异步启动工作流程。
kickoff_for_each_async()
:以异步方式为每个代理单独执行任务。
# Start the crew's task execution
result = my_crew.kickoff()
print(result)
# Example of using kickoff_for_each
inputs_array = [{'topic': 'AI in healthcare'}, {'topic': 'AI in finance'}]
results = my_crew.kickoff_for_each(inputs=inputs_array)
for result in results:
print(result)
# Example of using kickoff_async
inputs = {'topic': 'AI in healthcare'}
async_result = my_crew.kickoff_async(inputs=inputs)
print(async_result)
# Example of using kickoff_for_each_async
inputs_array = [{'topic': 'AI in healthcare'}, {'topic': 'AI in finance'}]
async_results = my_crew.kickoff_for_each_async(inputs=inputs_array)
for async_result in async_results:
print(async_result)
这些方法提供了在团队内管理和执行任务的灵活性,允许根据您的需求进行同步和异步工作流程。
从特定任务重放:¶
您现在可以使用我们的命令行界面命令 replay 从特定任务重放。
CrewAI 中的重放功能允许您使用命令行界面 (CLI) 从特定任务重放。通过运行命令 crewai replay -t <task_id>
,您可以指定重放过程中的 task_id
。
Kickoffs 现在将最新的 kickoffs 返回的任务输出保存在本地,以便您能够进行重放。
从特定任务使用CLI进行重放¶
要使用重放功能,请按照以下步骤操作:
- 打开终端或命令提示符。
- 导航到您的CrewAI项目所在的目录。
- 运行以下命令:
要查看最新的启动任务_id,请使用:
这些命令允许您从最新的启动任务进行重放,同时保留之前执行任务的上下文。