跳转至

任务

任务概述

什么是任务?

在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_pydanticoutput_json,则TaskOutput将分别包含pydanticjson_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的潜力至关重要,确保代理为他们的任务做好准备,并且任务按预期执行。