在最近几个月里,ChatGPT革新了我们与技术沟通、学习和互动的方式。我们的社交平台充斥着提示、对这些提示的回应、整篇文章以及无数其他使用大语言模型生成内容的例子,这些内容与人类撰写的内容难以辨认。
尽管这些模型有许多优点,但它们也存在缺陷,这可以通过幻觉现象来证明 - 即在响应用户输入时生成错误或无意义的信息。这个问题可能会损害AI生成内容的可靠性和可信度,这在研究人员和用户中都引起了越来越多的关注。这些担忧引发了另一波全新库的涌现,例如Langchain,试图通过结合类似于向量数据库的工具,将所需的上下文引入提示,从而克服这些问题。到目前为止,这也是将新的、快速变化的知识整合到神经模型中的最佳方法。如此之好,以至于OpenAI决定在模型级别引入一种扩展模型能力的外部插件方式。这些插件旨在增强模型的性能,作为与核心系统无缝接口的模块化扩展。通过向ChatGPT添加知识库插件,我们可以有效地为AI提供一个经过策划的、可信的信息源,确保生成的内容更加准确和相关。Qdrant可能作为一个向量数据库,存储所有事实,并根据请求提供给模型。
如果您想询问ChatGPT关于您的数据源的问题,例如文件、笔记或电子邮件,首先访问官方的 ChatGPT检索插件库 是最简单的方式。Qdrant已经集成,因此您可以立即使用它。在接下来的部分中,我们将指导您如何使用Qdrant设置知识库,并展示这强大的组合如何显著提高ChatGPT的性能和输出质量。
使用Qdrant实现知识库
官方的 ChatGPT 检索插件使用向量数据库来构建您的知识库。 您的文档经过 OpenAI 的 text-embedding-ada-002 模型进行切分和向量化 以存储在 Qdrant 中。这使得语义搜索功能成为可能。因此,每当 ChatGPT 认为检查知识库可能相关时,它会形成一个查询并将其发送 给插件以将结果纳入其响应中。您现在可以修改知识库,并且 ChatGPT 始终会知道最新的事实。不需要模型微调。 让我们为您的文档实现这一点。在我们的案例中,这将是 Qdrant 的 文档,因此您可以直接在 ChatGPT 中询问关于 Qdrant 的技术问题。
一切从克隆插件的库开始。
git clone git@github.com:openai/chatgpt-retrieval-plugin.git
请在克隆后使用您喜欢的IDE打开项目。
前提条件
在我们开始之前,您需要确保三件事情:
- 创建一个OpenAI API 密钥,以便您可以以编程方式使用他们的嵌入模型。如果您已经有一个账户,您可以在 https://platform.openai.com/account/api-keys 生成一个。否则,可能需要注册一个账户。
- 运行一个 Qdrant 实例。该实例必须可以从外部访问,因此您 要么需要在本地启动它,要么使用 Qdrant Cloud 服务。提供一个免费的 1GB 集群,这在许多情况下可能已经足够。我们将 使用云。
- 由于 ChatGPT 将通过网络与您的服务进行交互,您必须部署它,使其可以从 Internet 进行连接。不幸的是,localhost 不是一个选项,但任何提供商,如 Heroku 或 fly.io,都可以完美工作。我们将使用 fly.io,请您注册一个账户。您可能还需要安装 flyctl 工具以进行部署。该过程在 fly.io 的主页上有描述。
配置
检索插件是一个基于FastAPI的应用程序,其默认功能在大多数情况下可能已经足够。但是,需要一些配置,以便ChatGPT知道如何以及何时使用它。然而,我们可以开始设置Fly.io,因为我们需要了解该服务的主机名以便完全配置它。
首先,让我们登录到 Fly CLI:
flyctl auth login
这将打开浏览器,您可以简单地提供凭据,所有后续命令将以您的账户执行。如果您从未使用过 fly.io,您可能需要在运行任何实例之前提供信用卡信息,但有一个您不会被收费的 Hobby Plan。
让我们尝试启动实例,但不要部署它。我们将获得分配的主机名,并获得填写配置所需的所有详细信息。检索插件使用TCP端口8080,因此我们需要配置fly.io,以便它将所有流量重定向到该端口。
flyctl launch --no-deploy --internal-port 8080
我们将被询问应用程序的名称以及它应该部署到的区域。请根据您的需要选择最合适的选项。之后,我们应该看到新创建的应用程序的主机名:
...
Hostname: your-application-name.fly.dev
...
让我们记下来。我们将需要它来配置服务。但我们将从设置所有应用程序的秘密开始:
flyctl secrets set DATASTORE=qdrant \
OPENAI_API_KEY=<your-openai-api-key> \
QDRANT_URL=https://<your-qdrant-instance>.aws.cloud.qdrant.io \
QDRANT_API_KEY=<your-qdrant-api-key> \
BEARER_TOKEN=eyJhbGciOiJIUzI1NiJ9.e30.ZRrHA1JJJW8opsbCGfG_HACGpVUMN_a9IV7pAx_Zmeo
秘密将被暂存用于第一次部署。这里有一个由 https://jwt.io/ 生成的最小 Bearer 令牌的示例。请调整令牌并且不要公开暴露,但您可以在演示中保持相同的值。
现在,让我们深入研究应用程序配置文件。您可以选择提供您的图标并将其保留为 .well-known/logo.png 文件,但还有两个我们将要修改的附加文件。
文件 .well-known/openapi.yaml 描述了以 OpenAPI 格式公开的 API。
第 3 到 5 行可能包含应用程序的标题和描述,但重要部分是设置应用程序将运行的服务器 URL。最终,文件的顶部应该如下所示:
openapi: 3.0.0
info:
title: Qdrant Plugin API
version: 1.0.0
description: Plugin for searching through the Qdrant doc…
servers:
- url: https://your-application-name.fly.dev
...
在同一目录中还有另一个文件,这个文件是配置的关键部分。它包含我们正在实现的插件的描述,ChatGPT 使用这个描述来判断是否应该与我们的知识库进行通信。该文件名为 .well-known/ai-plugin.json,在最终部署应用之前,让我们编辑它。我们需要填写各种属性:
| 属性 | 含义 | 示例 |
|---|---|---|
name_for_model | ChatGPT模型的插件名称 | qdrant |
name_for_human | 人类友好的模型名称,将在ChatGPT界面中显示 | Qdrant文档插件 |
description_for_model | 插件的目的描述,以便 ChatGPT 知道在什么情况下应该使用它来回答问题。 | 用于搜索 Qdrant 文档以找到问题的答案并检索相关信息的插件。当用户询问可能与 Qdrant 向量数据库或语义向量搜索相关的内容时,请使用它。 |
description_for_human | 插件的简短描述,也将在ChatGPT UI中显示。 | 查找Qdrant文档 |
auth | 应用程序使用的授权方案。默认情况下,必须配置承载令牌。 | {"type": "user_http", "authorization_type": "bearer"} |
api.url | 指向OpenAPI架构定义的链接。请根据您的应用程序URL进行调整。 | https://your-application-name.fly.dev/.well-known/openapi.yaml |
logo_url | 指向应用程序徽标的链接。请根据您的应用程序 URL 进行调整。 | https://your-application-name.fly.dev/.well-known/logo.png |
一个完整的文件可能如下所示:
{
"schema_version": "v1",
"name_for_model": "qdrant",
"name_for_human": "Qdrant Documentation Plugin",
"description_for_model": "Plugin for searching through the Qdrant documentation to find answers to questions and retrieve relevant information. Use it whenever a user asks something that might be related to Qdrant vector database or semantic vector search",
"description_for_human": "Search through Qdrant docs",
"auth": {
"type": "user_http",
"authorization_type": "bearer"
},
"api": {
"type": "openapi",
"url": "https://your-application-name.fly.dev/.well-known/openapi.yaml",
"has_user_authentication": false
},
"logo_url": "https://your-application-name.fly.dev/.well-known/logo.png",
"contact_email": "email@domain.com",
"legal_info_url": "email@domain.com"
}
这是运行最终命令之前的最后一步。将应用程序部署到服务器上的命令:
flyctl deploy
该命令将使用Dockerfile构建镜像并在指定的URL上部署服务。命令完成后,服务应在我们之前获得的主机名上运行:
https://your-application-name.fly.dev
与ChatGPT的集成
一旦我们部署了服务,我们可以将 ChatGPT 指向它,以便模型知道如何连接。当您打开 ChatGPT 用户界面时,您应该会看到一个包含 Plugins 选项卡的下拉菜单:

一旦选择,您应该能够选择一个插件商店:

有一些现成的插件可用,但也有可能通过点击右下角的“开发自己的插件”选项来安装你自己的插件:

我们需要确认我们的插件已经准备好,但由于我们依赖于OpenAI的官方检索插件,这应该没问题:

点击“我的清单已准备好”后,我们可以将ChatGPT指向我们新创建的服务:

成功的插件安装应以以下信息结束:

我们提供了插件的名称和描述。让我们点击“完成”并再次返回“插件商店”窗口。我们需要在右下角选择另一个选项:

我们的插件没有 oficialmente 验证,但我们当然可以自由使用它。安装只需要服务 URL:

OpenAI无法保证该插件提供事实信息,因此我们需要接受一个警告:

最后,我们需要再次提供Bearer令牌:

我们的插件现在可以进行测试了。由于知识库中没有数据,提取任何事实都是不可能的,但我们将使用我们的服务通过https://your-application-name.fly.dev/docs暴露的Swagger UI放入一些数据。我们需要先进行授权,然后调用upsert方法并传入一些文档。为了演示的目的,我们只需放入一份从Qdrant文档中提取的单个文档,以查看集成是否正常工作:

我们可以回到ChatGPT UI,并发送一个提示,但我们需要确保已选择插件:

现在如果我们的提示似乎与提供的插件描述有某种关系,模型将自动形成一个查询并发送到HTTP API。查询将由我们的应用进行向量化,然后用于找到一些相关的文档,这些文档将作为生成响应的上下文。

我们有一个强大的语言模型,它可以与我们的知识库互动,不仅返回语法正确的信息,还能提供事实信息。这就是您与模型的交互可能开始的样子:
然而,单个文档不足以充分发挥插件的全部功能。如果您想放入更多您收集的文档,scripts/ 目录中已经有一些脚本可以转换 JSON、JSON 行或甚至 zip 归档。

