在这里加入 ChatGPT 插件候补名单!
在此处查找可以访问 2018 年至 2022 年联合国年度报告的检索插件的示例视频。
ChatGPT 检索插件存储库为使用自然语言查询对个人或组织文档进行语义搜索和检索提供了灵活的解决方案。存储库分为几个目录:
目录 | 描述 |
---|---|
datastore |
包含使用各种矢量数据库提供程序存储和查询文档嵌入的核心逻辑。 |
examples |
包括示例配置、身份验证方法和特定于提供程序的示例。 |
models |
包含插件使用的数据模型,例如文档和元数据模型。 |
scripts |
提供用于处理和上载来自不同数据源的文档的脚本。 |
server |
包含主要的 FastAPI 服务器实现。 |
services |
包含用于分块、元数据提取和 PII 检测等任务的实用程序服务。 |
tests |
包括针对各种矢量数据库提供程序的集成测试。 |
.well-known |
存储插件清单文件和 OpenAPI 架构,用于定义插件配置和 API 规范。 |
本自述文件提供了有关如何设置、开发和部署 ChatGPT 检索插件的详细信息。
插件是专门为 ChatGPT 等语言模型设计的聊天扩展,使它们能够访问最新信息、运行计算或与第三方服务交互以响应用户的请求。它们解锁了广泛的潜在用例,并增强了语言模型的功能。
开发人员可以通过其网站公开 API 并提供描述 API 的标准化清单文件来创建插件。ChatGPT 使用这些文件,并允许 AI 模型调用开发人员定义的 API。
插件包括:
检索插件已经包含所有这些组件。在此处阅读聊天插件博客文章,并在此处查找文档。
这是 ChatGPT 的一个插件,可以对个人或组织文档进行语义搜索和检索。它允许用户通过以自然语言提出问题或表达需求,从其数据源(如文件、注释或电子邮件)获取最相关的文档片段。企业可以使用此插件通过 ChatGPT 将其内部文档提供给员工。
该插件使用 OpenAI 的嵌入模型生成文档块的嵌入,然后使用后端的矢量数据库存储和查询它们。作为一个开源和自托管的解决方案,开发人员可以部署自己的检索插件并将其注册到 ChatGPT。检索插件支持多个矢量数据库提供程序,允许开发人员从列表中选择他们喜欢的一个。
text-embedding-ada-002
FastAPI 服务器公开插件的端点,用于更新插入、查询和删除文档。用户可以通过按源、日期、作者或其他条件使用元数据筛选器来优化其搜索结果。该插件可以托管在任何支持 Docker 容器的云平台上,例如 Fly.io、Heroku 或 Azure 容器应用。为了使用最新文档更新矢量数据库,该插件可以使用传入的 webhook 到更新插入和删除端点,连续处理和存储来自各种数据源的文档。Zapier 或 Make 等工具可以帮助根据事件或计划配置 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 检索插件:
安装 Python 3.10(如果尚未安装)。
克隆存储库:
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
设置所需的环境变量:
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
访问 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 实例,请执行以下操作:
Name– 集群的唯一名称。该名称将成为用于访问此实例的 URL 的一部分。
Subscription Tier– 沙盒免费试用,或联系 hello@weaviate.io 以获取其他选项。
Weaviate Version- 默认为最新版本。
OIDC Authentication– 默认启用。这需要用户名和密码才能访问你的实例。
混合SaaS
如果你出于安全或合规性原因需要将数据保留在本地,Weaviate 还提供混合 SaaS 选项:Weaviate 在你的云实例中运行,但集群由 Weaviate 远程管理。这为你提供了托管服务的好处,而无需将数据发送到外部方。
Weaviate Hybrid SaaS是一个定制解决方案。如果你对此选项感兴趣,请与 hello@weaviate.io 联系。
自托管 – 使用 Docker 容器
要使用 Docker 设置 Weaviate 实例,请执行以下操作:
使用以下命令下载文件:
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
运行以启动 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_PORTWEAVIATE_HOSThttps://(wcs-instance-name).weaviate.networkhttps://my-project.weaviate.network/
对于自托管实例,如果你的实例不在 127.0.0.1:8080,请相应地进行设置。例如:和 。
WEAVIATE_HOSTWEAVIATE_PORTWEAVIATE_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_SIZENone
详细了解 Weaviate 中的批处理配置。
Zilliz 是一个托管的云原生矢量数据库,专为十亿级规模而设计。Zilliz提供了许多关键功能,例如:
在此处查找更多信息。
自托管与 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 数据库并更新环境变量。
然后,使用以下命令启动测试套件:
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 docker 撰写。
然后,使用以下命令启动测试套件:
pytest ./tests/datastore/providers/milvus/test_milvus_datastore.py
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 云版本,请提供 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>"
其他参数是可选的,可以根据需要进行更改。
对于自托管版本,请使用 Docker 容器或官方 Helm 图表进行部署。唯一必需的参数是指向 Qdrant 服务器 URL。
QDRANT_URL
例:
QDRANT_URL="http://YOUR_HOST.example.com:6333"
其他参数是可选的,可以根据需要进行更改。
一套集成测试验证了 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 云。
docker compose up -d
环境变量:
名字 | 必填 | 描述 | 违约 |
---|---|---|---|
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,首先需要使用以下命令设置必要的环境变量:
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 以保存对话中的信息:请参阅内存示例文件夹中的说明。
你可以从四个选项中进行选择,以验证对插件的请求:
无需身份验证:任何人都可以添加你的插件并在没有任何凭据的情况下使用其 API。如果仅公开不敏感或已公开的文档,则此选项适用。它不会为你的数据提供任何安全性。如果使用此方法,请将此 main.py 的内容复制到实际的 main.py 文件中。此处的示例清单。
HTTP 持有者:你可以使用秘密令牌作为标头来授权对插件的请求。此选项有两种变体:
用户级别(此实现的默认级别):将插件添加到 ChatGPT 的每个用户都必须在添加插件时提供持有者令牌。你可以使用你喜欢的任何工具或方法(例如 jwt.io)生成和分发这些令牌。此方法提供更好的安全性,因为每个用户都必须输入共享访问令牌。如果需要每个用户的唯一访问令牌,则需要在 main.py 文件中自行实现。此处的示例清单。
服务级别:任何人都可以添加你的插件并在没有凭据的情况下使用其 API,但你必须在注册插件时添加持有者令牌。安装插件时,你需要添加持有者令牌,然后从 ChatGPT 接收一个令牌,你必须将其包含在托管清单文件中。ChatGPT 将使用你的令牌代表添加它的所有用户授权对你的插件的请求。此方法对用户来说更方便,但可能不太安全,因为所有用户共享相同的令牌,并且不需要添加令牌即可安装插件。此处的示例清单。
OAuth:用户必须通过OAuth流程才能添加你的插件。你可以使用 OAuth 提供程序对添加插件的用户进行身份验证,并授予他们访问你的 API 的权限。此方法提供最高级别的安全性和控制,因为用户通过受信任的第三方提供商进行身份验证。但是,你需要在 main.py 文件中自行实现 OAuth 流,并在清单文件中提供必要的参数。此处的示例清单。
在选择最适合你的用例和安全要求的方法之前,请考虑每种身份验证方法的优缺点。如果你选择使用与默认方法(用户级别 HTTP)不同的方法,请确保在此处更新清单文件。
你可以将应用部署到不同的云提供商,具体取决于你的首选项和要求。但是,无论你选择哪个提供商,你都需要更新应用程序中的两个文件:openapi.yaml 和 ai-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
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"}}]}'
若要将 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
要将 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
部署应用的一些可能的其他选项包括:
创建应用后,请确保在此处更改插件清单文件中的插件 URL,在此处更改 OpenAPI 架构中的插件 URL,然后重新部署。
要安装开发人员插件,请按照以下步骤操作:
首先,通过将开发人员插件部署到你首选的托管平台(例如 Fly.io、Heroku 等)并更新清单文件和 OpenAPI 架构中的插件 URL 来创建你的开发人员插件。
转到 ChatGPT 并从模型选择器中选择“插件”。
从插件选择器中,滚动到底部并单击“插件商店”。
转到“开发自己的插件”并按照提供的说明进行操作。你需要输入部署插件的域。
根据你为插件选择的身份验证类型按照说明进行操作(例如,如果你的插件使用服务级别 HTTP,则必须粘贴访问令牌,然后将从插件流收到的新访问令牌粘贴到 ai-plugin.json 文件中并重新部署你的应用程序)。
接下来,你必须添加插件。再次转到“插件商店”,然后单击“安装未经验证的插件”。
按照提供的说明进行操作,这将要求你输入部署插件的域。
根据你为插件选择的身份验证类型按照说明进行操作(例如,如果你的插件使用用户级 HTTP,则必须粘贴持有者令牌)。
完成这些步骤后,你的开发者插件应该已安装并准备好在 ChatGPT 中使用。
为了使存储在矢量数据库中的文档保持最新,请考虑使用 Zapier 或 Make 等工具根据事件或计划配置插件 API 的传入 Webhook。例如,这可以让你在更新笔记或接收电子邮件时同步新信息。你还可以使用 Zapier 传输批处理现有文档的集合并将其上传到矢量数据库。
如果需要将这些工具中的自定义字段传递到插件,则可能需要创建调用数据存储的 upsert 函数的其他检索插件 API 端点,例如 。此自定义终结点可以设计为接受来自 Webhook 的特定字段并相应地处理它们。
upsert-email
若要设置传入的 Webhook,请按照以下常规步骤操作:
https://your-plugin-url.com/upsert
设置 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 检索插件旨在为语义搜索和检索提供灵活的解决方案,但它确实存在一些限制:
text-embedding-ada-002
text-embedding-ada-002
ChatGPT 检索插件为语义搜索和检索提供了一个灵活的解决方案,但总有进一步发展的潜力。我们鼓励用户通过提交新功能或增强功能的拉取请求来为项目做出贡献。显着的贡献可能会得到OpenAI积分的认可。
对未来方向的一些想法包括:
我们欢迎社区的贡献,以帮助改进 ChatGPT 检索插件并扩展其功能。如果你有想要贡献的想法或功能,请向存储库提交拉取请求。
我们要感谢以下贡献者对代码/文档的贡献,以及在将各种矢量数据库提供程序与 ChatGPT 检索插件集成方面的支持: