• 文章
  • Extending ChatGPT with a Qdrant-based knowledge base
返回实用示例

用基于Qdrant的知识库扩展ChatGPT

Kacper Łukawski

·

2023年3月23日

Extending ChatGPT with a Qdrant-based knowledge base

在最近几个月里,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打开项目。

前提条件

在我们开始之前,您需要确保三件事情:

  1. 创建一个OpenAI API 密钥,以便您可以以编程方式使用他们的嵌入模型。如果您已经有一个账户,您可以在 https://platform.openai.com/account/api-keys 生成一个。否则,可能需要注册一个账户。
  2. 运行一个 Qdrant 实例。该实例必须可以从外部访问,因此您 要么需要在本地启动它,要么使用 Qdrant Cloud 服务。提供一个免费的 1GB 集群,这在许多情况下可能已经足够。我们将 使用云。
  3. 由于 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_modelChatGPT模型的插件名称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 归档。

这个页面有用吗?

感谢您的反馈!🙏

我们很遗憾听到这个消息。 😔 你可以 编辑 这个页面在 GitHub上,或者 create 一个 GitHub 问题。