开发者独立搭建一个跨模态搜索应用有多难?
00 背景介绍
你是否也有这样的时刻,不管是每天工作要处理的 PDF 文档,还是打发时间看的小视频,偶尔突然回忆涌上心头,凭借模糊的记忆却总是难以准确找到它。对于开发者来说,不论是随手拍摄的照片到大红大紫的元宇宙 3D 模型,我们总是希望能用一种更加智能的方式去检索到它,而不是通过打标签这种费时耗力的笨办法。
如何对非结构化数据进行搜索,正在成为一个越来越重要的问题。人工神经网络模型在解决非结构化数据搜索问题上扮演着重要的角色,但是从零开始搭建这样的神经搜索系统,通常需要极高的开发和维护成本。而 Jina 框架就是为解决这一问题而生。
01 神经搜索
什么是神经搜索?神经搜索听起来是个非常抽象的名词,最经典的场景就是各大电商平台里非常普遍的以图搜图,这个功能背后就是一整套神经搜索系统。第二个被广泛应用的场景是客服问答机器人。当消费者发出一个问题,系统会根据问题去找到相似的问题,再把对应的答案返回给消费者。如果这个路径不通,它则会根据问题去对应的知识库里查找对应的答案,再把反馈给消费者。这也是神经搜索的经典应用。
神经搜索 vs 传统搜索
传统的图片搜索,更多是把图片和对应的文字标签进行关联,以实现从文本到图片的搜索。而神经搜索能几乎像人类一样“看懂”图片里面到底有什么。使用神经搜索实现一个文本到图片的跨模态搜索应用时,不需要像传统搜索把所有图片都打上标签,才能开始搜索。利用神经搜索,只需要把图片进行索引,就可以直接用文字去对图片进行搜索,这适用于很多场景。免去了给图片打标签的步骤,所以提质、降本、增效就是神经搜索较传统搜索最突出的特点。总的来说,神经搜索系统就是基于深度学习、神经网络和向量索引的信息检索技术,它尤其适合于去处理多模态和跨模态的非结构化数据。
在过去的十几年间,解决非结构化数据的方式有两种:
方法之一:通过手动或半自动地方式,由人类数据标注师给非结构化数据,如图片、视频等打上标签,把它们转化为结构化数据,再进行搜索;
方式之二:利用神经网络模型,让向量表示数据,并在向量空间中进行相似度搜索。而神经搜索的关键就在于用神经网络模型得到数据的向量表示,接着将向量表示存储起来,再利用这些向量表示去查找相似的数据。因此,如果你要想从零开始搭一套生产级别的神经搜索,这还是相当有挑战的。
02 神经搜索的挑战
第一大块的挑战来自于整个系统的复杂性,尤其是整个工具链的复杂性。搭建系统的第一步就是要用神经网络模型对数据进行向量表示。那么到底选择什么样的神经网络模型?选择了对应的模型之后,又该怎样去训练呢?
另外一方面,除了生成向量之外,还需要对非结构化数据进行一些处理。比如说想要去搜索视频,就需要对视频帧进行抽取,抽取出帧之后,需要对每一帧去做 OCR 识别,或者去做一些物体识别地处理。也可以把视频中的音频信息抽取出来,识别出人声部分,转化成文字等等。每一个步骤都涉及到很多不同的工具,而每增加一个工具都会让整个系统的复杂程度指数级增长。
第二大块的挑战是向量检索部分。因为把数据转换成向量之后,需要把这些向量存储起来,否则每次都需要重新生成向量。除此之外,在查找时也需要保证性能——在庞大的向量空间里高速高效地找到这些相似的数据。以及各种各样的向量数据库、向量索引技术等等。当一个开发者想要从零搭建一套神经搜索系统,这些技术细节都是需要了解学习的。
第三大块是非常关键的部署部分。如果想在线上去搭建一套神经搜索系统,部署在生产环境里面是非常复杂的,云原生的技术是必须要了解的。简单来说,神经搜索系统是一个完整的流水线,要保证不同的模块能在不同的环境里面,独立并且分布式地运行。比如说可能有一个很古老的模型,它还在用 Tensorflow 1.0,而其它模型已经都在 Tensorflow 2.x 上面运行,这时就需要保证每一个模型所在的模块都有自己独立的运行环境。
另一方面需要保证每一个模块可以独立地进行缩放。比如说问答机器人的例子里面,有专门的模块对用户的问题进行分类,判断问题是否可以回答。因为用户可能发一些和知识库完全没关系的信息,需要拒绝回答,这是一个简单的文本二分类问题。因此不需要去使用复杂的 GPU 机器来进行运算,完全可以在一台 CPU 机器上进行运算。但与此同时,流水线需要对这个问题进行编码,计算它的向量表示,需要用到非常复杂的 Bert 模型,涉及到大量的运算量,必须要在 GPU 上面跑。
那么,如何保证同一个流水线上不同的模块能在不同的硬件环境上跑?这也是神经搜索需要应付的挑战。更关键的是,神经搜索提供的搜索功能,只属于整个庞大产品体系中一个非常基础的组件。在你日常使用或自己搭建的网站里,搜索框只是网站中一部分功能,网站的核心还是在于网页其它的功能部分。而对搜索的要求就是——这个搜索框能够稳定高效地运转。
而以上这些功能恰好是云原生生态体系要去解决的问题。首先,在云原生体系里面,微服务和容器化两个技术结合起来,可以保证每一个模块独立的运行,而且以分布式的形式去运行,可以独立地进行缩放,并且不会有版本依赖的问题。其次,云原生里的编排系统,恰好对应了神经搜索系统所需要的流水线,使用一套完整的编排系统来保证流水线的持续稳定的运转,并且能保证整个流水线的弹性的伸缩。最后,系统出错时,我们不仅需要知道哪里出了故障,而且要知道出了什么样的故障。而云原生框架能提供对 IT 系统状态的监测与诊断的一体化方案,包含可观测的方法,如何去追踪日志,如何报警,如何捕获故障的原因。如果想要搭一套神经搜索系统,就必须要具备一定的云原生知识。
综上所述,要搭一套神经搜索系统,需要开发者知道深度学习技术,需要知道向量索引技术,同时也需要知道云原生技术,在这三个技术背后都有非常庞大的技术栈,以及一套不断在更新地生态体系。
03 神经搜索与 Jina 全家桶
基于这三个非常庞大,并且在快速变化的系统上,想要去构建一套神经搜索系统,这个复杂度是可想而知的。而 Jina 就是为了解决这一问题而生。我们希望为开发者来提供一个统一的工具集,提供端到端的神经搜索开发体验。基于这个工具集,开发者不需要去担心,这些不断迭代更新的技术栈,通通都交给 Jina 来负责。开发者只需要关心如何利用神经搜索来实现自己业务上的需求。
到目前为止,我们提供了七个不同的工具,接下来我将结合开发者在搭建神经搜索系统的完整流程,来分享这七个工具会如何具体帮助到每一个开发者。
1. DocArray
搭建一个神经搜索系统,第一步往往是对数据进行封装,因为多模态数据往往是非结构化的,所涉及的数据内容非常丰富,只有进行封装后才能保证在整个系统里顺利流转,并作对应处理。这时你就可以用到 DocArray,DocArray 是针对非结构化数据的一个 Python 库,在 DocArray 里面我们定义了整个 Jina 生态的基础数据类型,同时 DocArray 提供了在本地去搭建神经搜索所需要的各种函数,开发者可以在本地快速搭建起一套神经搜索系统。
2. Jina Hub
如果开发者有自己的模型,可以使用自己的模型来对数据进行向量表示。如果开发者希望使用一些现成的模型,这时你就可以使用 Jina Hub。在 Jina Hub 中我们提供了各种各样数据处理模块,也包括很多预训练的模型,可以快速对图片、文字、声音、视频进行向量化处理。当然这些向量化处理大多是基于一些预训练的模型。
3. Finetuner
如果你希望进一步提升搜索系统的准确率、召回率,这时你就需要对模型进行一些微调,我们提供了 Finetuner 的工具,Finetuner 针对神经搜索这个场景,封装了不同深度学习框架的模型、损失函数和训练过程,你只需要告诉 Finetuner,你希望做一个什么样的神经搜索系统,你的数据是什么样的,我们就可以使用你的数据,针对你选择的任务,对你的模型,对相应的模型进行微调。比方说 Finetuner 对 CLIP 模型的召回效果提升了 200%。
4. Jina
有了 DocArray、Hub 和 Finetuner 之后,你就可以在本地搭起了一套神经搜索系统,下一步你大概会希望把这套系统部署在云端,以服务化的形式向外提供服务。这时你就需要使用 Jina,Jina 全面地支持了云原生的整个生态,你可以使用 Jina 直接去导出 kubernetes 的部署文件,同时也提供了各种云原生的监控和日志追踪的接口。而且 Jina 可以对外提供各种不同的网络接口,无论你是希望以 Websocket 还是 Restful,还是 gRPC 的形式,甚至是 GraphQL 的形式,Jina 都完全支持,Jina 也会为你的服务去生成自动生成 Open API 定义。
5. JCloud
如果说开发者并不了解云原生的知识,但还是希望在云端有一套非常稳定的神经搜索系统,那么你就可以选择 JCloud。JCloud 是针对云端部署提供的一套托管服务,开发者只需要对 Flow 做一些简单的定义,就可以快速把这套神经搜索系统在 JCloud 上部署。
6. Jina NOW
Jina NOW 是一套无代码和低代码的开发环境。Jina NOW 主要针对的是非开发者的用户,或者说非 Python 开发者,对神经搜索了解非常有限,但是想在整个产品里面快速地把神经搜索系统搭建起来的用户。在 Jina NOW 里,用户只需要去选择对应的神经搜索任务,提供对应数据,就可以搭建一套完整的神经搜索系统。Jina NOW 会使用你的数据对模型进行微调,并且定义好整个神经搜索系统的架构,在云端来使用 JCloud,为你的神经搜索系统进行一个云端的部署。
7. CLIP-as-service
我们观察到很多用户用 Jina 去计算数据的向量表示,前面我们也提到在神经搜索系统里面非常重要的一点就是,用到人工神经网络模型,对数据进行向量表示的计算。因此我们就针对用户的使用场景,专门去开发了 CLIP-as-service,使用 CLIP-as-service 你就可以快速地搭建起这样一套向量计算的服务。
刚才我们提到的在神经搜索系统搭建过程中遇到了各种各样的问题,下面我们看看 Jina 全家桶是怎么样解决的。首先针对 AI 模型,Jina Hub 提供了各种各样的针对各种不同模态数据的模型,同时也提供了各种垂直领域对数据进行处理的模块。比如说你有一个 PDF 文件,希望把 PDF 文件里面的图片、文字、图表分别抽取出来,预处理的模块就可以直接在 Jina Hub 上面找到。除此之外,Jina Hub 是一个开放的平台,不仅 Jina 官方会维护一些模块,同时社区的小伙伴也都在积极地把自己的开发模块贡献到 Jina Hub 上面去。
如果你对 Jina Hub 上面提供的预训练模型不满意,可以使用 Finetuner 提供的 SaaS 服务,对模型进行微调。在整个微调的过程中,你也不需要去了解模型在神经搜索场景下,需要用到什么损失函数,需要怎样生成样本,这些细节都通通交给 Finetuner 为你解决。
针对向量索引这部分的问题,DocArray 本身提供了原生的向量索引实现,如果对原生的向量索引实现不满意的话,DocArray 同时也提供了对其它向量数据库的集成。我们在保证效率的前提下,让用户以最小的成本,从一个本地的神经搜索系统快速地扩展到一个云端的搜索系统。在本地如果数据量小的时候,可以使用一些 DocArray 提供的原生向量搜索的实现;当数据量达到 e 级别时候,就可以去考虑使用一些这种更专业的向量数据库,或者更成熟的向量数据库来保证数据的一致性。
针对就是线上部署的问题,前面提到了整个 Jina 全家桶在设计的时候,我们是全面拥抱云原生和分布式系统的。当你在本地开发完一套神经搜索系统,希望迁移到云端时,使用 Jina 就可以快速获得 Kubernetes 的部署配置,同时你可以开箱即用地去使用 Prometheus、Grafana 的监控工具。
总的来说,Jina 全家桶就是这样一套完整的神经搜索的框架,我们希望是帮助到开发者去高效地,以最低的成本去开发一套神经搜索系统,让大家能够在自己的搜索系统里面越来越多的应用到 AI 模型。
04 神经搜索与多模态应用
最后想和大家分享,两个利用 AI 去生成艺术作品的新项目,一个是 DALL·E FLOW,另外一个是 DISCOART。
Repo:Github.com/jina-ai/discoart
Repo:Github.com/jina-ai/dalle-flow
DALL·E FLOW 是一套 AI 模型的服务,输入是一个文本,输出时,模型会根据这句话来生成一幅高度对应的图片。这张图所对应的输入文本就是两个古希腊的学者在做结对编程。
DISCOART 和 DALL·E FLOW 非常近似,但是区别在于它不仅能够接受文字输入,而且它能接受图片输入,它能够结合这两者来生成一张图片。
AI 生成技术的本质是用人工神经网络模型来表示数据,同时表示不同模 s 态之间数据的关系。在拿到输入之后,在预测的时候,实际上是利用这些人工网络模型去生成一些和输入相似的数据。比如说输入了文本,整个系统就会去生成一些和文本相似的数据。需要注意的是这些数据并不是以前存在的数据,而是模型生成出来的新数据,因此这些模型根本不会存储数据,它存储的是不同模态之间,从文字到图片数据的关系。
那么,这和神经搜索有什么关系?从差异上讲,神经搜索实际上是用了人工神经网络模型去表示数据,把数据表示成向量,存储这些向量,再去查找对应的数据。但是 AI 生成技术是用人工神经网络来表示这个数据的关系,它并不会去表示数据本身,同时它会把数据的关系以模型的权重的形式存储起来,最后根据这些关系去生成数据。
这两个应用——神经搜索和 AI 生成技术,它们背后之所以都可以用 Jina 全家桶来搭建,本质的原因在于,Jina 全家桶提供了一套针对多模态数据的处理工具,使用 Jina 的全家桶,我们可以非常有效地来表示多模态的数据,同时我们可以对这些多模态数据进行非常便捷地操作和处理。借此希望起到抛砖引玉的作用,启发大家去构建属于自己的多模态、跨模态的应用!
版权声明: 本文为 InfoQ 作者【Jina AI】的原创文章。
原文链接:【http://xie.infoq.cn/article/9e32f9e3e8ec8c199bca2e67d】。文章转载请联系作者。
评论