ChatGPT Retrieval Plugin(ChatGPT 检索插件)是一款基于 ChatGPT 的开源插件,主要作用是暴露一个 API 供 ChatGPT 访问和理解用户数据库中的文档资料,相当于对 ChatGPT 灌输特定领域的专业知识,赋予其解答相关专业问题的能力。这无疑拓宽了 ChatGPT 的应用领域,使其不仅仅只是个陪聊的 NPC。你觉得 ChatGPT Retrieval Plugin 在未来有哪些具体的应用场景?不妨在评论区交流和探讨。
ChatGPT 插件的定义
插件是 ChatGPT 聊天功能的扩展,使 ChatGPT 能够根据用户的请求来访问最新讯息、运算、与第三方服务交互等。插件解锁了广泛的潜在应用场景并增强了 ChatGPT 的功能。开发人员可以通过公开 API 并提供描述 API 的标准文档来创建插件。ChatGPT 将根据这些文档调用开发人员定义的 API。
一个插件应包含如下内容:1 个 API;API 架构(OpenAPI JSON 或 YAML 格式);定义插件相关的元数据(JSON 文件)。
ChatGPT 检索插件
检索插件是一个 ChatGPT 插件,可以实现对个人或组织机构的文档进行语义搜索和检索。用户可以通过提出问题或着用自然语言表达需求来从他们私有的数据源(如文件、笔记或电子邮件)中获取相关度最高的文档片段。企业也可以使用此插件通过 ChatGPT 向员工提供内部文档。
此插件使用 OpenAI 的 text-embedding-ada-002 嵌入模型生成文档块,然后在后端使用矢量数据库对其进行存储和查询。作为一个开源和自营(self-hosted)的解决方案,开发人员可以部署自己的检索插件并将其注册到 ChatGPT。检索插件支持多个矢量数据库提供商,允许开发人员自行选择。
FastAPI 服务器公开插件的 API endpoint 以更新、查询和删除文档。用户可以按来源、日期、作者或其他条件使用元数据过滤器来筛选搜索结果。该插件可以托管在任何支持 Docker 容器的云平台上,例如 Fly.io、Heroku 或 Azure Container Apps。为了使矢量数据库能够一直更新最新的文档,此插件通过 webhooks 和 endpoints 来连续地处理和存储来自各种数据源的文档。可以利用 Zapier 或 Make 等工具根据事件或计划配置 webhook。
记忆功能
检索插件的一个显着特点是它能够为 ChatGPT 提供记忆功能。通过使用插件的 upsert endpoints,ChatGPT 可以将对话中的片段保存到矢量数据库中以供以后参考(仅当用户需要保存时)。通过记住和检索以前对话中的信息,记忆功能可以提供上下文信息更丰富的聊天体验。
检索插件允许 ChatGPT 搜索用户的矢量数据库,然后将最匹配的结果添加到 ChatGPT 会话中。这意味着此插件不会收到任何外部影响,其主要风险在于数据授权和隐私。开发人员在将数据添加到检索插件时,需要确认相关授权,并且确认数据将会在用户的 ChatGPT 会话中出现。授权方式有很多种。您可以选择其中之一来确保插件的安全性。
API Endpoints
检索插件是在 FastAPI 的基础上构建的。FastAPI 是一种基于 Python 的 Web 框架,用于构建 API。FastAPI 可以轻松开发、验证和记录 API endpoints。FastAPI 的优点之一是使用 Swagger UI 自动生成交互式 的 API 文档。当 API 在本地运行时,位于 <local_host_url>/docs(例如 <http://0.0.0.0:8000>/docs)的 Swagger UI 可用于与 API endpoint 进行交互、测试其功能并查看请求和响应模型。
该插件公开了以下 endpoints,用于从向量数据库中更新、查询和删除文档。所有请求和响应都采用 JSON 格式,并且需要一个有效的 token 作为授权 header。
- /upsert: 允许上传一个或多个文档并将其文本和元数据存储在矢量数据库中。这些文档被分成大约 200 token 大小的块,每个块都有一个唯一的 ID。请求体中需要包含文档列表,每个文档都有一个 text 字段,以及可选的 ID 和元数据字段。元数据字段可以包含以下可选子字段:source、source_id、url、created_at 和 author。返回值是插入文档的 ID 列表(如果未提供初始 ID,则生成一个 ID)。
- /upsert-file:允许上传单个文件(PDF、TXT、DOCX、PPTX 或 MD)并将其文本和元数据存储在矢量数据库中。该文件被转换为纯文本并切分成包含 200 token 的块,每个块都有唯一的 ID。返回值是一个列表,其中包含插入文件的 ID。
- /query:允许使用一种或多种自然语言进行查询,并且可以指定元数据过滤器。请求体中需要包含查询指令列表,每个查询指令都有一个 query、可选的过滤器和 top_k 字段。过滤器字段应包含以下子可选字段:source、source_id、document_id、url、created_at 和 author。top_k 字段指定给定查询返回多少结果,默认值为 3。返回值是一个对象列表,每个对象包含相关度最高的文档块列表,以及响应的文本、元数据和相似度分数。
- /delete: 允许使用 ID、元数据过滤器或 delete_all 标志从向量数据库中删除一个或多个文档。要求请求体中至少包含以下参数之一:ids、filter 或 delete_all。ids 参数应该是要删除的文档 ID 列表。filter 参数应包含以下可选子字段:source、source_id、document_id、url、created_at 和 author。delete_all 参数应该是一个布尔值,指示是否从向量数据库中删除所有文档。返回值是一个布尔值,指示删除是否成功。
请求和响应模型的详细规范和示例可以在 OpenAPI 架构中看到,或者在本地运行应用程序并访问 http://0.0.0.0:8000/openapi.json。请注意,OpenAPI 架构仅包含 /query,因为这是 ChatGPT 需要使用的唯一功能,ChatGPT 需要通过 /query 根据用户的查询指令来检索用户的相关文档数据。如果开发人员还希望 ChatGPT 能够记忆对话内容以供日后使用,可以使用 /upsert 将对话中的片段保存到矢量数据库中。
原文链接:https://zhuanlan.zhihu.com/p/616819907