3 月 23 日,OpenAI 又投出了一枚重磅炸弹:为 ChatGPT 推出插件体系!

此举意味着 ChatGPT 将迎来“APP Store”时间,也便是围绕它的才能,构成一个开发者生态,打造出基于 AI 的“操作体系”!

插件体系将为 ChatGPT 带来质的腾跃,由于借助于插件服务,它能够获取实时的互联网信息、调用第三方运用(预订酒店航班、点外卖、购物、查询股票价格等等)。

ChatGPT 是一个无比聪明的大脑,而插件会成为它的眼睛、耳朵、四肢、甚至于翅膀,才能惊人,未来不敢幻想!

官方现在供给了两个插件:

  • 一个网页浏览器。运用新必应浏览器的 API,实时搜索互联网内容,并给出答案和链接
  • 一个代码解释器。运用 Python 解释器,能够解决数学问题、做数据分析与可视化、编辑图片、剪辑视频等等,还支撑下载处理后的文件

别的,OpenAI 还开源了一个知识库检索插件 chatgpt-retrieval-plugin ,这个插件通过自然语言从各种数据源(如文件、笔记、邮件和公共文档)检索信息。有了开源代码后,开发者能够布置自己的插件版别。

幻想一下,假设我供给了一个“Python 知识库插件”,以所有官方文档作为数据源,那以后有任何 Python 运用上的问题,我就只需问询 ChatGPT,然后它调用插件并解析数据,最终回来给我准确的答案。这将节约大量的时间!

不只如此,你还能够用书本作为数据源,打造出“西游记知识库”、“红楼梦知识库”、“百科全书知识库”、“个人图书馆知识库”,等等;以专业范畴的论文与学术期刊为数据源,创造出一个专家助手,从此写论文查材料将无比轻松;以苏格拉底、乔布斯、马斯克等名人的材料为数据源,创造出人格化的个人顾问……

作为榜首个开源的 ChatGPT 插件,chatgpt-retrieval-plugin 项目一经发布,就登上 Github 趋势榜榜首,发布仅一周就获得 11K stars。

这个项目完全是用 Python 写的,不管是出于学习编程的目的,还是为了将来开发其他插件作学习,这都值得咱们花时间好好研讨一下。

接下来,我将共享自己在阅览项目文档和源码时,收获到的一些信息。

首要,该项目含 Python 代码约 3 K,规划不算大。项目结构也很清晰,目录如下:

目录 描绘
datastore 包含运用各种向量数据库供给程序存储和查询文档嵌入的中心逻辑
examples 包含装备示例、身份验证办法和面向程序供给方的示例
models 包含插件运用的数据模型,例如文档和元数据模型
scripts 存放实用的脚本,用于处理和上传来自不同数据源的文件
server 存放主要的 FastAPI 服务端完成
services 包含用于任务(如分块、元数据提取和 PII 检测)的实用服务
tests 包含各种向量数据库供给程序的集成测验
.well-known 存储插件清单文件和 OpenAPI 格式,定义插件装备和 API 规范等信息

除掉示例、测验、装备文件等内容外,最主要的三个目录如下:

datastore 数据存储

数据源的文本数据会被映射到低维度向量空间,然后存储到向量数据库中。官方已供给 Pinecone、Weaviate、Zilliz、Milvus、Qdrant、Redis 这几种数据存储方案的示例。别的,有几个 pull requests 想要加入 PostgreSQL 的支撑,大概率将来会集入。

这儿运用了笼统工厂设计模式 ,DataStore 是一个笼统类,每种数据存储库是具体的完成类,需要完成三个笼统办法:

(1)_upsert(chunks: Dict[str, List[DocumentChunk]]) -> List[str] 办法,接纳一个字典参数,包含有 DocumentChunk 目标列表,将它们刺进到数据库中。回来值为文档 ID 的列表。

(2)_query(queries: List[QueryWithEmbedding]) -> List[QueryResult] 办法,接纳一个列表参数,包含被 embedding 的查询文本。回来一个包含匹配文档块和分数的查询结果列表。

(3)delete(ids: Optional[List[str]] = None, filter: Optional[DocumentMetadataFilter] = None, delete_all: Optional[bool] = None, ) -> bool 办法,依据 id 和其它过滤条件删去,或许悉数删去。回来操作是否成功。

值得注意的是,该目录下的factory.py 模块运用了 Python 3.10 新引进的 match-case 语法,紧跟着 Python 社区的新潮流呢~

server 服务端接口

这个目录只有一个main.py 文件,是整个项目的发动入口。它运用了现在主流的 FastAPI 框架,供给了增删改查的几个 API,别的运用 uvicorn 模块来发动服务。

  • /upsert-file 接口,用于上传单个文件,将其转换为 Document 目标,再进行新增或更新
  • /upsert 接口,上传一系列的文档目标,用于新增或更新
  • /query 接口,传入一系列的文本条件,转成 QueryWithEmbedding 目标后,再从向量数据库查询
  • /delete 接口,依据条件删去或许悉数删去数据库中的数据

在这几个接口中,增改删功用主要是给开发者/维护者运用的,ChatGPT 只需调用插件的查询接口。因而,代码中还创建了一个“/sub”子运用,只包含/query 接口,供给给 ChatGPT 调用。

别的,它运用 FastAPI 的 mount 办法挂载了一个“/.well-known”静态文件目录,暴露了关于本插件的基本信息,例如称号、描绘、作者、logo、邮箱、供给给 OpenAPI 的接口文档等等。

services 任务处理办法

这个目录下是一些通用的函数,比方下面这些:

(1)chunks.py 文件包含了将字符串和 Document 目标分割成小块、以及为每个块获取嵌入向量的函数。

(2)file.py 文件供给了从上传的文件中提取文本内容及元数据的函数。现在支撑解析的文件类型包含 PDF、纯文本、Markdown、Word、CSV 和 PPTX。

(3)openai.py 文件包含两个函数:get_embeddings 函数运用 OpenAI 的 text-embedding-ada-002 模型对给定的文本进行嵌入。get_chat_completion 函数运用 OpenAI 的 ChatCompletion API 生成对话。

整个而言,这个插件的几个接口功用很清晰,代码逻辑也不算杂乱。中心的文本嵌入操作是借助于 openai 的 Embedding 接口,文本分块信息的存储及查询操作,则是依赖于各家向量数据库的功用。

YouTube 上有博主手画了一张示意图,字体虽潦草,但我们能够意会一下:

ChatGPT 开源了第一款插件,都来学习一下源码吧!

他这个视频 值得引荐一看,由于 up 主不只简明地介绍了插件的作业原理,还手把手演示怎么布置到 Digital Ocean、怎么修改装备、怎么调试,而且他有 ChatGPT 的插件权限,能够将自己布置的插件接入 ChatGPT,现场演示了知识库插件的运用!

现在,关于 ChatGPT 插件的介绍、开发及装备等材料还比较少,毕竟是新推出的。但是,申请 waitlist 的个人和安排已经不计其数了,一旦敞开运用,林林总总的插件一定会像 Python 社区丰富的开源库相同,也将极大扩展 ChatGPT 的生态。

最终,插件 chatgpt-retrieval-plugin 的官方文档是最为具体的一手材料,引荐我们研讨一番。