今天,我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息:crewAI。 我将在这里或那里跳过一些内容,使本教程成为一个精炼的教程,概述帮助您入门的关键概念和要点
今天,我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息:crewAI。 我将在这里或那里跳过一些内容,使本教程成为一个精炼的教程,概述帮助您入门的关键概念和要点。
什么是crewAI?
crewAI 是由 João Moura 创建的框架。 它旨在建立一个人工智能代理团队,共同完成任务。 它建立在LangChain之上,并提供直观易用的API。
为什么我需要AI代理?
假设您是一名博主,花费大量时间研究和撰写内容。 您能否自动化该过程并节省无数时间?
或者,您可能是 SEO 专家,并且浪费时间生成和解释报告。 有没有办法自动执行此操作,以便您可以专注于 SEO 的战略方面?
这两个问题的答案都是:是的,有。
在婴儿期,代理由于其效率和速度而有潜力取代人类在现实世界中完成的许多流程。
核心crewAI组件
我们将讨论crewAI 最重要的组成部分。 以下是我们将要介绍的内容的细分:
- Agents
- Tasks
- Tools
- Crews (and Processes)
现在,如果我将以上几点放在一个句子中来解释它们是如何联系在一起的,那么这句话将是这样的:
Crews, made up of Agents perform Tasks using Tools by following Processes. *
无法将内存组件放入该句子中 - 如果可以,请在评论中分享!
认识 crewAI
假设您是一位博主(像我一样),希望优化您的促销后流程。 为了简单起见,我们假设这是一个 3 步过程,如下所示:
- 获取博客上的最新帖子。
- 根据该帖子写一条推文。
- 根据帖子撰写新闻通讯电子邮件。
现在我将向您展示crewAI 如何帮助我在几秒钟内(而不是通常需要几分钟或几小时)实现上述目标。
crewAI 中的代理
代理一起工作,每个代理使用一种或多种工具为团队做出贡献,以解决共同的目标。
如果我们回到我们的示例,我们将需要创建两个代理。 第一个将从我的博客中提取最新帖子,然后第二个将使用该内容将其转换为 Twitter(或 X)帖子和时事通讯电子邮件。
好吧,太酷了 - 让我们看看第一个代理在 Python 中是什么样子的:
from crewai import Agent
...
extractor = Agent(
role='Content Retriever',
goal='Given a URL you will retrieve the content.',
backstory='''As an expert at retrieving complete and accurate
information, you are responsible for presenting the content of webpages
that will be used to create engaging content for twitter and a newsletter.
''',
verbose=True
)
第二个:
writer = Agent(
role='Content Writer',
goal='You are responsible to transforming long text into engaging content ready for promotion on different channels.',
backstory="""
You are an excellent communications specialist, known for your
exceptional skill of transforming complex subject into easy to
understand stories that attract people.
""",
verbose=True
)
- role 属性指定代理的功能。
- goal 属性指定代理必须实现的目标。
- backstory 属性为代理的身份和行为添加了上下文。
代理属性
要创建代理,您通常需要使用所需的属性初始化 Agent 类的实例。 这是一个包含所有属性的概念示例:
# Example: Creating an agent with all attributes
from crewai import Agent
agent = Agent(
role='Data Analyst',
goal='Extract actionable insights',
backstory="""You're a data analyst at a large company.
You're responsible for analyzing data and providing insights
to the business.
You're currently working on a project to analyze the
performance of our marketing campaigns.""",
tools=[my_tool1, my_tool2], # Optional, defaults to an empty list
llm=my_llm, # Optional
function_calling_llm=my_llm, # Optional
max_iter=15, # Optional
max_rpm=None, # Optional
verbose=True, # Optional
allow_delegation=True, # Optional
step_callback=my_intermediate_step_callback, # Optional
cache=True # Optional
)
这就是创建代理所需了解的全部内容。 现在让我们分配任务。
crewAI 中的任务
任务是代理所做的事情。 任务至少由描述、预期输出以及对将执行该任务的代理的引用组成。
在我们的例子中,我们需要执行以下任务:
任务 1:从博客中获取内容
任务 2:根据内容撰写推文
任务3:根据内容撰写新闻通讯
任务 1 和 writer 代理将负责处理,并且由于代理可以执行多个任务,因此我们将把任务 2 和 3 分配给我们的 extractor。
我们将从任务 1 开始:fetch
from crewai import Task
...
fetch = Task(
description=f'''
Given a URL, retrieve the content of the webpage.
It is important that you do not miss any information.
Make sure that:
- The content does not include html, css, or javascript.
- The content is complete and accurate.
- You do not include headers, footers, or sidebars.
''',
agent=extractor,
expected_output='''
Title: [The title of the article]
Author: [The author of the article]
Date: [The date the article was published]
Content: [The content of the article]
'''
)
任务 2 如下所示:
twitterize = Task(
description='''
Given a long text, transform it into engaging content ready for promotion on Twitter.
Make sure that:
- The content is engaging and informative.
- The content is less than 280 characters.
- The content includes relevant hashtags - Limit to one.
''',
agent=writer,
expected_output='''
Title: [Engaging catchy title for the tweet]
Content: [Engaging content for the tweet]
'''
)
最后,任务3与twitterize比较相似。 您可以自己创建它,或者您可以在本文底部免费获取源代码。
嗯不错! 现在您知道什么是任务以及它们如何工作。下一个:工具。
有关可用任务参数和选项的完整列表
任务属性
属性 | 描述 |
---|---|
Description | 清晰、简洁地说明任务的内容。 |
Agent | 负责任务的代理,直接分配或由机组人员的进程分配。 |
Expected Output | 任务完成情况的详细描述。 |
Tools(可选) | 代理可以用来执行任务的功能或能力。 |
Async Execution(可选) | 如果设置,任务将异步执行,无需等待完成即可继续进行。 |
Context (可选) | 指定其输出用作该任务上下文的任务。 |
Config(可选) | 执行任务的代理的其他配置详细信息,允许进一步定制。 |
Output JSON (可选) | 输出 JSON 对象,需要 OpenAI 客户端。 只能设置一种输出格式。 |
Output Pydantic (可选) | 输出 Pydantic 模型对象,需要 OpenAI 客户端。 只能设置一种输出格式。 |
Output File (可选) | 将任务输出保存到文件中。 如果与输出 JSON 或输出 Pydantic 一起使用,指定如何保存输出。 |
Callback(可选) | 一个 Python 可调用函数,在完成后使用任务的输出执行。 |
Human Input (可选) | 指示任务最后是否需要人工反馈,这对于需要人工监督的任务很有用。 |
使用工具创建任务
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='Researcher',
goal='Find and summarize the latest AI news',
backstory="""You're a researcher at a large company.
You're responsible for analyzing data and providing insights
to the business.""",
verbose=True
)
search_tool = SerperDevTool()
task = Task(
description='Find and summarize the latest AI news',
expected_output='A bullet list summary of the top 5 most important AI news',
agent=research_agent,
tools=[search_tool]
)
crew = Crew(
agents=[research_agent],
tasks=[task],
verbose=2
)
result = crew.kickoff()
print(result)
crewAI工具
正如您所看到的,我们的提取器代理的任务是从给定的 URL 中提取信息。 但如何呢?
提示:通过使用工具。
在crewAI中,您可以通过三种方式使用工具:
- 自定义工具:您自己编写的工具,本质上是一个 Python 函数。
- 内置工具:crewAI 附带了许多内置工具。
- LangChain工具:由于crewAI是建立在LangChain之上的,因此您也将获得LangChain的所有好东西。
对于我们的示例,有很多现有工具可以帮助我们从博客中提取信息。 此类工具之一是内置于crewAI 中的ScrapeWebsiteTool。 所以在这种情况下,我们不需要自己构建。
要使用它,我们只需将它传递到提取器使用的工具列表中,如下所示:
from crewai_tools import ScrapeWebsiteTool
site_url = 'https://www.gettingstarted.ai/crewai-beginners-tutorial
scrape_tool = ScrapeWebsiteTool(url=site_url)
extractor = Agent(
...
tools=[scrape_tool] # <----
...
)
确保使用 pip 安装可选工具包:
pip install crewai[tools]
太酷了 - 我们快完成了,这意味着您快成为超级巨星了!
crewAI crews
现在我们已经定义了任务、工具和代理。 我们必须将它们全部分组,以便它们一起工作。 这就是我们定义工作人员的地方,但在此之前 - 让我解释一下特工如何一起工作。
crew 流程
现在您知道船员是由特工组成的。 但这些代理必须知道如何相互交谈,比如由哪一个发起对话。 在crewAI 中,有两个受支持的流程,第三个流程即将推出。 目前的流程是:
- 顺序:一项接着一项任务,有秩序地进行。
- 分层:经理将协调对话流程。
由于我们的任务可以按顺序完成,因此我们将采用顺序流程。
我们开始做吧:
from crewai import Crew
...
crew = Crew(
agents=[extractor, writer],
tasks=[fetch, twitterize, newsletterize],
Process=Process.sequential
)
这就是全部,非常简单,不是吗?
最后,我们调用 kickoff() 方法来设置一切:
result = crew.kickoff()
print("#### USAGE ####")
print (crew.usage_metrics) # <-- Optional
print("#### RESULT ####")
print(result)
快速仅供参考:usage_metrics 函数返回一个很好的执行摘要,如下所示: Crew use {'total_tokens': 65002, 'prompt_tokens': 55305, 'completion_tokens': 9697, 'successful_requests': 67}
结论和想法
老实说,crewAI 的美妙之处无疑在于其简单的结构。 您可以添加另一个代理,负责在 Twitter 上发布消息并向您的订阅者发送电子邮件。
您可以通过利用工具来完成此操作,可以使用现有工具,也可以创建自己的与第三方 API 的集成。
现在,如果您正在使用 OpenAI 或其他付费 LLM 服务,我建议您密切关注计费仪表板,因为代理往往会消耗大量代币,例如,本教程中的工作人员运行一次的成本约为 0.90 美元。
Agent 会取代人类团队吗? 是的,也不是?
是的,如果您或您的公司能够以更少的成本更快地取得成果,您会不会这么做吗?