查看原文
科技与AI

如何构建能够推理的人工智能Agent?

Zaik社区 ZAIK 2023-08-28

原文:reworkd.ai

翻译:Zaik社区

生成式预训练变压器Transformer(GPT)的发明是近十年来人工智能技术最重要的进步之一。为当今的大型语言模型 (LLM) 提供支持的 GPT 展示了非凡的推理、理解和规划能力。然而,它们的真正潜力尚未完全发挥

在 Reworkd,我们相信LLM的真正力量在于代理行为。通过设计一个利用LLM新兴能力的系统并提供支持环境相互作用的生态系统,我们可以充分发挥 GPT-4 等模型的潜力。以下是 AgentGPT 的工作原理。

LLM 有很多限制

LLM的主要产品是由以下技术支持的聊天机器人

如果您熟悉 OpenAI 的 API,则与模型聊天时可能使用的常用公式可能包括:

  • 获取用户的消息。

  • 添加聊天记录列表

  • 通过 API 发送聊天历史记录以检索完成情况


当对话范围较小时,此方法效果很好;然而,当您继续向聊天历史记录中添加新消息时,完成的大小和复杂性会不断增加,您很快就会遇到一堵墙:可怕的上下文限制。

上下文限制是可以输入到模型中以进行单个响应的最大标记数(一个标记通常代表一个单词)。它们是必要的,因为当我们添加额外的令牌时,计算成本往往会呈二次方增加。然而,它们往往是快速工程师的祸根。

一种解决方案是测量聊天历史记录中的token数量,然后将其发送到模型并删除旧消息以确保其符合token限制。虽然这种方法有效,但它最终会减少助理可用的知识量。

独立法LLM面临的另一个问题是需要人工指导。从根本上说,LLM是下一个词的预测器,通常,它们的内部结构本质上并不适合高阶思维过程,例如通过复杂任务进行推理。这种弱点并不意味着他们不能或不会推理。事实上,有几项研究表明它们可以。然而,这确实意味着他们面临某些障碍。例如,LLM本身可以创建一个逻辑步骤列表;然而,它没有观察和反思该清单的内置机制。

对于最终用户来说,预训练模型本质上是一个“黑匣子”,其中交付的最终产品几乎没有主动更新其知识库的能力,并且往往以不可预测的方式运行。结果,很容易产生幻觉。

因此,需要用户付出很大的努力来指导模型的输出,而促使LLM本身就成为了一项工作。这项额外的工作与我们对人工智能驱动的未来的愿景相去甚远。

通过提供一个平台来赋予LLM agent能力,AgentGPT 旨在利用即时工程技术、矢量数据库和 API 工具来克服独立LLM的局限性。以下是利用agent概念所做的一些有趣的工作:

什么是 agents?

该系统的工程由 3 部分组成。

  • 推理和计划。

    如果您只是简单地提出一个总体目标,例如“构建一个可扩展的电子商务平台”,并将其交给 ChatGPT,您可能会得到类似“作为人工智能语言模型......”的响应。然而,通过prompt engineering,我们可以得到一个模型,将目标分解为可消化的步骤,并用一种 称为思维链prompt的方法对其进行反思。

  • 记忆。

    在处理记忆时,我们将问题分为短期和长期。在管理短期记忆时,我们可以使用prompt技术(例如几次prompt)来引导LLM的反应。然而,成本和上下文限制使得在不限制模型可用于做出决策的信息广度的情况下生成完成结果变得很棘手。同样,这个问题也出现在长期记忆中,因为不可能提供适当的写作语料库来弥合 GPT -4 的截止日期 2021 年与今天之间的差距。通过使用向量数据库,我们尝试使用高维向量空间中的信息检索专用模型来克服这个问题。

  • 工具。

    使用LLM作为一般参与者的另一个挑战是它们仅限于文本输出。同样,我们可以使用及时的工程技术来解决这个问题。我们可以利用 Google Search、Hugging Face、Dall-E 等 API 工具,通过少样本和思维链方法从 LLM 生成可预测的函数调用。此外,我们可以使用仅返回的微调 LLM采用特殊格式的响应,例如 JSON。这是 OpenAI 最近发布 API 函数调用功能时所采用的方法。


这三个概念构成了多个成功的基于代理的 LLM 平台的支柱,例如 Microsoft Jarvis、AutoGPT、BabyAGI,当然还有 AgentGPT。记住这个简短的概述,让我们更深入地了解每个组件。

我们如何让agent明智地行动?

Prompt engineering已经高度普及,考虑到它能够提高LLM反应的可靠性,为生成式人工智能的潜在应用开辟了广阔的途径,这是很自然的。 AgentGPT 的思考和推理能力是新颖的提示方法的结果

Prompt Engineering 介绍

Prompt Engineering是一个很大程度上是经验性的领域,旨在通过巧妙地使用英语来找到指导 LLM 反应的方法。你可以把它想象成律师,Prompt措辞中的每一个细微差别都很重要。

这些是更高级Prompt 技术的主要概念和构建模块:

Zero-Shot 涉及将原始命令直接发送到 LLM,几乎不需要格式化

Few-Shot 以示例响应的形式提供完成上下文。

思维链通过对复杂任务的生成和推理来指导模型进行推理。

AgentGPT 如何使用Prompt Engineering

传统上,思维链Prompt利用小样本技术来提供思维和推理过程的示例。然而,当它成为一个主题时,随着任务复杂性的增加,它的成本也会变得更高,因为我们需要提供更多的上下文。

计划与解决(PS):由于是一种zero-shot方法,它为使用“触发”词的 LLM 引导推理提供了一个Prompt框架。这些关键字触发模型的推理响应。

我们可以通过修改提取重要变量的Prompt和生成具有内聚格式的最终 响应的步骤来扩展这个概念。此方法允许我们解析最终响应并将其显示给最终用户,并将子步骤提供给未来的计划和解决Prompt

虽然 PS Prompt有助于唤起推理反应,但它仍然忽略了推理中的一个基本概念,那就是对反思和行动的正确处理。反思对于任何智能体来说都是基础,因为它必须合理化行动、执行该行动并使用反馈来调整未来的行动。没有它,代理将是无状态且不变的。

AgentGPT 使用称为推理和行动 (ReAct) 的Prompt框架来扩展计划和解决概念的功能。ReAct 旨在为模型提供一个框架,使其能够通过外部知识库获取新知识并观察其所采取的行动。利用这些观察结果,LLM可以对下一组要完成的步骤做出明智的决策,同时执行查询知识库(例如 Google 搜索或维基百科 API)的操作。

Prompt Engineering在解决短期记忆挑战以及灌输 AgentGPT 工作时可以看到的推理行为方面非常有效。然而,即时工程并不能解决长期记忆的问题。这个问题就是矢量数据库的用武之地,我们接下来将讨论这些问题

我们如何为agent提供memory?

虽然我们已经看到Prompt Engineering在解决短期记忆和推理问题方面非常有效,但我们不能仅通过聪明的英语来解决长期记忆。由于我们不允许更新模型来学习数据,因此我们必须构建一个外部系统来存储和检索知识

一个聪明的解决方案可能会使用LLM来生成以前对话的摘要作为Prompt的上下文。然而,这存在三个重大问题。首先,我们淡化对话的相关信息;其次,它引入了另一个成本领域,即为这些摘要的 API 使用付费;第三,它是不可扩展的。

因此,Prompt似乎对长期记忆无效。由于长期记忆是一个信息存储和高效检索的问题,搜索的研究并不缺乏,因此我们必须将目光投向向量数据库。

揭秘矢量数据库

矢量数据库已经被炒作有一段时间了,而且这种炒作是非常值得的。它们是存储和检索向量的有效方法,允许我们使用一些有趣的新算法在几毫秒内查询数十亿甚至数万亿条数据记录

让我们从一些词汇开始:

  • LLM 上下文中的向量是 GPT-4 等模型编码的一段文本的表示。

  • 向量空间包含许多这样的向量。

  • 嵌入是文本的矢量化版本。


向量数据库如:

Facebook AI 相似性搜索 (FAISS) 为我们提供了宝贵的工具来控制这些向量并在向量空间中有效地定位它们

由于文本处于由模型类型指定的数字嵌入中(即 text-embedding-ada-002),因此文本存在于空间中的某个位置,并且它基于组成其向量的数字。这意味着相似的文本将被表示为具有相似数字的向量,因此它们可能会被紧密地分组。另一方面,不太相似的文本会离得更远。例如,关于烹饪的文本比关于物理的文本更接近食物。

有几种不同的算法用于查询向量空间,但与本讨论最相关的是余弦相似度搜索。余弦相似度测量两个非零向量之间角度的余弦。它是方向的度量,这意味着它用于确定两个文档(或向量表示的任何内容)的相似程度。余弦相似度的范围为 -1 到 1,其中 -1 表示向量完全相反(完全相反),0 表示向量正交(或不相关),1 表示向量相同。

FAISS 有助于管理这些向量空间,但它不是数据库。矢量库缺乏 CRUD 操作,这使得它们无法单独用于长期记忆,而这正是 Pinecone 和 Weaviate 等云服务介入的地方。

Pinecone 和 Weaviate 基本上完成了管理我们载体的所有艰苦工作。他们提供了一个 API,允许您上传嵌入、执行各种类型的搜索并存储这些向量以供以后使用。它们提供了我们需要的典型 CRUD 函数,以便将内存注入到易于访问的 Python 模块中的 LLM 中。

通过使用它们,我们可以对大量信息进行编码以供将来存储和检索。例如,当LLM需要额外的知识来完成任务时,我们可以提示它查询向量空间以查找相关信息。因此,我们可以创造长期记忆。

与环境交互的工具

虽然Prompt Engineering和矢量数据库解决了LLM的许多限制和挑战,但仍然存在agent交互的问题。我们如何扩展法学硕士与文本之外的环境交互的能力?

API 就是答案。通过利用 API,我们可以让我们的代理能够执行各种操作并访问外部资源。

这里有一些例子:

  • Google Search API:允许agent搜索网络并检索相关信息。

  • Hugging Face:提供对各种 NLP 模型和转换器的访问,以执行摘要、翻译、情感分析等任务。

  • Dall-E:使agent能够根据文本描述生成图像。

  • OpenAI 的 GPT API:允许代 理利用 GPT-4 模型进行文本完成和生成。


使用 API 工具与Prompt Engineering技术相结合,我们可以创建生成可预测函数调用的提示,并利用 API 请求的输出来增强代理的功能。这使得agent能够以一种超越基于文本的交互的有意义的方式与环境交互。

工程稳健的函数调用

同样,我们可以通过将我们想要为模型提供的工具表示为函数来通过Prompt Engineering来实现工具。然后我们可以告诉模型该函数存在于Prompt中,因此我们的程序可以根据模型的响应以编程方式调用它。然而,首先,我们应该检查实现工具交互的主要挑战:一致性、上下文和格式。

例如,使用相同Prompt的聊天完成之间的响应往往会有所不同。因此,让LLM一致地发出函数调用是具有挑战性的。一个次要的解决方案可能包括调整模型的温度(控制随机性的参数),但最好的解决方案应该利用LLM的推理能力。因此,我们可以使用 ReAct 框架来帮助LLM了解何时发出函数调用。

在这样做的过程中,我们还会遇到另一个重大问题。LLM如何了解他们可以使用哪些工具?我们可以在Prompt中包含可用的工具,但这可能会显着增加我们需要发送到模型的token数量。虽然这对于在多个工具上运行的应用程序来说可能没问题,但随着我们向系统添加更多工具,它会增加成本。因此,我们将使用向量数据库来帮助法LLM查找其所需的相关工具。

最后,我们需要以可预测的格式生成函数调用。此格式应包括函数名称及其采用的参数的规定,并且必须包括允许我们以编程方式解析和执行这些参数的响应的分隔符。例如,您可以提示模型仅返回 JSON 格式的响应,然后使用内置 Python 库来解析字符串化的 JSON。

最近,使用这种方法也变得更加容易。6月下旬,OpenAI发布了gpt-4-0613和gpt-3.5-turbo-16k-0613(哇,这些名字越来越长了)。它们通过使用针对 JSON 进行微调的模型来原生支持函数调用,以返回易于使用的函数调用。你可以在这里读更多关于它的内容。 

https://platform.openai.com/docs/guides/gpt/function-calling

LLM Agent的未来是光明的!

大型语言模型是过去十年最重大的进步之一。它们能够像人类一样推理和说话,似乎能够做任何事情。尽管如此,围绕LLM的构建仍会出现一些工程挑战,例如上下文限制、推理和长期保留。

使用上述方法,AgentGPT 释放了 GPT-4 等强大模型的全部潜力。通过新颖的Prompt方法、高效的向量数据库、丰富的API工具,我们可以赋予任何模型超能力。这只是一个开始,我们希望您能加入我们的旅程。

结论

AgentGPT 代表了构建具有推理、记忆和执行功能的 AI agent的强大方法。通过利用Prompt Engineering、矢量数据库和 API 工具,我们可以克服独立LLM的局限性,并创建能够展示agent行为的agent。

凭借推理、计划和反思的能力,AgentGPT 代理可以处理复杂的任务并以有意义的方式与环境交互。通过向量数据库整合长期记忆并利用 API,我们为代理提供了访问大量知识和资源的机会。AgentGPT 是朝着释放LLM的全部潜力和创建可以在各个领域协助人类并与人类协作的智能agent迈出的一步。语言模型、Prompt Engineering、外部存储器和 API 交互的结合为人工智能代理的未来开辟了令人兴奋的可能性。






您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存