任务
任务概述¶
什么是任务?
在crewAI框架中,任务是代理完成的具体任务。它们提供了执行所需的所有必要细节,例如描述、负责的代理、所需的工具等,从而支持广泛的操作复杂性。
crewAI中的任务可以是协作性的,需要多个代理共同工作。这是通过任务属性管理并由Crew的流程协调的,增强了团队合作和效率。
Task任务属性¶
| 属性 | 参数 | 类型 | 描述 |
|---|---|---|---|
| 描述 | description |
str |
对任务内容的清晰、简洁陈述。 |
| 代理 | agent |
Optional[BaseAgent] |
负责任务的代理,直接分配或由Crew的流程指定。 |
| 预期输出 | expected_output |
str |
对任务完成情况的详细描述。 |
| 工具 (可选) | tools |
Optional[List[Any]] |
代理可以用来执行任务的功能或能力。默认为空列表。 |
| 异步执行 (可选) | async_execution |
Optional[bool] |
如果设置,任务将异步执行,允许在不等待完成的情况下继续进行。默认为False。 |
| 上下文 (可选) | context |
Optional[List["Task"]] |
指定其输出用作此任务上下文的任务。 |
| 配置 (可选) | config |
Optional[Dict[str, Any]] |
为执行任务的代理提供的额外配置细节,允许进一步自定义。默认为None。 |
| 输出JSON (可选) | output_json |
Optional[Type[BaseModel]] |
输出一个JSON对象,需要OpenAI客户端。只能设置一种输出格式。 |
| 输出Pydantic (可选) | output_pydantic |
Optional[Type[BaseModel]] |
输出一个Pydantic模型对象,需要OpenAI客户端。只能设置一种输出格式。 |
| 输出文件 (可选) | output_file |
Optional[str] |
将任务输出保存到文件。如果与输出JSON或输出Pydantic一起使用,指定如何保存输出。 |
| 输出 (可选) | output |
Optional[TaskOutput] |
TaskOutput的实例,包含原始、JSON和Pydantic输出以及附加细节。 |
| 回调 (可选) | callback |
Optional[Any] |
任务完成后执行的CallableWrapper。 |
| 人工输入 (可选) | human_input |
Optional[bool] |
指示任务是否应在最后涉及人工审核,适用于需要人工监督的任务。默认为False。 |
| 转换器类 (可选) | converter_cls |
Optional[Type[Converter]] |
用于导出结构化输出的转换器类。默认为None。 |
创建任务¶
创建任务涉及定义其范围、负责的代理以及任何额外的属性以增加灵活性:
from crewai import Task
task = Task(
description='查找并总结最新的、最相关的AI新闻',
agent=sales_agent,
expected_output='一个包含最重要的AI新闻的前5条的要点总结列表',
)
任务分配
直接指定一个agent进行分配,或者让hierarchical CrewAI的流程根据角色、可用性等决定。
任务输出¶
理解任务输出
crewAI框架中的任务输出封装在TaskOutput类中。这个类提供了一种结构化的方式来访问任务的结果,包括各种格式,如原始输出、JSON和Pydantic模型。
默认情况下,TaskOutput将只包含raw输出。如果原始Task对象配置了output_pydantic或output_json,则TaskOutput将分别包含pydantic或json_dict输出。
任务输出属性(output属性)¶
| 属性 | 参数 | 类型 | 描述 |
|---|---|---|---|
| 描述 | description |
str |
任务的描述。 |
| 摘要 | summary |
Optional[str] |
任务的摘要,自动从描述的前10个单词生成。 |
| 原始 | raw |
str |
任务的原始输出。这是输出的默认格式。 |
| Pydantic | pydantic |
Optional[BaseModel] |
表示任务结构化输出的Pydantic模型对象。 |
| JSON字典 | json_dict |
Optional[Dict[str, Any]] |
表示任务JSON输出的字典。 |
| 代理 | agent |
str |
执行任务的代理。 |
| 输出格式 | output_format |
OutputFormat |
任务输出的格式,选项包括RAW、JSON和Pydantic。默认是RAW。 |
任务方法和属性¶
| 方法/属性 | 描述 |
|---|---|
| json | 如果输出格式是JSON,则返回任务输出的JSON字符串表示。 |
| to_dict | 将JSON和Pydantic输出转换为字典。 |
| str | 返回任务输出的字符串表示,优先考虑Pydantic,然后是JSON,最后是原始。 |
访问任务输出¶
一旦任务被执行,其输出可以通过Task对象的output属性访问。TaskOutput类提供了各种与输出交互和展示的方式。
示例¶
# 示例任务
task = Task(
description='查找并总结最新的AI新闻',
expected_output='一个包含最重要的AI新闻的前5条的要点总结列表',
agent=research_agent,
tools=[search_tool]
)
# 执行crew
crew = Crew(
agents=[research_agent],
tasks=[task],
verbose=True
)
result = crew.kickoff()
# 访问任务输出
task_output = task.output
print(f"任务描述: {task_output.description}")
print(f"任务摘要: {task_output.summary}")
print(f"原始输出: {task_output.raw}")
if task_output.json_dict:
print(f"JSON输出: {json.dumps(task_output.json_dict, indent=2)}")
if task_output.pydantic:
print(f"Pydantic输出: {task_output.pydantic}")
工具与任务的集成¶
利用crewAI工具包和LangChain工具来增强任务性能和代理交互。
使用工具创建任务¶
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='查找并总结最新的AI新闻',
backstory="""你是一家大公司的研究员。
你负责分析数据并为业务提供洞察。""",
verbose=True
)
# 执行语义搜索,从互联网上的文本内容中查找指定查询的相关内容
search_tool = SerperDevTool()
task = Task(
description='查找并总结最新的AI新闻',
expected_output='一个包含最重要的AI新闻的前5条的要点总结列表',
agent=research_agent,
tools=[search_tool]
)
crew = Crew(
agents=[research_agent],
tasks=[task],
verbose=True
)
result = crew.kickoff()
print(result)
这演示了如何通过特定的工具来覆盖代理的默认设置,以实现定制的任务执行。
引用其他任务¶
在crewAI中,一个任务的输出会自动传递到下一个任务,但你可以在另一个任务中明确指定哪些任务的输出,包括多个输出,应该用作上下文。
当你有一个任务依赖于另一个任务(不是立即执行的任务)的输出时,这非常有用。这是通过任务的context属性完成的:
# ...
research_ai_task = Task(
description='查找并总结最新的AI新闻',
expected_output='一个包含最重要的AI新闻的前5条的要点总结列表',
async_execution=True,
agent=research_agent,
tools=[search_tool]
)
research_ops_task = Task(
description='查找并总结最新的AI Ops新闻',
expected_output='一个包含最重要的AI Ops新闻的前5条的要点总结列表',
async_execution=True,
agent=research_agent,
tools=[search_tool]
)
write_blog_task = Task(
description="撰写一篇关于AI重要性及其最新新闻的完整博客文章",
expected_output='一篇关于AI的4段长文章',
agent=writer_agent,
context=[research_ai_task, research_ops_task]
)
#...
异步执行¶
你可以定义一个任务以异步方式执行。这意味着crew不会等待它完成以继续下一个任务。这对于需要很长时间才能完成的任务,或者对于不是下一个任务执行的关键任务非常有用。
然后,你可以使用context属性在未来的任务中定义它应该等待异步任务的输出完成。
#...
list_ideas = Task(
description="列出5个关于AI文章的有趣想法",
expected_output="关于文章的5个要点列表",
agent=researcher,
async_execution=True # 将异步执行
)
list_important_history = Task(
description="研究AI的历史,并给出5个最重要的事件。",
expected_output="5个重要事件的要点列表",
agent=researcher,
async_execution=True # 将异步执行
)
write_article = Task(
description="撰写一篇关于AI、其历史和有趣想法的文章。",
expected_output="一篇关于AI的4段文章",
agent=writer,
context=[list_ideas, list_important_history] # 将等待两个任务的输出完成
)
#...
回调机制¶
回调函数在任务完成后执行,允许根据任务的结果触发操作或通知。
# ...
def callback_function(output: TaskOutput):
# 在任务完成后执行一些操作
# 示例:向经理发送电子邮件
print(f"""
任务完成!
任务: {output.description}
输出: {output.raw}
""")
research_task = Task(
description='查找并总结最新的AI新闻',
expected_output='一个包含最重要的AI新闻的前5条的要点总结列表',
agent=research_agent,
tools=[search_tool],
callback=callback_function
)
#...
访问特定任务输出¶
一旦crew运行完成,你可以通过任务对象的output属性访问特定任务的输出:
# ...
task1 = Task(
description='查找并总结最新的AI新闻',
expected_output='一个包含最重要的AI新闻的前5条的要点总结列表',
agent=research_agent,
tools=[search_tool]
)
#...
crew = Crew(
agents=[research_agent],
tasks=[task1, task2, task3],
verbose=True
)
result = crew.kickoff()
# 返回一个TaskOutput对象,其中包含任务的描述和结果
print(f"""
任务完成!
任务: {task1.output.description}
输出: {task1.output.raw}
""")
工具覆盖机制¶
在任务中指定工具允许动态调整代理的能力,强调了CrewAI的灵活性。
错误处理和验证机制¶
在创建和执行任务时,某些验证机制被放置到位,以确保任务属性的健壮性和可靠性。这些包括但不限于:
- 确保每个任务只设置一种输出类型,以保持清晰的输出预期。
- 防止手动分配
id属性,以维护唯一标识符系统的完整性。
这些验证有助于保持crewAI框架中任务执行的一致性和可靠性。
创建目录以保存文件¶
现在可以指定任务在将输出保存到文件时是否应该创建目录。这对于组织输出并确保文件路径结构正确非常有用。
# ...
save_output_task = Task(
description='将总结的AI新闻保存到文件',
expected_output='文件保存成功',
agent=research_agent,
tools=[file_save_tool],
output_file='outputs/ai_news_summary.txt',
create_directory=True
)
#...
结论¶
任务是crewAI中代理行动的驱动力。通过正确定义任务及其结果,你为AI代理有效工作设置了舞台,无论是独立工作还是作为协作单元。为任务配备适当的工具、理解执行过程和遵循稳健的验证实践对于最大化CrewAI的潜力至关重要,确保代理为他们的任务做好准备,并且任务按预期执行。