本文为 Jina AI Co-founder & CTO 王楠,在 2021 年 12 月 25 日 Python Meetup Beijing 的分享实录,内附 Demo 及 PPT 地址。
阅读本文,你将对神经搜索 (Neural Search)、Jina 及 Finetuner,有较为全面的了解。
神经搜索:用非结构化数据搜索非结构化数据
结构化数据, 以常用的数据库为代表,其所有信息都是定义好的,可以直接进行快速搜索。
与结构化数据相对应的,即非结构化数据, 这类数据没有直接可供搜索的结构化信息。
据 MongoDB 统计,我们身边 80%~90% 的数据,都属于非结构化数据,所以,非结构化数据的搜索,是一个非常重要的问题。
非结构化数据本身包含丰富的信息,但这些信息必须借助工具抽取和加工。得益于深度学习及人工智能技术的迅猛发展,过去十几年间,产生了很多可以用于抽取非结构化数据信息的深度学习模型。
一方面,各种分类模型可以精确地给视频、照片等非结构化数据打标签;另一方面,还可以 利用深度学习模型,把非结构化的数据表示为向量。
利用深度学习模型处理非结构化数据的两种思路
在向量空间中,相似数据会聚合在一起,不同数据则会分散在空间的不同位置。根据用户查询的数据,在向量空间中寻找近邻, 就可以实现非结构化数据的搜索。
神经搜索特指使用非结构化数据搜索非结构化数据,深度学习模型和向量索引是神经搜索的重要组成部分。
神经搜索系统包括两个关键要素:深度学习模型及向量索引,这两点也是神经搜索系统和传统搜索系统的区别。
神经搜索系统的应用,包括以图搜图、以文字搜图、Question-Answering(问答机器人)、照片去重、海量标签分类等。
神经搜索系统的应用场景
由于神经搜索是一个全新的领域,缺少系统搭建的统一工具,开发者通常需要同时了解包括分布式系统、深度学习框架以及网络服务方面的知识,为此我们设计了 Jina。
Jina:简单易用的云原生神经搜索框架
Jina 是一款主打易用性及云原生的神经搜索框架, 于 2020 年 4 月在 GitHub 开源,截至目前已收获 13.1k Star(最新数据)。
Jina 多次登上了 GitHub 全球 Trending 排行榜第一名,最近还被收录进了 2021 年度全球最受欢迎的 10 个 Python 库榜单,目前已有 200 多名贡献者。
访问 Jina GitHub
访问 Python 库榜单
Jina 中包括三个重要概念:Document、Executor 和 Flow。
Document:封装非结构化数据;Executor:实现神经搜索系统所需要的不同模块;Flow:将 Executor 连接起来
Document 是 Jina 中一个基础的数据类型, 可以帮助开发者方便地描述非结构化数据,相当于 Numpy 中的 ndarray 或 PyTorch 中的 Tensor。一组 Document 构成一个 DocumentArray,开发者可以像使用 Python 原生的 list 一样使用 DocumentArray。
Executor 对应神经搜索系统中的不同模块, 实现对数据处理的核心功能。Flow 则对应整套神经搜索系统, 将多个 Executor 连接起来,构建成一套完整的搜索系统。
Jina 不仅可以方便地在本地调试,也可以快速的以服务形式进行部署。Jina 原生提供 Swagger-UI,方便代码调试。
Jina 中的 Debug 工具操作便捷,可直接可视化所有请求和结果
此外,将 Jina 部署到 Kubernetes 系统中也非常简单, 仅用几行代码,就可以完成部署。
开发者如果自己设计神经搜索系统,往往需要自行维护一套工具链,包括构建模型预测服务、维护向量索引等,Jina 通过将整个流程封装成一个完整系统,提供统一的接口,极大降低了神经搜索系统的开发成本。
Finetuner:一行代码解决模型调优
用 Jina 从零搭建一套神经搜索系统,约需要 1~2 天,但是对模型进行调优,往往需要 1-2 周甚至更长时间。
用 Jina 搭建一套神经搜索系统,约有 87.5% 的时间用于调优
为了帮助开发者更快、更简洁地调试神经搜索系统, 我们设计了 Finetuner。
用 Finetuner 对模型进行调优,共包括三个步骤:
1、载入数据
2、载入模型(下图示例中使用的是 PyTorch resnet50 模型)
3、将模型和数据传给 Finetuner 的 fit() 函数,Finetuner 就可以自动对模型进行微调
Finetuner:一行代码搞定调优过程
Finetuner 主要包含三个模块,分别与炼丹师们训练模型的三个步骤一一对应:Labeler 对应数据准备,Tailer 对应模型搭建,Tuner 对应模型训练。
Finetuner 支持 PaddlePaddle、PyTorch 及 Keras 三个框架
Labeler
Labeler 在实际中使用较少
Labeler 主要包含两部分:前端页面 (UI) 和存储 (Data Storage)。
Tailer
Tailer 的主要任务是准备模型
因为我们接触到的大部分模型,并不是为搜索场景设计的,无法把非结构化数据,直接转换成向量表示,所以我们需要使用 Tailer。
Tailer 的输入是一个任意模型,输出是一个新模型,这个新的模型可以计算非结构化数据的向量表示。
除此之外,Tailer 模块中还提供一些实用功能,如开发者可以指定冻结模型中的某些层。此外 Tailer 还提供可视化网络结构的 display 函数。
Tuner
Tuner 对应模型训练的步骤
Tuner 的核心包括四个部分:dataset、sampler、miner、loss。
loss: 实现了搜索场景下,常用的两个损失函数 Triple loss 和 Siamese loss。
dateset 和 sampler 则主要是针对搜索场景,生成模型训练需要的数据样本。
dataset 对数据进行统一封装,sampler 会在统一数据结构的基础上,对数据进行各种操作,生产出训练模型时需要的三元组或二元组。
今天我们主要介绍了 Jina 和 Finetuner。在 Jina 生态中,Jina 解决开发者搭建神经搜索系统的问题,Finetuner 解决搭建过程中模型微调的问题。另一个我们没有介绍的重要成员是 Jina Hub。
Jina Hub 是一个 Executer 的分享平台,开发者可以方便地在 Jina Hub 上,和团队或社区分享自己的 Executer。
答现场问:开发者们问 Jina
1、 Jina 是否考虑围绕具体场景,进行产品化?
Jina 本身是一个工具,而不是一个产品,我们希望赋能开发者,由开发者根据实际场景进行产品化。
每个开发者都有自己熟悉的产品和业务,具备专业领域的知识,这些东西并不是通用的知识,也很难迁移到别的地方。
我们希望开发者能通过 Jina 或 Finetuner,搭建定制化搜索系统,从而构建针对具体场景的产品。
2、用 Jina 搭建的神经搜索系统,能否兼容通用搜索倒排索引的搜索?
是的,传统搜索完全可以和 Jina 融合。
以 DocQA 为例,第一步是拉取候选,通过向量索引把所有相似段落找出来。第二步是用计算量更大的深度学习模型,从段落里把需要的答案找出来。
在第一步做召回时,可以用基于向量索引的方法,也可以基于传统的 TF-IDF 或 bm25。因此在 Jina 里使用传统倒排索引做召回,是完全可以的。
3、用 Jina 搭建一套神经搜索系统,需要多少计算资源?
用 Jina 搭建神经搜索系统需要的资源,完全取决于业务需求,如数据量、稳定性要求、要求的响应时间等。
单一数据类型,如果数据量在百万以内,CPU 完全应付得了;如果数据量比较大,比如要搜索上亿个视频,且要求毫秒级别的反馈,那就必须要用 GPU。
4、利用 Jina 能否搜索 PDF 中的具体内容?
可以的,我们已经有企业客户利用 Jina,搭建公司内部资源的搜索系统,其中就包括 PDF 搜索。客户可以实现通过文字直接搜索相关语义内容,或通过文字匹配 PDF 中的图片。
2022 Python Meetup,重磅来袭
2022 年,Python Meetup 将在上海、杭州、长沙等地召开,Jina 也将为各地开发者带来最新的神经搜索技术分享,以及最炫酷的周边礼品。
欢迎关注 Jina AI,了解最新线下活动进展~
本次活动的相关链接:
主要的 Jina 仓库:get.jina.ai
Finetuner 官网:finetuner.jina.ai
本次分享的 Demo:hub.jina.ai
参与社区贡献:github.com/jina-ai/
本次分享 PPT:Here
加入 Jina AI
Jina AI 刚刚完成了 3000 万美金 A 轮融资,我们希望利用这笔资金,吸引更多相信开源力量、相信神经搜索美好未来的小伙伴加入,共同为全球开源社区做贡献。
了解岗位详情,请访问 https://jina.ai/careers/