近几个月来,ChatGPT 彻底改变了我们沟通、学习和与技术互动的方式。我们的社交平台充斥着提示、对提示的响应、整篇文章以及使用大型语言模型生成与人类撰写内容无法区分的内容的无数其他示例。
尽管有诸多好处,但这些模型也存在缺陷,幻觉现象就是例证——即对用户输入生成不正确或无意义的信息。这个问题可能会损害人工智能生成内容的可靠性和可信度,已经引起了研究人员和用户的日益关注。这些担忧催生了又一波全新的库,例如 Langchain,试图克服这些问题,例如通过结合向量数据库等工具将所需的上下文带入提示中。到目前为止,这是将新的和快速变化的知识整合到神经网络模型中的最佳方式。效果非常好,OpenAI 决定在模型层面引入一种通过外部插件扩展模型能力的方式。这些插件旨在增强模型的性能,作为模块化扩展与核心系统无缝对接。通过向 ChatGPT 添加知识库插件,我们可以有效地为人工智能提供一个精选的、可信的信息来源,确保生成的内容更加准确和相关。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 将通过网络与您的服务互动,因此您必须部署它,使其可以从互联网连接。遗憾的是,localhost 不是一个选项,但任何提供商,如 Heroku 或 fly.io,都可以完美工作。我们将使用 fly.io,因此请注册一个账户。您可能还需要安装用于部署的 flyctl 工具。该过程在 fly.io 的主页上有描述。
配置
检索插件是一个基于 FastAPI 的应用程序,其默认功能在大多数情况下可能已足够。但是,需要进行一些配置,以便 ChatGPT 知道如何以及何时使用它。不过,我们可以先开始设置 Fly.io,因为我们需要知道服务的 hostname 才能完全配置它。
首先,让我们登录 Fly CLI
flyctl auth login
这将打开浏览器,因此您只需提供凭据即可,所有后续命令都将使用您的账户执行。如果您从未用过 fly.io,在运行任何实例之前可能需要提供信用卡信息,但有一个 Hobby Plan 是不会收费的。
让我们尝试启动实例,但不要部署它。我们将获得分配的 hostname,并拥有所有详细信息用于填充配置。检索插件使用 TCP 端口 8080,因此我们需要配置 fly.io,以便也将所有流量重定向到该端口。
flyctl launch --no-deploy --internal-port 8080
系统将提示您输入应用程序名称和部署区域。请选择最适合您的选项。之后,您应该会看到新创建应用程序的 hostname
...
Hostname: your-application-name.fly.dev
...
让我们记下它。服务配置需要用到它。但我们先从设置所有应用程序的 secrets 开始
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
这些 secrets 将为首次部署进行准备。这里有一个由 https://jwt.node.org.cn/ 生成的最小 Bearer token 示例。请调整该 token,不要公开暴露它,但演示时可以保持相同的值。
现在,让我们深入研究应用程序配置文件。您可以选择提供自己的图标并将其命名为 .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 UI 中 | Qdrant 文档插件 |
description_for_model | 插件用途的描述,以便 ChatGPT 知道在何种情况下应使用它来回答问题。 | 用于搜索 Qdrant 文档以查找问题答案和检索相关信息的插件。当用户询问可能与 Qdrant 向量数据库或语义向量搜索相关的问题时,请使用它。 |
description_for_human | 插件的简短描述,也将显示在 ChatGPT UI 中。 | 搜索 Qdrant 文档 |
auth | 应用程序使用的授权方案。默认情况下,必须配置 Bearer token。 | {"type": "user_http", "authorization_type": "bearer"} |
api.url | OpenAPI 模式定义的链接。请根据您的应用程序 URL 进行调整。 | https://your-application-name.fly.dev/.well-known/openapi.yaml |
logo_url | 应用程序 Logo 的链接。请根据您的应用程序 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。命令完成后,服务应该在我们之前获得的 hostname 上运行
https://your-application-name.fly.dev
与 ChatGPT 集成
部署服务后,我们可以将 ChatGPT 指向它,以便模型知道如何连接。打开 ChatGPT UI 后,您应该会看到一个包含 Plugins 选项卡的下拉菜单
选中后,您应该能够选择其中一个或查看插件商店
有一些预制的插件可用,但也可以通过点击右下角的“开发您自己的插件”选项来安装您自己的插件
我们需要确认我们的插件已准备就绪,但由于我们使用的是 OpenAI 官方的检索插件,所以这应该没有问题
点击“我的 Manifest 已就绪”后,我们就可以将 ChatGPT 指向我们新创建的服务了
插件安装成功后应显示以下信息
这里有我们提供的插件名称和描述。让我们点击“完成”,然后再次返回“插件商店”窗口。右下角还有另一个选项需要选择
我们的插件尚未正式验证,但我们当然可以自由使用它。安装只需要服务 URL
OpenAI 无法保证插件提供的事实信息准确无误,因此我们需要接受一个警告
最后,我们需要再次提供 Bearer token
我们的插件现在可以测试了。由于知识库中没有数据,无法提取任何事实,但我们将使用我们的服务在 https://your-application-name.fly.dev/docs 暴露的 Swagger UI 放入一些数据。我们需要先授权,然后调用 upsert 方法并附带一些文档。为了演示目的,我们可以只放入从 Qdrant 文档中提取的单个文档,看看集成是否正常工作
我们可以回到 ChatGPT UI,发送一个提示,但需要确保插件已被选中
现在,如果我们的提示与提供的插件描述有所关联,模型将自动形成查询并将其发送到 HTTP API。该查询将由我们的应用程序进行向量化,然后用于查找相关的文档,这些文档将用作生成响应的上下文。
我们拥有一个强大的语言模型,可以与我们的知识库互动,不仅返回语法正确的信息,还能返回事实信息。这便是您与模型互动的方式可能看起来的样子
然而,单个文档不足以发挥插件的全部功能。如果您想放入更多已收集的文档,scripts/
目录下已有可用的脚本,允许转换 JSON、JSON Lines 甚至 zip 归档文件。