chatgpt-retrieval-plugin - ChatGPT 检索插件存储库为使用自然语言查询的个人或组织文档的语义搜索和检索提供了灵活的解决方案。

Created at: 2023-03-23 14:06:22
Language: Python
License: MIT

聊天GPT检索插件

在这里加入 ChatGPT 插件候补名单

在此处查找可以访问 2018 年至 2022 年联合国年度报告的检索插件的示例视频。

介绍

ChatGPT 检索插件存储库为使用自然语言查询对个人或组织文档进行语义搜索和检索提供了灵活的解决方案。存储库分为几个目录:

目录 描述
datastore
包含使用各种矢量数据库提供程序存储和查询文档嵌入的核心逻辑。
examples
包括示例配置、身份验证方法和特定于提供程序的示例。
models
包含插件使用的数据模型,例如文档和元数据模型。
scripts
提供用于处理和上载来自不同数据源的文档的脚本。
server
包含主要的 FastAPI 服务器实现。
services
包含用于分块、元数据提取和 PII 检测等任务的实用程序服务。
tests
包括针对各种矢量数据库提供程序的集成测试。
.well-known
存储插件清单文件和 OpenAPI 架构,用于定义插件配置和 API 规范。

本自述文件提供了有关如何设置、开发和部署 ChatGPT 检索插件的详细信息。

目录

大约

插件

插件是专门为 ChatGPT 等语言模型设计的聊天扩展,使它们能够访问最新信息、运行计算或与第三方服务交互以响应用户的请求。它们解锁了广泛的潜在用例,并增强了语言模型的功能。

开发人员可以通过其网站公开 API 并提供描述 API 的标准化清单文件来创建插件。ChatGPT 使用这些文件,并允许 AI 模型调用开发人员定义的 API。

插件包括:

  • 一个接口
  • API 架构(OpenAPI JSON 或 YAML 格式)
  • 定义插件相关元数据的清单(JSON 文件)

检索插件已经包含所有这些组件。在此处阅读聊天插件博客文章,并在此处查找文档。

检索插件

这是 ChatGPT 的一个插件,可以对个人或组织文档进行语义搜索和检索。它允许用户通过以自然语言提出问题或表达需求,从其数据源(如文件、注释或电子邮件)获取最相关的文档片段。企业可以使用此插件通过 ChatGPT 将其内部文档提供给员工。

该插件使用 OpenAI 的嵌入模型生成文档块的嵌入,然后使用后端的矢量数据库存储和查询它们。作为一个开源和自托管的解决方案,开发人员可以部署自己的检索插件并将其注册到 ChatGPT。检索插件支持多个矢量数据库提供程序,允许开发人员从列表中选择他们喜欢的一个。

text-embedding-ada-002

FastAPI 服务器公开插件的端点,用于更新插入、查询和删除文档。用户可以通过按源、日期、作者或其他条件使用元数据筛选器来优化其搜索结果。该插件可以托管在任何支持 Docker 容器的云平台上,例如 Fly.io、Heroku 或 Azure 容器应用。为了使用最新文档更新矢量数据库,该插件可以使用传入的 webhook 到更新插入和删除端点,连续处理和存储来自各种数据源的文档。ZapierMake 等工具可以帮助根据事件或计划配置 Webhook。

内存功能

检索插件的一个显着特点是它能够为 ChatGPT 提供内存。通过利用插件的更新插入端点,ChatGPT 可以将对话中的片段保存到矢量数据库以供以后参考(仅在用户提示时)。此功能允许 ChatGPT 记住和检索以前对话中的信息,从而有助于提供更具上下文感知的聊天体验。在此处了解如何使用内存配置检索插件。

安全

检索插件允许 ChatGPT 搜索内容的矢量数据库,然后将最佳结果添加到 ChatGPT 会话中。这意味着它没有任何外部影响,主要的风险考虑因素是数据授权和隐私。开发人员应该只在他们的检索插件中添加他们有权的内容,并且他们可以出现在用户的 ChatGPT 会话中。你可以从许多不同的身份验证方法中进行选择来保护插件(更多信息在这里)。

接口端点

检索插件是使用 FastAPI 构建的,FastAPI 是一个使用 Python 构建 API 的 Web 框架。FastAPI 允许轻松开发、验证和记录 API 端点。在此处查找 FastAPI 文档。

使用 FastAPI 的好处之一是使用 Swagger UI 自动生成交互式 API 文档。当 API 在本地运行时,可以使用 Swagger UI at 与 API 终结点交互、测试其功能以及查看预期的请求和响应模型。

<local_host_url i.e. http://0.0.0.0:8000>/docs

该插件公开以下端点,用于更新插入、查询和删除矢量数据库中的文档。所有请求和响应均采用 JSON 格式,并且需要有效的持有者令牌作为授权标头。

  • /upsert
    :此端点允许上传一个或多个文档并将其文本和元数据存储在矢量数据库中。这些文档被分成大约 200 个代币的块,每个都有唯一的 ID。终结点需要请求正文中的文档列表,每个文档都有一个字段,以及可选的 and 字段。该字段可以包含以下可选子字段:、、、 和 。端点返回插入文档的 ID 列表(如果最初未提供,则会生成 ID)。
    text
    id
    metadata
    metadata
    source
    source_id
    url
    created_at
    author

  • /upsert-file
    :此端点允许上传单个文件(PDF、TXT、DOCX、PPTX 或 MD),并将其文本和元数据存储在矢量数据库中。该文件被转换为纯文本,并拆分为大约 200 个令牌的块,每个块都有一个唯一的 ID。终结点返回一个列表,其中包含所插入文件的生成 ID。

  • /query
    :此终结点允许使用一个或多个自然语言查询和可选的元数据筛选器查询矢量数据库。终结点需要请求正文中的查询列表,每个查询都有 a 和 Optional and 字段。该字段应包含以下子字段的子集:、 和 。该字段指定要为给定查询返回的结果数,默认值为 3。端点返回一个对象列表,每个对象都包含给定查询最相关的文档块的列表,以及它们的文本、元数据和相似性分数。
    query
    filter
    top_k
    filter
    source
    source_id
    document_id
    url
    created_at
    author
    top_k

  • /delete
    :此端点允许使用其 ID、元数据过滤器或 delete_all 标志从矢量数据库中删除一个或多个文档。终结点在请求正文中至少需要以下参数之一:、 或 。该参数应该是要删除的文档 ID 的列表;将删除具有这些 IDS 的文档的所有文档区块。该参数应包含以下子字段的子集:、 和 。该参数应为布尔值,指示是否从矢量数据库中删除所有文档。终结点返回一个布尔值,指示删除是否成功。
    ids
    filter
    delete_all
    ids
    filter
    source
    source_id
    document_id
    url
    created_at
    author
    delete_all

可以通过在本地运行应用并导航到 http://0.0.0.0:8000/openapi.json在此处的 OpenAPI 架构中找到请求和响应模型的详细规范和示例。请注意,OpenAPI 架构仅包含端点,因为这是 ChatGPT 需要访问的唯一函数。这样,ChatGPT 只能使用该插件根据自然语言查询或需求检索相关文档。但是,如果开发人员还希望让 ChatGPT 能够记住以后的事情,他们可以使用端点将对话中的片段保存到矢量数据库。可以在此处找到允许 ChatGPT 访问端点的清单和 OpenAPI 架构的示例。

/query
/upsert
/upsert

要包含自定义元数据字段,请在此处编辑 和数据模型,并在此处更新 OpenAPI 架构。你可以通过在本地运行应用程序、复制在 http://0.0.0.0:8000/sub/openapi.json 中找到的 json,并使用 Swagger 编辑器将其转换为 YAML 格式来轻松更新此内容。或者,你可以将文件替换为文件。

DocumentMetadata
DocumentMetadataFilter
openapi.yaml
openapi.json

快速入门

请按照以下步骤快速设置并运行 ChatGPT 检索插件:

  1. 安装 Python 3.10(如果尚未安装)。

  2. 克隆存储库:

    git clone https://github.com/openai/chatgpt-retrieval-plugin.git

  3. 导航到克隆的存储库目录:

    cd /path/to/chatgpt-retrieval-plugin

  4. 安装诗歌:

    pip install poetry

  5. 使用 Python 3.10 创建新的虚拟环境:

    poetry env use python3.10

  6. 激活虚拟环境:

    poetry shell

  7. 安装应用依赖项:

    poetry install

  8. 设置所需的环境变量:

    export DATASTORE=<your_datastore>
    export BEARER_TOKEN=<your_bearer_token>
    export OPENAI_API_KEY=<your_openai_api_key>
    <Add the environment variables for your chosen vector DB here>
    
  9. 在本地运行 API:

    poetry run start

  10. 访问 API 文档并测试 API 终结点(确保添加持有者令牌)。

    http://0.0.0.0:8000/docs

有关设置、开发和部署 ChatGPT 检索插件的更多详细信息,请参阅下面的完整开发部分。

发展

设置

此应用程序使用 Python 3.10 和诗歌进行依赖项管理。

在你的计算机上安装 Python 3.10(如果尚未安装)。它可以从 Python 官方网站下载,也可以使用包管理器(如 or )下载,具体取决于你的系统。

brew
apt

从 GitHub 克隆存储库:

git clone https://github.com/openai/chatgpt-retrieval-plugin.git

导航到克隆的存储库目录:

cd /path/to/chatgpt-retrieval-plugin

安装诗歌:

pip install poetry

创建一个使用 Python 3.10 的新虚拟环境:

poetry env use python3.10
poetry shell

使用诗歌安装应用依赖项:

poetry install

注意:如果在 中添加依赖项,请确保运行 和 。

pyproject.toml
poetry lock
poetry install

一般环境变量

API 需要以下环境变量才能工作:

名字 必填 描述
DATASTORE
是的 这指定要用于存储和查询嵌入的矢量数据库提供程序。你可以从 、、、、 或 中进行选择。
pinecone
weaviate
zilliz
milvus
qdrant
redis
BEARER_TOKEN
是的 这是一个机密令牌,你需要对其进行对 API 的请求进行身份验证。你可以使用你喜欢的任何工具或方法(例如 jwt.io)生成一个。
OPENAI_API_KEY
是的 这是使用模型生成嵌入所需的 OpenAI API 密钥。你可以通过在OpenAI上创建帐户来获取API密钥。
text-embedding-ada-002

选择矢量数据库

该插件支持多个矢量数据库提供程序,每个提供程序具有不同的功能、性能和定价。根据你选择的一个,你将需要使用不同的 Dockerfile 并设置不同的环境变量。以下各节提供有关使用每个矢量数据库提供程序的详细信息和说明。

松果

Pinecone 是一个托管矢量数据库,旨在提高速度、规模并更快地将产品交付到生产环境。要使用松果作为你的矢量数据库提供商,首先通过注册一个帐户来获取 API 密钥。你可以从 dashboard 侧边栏中的“API 密钥”部分访问你的 API 密钥。

该应用程序将在你首次运行时自动为你创建一个松果索引。只需为索引选择一个名称并将其设置为环境变量即可。

环境变量:

名字 必填 描述
DATASTORE
是的 数据存储名称,将其设置为
pinecone
BEARER_TOKEN
是的 用于对 API 请求进行身份验证的密钥令牌
OPENAI_API_KEY
是的 用于生成模型嵌入的 OpenAI API 密钥
text-embedding-ada-002
PINECONE_API_KEY
是的 你的松果API密钥,可在松果控制台中找到
PINECONE_ENVIRONMENT
是的 你的松果环境,可在松果控制台中找到,例如、等。
us-west1-gcp
us-east-1-aws
PINECONE_INDEX
是的 你选择的松果索引名称。注意:索引名称必须由小写字母数字字符或“-”组成

如果要使用自定义配置创建自己的索引,可以使用松果SDK,API或Web界面(请参阅文档)。确保对嵌入使用 1536 维数,并避免对元数据中的文本字段编制索引,因为这会显著降低性能。

# Creating index with Pinecone SDK - use only if you wish to create the index manually.

import os, pinecone

pinecone.init(api_key=os.environ['PINECONE_API_KEY'],
              environment=os.environ['PINECONE_ENVIRONMENT'])

pinecone.create_index(name=os.environ['PINECONE_INDEX'],
                      dimension=1536,
                      metric='cosine',
                      metadata_config={
                          "indexed": ['source', 'source_id', 'url', 'created_at', 'author', 'document_id']})

编织

设置编织实例

Weaviate是一个开源矢量搜索引擎,旨在无缝扩展到数十亿个数据对象。此实现支持开箱即用的混合搜索(这意味着它在关键字搜索中效果更好)。

你可以通过 4 种方式运行 Weaviate:

  • SaaS – 与Weaviate Cloud Services(WCS)。

    WCS 是一项完全托管的服务,负责托管、扩展和更新你的 Weaviate 实例。你可以使用持续 30 天的沙盒免费试用。

    要使用 WCS 设置 SaaS Weaviate 实例,请执行以下操作:

    1. 导航到 Weaviate Cloud Console
    2. 注册或登录你的 WCS 帐户。
    3. 使用以下设置创建新群集:
      • Name
        – 集群的唯一名称。该名称将成为用于访问此实例的 URL 的一部分。
      • Subscription Tier
        – 沙盒免费试用,或联系 hello@weaviate.io 以获取其他选项。
      • Weaviate Version
        - 默认为最新版本。
      • OIDC Authentication
        – 默认启用。这需要用户名和密码才能访问你的实例。
    4. 等待几分钟,直到你的集群准备就绪。完成后,你将看到一个绿色勾号✔️。复制群集 URL。
  • 混合SaaS

    如果你出于安全或合规性原因需要将数据保留在本地,Weaviate 还提供混合 SaaS 选项:Weaviate 在你的云实例中运行,但集群由 Weaviate 远程管理。这为你提供了托管服务的好处,而无需将数据发送到外部方。

    Weaviate Hybrid SaaS是一个定制解决方案。如果你对此选项感兴趣,请与 hello@weaviate.io 联系。

  • 自托管 – 使用 Docker 容器

    要使用 Docker 设置 Weaviate 实例,请执行以下操作:

    1. 使用以下命令下载文件:

      docker-compose.yml
      curl

      curl -o docker-compose.yml "https://configuration.weaviate.io/v2/docker-compose/docker-compose.yml?modules=standalone&runtime=docker-compose&weaviate_version=v1.18.0"
      

      或者,你可以使用Weaviate的docker composite配置工具来生成自己的文件。

      docker-compose.yml

    2. 运行以启动 Weaviate 实例。

      docker-compose up -d

      要将其关闭,请运行 。

      docker-compose down

  • 自托管 – 使用 Kubernetes 集群

    要使用 Kubernetes 配置自托管实例,请遵循 Weaviate 的文档。

配置编织环境变量

你需要设置一些环境变量才能连接到 Weaviate 实例。

检索应用环境变量

名字 必填 描述
DATASTORE
是的 数据存储名称。将其设置为
weaviate
BEARER_TOKEN
是的 你的秘密令牌
OPENAI_API_KEY
是的 你的 OpenAI API 密钥

编织数据存储环境变量

名字 必填 描述 违约
WEAVIATE_HOST
自选 你的 Weaviate 实例主机地址(请参阅下面的注释)
http://127.0.0.1
WEAVIATE_PORT
自选 你的编织端口号 8080
WEAVIATE_INDEX
自选 你选择的 Weaviate 类/集合名称来存储你的文档 OpenAIDocument

对于 WCS 实例,设置为 443 和 。例如:。

WEAVIATE_PORT
WEAVIATE_HOST
https://(wcs-instance-name).weaviate.network
https://my-project.weaviate.network/

对于自托管实例,如果你的实例不在 127.0.0.1:8080,请相应地进行设置。例如:和 。

WEAVIATE_HOST
WEAVIATE_PORT
WEAVIATE_HOST=http://localhost/
WEAVIATE_PORT=4040

编织身份验证环境变量

如果你为 Weaviate 实例启用了 OIDC 身份验证(建议用于 WCS 实例),请设置以下环境变量。如果启用了匿名访问,请跳过此部分。

名字 必填 描述
WEAVIATE_USERNAME
是的 你的 OIDC 或 WCS 用户名
WEAVIATE_PASSWORD
是的 你的 OIDC 或 WCS 密码
WEAVIATE_SCOPES
自选 以空格分隔的范围列表

Weaviate 中了解有关身份验证和 Python 客户端身份验证的更多信息。

编织批量导入环境变量

Weaviate 使用批处理机制批量执行操作。这样可以更快、更高效地导入和更新数据。你可以使用以下可选环境变量调整批处理设置:

名字 必填 描述 违约
WEAVIATE_BATCH_SIZE
自选 每个批处理操作的插入/更新数 20
WEAVIATE_BATCH_DYNAMIC
自选 让批处理决定批处理大小
WEAVIATE_BATCH_TIMEOUT_RETRIES
自选 超时重试尝试次数 3
WEAVIATE_BATCH_NUM_WORKERS
自选 运行批处理操作的最大并发线程数 1

注意:最佳取决于可用资源(RAM,CPU)。更高的值意味着更快的批量操作,但也意味着对 RAM 和 CPU 的需求更高。如果在导入过程中遇到失败,请减小批大小。

WEAVIATE_BATCH_SIZE

设置为 表示对批大小没有限制。所有插入或更新操作都将在单个操作中发送到 Weaviate。这可能会有风险,因为你无法控制批大小。

WEAVIATE_BATCH_SIZE
None

详细了解 Weaviate 中的批处理配置

齐利兹

Zilliz 是一个托管的云原生矢量数据库,专为十亿级规模而设计。Zilliz提供了许多关键功能,例如:

  • 多种索引算法
  • 多个距离指标
  • 标量滤波
  • 时间旅行搜索
  • 回滚和快照
  • 完整的 RBAC
  • 99.9% 正常运行时间
  • 存储和计算分离
  • 多语言软件开发工具包

在此处查找更多信息。

自托管与 SaaS

Zilliz是一个SaaS数据库,但提供了一个开源解决方案Milvus。这两个选项都提供十亿级的快速搜索,但 Zilliz 为你处理数据管理。它会自动扩展计算和存储资源,并为数据创建最佳索引。请参阅此处的比较。

部署数据库

Zilliz Cloud可以通过几个简单的步骤进行部署。首先,在此处创建一个帐户。设置帐户后,请按照此处的指南设置数据库并获取此应用程序所需的参数。

环境变量:

名字 必填 描述
DATASTORE
是的 数据存储名称,设置为
zilliz
BEARER_TOKEN
是的 你的秘密令牌
OPENAI_API_KEY
是的 你的 OpenAI API 密钥
ZILLIZ_COLLECTION
自选 齐利兹集合名称。默认为随机 UUID
ZILLIZ_URI
是的 Zilliz 实例的 URI
ZILLIZ_USER
是的 齐利兹用户名
ZILLIZ_PASSWORD
是的 齐利兹密码

运行 Zilliz 集成测试

一套集成测试可用于验证 Zilliz 集成。要运行测试,请创建一个 Zilliz 数据库并更新环境变量。

然后,使用以下命令启动测试套件:

pytest ./tests/datastore/providers/zilliz/test_zilliz_datastore.py

米尔沃斯

Milvus 是一个开源的云原生向量数据库,可扩展到数十亿个向量。它是Zilliz的开源版本。它支持:

  • 各种索引算法和距离指标
  • 标量滤波和时间旅行搜索
  • 回滚和快照
  • 多语言软件开发工具包
  • 存储和计算分离
  • 云可扩展性
  • 具有多语言支持的开发人员优先社区

访问 Github 了解更多信息。

部署数据库

你可以使用 Docker Compose、Helm、K8's Operator 或 Ansible 部署和管理 Milvus。按照此处的说明开始操作。

环境变量:

名字 必填 描述
DATASTORE
是的 数据存储名称,设置为
milvus
BEARER_TOKEN
是的 你的持有者令牌
OPENAI_API_KEY
是的 你的 OpenAI API 密钥
MILVUS_COLLECTION
自选 Milvus 集合名称,默认为随机 UUID
MILVUS_HOST
自选 米尔维斯主机 IP,默认为
localhost
MILVUS_PORT
自选 米尔维斯端口,默认为
19530
MILVUS_USER
自选 Milvus 用户名(如果启用了 RBAC),默认为
None
MILVUS_PASSWORD
自选 如果需要,Milvus 密码默认为
None

运行 Milvus 集成测试

一套集成测试可用于验证 Milvus 集成。要运行测试,请运行在示例文件夹中找到的 milvus docker 撰写。

然后,使用以下命令启动测试套件:

pytest ./tests/datastore/providers/milvus/test_milvus_datastore.py

Qdrant

Qdrant 是一个矢量数据库,可以存储文档和矢量嵌入。它可以作为自托管版本或托管 Qdrant 云解决方案运行。这两个选项的配置几乎相同,除了 Qdrant Cloud 提供的 API 密钥。

环境变量:

名字 必填 描述 违约
DATASTORE
是的 数据存储名称,设置为
qdrant
BEARER_TOKEN
是的 秘密令牌
OPENAI_API_KEY
是的 OpenAI API 密钥
QDRANT_URL
是的 Qdrant 实例网址
http://localhost
QDRANT_PORT
自选 用于 Qdrant HTTP 通信的 TCP 端口
6333
QDRANT_GRPC_PORT
自选 用于 Qdrant GRPC 通信的 TCP 端口
6334
QDRANT_API_KEY
自选 Qdrant Cloud 的 Qdrant API 密钥
QDRANT_COLLECTION
自选 Qdrant 集合名称
document_chunks
Qdrant Cloud

对于托管的 Qdrant 云版本,请提供 Qdrant 实例 URL 和来自 Qdrant Cloud UI 的 API 密钥。

例:

QDRANT_URL="https://YOUR-CLUSTER-URL.aws.cloud.qdrant.io"
QDRANT_API_KEY="<YOUR_QDRANT_CLOUD_CLUSTER_API_KEY>"

其他参数是可选的,可以根据需要进行更改。

自托管 Qdrant 实例

对于自托管版本,请使用 Docker 容器或官方 Helm 图表进行部署。唯一必需的参数是指向 Qdrant 服务器 URL。

QDRANT_URL

例:

QDRANT_URL="http://YOUR_HOST.example.com:6333"

其他参数是可选的,可以根据需要进行更改。

运行 Qdrant 集成测试

一套集成测试验证了 Qdrant 集成。要运行它,请在 Docker 容器中启动本地 Qdrant 实例。

docker run -p "6333:6333" -p "6334:6334" qdrant/qdrant:v1.0.3

然后,使用以下命令启动测试套件:

pytest ./tests/datastore/providers/test_qdrant_datastore.py

雷迪斯

通过使用 Redis Stack docker 容器创建 Redis 数据库,将 Redis 用作低延迟矢量引擎。对于托管/托管解决方案,请尝试 Redis 云

  • 数据库需要 RediSearch 模块 (v 2.6 ++),该模块包含在上面的自托管 docker 组合中。
  • 使用 Redis docker 映像运行应用:在此目录中
    docker compose up -d
  • 应用会在首次运行时自动创建 Redis 矢量搜索索引。(可选)创建具有特定名称的自定义索引,并将其设置为环境变量(见下文)。
  • 若要启用更多混合搜索功能,请在此处调整文档架构。

环境变量:

名字 必填 描述 违约
DATASTORE
是的 数据存储名称,设置为
redis
BEARER_TOKEN
是的 秘密令牌
OPENAI_API_KEY
是的 OpenAI API 密钥
REDIS_HOST
自选 红地思主机网址
localhost
REDIS_PORT
自选 雷迪斯港
6379
REDIS_PASSWORD
自选 雷迪斯密码 没有
REDIS_INDEX_NAME
自选 雷迪斯矢量索引名称
index
REDIS_DOC_PREFIX
自选 索引的 Redis 键前缀
doc
REDIS_DISTANCE_METRIC
自选 矢量相似度距离度量
COSINE
REDIS_INDEX_TYPE
自选 矢量索引算法类型
FLAT

在本地运行 API

要在本地运行 API,首先需要使用以下命令设置必要的环境变量:

export

export DATASTORE=<your_datastore>
export BEARER_TOKEN=<your_bearer_token>
export OPENAI_API_KEY=<your_openai_api_key>
<Add the environment variables for your chosen vector DB here>

使用以下命令启动 API:

poetry run start

附加到终端中显示的 URL 并在浏览器中打开它以访问 API 文档并试用端点(即 http://0.0.0.0:8000/docs)。请确保输入持有者令牌并测试 API 终结点。

docs

注意:如果将新的依赖项添加到 pyproject.toml 文件,则需要运行并更新锁定文件并安装新的依赖项。

poetry lock
poetry install

个性化

你可以通过执行以下操作来针对自己的用例个性化检索插件:

  • 替换徽标:将徽标中的图像替换为你自己的徽标.png

  • 编辑数据模型:在 models.py编辑 和 数据模型以添加自定义元数据字段。相应地更新 openapi.yaml 中的 OpenAPI 架构。若要更轻松地更新 OpenAPI 架构,可以在本地运行应用,然后导航到并复制网页的内容。然后转到 Swagger 编辑器并粘贴 JSON 以将其转换为 YAML 格式。你还可以将 openapi.yaml 文件替换为 .well-known 文件夹中的 openapi.json 文件。

    DocumentMetadata
    DocumentMetadataFilter
    http://0.0.0.0:8000/sub/openapi.json

  • 更改插件名称、描述和使用说明:更新模型的插件名称、面向用户的描述和使用说明。你可以编辑 main.py 文件中的说明,也可以更新 openapi.yaml 文件。按照与上一步中相同的说明更新 OpenAPI 架构。

  • 启用 ChatGPT 以保存对话中的信息:请参阅内存示例文件夹中的说明。

身份验证方法

你可以从四个选项中进行选择,以验证对插件的请求:

  1. 无需身份验证:任何人都可以添加你的插件并在没有任何凭据的情况下使用其 API。如果仅公开不敏感或已公开的文档,则此选项适用。它不会为你的数据提供任何安全性。如果使用此方法,请将此 main.py 的内容复制到实际的 main.py 文件中此处的示例清单。

  2. HTTP 持有者:你可以使用秘密令牌作为标头来授权对插件的请求。此选项有两种变体:

    • 用户级别(此实现的默认级别):将插件添加到 ChatGPT 的每个用户都必须在添加插件时提供持有者令牌。你可以使用你喜欢的任何工具或方法(例如 jwt.io)生成和分发这些令牌。此方法提供更好的安全性,因为每个用户都必须输入共享访问令牌。如果需要每个用户的唯一访问令牌,则需要在 main.py 文件中自行实现。此处的示例清单。

    • 服务级别:任何人都可以添加你的插件并在没有凭据的情况下使用其 API,但你必须在注册插件时添加持有者令牌。安装插件时,你需要添加持有者令牌,然后从 ChatGPT 接收一个令牌,你必须将其包含在托管清单文件中。ChatGPT 将使用你的令牌代表添加它的所有用户授权对你的插件的请求。此方法对用户来说更方便,但可能不太安全,因为所有用户共享相同的令牌,并且不需要添加令牌即可安装插件。此处的示例清单。

  3. OAuth:用户必须通过OAuth流程才能添加你的插件。你可以使用 OAuth 提供程序对添加插件的用户进行身份验证,并授予他们访问你的 API 的权限。此方法提供最高级别的安全性和控制,因为用户通过受信任的第三方提供商进行身份验证。但是,你需要在 main.py 文件中自行实现 OAuth 流,并在清单文件中提供必要的参数。此处的示例清单。

在选择最适合你的用例和安全要求的方法之前,请考虑每种身份验证方法的优缺点。如果你选择使用与默认方法(用户级别 HTTP)不同的方法,请确保在此处更新清单文件。

部署

你可以将应用部署到不同的云提供商,具体取决于你的首选项和要求。但是,无论你选择哪个提供商,你都需要更新应用程序中的两个文件:openapi.yamlai-plugin.json。如上所述,这些文件分别定义了应用的 API 规范和 AI 插件配置。需要更改两个文件中的 url 字段,以匹配已部署应用的地址。

在部署应用程序之前,你可能希望从 pyproject.toml 文件中删除未使用的依赖项,以减小应用程序的大小并提高其性能。根据你选择的矢量数据库提供程序,你可以删除特定提供程序不需要的包。

以下是你可以为每个矢量数据库提供程序删除的包:

  • 松果:删除 、 、 和 。
    weaviate-client
    pymilvus
    qdrant-client
    redis
  • 编织:删除 、 、 和 。
    pinecone-client
    pymilvus
    qdrant-client
    redis
  • 齐利兹:删除 、 、 和 。
    pinecone-client
    weaviate-client
    qdrant-client
    redis
  • 米尔维斯:删除 、 、 和 。
    pinecone-client
    weaviate-client
    qdrant-client
    redis
  • Qdrant:删除 、 、 和 。
    pinecone-client
    weaviate-client
    pymilvus
    redis
  • 雷迪斯:删除 、 、 和 。
    pinecone-client
    weaviate-client
    pymilvus
    qdrant-client

从文件中删除不必要的包后,无需手动运行。提供的 Dockerfile 负责使用命令生成的文件安装所需的依赖项。

pyproject.toml
poetry lock
poetry install
requirements.txt
poetry export

部署应用后,请考虑使用以下脚本之一或通过调用终结点上传初始一批文档,例如:

/upsert

curl -X POST https://your-app-url.com/upsert \
  -H "Authorization: Bearer <your_bearer_token>" \
  -H "Content-type: application/json" \
  -d '{"documents": [{"id": "doc1", "text": "Hello world", "metadata": {"source_id": "12345", "source": "file"}}, {"text": "How are you?", "metadata": {"source_id": "23456"}}]}'

部署到 Fly.io

若要将 Docker 容器从此存储库部署到 Fly.io,请执行以下步骤:

在本地计算机上安装 Docker(如果尚未安装)。

在本地计算机上安装 Fly.io CLI

从 GitHub 克隆存储库:

git clone https://github.com/openai/chatgpt-retrieval-plugin.git

导航到克隆的存储库目录:

cd path/to/chatgpt-retrieval-plugin

登录到 Fly.io CLI:

flyctl auth login

创建并启动 Fly.io 应用:

flyctl launch

按照终端中的说明进行操作:

  • 选择你的应用名称
  • 选择你的应用区域
  • 不添加任何数据库
  • 暂不部署(如果部署,第一次部署可能会失败,因为尚未设置环境变量)

设置所需的环境变量:

flyctl secrets set DATASTORE=your_datastore \
OPENAI_API_KEY=your_openai_api_key \
BEARER_TOKEN=your_bearer_token \
<Add the environment variables for your chosen vector DB here>

或者,你可以在 Fly.io 控制台中设置环境变量。

此时,你可以在此处将插件清单文件中的插件 url 更改为 Fly.io 应用程序的 url,该 url 为 .

https://your-app-name.fly.dev

使用以下命令部署应用:

flyctl deploy

完成这些步骤后,应将 Docker 容器部署到 Fly.io 并使用必要的环境变量集运行。你可以通过运行以下命令来查看你的应用:

flyctl open

这将打开你的应用程序 URL。你应该能够在 找到 OpenAPI 架构,在 找到清单。

<your_app_url>/.well-known/openapi.yaml
<your_app_url>/.well-known/ai-plugin.json

要查看应用日志,请执行以下操作:

flyctl logs

现在,请确保已在此处更改插件清单文件中的插件 url,在此处更改 OpenAPI 架构中的插件 URL,并使用 .此网址将是 。

flyctl deploy
https://<your-app-name>.fly.dev

调试提示:Fly.io 默认使用端口 8080。

如果应用部署失败,请检查环境变量是否设置正确,然后检查端口配置是否正确。你也可以尝试将 -e 标志与命令一起使用,以便在启动时设置环境变量。

flyctl launch

部署到 Heroku

要将 Docker 容器从此存储库部署到 Heroku 并设置所需的环境变量,请执行以下步骤:

在本地计算机上安装 Docker(如果尚未安装)。

在本地计算机上安装 Heroku CLI

从 GitHub 克隆存储库:

git clone https://github.com/openai/chatgpt-retrieval-plugin.git

导航到克隆的存储库目录:

cd path/to/chatgpt-retrieval-plugin

登录 Heroku CLI:

heroku login

创建一个 Heroku 应用程序:

heroku create [app-name]

登录 Heroku 容器注册表:

heroku container:login

或者,你可以使用 Makefile 中的命令通过运行以下命令登录到 Heroku 容器注册表:

make heroku-login

使用 Dockerfile 构建 Docker 镜像:

docker buildx build --platform linux/amd64 -t [image-name] .

(替换为要为 Docker 映像指定的名称)

[image-name]

将 Docker 镜像推送到 Heroku 容器注册表,并将新推送的镜像发布到 Heroku 应用。

docker tag [image-name] registry.heroku.com/[app-name]/web
docker push registry.heroku.com/[app-name]/web
heroku container:release web -a [app-name]

或者,你可以使用 中的命令通过运行以下命令将 Docker 镜像推送到 Heroku 容器注册表:

make heroku-push

注意:你将需要编辑生成文件并替换为实际的应用名称。

<your app name>

为你的 Heroku 应用程序设置所需的环境变量:

heroku config:set DATASTORE=your_datastore \
OPENAI_API_KEY=your_openai_api_key \
BEARER_TOKEN=your_bearer_token \
<Add the environment variables for your chosen vector DB here> \
-a [app-name]

你还可以在 Heroku 控制台中设置环境变量。

完成这些步骤后,你的 Docker 容器应部署到 Heroku 并使用设置的必要环境变量运行。你可以通过运行以下命令来查看你的应用:

heroku open -a [app-name]

这将打开你的应用程序 URL。你应该能够在 找到 OpenAPI 架构,在 找到清单。

<your_app_url>/.well-known/openapi.yaml
<your_app_url>/.well-known/ai-plugin.json

要查看应用日志,请执行以下操作:

heroku logs --tail -a [app-name]

现在,请确保在此处更改插件清单文件中的插件 URL,在此处更改 OpenAPI 架构中的插件 URL,并使用 .此网址将是 。

make heroku-push
https://your-app-name.herokuapp.com

其他部署选项

部署应用的一些可能的其他选项包括:

  • Azure 容器应用:这是一个云平台,允许你使用 Docker 容器部署和管理 Web 应用。可以使用 Azure CLI 或 Azure 门户创建和配置应用服务,然后将 Docker 映像推送到容器注册表并将其部署到应用服务。还可以使用 Azure 门户设置环境变量并缩放应用。在此处了解更多信息。
  • Google Cloud Run:这是一个无服务器平台,允许你使用 Docker 容器运行无状态 Web 应用。你可以使用 Google Cloud Console 或 gcloud 命令行工具创建和部署 Cloud Run 服务,然后将 Docker 镜像推送到 Google 容器注册表并将其部署到你的服务。你还可以使用 Google Cloud Console 设置环境变量并扩展应用。在此处了解更多信息。
  • AWS Elastic Container Service:这是一个云平台,允许你使用 Docker 容器运行和管理 Web 应用程序。你可以使用 AWS CLI 或 AWS 管理控制台创建和配置 ECS 集群,然后将 Docker 映像推送到 Amazon Elastic Container Registry 并将其部署到集群。你还可以使用 AWS 管理控制台设置环境变量并扩展应用程序。在此处了解更多信息。

创建应用后,请确保在此处更改插件清单文件中的插件 URL,在此处更改 OpenAPI 架构中的插件 URL,然后重新部署。

安装开发人员插件

要安装开发人员插件,请按照以下步骤操作:

  • 首先,通过将开发人员插件部署到你首选的托管平台(例如 Fly.io、Heroku 等)并更新清单文件和 OpenAPI 架构中的插件 URL 来创建你的开发人员插件。

  • 转到 ChatGPT 并从模型选择器中选择“插件”。

  • 从插件选择器中,滚动到底部并单击“插件商店”。

  • 转到“开发自己的插件”并按照提供的说明进行操作。你需要输入部署插件的域。

  • 根据你为插件选择的身份验证类型按照说明进行操作(例如,如果你的插件使用服务级别 HTTP,则必须粘贴访问令牌,然后将从插件流收到的新访问令牌粘贴到 ai-plugin.json 文件中并重新部署你的应用程序)。

  • 接下来,你必须添加插件。再次转到“插件商店”,然后单击“安装未经验证的插件”。

  • 按照提供的说明进行操作,这将要求你输入部署插件的域。

  • 根据你为插件选择的身份验证类型按照说明进行操作(例如,如果你的插件使用用户级 HTTP,则必须粘贴持有者令牌)。

完成这些步骤后,你的开发者插件应该已安装并准备好在 ChatGPT 中使用。

网络钩子

为了使存储在矢量数据库中的文档保持最新,请考虑使用 ZapierMake 等工具根据事件或计划配置插件 API 的传入 Webhook。例如,这可以让你在更新笔记或接收电子邮件时同步新信息。你还可以使用 Zapier 传输批处理现有文档的集合并将其上传到矢量数据库。

如果需要将这些工具中的自定义字段传递到插件,则可能需要创建调用数据存储的 upsert 函数的其他检索插件 API 端点,例如 。此自定义终结点可以设计为接受来自 Webhook 的特定字段并相应地处理它们。

upsert-email

若要设置传入的 Webhook,请按照以下常规步骤操作:

  • 选择一个网络钩子工具,如 Zapier or Make 并创建一个帐户。
  • 在工具中设置新的 Webhook 或传输,并将其配置为根据事件或计划触发。
  • 指定 webhook 的目标 URL,它应该是检索插件的 API 端点(例如 )。
    https://your-plugin-url.com/upsert
  • 配置 webhook 有效负载以包含必要的数据字段,并根据检索插件的 API 要求对其进行格式化。
  • 测试 webhook 以确保它正常工作并按预期将数据发送到你的检索插件。

设置 webhook 后,你可能需要运行回填以确保任何以前丢失的数据都包含在矢量数据库中。

请记住,如果要使用传入的 Webhook 持续同步数据,则应考虑在设置这些后运行回填以避免丢失任何数据。

除了使用 Zapier 和 Make 等工具外,你还可以构建自己的自定义集成以将数据与你的检索插件同步。这使你可以更好地控制数据流,并根据你的特定需求和要求定制集成。

脚本

该文件夹包含用于批量更新插入或处理来自不同数据源(如 zip 文件、JSON 文件或 JSONL 文件)的文本文档的脚本。这些脚本使用插件的 upsert 实用程序函数将文档及其元数据上传到矢量数据库,然后将其转换为纯文本并将它们拆分为块。每个脚本文件夹都有一个自述文件,说明如何使用它以及它需要哪些参数。你还可以选择使用语言模型筛选文档中的个人身份信息 (PII),并在检测到时跳过它们,使用 services.pii_detection 模块。如果要避免无意中将敏感或私有文档上传到矢量数据库,这会很有帮助。此外,还可以选择使用语言模型从文档文本中提取元数据,并带有 services.extract_metadata 模块。如果要丰富文档元数据,这可能很有用。注意:如果使用传入的 Webhook 持续同步数据,请考虑在设置这些后运行回填以避免丢失任何数据。

scripts

这些脚本是:

  • process_json:此脚本处理 JSON 格式的文档文件转储,并将它们与一些元数据一起存储在矢量数据库中。JSON 文件的格式应为 JSON 对象列表,其中每个对象表示一个文档。JSON 对象应具有一个字段和可选的其他字段来填充元数据。你可以将自定义元数据作为 JSON 字符串和标志提供,以筛选 PII 并提取元数据。
    text
  • process_jsonl:此脚本处理 JSONL 格式的文档文件转储,并将它们与一些元数据一起存储在矢量数据库中。JSONL 文件的格式应为换行符分隔的 JSON 文件,其中每行都是表示文档的有效 JSON 对象。JSON 对象应具有一个字段和可选的其他字段来填充元数据。你可以将自定义元数据作为 JSON 字符串和标志提供,以筛选 PII 并提取元数据。
    text
  • process_zip:此脚本处理 zip 文件中的文档文件转储,并将它们与一些元数据一起存储在矢量数据库中。zip文件的格式应该是docx,pdf,txt,md,pptx或csv文件的平面zip文件夹。你可以将自定义元数据作为 JSON 字符串和标志提供,以筛选 PII 并提取元数据。

局限性

虽然 ChatGPT 检索插件旨在为语义搜索和检索提供灵活的解决方案,但它确实存在一些限制:

  • 关键字搜索限制:模型生成的嵌入可能并不总是有效地捕获确切的关键字匹配项。因此,对于严重依赖特定关键字的查询,插件可能不会返回最相关的结果。某些矢量数据库(如 Weaviate)使用混合搜索,对于关键字搜索可能表现更好。
    text-embedding-ada-002
  • 敏感数据处理:该插件不会自动检测或过滤敏感数据。开发人员有责任确保他们拥有必要的授权,可以在检索插件中包含内容,并且内容符合数据隐私要求。
  • 可扩展性:插件的性能可能会有所不同,具体取决于所选的矢量数据库提供程序和数据集的大小。某些提供程序可能比其他提供程序提供更好的可伸缩性和性能。
  • 语言支持:该插件目前使用 OpenAI 的模型,该模型针对英语进行了优化。但是,它仍然足够强大,可以为各种语言生成良好的结果。
    text-embedding-ada-002
  • 元数据提取:可选的元数据提取功能依赖于语言模型从文档文本中提取信息。此过程可能并不总是准确的,并且提取的元数据的质量可能因文档内容和结构而异。
  • PII 检测:可选的 PII 检测功能并非万无一失,可能无法捕获个人身份信息的所有实例。请谨慎使用此功能,并验证其针对特定用例的有效性。

未来方向

ChatGPT 检索插件为语义搜索和检索提供了一个灵活的解决方案,但总有进一步发展的潜力。我们鼓励用户通过提交新功能或增强功能的拉取请求来为项目做出贡献。显着的贡献可能会得到OpenAI积分的认可。

对未来方向的一些想法包括:

  • 更多矢量数据库提供程序:如果你有兴趣将另一个矢量数据库提供程序与 ChatGPT 检索插件集成,请随时提交实现。
  • 其他脚本:扩展可用于处理和上传来自各种数据源的文档的脚本范围将使插件更加通用。
  • 用户界面:开发用于管理文档和与插件交互的用户界面可以改善用户体验。
  • 混合搜索/TF-IDF 选项:使用混合搜索或 TF-IDF 索引的选项增强数据存储的更新插入功能可以提高插件对基于关键字的查询的性能。
  • 高级分块策略和嵌入计算:实施更复杂的分块策略和嵌入计算,例如嵌入文档标题和摘要、执行文档块和摘要的加权平均或计算文档的平均嵌入,可能会获得更好的搜索结果。
  • 自定义元数据:允许用户将自定义元数据(例如标题或其他相关信息)添加到文档区块,可能会在某些用例中改善检索到的结果。
  • 其他可选服务:集成更多可选服务,例如在嵌入文档之前汇总文档或预处理文档,可以增强插件的功能和检索结果的质量。这些服务可以使用语言模型实现并直接集成到插件中,而不仅仅是在脚本中可用。

我们欢迎社区的贡献,以帮助改进 ChatGPT 检索插件并扩展其功能。如果你有想要贡献的想法或功能,请向存储库提交拉取请求。

贡献

我们要感谢以下贡献者对代码/文档的贡献,以及在将各种矢量数据库提供程序与 ChatGPT 检索插件集成方面的支持: