跳到主要内容

CrewAI 任务

任务概述

!!! note "什么是任务?" 在 crewAI 框架中,任务是由代理完成的具体任务。它们提供了执行所需的所有必要细节,例如描述、负责代理、所需工具等,有助于促进各种行动的复杂性。

crewAI 中的任务可以是协作性的,需要多个代理共同完成。这是通过任务属性进行管理,并由团队的流程进行编排,增强了团队合作和效率。

任务属性

属性描述
描述任务内容的清晰简明陈述。
代理负责任务的代理,可以直接分配,也可以由团队的流程分配。
预期输出任务完成后的详细描述。
工具 (可选)代理可以利用的功能或能力来执行任务。
异步执行 (可选)如果设置,任务将异步执行,允许在不等待完成的情况下进行进展。
上下文 (可选)指定输出用作此任务上下文的任务。
配置 (可选)用于执行任务的代理的其他配置细节,允许进一步定制。
输出 JSON (可选)输出 JSON 对象,需要 OpenAI 客户端。只能设置一种输出格式。
输出 Pydantic (可选)输出 Pydantic 模型对象,需要 OpenAI 客户端。只能设置一种输出格式。
输出文件 (可选)将任务输出保存到文件。如果与 输出 JSON输出 Pydantic 一起使用,指定输出保存方式。
回调 (可选)任务完成后执行的 Python 可调用函数。
人工输入 (可选)指示任务是否需要最终的人工反馈,对需要人工监督的任务很有用。

创建任务

创建任务涉及定义其范围、负责代理以及任何额外属性以实现灵活性:

from crewai import Task

task = Task(
description='查找并总结有关人工智能的最新和最相关新闻',
agent=sales_agent
)

!!! note "任务分配" 直接指定一个 代理 进行分配,或者让 分层 的 CrewAI 流程根据角色、可用性等进行决定。

任务与工具的集成

利用 crewAI ToolkitLangChain Tools 中的工具,增强任务性能和代理交互。

使用工具创建任务

import os
os.environ["OPENAI_API_KEY"] = "Your Key"
os.environ["SERPER_API_KEY"] = "Your Key" # serper.dev API key

from crewai import Agent, Task, Crew
from crewai_tools import SerperDevTool

research_agent = Agent(
role='研究员',
goal='查找并总结最新的人工智能新闻',
backstory="""你是一家大公司的研究员。
你负责分析数据并为业务提供见解。""",
verbose=True
)

search_tool = SerperDevTool()

task = Task(
description='查找并总结最新的人工智能新闻',
expected_output='列出前 5 条最重要的人工智能新闻的摘要',
agent=research_agent,
tools=[search_tool]
)

crew = Crew(
agents=[research_agent],
tasks=[task],
verbose=2
)

result = crew.kickoff()
print(result)

这演示了如何使用特定工具的任务可以覆盖代理的默认设置,实现定制任务执行。

引用其他任务

在 crewAI 中,一个任务的输出会自动传递到下一个任务,但你可以明确定义哪些任务的输出,包括多个任务应该被用作另一个任务的上下文。

当你有一个任务依赖于另一个任务的输出,而这两个任务不是立即连续执行时,这将非常有用。这是通过任务的 上下文 属性完成的:

# ...

research_ai_task = Task(
description='查找并总结最新的人工智能新闻',
expected_output='列出最重要的5条人工智能新闻的摘要',
async_execution=True,
agent=research_agent,
tools=[search_tool]
)

research_ops_task = Task(
description='查找并总结最新的人工智能运维新闻',
expected_output='列出最重要的5条人工智能运维新闻的摘要',
async_execution=True,
agent=research_agent,
tools=[search_tool]
)

write_blog_task = Task(
description="撰写一篇关于人工智能重要性及最新动态的完整博客文章",
expected_output='一篇包含4段的完整博客文章',
agent=writer_agent,
context=[research_ai_task, research_ops_task]
)

#...

异步执行

您可以定义一个任务以异步方式执行。这意味着工作人员不会等待它完成才继续进行下一个任务。这对于需要很长时间才能完成的任务或者对于下一个任务的执行并不至关重要的任务非常有用。

然后,您可以使用 context 属性来定义在将来的任务中它应该等待异步任务的输出完成。

#...

list_ideas = Task(
description="探索人工智能文章的5个有趣想法清单。",
expected_output="一份包含5个文章想法的项目清单。",
agent=researcher,
async_execution=True # 将以异步方式执行
)

list_important_history = Task(
description="研究人工智能的历史并给我列出5个最重要的事件。",
expected_output="5个重要事件的项目清单。",
agent=researcher,
async_execution=True # 将以异步方式执行
)

write_article = Task(
description="撰写一篇关于人工智能、其历史和有趣想法的文章。",
expected_output="一篇关于人工智能的4段文章。",
agent=writer,
context=[list_ideas, list_important_history] # 将等待这两个任务的输出完成
)

#...

回调机制

回调函数在任务完成后执行,允许根据任务的结果触发操作或通知。

# ...

def callback_function(output: TaskOutput):
# 任务完成后执行某些操作
# 例如:向经理发送电子邮件
print(f"""
任务完成!
任务:{output.description}
输出:{output.raw_output}
""")

research_task = Task(
description='查找并总结最新的人工智能新闻',
expected_output='最重要的5条人工智能新闻的项目清单摘要',
agent=research_agent,
tools=[search_tool],
callback=callback_function
)

#...

访问特定任务的输出

一旦工作人员完成运行,您可以通过使用任务对象的 output 属性来访问特定任务的输出:

# ...
task1 = Task(
description='查找并总结最新的人工智能新闻',
expected_output='最重要的5条人工智能新闻的项目清单摘要',
agent=research_agent,
tools=[search_tool]
)

#...

crew = Crew(
agents=[research_agent],
tasks=[task1, task2, task3],
verbose=2
)

result = crew.kickoff()

# 返回一个包含任务描述和结果的 TaskOutput 对象
print(f"""
任务完成!
任务:{task1.output.description}
输出:{task1.output.raw_output}
""")

工具覆盖机制

在任务中指定工具允许对代理能力进行动态调整,突显了 CrewAI 的灵活性。

错误处理和验证机制

在创建和执行任务时,存在某些验证机制,以确保任务属性的健壮性和可靠性。这些验证包括但不限于:

  • 确保每个任务只设置一个输出类型,以保持清晰的输出期望。
  • 防止手动分配 id 属性,以维护唯一标识符系统的完整性。

这些验证有助于在 CrewAI 框架内保持任务执行的一致性和可靠性。

结论

任务是 CrewAI 中代理行动的驱动力。通过正确定义任务及其结果,您为您的 AI 代理设定了舞台,使其能够有效地工作,无论是独立工作还是作为协作单位。为任务配备适当的工具,了解执行过程,并遵循健壮的验证实践对于最大化 CrewAI 的潜力至关重要,确保代理已经有效准备好执行其任务,并且任务能够按预期执行。