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

3 月 23 日,OpenAI 又投出了一枚重磅炸弹:为 ChatGPT 推出插件系统!
此举意味着 ChatGPT 将迎来“App Store”时刻,也就是围绕它的能力,形成一个开发者生态,打造出基于 AI 的“操作系统”!
插件系统将为 ChatGPT 带来质的飞跃,因为借助于插件服务,它可以获取实时的互联网信息、调用第三方应用(预定酒店航班、点外卖、购物、查询股票价格等等) 。
ChatGPT 是一个无比聪明的大脑,而插件会成为它的眼睛、耳朵、手脚、甚至于翅膀,能力惊人,未来不敢想象!
官方目前提供了两个插件:

  • 一个网页浏览器 。利用新必应浏览器的 API,实时搜索互联网内容,并给出答案和链接
  • 一个代码解释器 。利用 Python/ target=_blank class=infotextkey>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??
【ChatGPT 开源了第一款插件,都来学习一下源码吧!】存储插件清单文件和 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 


推荐阅读