改变你对AI能力的认知

动机

有一句非洲谚语说得好:

单独行动,我们走得更快;一同前行,我们走得更远。 这句话同样适用于人工智能领域。正如现实中没有人能成为所有领域的专家一样,在AI世界里,也没有任何一个大型语言模型(LLM)能够独自精通所有的知识领域。因此,通过将多个专门化的AI代理联合起来,我们可以创造出更加高效且强大的系统。每个AI代理都可以专注于自己的专业领域,从而作为一个整体更好地完成复杂任务。 采用这样的策略,不仅可以提高系统的整体性能,还能确保结果的质量。接下来,我们将探讨以下内容:

  • 什么是AI Agent

  • 为何应考虑使用AI代理解决实际问题

  • 如何从零开始构建一个完整的AI Agent系统

系统的一般工作流程

在我们深入具体实现细节之前,先来了解下本文中构建的系统主要组成部分:

  • 定义任务:明确需要解决的问题以及期望达到的目标。

  • 设计架构:规划AI代理的结构和功能分配。

  • 选择技术栈:确定适合项目需求的技术和工具。

  • 开发与集成:编写代码并整合各个AI代理。

  • 测试与优化:确保系统稳定运行,并持续改进性能。 理解这些组件如何协同工作对于构建一个成功的AI Agent系统至关重要。

自主AI代理的工作流程

自主AI代理工作流程

  • 工作流包含四个代理,每个代理都具备一套专业技能。

  • 用户请求提交给系统后,由各个代理分工协作完成。

  • 代理1(视频分析器)利用外部工具(如YouTube频道搜索)在网络上进行深度搜索,收集与用户请求相关的信息。搜索结果传递给下一个代理继续处理。

  • 代理2(博客文章作者)基于前一个代理提供的信息撰写详尽的博客文章。

  • 类似地,代理3代理4分别创作吸引人的LinkedIn帖子和推文。

  • 最终,来自代理2代理3代理4的成果分别保存为markdown文件,供用户查阅。

为何选择AI代理而非单一提示的LLM?

如果回想起之前讨论过的使用LLM进行文档解析,你会发现单一任务的请求意味着LLM的主要目标是进行数据提取。 这种方法在处理更为复杂的多步骤任务时暴露出以下局限性:

1. 任务执行的灵活性

  • 单一提示LLM需要精心设计提示语句,当任务需求发生变化时,可能难以适应。

  • AI代理则能够将复杂任务分解成多个子任务,并灵活调整行为,无需频繁重构。

2. 任务连续性和上下文保持

  • 单一提示LLM可能无法保留先前交互中的重要上下文信息,因为它们通常在一个孤立的会话中运行。

  • AI代理能够在不同交互间保持上下文连贯性,每个代理都能参考前一个代理的结果来完成任务。

3. 专业化和相互作用

  • 单一提示LLM即使经过广泛微调,也可能缺乏专业的领域知识,这通常需要耗费大量时间和成本。

  • AI代理可以组成一系列专门化的模型,各自专注于特定任务,如研究、撰写博客、社交媒体管理等。

4. 互联网接入

  • 单一提示LLM依赖预定义的知识库,这些知识库可能不够及时,导致信息不准确或受限。

  • AI代理则能够接入互联网,获取最新信息,从而做出更加精准的决策。

构建内容创建工作流

接下来,我们将探讨如何通过构建代理工作流来实现一个系统,该系统能够对用户指定的主题进行广泛的研究,并据此撰写博客文章、LinkedIn内容和Twitter帖子。 如果你更倾向于观看视频讲解,请跳转至视频部分。 aaaaaaa

 守则的结构

代码结构如下:

project
   |
   |---Multi_Agents_For_Content_Creation.ipynb
   |
  data
   |
   |---- blog-post.md
   |---- linkedin-post.md
   |---- tweet.md

项目结构

项目的文件夹结构以项目作为根目录,其中包含了数据文件夹以及相关的笔记本文件。

  • 项目

  • 数据 (目前为空)

  • 笔记本 在完成整个工作流程之后,数据文件夹将会包含以下三个Markdown文件:

  • blog-post.md

  • linkedin-post.md

  • tweet.md 每个Markdown文件都将包含由相应代理执行任务产生的结果。

代理创建及其角色与任务

基于先前对各个代理角色的探讨,我们现在将深入了解如何实际创建这些代理,并明确它们的角色与任务。 在此之前,我们需要先设定一些先决条件。

先决条件

所有的代码将在Google Colab笔记本上执行,而我们的案例仅需要两个库:openaicrewai[工具]。这些库可以通过以下命令进行安装:

1
!pip install openai crewai[tools]

aaaaaaa

%%bash
pip -qqq install 'crewai[tools]'
pip -qqq install youtube-transcript-api
pip -qqq install yt_dlp

成功安装库后,下一步是导入以下必要的模块:

import os
from crewai import Agent
from google.colab import userdata
from crewai import Crew, Process
from crewai_tools import YoutubeChannelSearchTool
from crewai import Task

每个代理都利用OpenAIgpt-4 o模型,我们需要通过OPENAI API KEY设置对模型的访问,如下所示:

OPENAI_API_KEY = userdata.get('OPEN_AI_KEY')
model_ID = userdata.get('GPT_MODEL')
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
os.environ["OPENAI_MODEL_NAME"] = model_ID

环境变量及其值

首先,我们需要从Google Colab Secrets中获取OPEN_AI_KEYGPT_MODEL这两个环境变量。这可以通过调用内置的userdata.get函数来实现。随后,我们可以利用Python的os.environ来设置环境变量OPEN_AI_KEY与选定的模型gpt-4。 完成上述配置后,接下来可以顺利地使用所选模型创建代理。

代理人及其角色

使用Agent类创建代理时,需要指定几个关键属性:

  • 角色:定义代理的角色和职责,例如Agent 1的角色是主题研究员

  • 目标:明确代理的任务或目标。

  • 背景故事:提供有关代理背景的具体信息。

  • 内存:这是一个布尔值,若设为True,则表示代理能够记住并从过往的交互中学习。 对于Agent 1或称作Video Analyzer的代理,还需额外设置两个属性:

  • 工具:代理执行任务时可利用的一系列工具。

  • allow_delegation:布尔值,指示代理的结果是否可以委托给其他代理进一步处理。

创建代理

在创建代理之前,我们首先需要为Agent 1设定用于探索个人YouTube频道的工具。这可以通过创建YouTubeSearchTool实例并提供频道句柄@techwithzoum来完成。 接下来,我们可以开始创建各个代理。

youtube_tool = YoutubeChannelSearchTool(youtube_channel_handle='@techwithzoum')
  1. 代理1 -主题研究员
topic_researcher = Agent(
    role=
    goal=
    verbose=True,
    memory=True,
    backstory=
    tools=[youtube_tool],
    allow_delegation=True
)
  • 首先,我们将Agent的角色定义为主题研究员
  • 然后,我们要求代理使用提供的{topic}来查找提及该主题的相关视频。
  • 最后,我们的第一个代理被定义为使用YouTube搜索工具查找和分析有关AI,数据科学,机器学习和生成AI主题的相关内容的专家。

当前代理定义中最重要的事情是属性值的微小变化。一旦理解了,就不需要解释下一个代理的定义。

2.代理2 -博客作家

blog_writer = Agent(
    role=
    goal=
    verbose=True,
    memory=True,
    backstory=
    allow_delegation=False
)

3.代理3 - LinkedIn帖子创建者

# LinkedIn Post Agent
linkedin_post_agent = Agent(
    role=
    goal=
    verbose=True,
    memory=True,
    backstory=
    allow_delegation=False
)

4.代理4 - Twitter帖子创建者

twitter_agent = Agent(
    role=
    goal=
    verbose=True,
    memory=True,
    backstory=
    allow_delegation=False
)
research_task = Task(
    description="Identify and analyze videos on the topic {topic} from the specified YouTube channel.",
    expected_output="A complete word by word report on the most relevant video found on the topic {topic}.",
    agent=topic_researcher,
    tools=[youtube_tool]
)

2.代理2 -博客作家

blog_writing_task = Task(
    description=""" Write a comprehensive blog post based on the transcription provided by the Topic Researcher.
                    The article must include an introduction , step-by-step guides, and conclusion.
                    The overall content must be about 1200 words long.""",
    expected_output="A markdown-formatted of the blog",
    agent=blog_writer,
    output_file='./data/blog-post.md'
)

3.代理3 - LinkedIn帖子创建者

linkedin_post_task = Task(
    description="Create a LinkedIn post summarizing the key points from the transcription provided by the Topic Researcher, including relevant hashtags.",
    expected_output="A markdown-formatted of the LinkedIn post",
    agent=linkedin_post_agent,
    output_file='./data/linkedin-post.md'
)

4.代理4 - Twitter帖子创建者

twitter_task = Task(
    description="Create a tweet from the transcription provided by the Topic Researcher, including relevant hastags.",
    expected_output="A markdown-formatted of the Twitter post",
    agent=twitter_agent,
    output_file='./data/tweets.md'
)

在本示例中, 我们将组织并指导各个代理协同工作以完成指定的任务。以下是各代理的功能概述:

  • 原始文本数据代理:负责处理最后三个代理所需的原始文本数据。

  • 博客文章代理 (blog-post.md):专门处理名为blog-post.md的Markdown文件。

  • 关联文章代理 (linked-post.md):针对另一个Markdown文件linked-post.md进行操作。

  • 推文代理 (tweets.md):管理与tweets.md同名的文件。

代理任务执行流程

  1. 原始文本数据代理首先准备并提供必要的文本数据给其他代理。

  2. 博客文章代理关联文章代理接着基于提供的文本数据对各自的Markdown文件进行处理。

  3. 推文代理最后利用之前代理的工作成果来更新tweets.md文件。 通过这种方式, 我们的代理团队能够高效有序地协作完成任务。

my_crew = Crew(
    agents=[topic_researcher, linkedin_post_agent, twitter_agent, blog_writer],
    tasks=[research_task, linkedin_post_task, twitter_task, blog_writing_task],
    verbose=True,
    process=Process.sequential,
    memory=True,
    cache=True,
    max_rpm=100,
    share_crew=True
)

在我们的系统中,有几个关键的概念需要理解:

  • 代理 (agents): 这是一个列表,包含了所有的代理。

  • 任务 (tasks): 对于每个座席而言,这是一个需要执行的任务列表。

  • 详细模式 (verbose): 设置为True,这样我们可以获取到完整的执行跟踪信息。

  • 最大请求每分钟 (max_rpm): 这个值定义了我们的工作组每分钟可以处理的最大请求数量,以此来避免遇到速率限制的问题。

  • 资源共享 (share_crew): 当设置为True时,意味着一个代理完成任务后的结果会被其他代理所共享。 完成这些配置之后,接下来通过调用kickoff函数来启动代理。此函数接收一个输入字典作为参数。在这个特定的例子中,我们的目标是搜索有关GPT3.5涡轮微调以及与其相关的图形用户界面的信息。aaaaaaa

topic_of_interest = 'GPT3.5 Turbo Fine-tuning and Graphical Interface'
result = my_crew.kickoff(inputs={'topic': topic_of_interest})

成功执行上述代码会生成我们上面指定的所有三个markdown文件。

下面是显示每个文件内容的结果。作为录制视频的人,这完全符合教程中所涵盖的内容。

博客代理的表现与评估

博客代理虽然未能提供详尽的分步指南以确保用户在执行代码时完全无误,但它成功地传达了教程的核心概念。 对于LinkedInTwitter的帖子,其成果非常出色! 若想深入了解,可以查阅GitHub仓库中ai_agents_outputs文件夹下的所有文件。

评估的重要性

我对这些代理的评估基于个人对内容的熟悉程度。然而,在实际应用前,需要一套更为客观且可扩展的评估方法。 以下是一些有效的评估策略:

  • 基准测试:使用标准数据集(例如GLUEFLASK)来衡量每个代理在不同任务上的表现,以便与其他最先进的模型进行比较。

  • 事实准确性测量:评估代理在多个领域内提供准确信息的能力。

  • 上下文感知相关性评分:量化代理响应与给定提示的相关程度。 可以利用多种框架来实施这些评估,其中包括:

  • DeepEval:一个开源工具,用于评估LLMs在不同指标上的表现。

  • MMLU(大规模多任务语言理解):一个框架,用于测试模型在零样本和少量样本设置下对广泛主题的理解能力。

  • OpenAI evals:另一个评估LLMs或基于LLMs构建的系统的框架。

结论

本文概述了如何利用AI代理高效地完成复杂任务,而非仅仅依赖单一的大规模语言模型。 希望本教程能帮助你掌握新技能。完整代码可在我的GitHub页面上找到。请订阅我的YouTube频道,以支持我的内容创作。 此外,如果你喜欢我的文章并希望支持我的写作,可以考虑成为Medium会员。只需每月支付5美元,你就能畅读Medium上所有的文章。 你可以通过Buy Me A Coffee为我买一杯咖啡,以示鼓励! 欢迎在Twitter上关注我,或者在LinkedIn上与我联系。一起探讨人工智能总是令人愉快的!