OpenAI宣布了ChatGPT插件 - 一种让ChatGPT在网络上执行操作的方式。这不仅意味着它可以访问互联网并浏览最新的内容和新闻,还可以为我们执行操作,例如购买杂货、预订航班等等!

至少在概念上,实现非常简单:

  • 插件提供程序使用 OpenAPI 标准为 API 编写规范。这是一个已经存在了一段时间的标准,也是像 Swagger 这样的工具用于 API 文档的动力。
  • 然后,此规范被编译成一个提示,向 ChatGPT 解释它如何使用 API 来增强其答案。考虑详细的提示,包括每个可用终结点的说明。
  • 最后,用户提出新问题。如果 ChatGPT 决定它应该从 API 中获取信息,它将在尝试响应之前发出请求并添加到上下文中

此过程已经记录在官方OpenAI文档中,尽管在撰写本文时其访问权限受到限制。

我没有等到我获得访问权限,而是决定基于上述内容实现自己的机制。所以,下面是我(有点成功)实现我自己的 ChatGPT 插件机制的尝试。

快速免责声明:除了已公开的 ChatGPT 插件当前实现之外,我没有其他信息。本练习是为了说明如何完成它的概念,并不打算暗示实际实现的样子。

选择 API 规范

第一步是了解如何指定 API。OpenAI 提供了一些示例 API 规范,因此我决定对自己的解决方案使用相同的输入,并为单个端点起草了一个简单的规范。

我使用了DummyJSON,这是一个为测试而设计的简单API,特别是“获取所有待办事项”端点。我编写了以下 YAML 文件作为规范:

openapi: 3.0.1info:
title: TODO Plugin
description: A plugin that allows the user to create and manage a TODO list using ChatGPT.
version:
'v1'servers:- url: https://dummyjson.com/todos paths:/todos: get:
operationId: getTodos
summary: Get the list of todos
parameters:
- in: query
name: limit
schema:
type: integer
description:
Number of todos to return - in: query
name: skip
schema:
type: integer
description:
Numberof todos to skip from the beginning of the list
responses:
"200":
description: OK
content:
application
/json: schema:
$ref:
'#/components/schemas/getTodosResponse'components:
schemas:
getTodosResponse:
type:
objectproperties:
todos:
type: array
items:
type:
objectproperties:
id:
type: int
todo:
type: string
completed:
type: bool
userId:
type: string
description: The list of todos.

一个具有两个参数的端点:“限制”和“跳过”。这将很好地作为一个例子。

提示工程

现在,我需要将上面的 YAML 文件转换为提示,向 ChatGPT 解释如何实际构建和执行此请求。幸运的是,ChatGPT 已经很擅长编写代码了!所以我所要做的就是让它以特定的格式输出一些东西,这样我就可以识别它,运行它的请求,并提供给它结果。

来来回回几次后,这是最终结果:

You are a virtual assistant that helps users withtheir questions by relying on
information from HTTP APIs. When the user asks a question, you should determine whether
you need to fetch information from the API to properly answer it. If so, you will
request the user to provide all the parameters you need, and then ask them to run the
request
for you. When you are ready to ask fora request, you should specify it using
the following syntax:
<http_request>{"url": "<request URL>","method": "<method>","body": {<json request body>},"headers": {<json request headers>}
}
</http_request> Replacein all the necessary values the user provides during the interaction, and donot
use placeholders. The user will then provide the response body, which you may use to
formulate your answer. You should not respond
withcode, but rather provide an answer
directly.
The following APIs are available to you:
--- <OpenAPI Specification goes here>

请注意,我要求 ChatGPT 使用特定的语法进行响应,并告诉它用户将给予响应。发生这种情况是因为 AI 模型本身并没有真正执行任何 API 调用 - 它必须将该操作委托给不同的系统。由于我们无法访问 ChatGPT 的内部组件,因此我们要求它将 HTTP 请求委托回给用户。这不会成为问题,只要我们对最终用户隐藏这些对话轮次,他们甚至可能不知道HTTP请求是什么。

这将我们带到下一节!

统筹

ChatGPT 是一个 AI 模型,通过 REST API 公开。向 OpenAI 模型发出请求只是端到端聊天机器人体验中的一个步骤。这意味着我们可以操纵哪些信息进入模型,以及向最终用户显示哪些信息。

为了使用 ChatGPT 实现虚拟助手,我使用了 Bot Framework Composer,这是一个基于 UI 的工具,允许我们构建对话体验并将其发布到许多不同的渠道。下面是高级别的解决方案体系结构:

thumbnail image 1 of blog post titled<br />
<br />
How ChatGPT Plugins (could) work<br />
<br />

我之所以使用 Bot Framework Composer,是因为它能够以最少的代码快速部署到多个最终用户通道。如果要复制此解决方案,可能还需要考虑使用 Power 虚拟代理,尤其是在生产环境中。

对话流程的构建方式如下:

  1. 用户提出一个问题 - 例如:“我的前 5 个待办事项是什么?
  2. ChatGPT 以预先格式化的消息进行响应:
    <http_request>{"url": "https://dummyjson.com/todos?limit=5","method": "GET","body": "","headers": {}
    }
    </http_request>
  3. Azure 机器人检测格式,并将请求提交到 DummyJSON API,而不会在最终用户中循环。
  4. Azure 机器人代表用户使用响应正文向 ChatGPT 发出新请求。
  5. ChatGPT 格式化响应:“这是您的前 5 个待办事项:......”
  6. Azure 机器人响应用户。

有一件事立即引起了我的注意 - ChatGPT 现在可以向互联网上的任何服务器发出请求。我们只向它“解释”如何使用一个端点,但没有什么能阻止它生成去其他地方的代码!出于这个原因,我应用了一个简单的域允许列表,以便请求只能转到 DummyJSON API,并且一次只能转到一个 - 太安全永远不会有什么坏处。

设计部分到此结束。现在,开始实施!

最终结果

我将不向读者提供(许多)迭代的细节,直到体验恰到好处。这是一个统计工具,在达到正确的提示之前,预计会进行一些试验和错误。但最后,这是我与机器人最终版本的对话:

thumbnail image 2 of blog post titled<br />
<br />
How ChatGPT Plugins (could) work<br />
<br />

您可以去查看 https://dummyjson.com/todos,您会发现这些实际上是列出的第一个待办事项!

我还想分享上一次测试中的以下对话,其中我的规范中的参数名称不正确。意识到我的错误,我解释了哪里出了问题,ChatGPT 给了我正确的答案。

thumbnail image 3 of blog post titled<br />
<br />
How ChatGPT Plugins (could) work<br />
<br />

结论

ChatGPT 插件很可能比上面的快速演示更多。这个练习的目的是展示如何完成这种集成 - 相信我,我和你一样好奇实际的实现是什么。赋予 ChatGPT 通过 HTTP 进行集成的能力开辟了一套全新的可能性,我迫不及待地想看看社区能想出什么。

同时,我们作为这项技术用户的责任也增加了:如果恶意提示让 Azure 机器人向未知服务器发出请求,会发生什么情况?现在有哪些新的攻击媒介可用?在我的机器人中,我应用了一个简单的域允许列表 - 随着新用例开始出现,这是否足够?我还设法在以后的提示中重写了 API 规范 - 是否存在与这种可能性相关的风险?有许多安全和负责任的AI问题处于危险之中 - OpenAI当然意识到这一点。

总的来说,我印象非常深刻。可能性确实是无穷无尽的,我肯定会在接下来的几周和几个月内密切关注此功能的发展。我希望很快能在Azure OpenAI中看到它!