引用文章[7]的开篇,来表示什么是: 向量化搜索
人工智能算法可以对物理世界的人/物/场景所产生各种非结构化数据(如语音、图片、视频,语言文字、行为等)进行抽象,变成多维的向量。
这些向量如同数学空间中的坐标,标识着各个实体和实体关系。我们一般将非结构化数据变成向量的过程称为 Embedding,而非结构化检索则是对这些生成的向量进行检索,从而找到相应实体的过程。
非结构化检索本质是向量检索技术,其主要的应用领域如人脸识别、推荐系统、图片搜索、视频指纹、语音处理、自然语言处理、文件搜索等。
随着 AI 技术的广泛应用,以及数据规模的不断增长,向量检索也逐渐成了 AI 技术链路中不可或缺的一环,更是对传统搜索技术的补充,并且具备多模态搜索的能力。
向量检索的应用场景远不止上面提到的这些类型。
如下图所示,它几乎覆盖了大部分的可以应用AI的业务场景。
1 facebook – Faiss
github: https://github.com/facebookresearch/faiss
tutorial: https://github.com/facebookresearch/faiss/wiki/Getting-started
向量化检索开山鼻祖的应用,Faiss库是由 Facebook 开发的适用于稠密向量匹配的开源库,支持 c++ 与 python 调用。
Faiss 支持多种向量检索方式,包括内积、欧氏距离等,同时支持精确检索与模糊搜索,篇幅有限嘛,我就先简单介绍精确检索相关内容。
Faiss 主要特性:
· 支持相似度检索和聚类;
· 支持多种索引方式;
· 支持Python和C++调用;
Faiss 使用场景:
最常见的人脸比对,指纹比对,基因比对等。
2 国产 – Milvus
文章[1][8]提及,
Milvus 是一款开源的特征向量相似度搜索引擎Milvus 使用方便、实用可靠、易于扩展、稳定高效和搜索迅速。
Milvus能够很好地应对海量向量数据,它集成了目前在向量相似性计算领域比较知名的几个开源库(Faiss, SPTAG等),通过对数据和硬件算力的合理调度,以获得最优的搜索性能。
Milvus 提供完整的向量数据更新,索引与查询框架。Milvus 利用 GPU(Nvidia)进行索引加速与查询加速,能大幅提高单机性能。除了提供针对向量的近实时搜索能力外,Milvus 可以对标量数据进行过滤。
随着数据和查询规模的增加,Milvus 还提供了集群分片的解决方案,支持读写分离、水平扩展、动态扩容等功能,实现了对于超大数据规模的支持。
目前,Milvus 是一个单节点主从式架构(Client-server model)的服务器,最高可以支持 TB 级特征数据的存储和搜索服务。对于有更大数据规模或者高并发需求的用户,可以使用目前尚在实验阶段的集群分片中间件 Mishards 进行部署。
Milvus索引类型:
· IVF:集成 Faiss IVF、Milvus 团队自研 IVF
· Graph:Milvus 团队实现的 NSG 索引、集成 Faiss hnsw
· Tree & Graph:集成微软 SPTAG
· IVF & Graph:Milvus 团队实现
可支撑的应用场景
2.1 图像视频检索
深度学习模型最开始就是用来对图像、视频等进行处理,通过训练可以精准的提取图片、视频中的特征从而对图片、视频进行分类,打标签,以图搜图,以图搜视频等等。Milvus凭借其出色的性能和数据管理能力,可以支持各种深度学习模型,实现对海量图片和视频的高性能分析检索能力。
· 图片搜索
· 图片去重
· 视频去重
· 以商品搜商品
2.2 智能问答机器人
传统的问答机器人大都是基于规则的知识图谱方式实现,这种方式需要对大量的语料进行分类整理。而基于深度学习模型的实现方式可以彻底摆脱对语料的预处理,只需提供问题和答案的对应关系,通过自然语言处理的语义分析模型对问题库提取语义特征向量存入Milvus中,然后对提问的问题也进行语义特征向量提取,通过对向量特征的匹配就可以实现自动回复,轻松实现智能客服等应用。
· 语义提取
· 个性化推荐
· 语料分析和推荐
2.3 赋能传统向量计算
在传统的数据处理领域也存在大量向量计算的场景,使用传统的计算方式需要消耗大量的算力而Milvus凭借先进的算法可以在同等算力资源下将向量数据处理能力提高至少两个数量级。
· 分子结构相似性分析
· 分子药理分析
· 药物分子虚拟筛选
2.4 音频数据处理
利用深度学习模型对音频数据进行分析和处理能够大大提高语音识别的准确率,而其核心也是对相关音频切片进行向量化处理并且通过向量距离的计算来判断其表达的含义,因此,Milvus在语音、音乐等音频数据处理领域的也有丰富的应用。
· 个性化音乐推荐
· 音乐去重
· 声纹验证
· 语音识别
· 智能语音小助手
· 智能翻译机器人
3 国产 – Jina- 神经网络搜索
文章[15]提及,
Jina AI是一家专注基于深度学习模型搭建搜索引擎技术的开源商业公司,打造下一代的开源神经搜索引擎开发平台,通过深度学习和人工智能搜索能力的结合做到全内容搜索,无论是文本、图片、语音、视频、源代码、元数据亦或是文件都可以称为搜索引擎输入源进行全域全方位搜索。
由AI界大名鼎鼎的肖涵老师带领的开源团队创始和开发,秉承了肖涵老师团队优秀的开源文化,其团队名下的Bert as server 和Fashion-Mnist 在GitHub的star数都高达8000,故本次的Jina质量可见一斑。
Jina以通用性为目标,几乎可以搜索任何内容形式(例如文本,图像,视频,音频);它的目标是在AI生产中,利用现代软件基础架构并以最佳工程实践进行构建。旨在易于使用,针对多个平台,架构和用例进行优化。
Jina也有着自身的Yaml语法,可通过API和仪表盘迅速的搭建出一个属于自己的云端系统。同时他最大的亮点就是其可以在多个平台和架构上实现任意类型的大规模索引和查询。
Jina Hub
· 90+ 的 Pod 镜像可供使用
· 支持最先进的AI模型
· 支持多种向量数据库
· 支持多种Evaluation 的方式
4 阿里达摩院 – Proxima & 蚂蚁金服- ZSearch
4.1 阿里达摩院 -Proxima
文章[7]提及,
Proxima 是阿里巴巴达摩院自研的向量检索内核。目前,其核心能力广泛应用于阿里巴巴和蚂蚁集团内众多业务,如淘宝搜索和推荐、蚂蚁人脸支付、优酷视频搜索、阿里妈妈广告检索等。
同时,Proxima 还深度集成在各式各类的大数据和数据库产品中,如阿里云 Hologres、搜索引擎 Elastic Search 和 ZSearch、离线引擎 MaxCompute (ODPS) 等,为其提供向量检索的能力。
Proxima 是通用化的向量检索工程引擎,实现了对大数据的高性能相似性搜索,支持 ARM64、x86、GPU 等多种硬件平台,支持嵌入式设备和高性能服务器,从边缘计算到云计算全面覆盖,支持单片索引十亿级别下高准确率、高性能的索引构建和检索。
向量检索的算法繁多且缺乏通用性,应对不同数据维度和分布有不同算法,但总体可归为三类思想:
空间划分法:空间划分法以 KD-Tree、聚类检索为代表,检索时快速定位到这些小集合,从而减少需要扫描的数据点的量,提高检索效率。
空间编码和转换法:空间编码和转换法,如 p-Stable LSH、PQ 等方法,将数据集重新编码或变换,映射到更小的数据空间,从而减少扫描的数据点的计算量。
· 邻居图法:邻居图法,如 HNSW、SPTAG、ONNG 等,通过预先建立关系图的方法,去加快检索时的收敛速度,减少需要扫描的数据点的量,以提高检索效率。
向量检索发展多年,并逐渐成为非结构化检索的主流方法,但仍存在了不少的技术挑战和问题。
业务场景:标签+向量的联合检索
在大多数业务场景下,需要同时满足标签检索条件和相似性检索的要求,如查询某些属性条件组合下相似性的图片等,我们称这种检索为“带条件的向量检索”。
目前,业内采用多路归并的方式,即分别检索标签和向量再进行结果合并,虽可以解决部分问题,但多数情况下结果不甚理想。主要原因在于,向量检索无范围性,其目标是尽可能保证 TOPK 的准确性,TOPK 很大时,准确性容易下降,造成归并结果的不准确甚至为空的情况。
业务场景: 语音/图像/视频检索
以图片搜索为例,我们先以离线的方式对所有历史图片进行机器学习分析,将每一幅图片(或者图片里分割出来的人物)抽象成高维向量特征,然后将所有特征构建成高效的向量索引,当一个新查询(图片)来的时候,我们用同样的机器学习方法对其进行分析并产出一个表征向量,然后用这个向量在之前构建的向量索引中查找出最相似的结果,这样就完成了一次以图片内容为基础的图像检索。
业务场景: 文本检索
地址查询,如果我们想在标准地址库中搜索“杭州阿里巴巴”的地址,在仅使用文本召回的时候,几乎没办法找到相似的结果,但是我们如果通过对海量用户的点击行为进行分析,将点击行为加上地址文本信息合并形成高维向量,这样在检索的时候就可以天然的将点击率高的地址召回并排列在前面。
业务场景: 搜索/推荐/广告
在电商领域的搜索/推荐/广告业务场景中,常见的需求是找到相似的同款商品和推荐给用户感兴趣的商品,这种需求绝大多数都是采用商品协同和用户协同的策略来完成的。
新一代的搜索推荐系统吸纳了深度学习的 Embedding 的能力, 通过诸如 Item-Item (i2i)、User-Item (u2i)、User-User-Item (u2u2i)、User2Item2Item (u2i2i) 等向量召回的方式实现快速检索。
算法工程师通过对商品的相似和相关关系,以及被浏览和被购买的用户行为的抽象,将它们表征成高维向量特征并存储在向量引擎中。这样,当我们需要找一个商品的相似商品(i2i)时,就可以高效快捷地从向量引擎中检索出来。
4.2 蚂蚁金服- ZSearch
文章[5]提及,
ElasticSearch(简称 ES)是一个非常受欢迎的分布式全文检索系统,常用于数据分析、搜索、多维过滤等场景。
ElasticSearch 广泛应用于蚂蚁金服内部的日志分析、多维分析、搜索等场景。当我们的 ElasticSearch 集群越来越多,用户场景越来越丰富,我们会面临越来越多的痛点:
· 如何管理集群;
· 如何方便用户接入和管理用户;
· 如何支持用户不同的个性化需求;
为了解决这些痛点,我们开发了 ZSearch 通用搜索平台:
· 基于 K8s 底座,快速创建 ZSearch 组件,快捷运维,故障机自动替换;
· 跨机房复制,重要业务方高保;
· 插件平台,用户自定义插件热加载;
· SmartSearch 简化用户搜索,开箱即用
4.3 ZSearch + Proxima => ProximaEngine
文章[5]提及,
proxima 是阿里内部达摩院开发的一个通用向量检索引擎框架,类似与 facebook 开源的 faiss;支持多种向量检索算法。
写入流程
扩展 ElasticSearch 本身的 InternalEngine,在写完 Lucene 以后,先写 Proxima 框架,Proxima 框架的数据通过 mmap 方式会直接刷到磁盘,一次请求的最后,Translog 刷入磁盘。就是一次完整的写入请求了。至于内存中的 segment,ElasticSearch 会异步到达某个条件是刷入磁盘。
Query 流程
查询的时候,通过 VectorQueryPlugin,先从 Proxima 向量检索引擎中查找 topN 的向量,获得 seqNo 和相似度,再通过构造 newSetQuery 的 FunctionScoreQuery,去 join 其他查询语句。这里的数字型 newSetQuery 底层是通过 BKDTree 去一次遍历所得,性能还是很高效的。
5 京东 – vearch
github:https://github.com/vearch/vearch
文档:https://vearch.readthedocs.io/zh_CN/latest/
文章[16]提及,vearch 是一个分布式向量搜索系统,可用来存储、计算海量的特征向量,为 AI 领域的向量检索提供基础系统支撑与保障。该系统能够广泛地应用于图像, 音视频和自然语言处理等各个机器学习领域。
vearch 基于 Facebook AI 研究院开源的 Faiss 实现,但 Faiss 本身只是一个能够单机运行的支持各种向量检索模型的机器学习算法基础库,不支持分布式、实时索引和检索,同时也不支持标量字段的存储和索引等等。
因此结合在实际应用中的需求,我们在 faiss 的基础上研发了 vearch,提供了类似 ElasticSearch 的灵活易用的 RESTFul API,可以方便地对表结构及数据进行管理查询。
为了提升检索召回及排序的质量,在实际应用场景中,通过量化,Hash 及图等检索模型召回后得到的 TopN 候选集,需要进一步比对计算其原始向量距离。因此在实际生产环境及成熟产品应用中,庞大原始向量的存储是不能逃避开的一个问题。
如下 GIF 图清晰地展示了 vearch 的总体用法及其内部结构。vearch 的使用主要分为三个步骤。 首先,创建数据库和空间,然后导入数据,最后可以搜索自己的数据集。
vearch 主要的应用场景有:
· 图像/视频/音频检索和去重;
· 安防领域视频智能监控
· 文本相似度计算;
· 推荐,搜索召回及排序;
案例 1:人脸识别底层特征向量存储、计算引擎,如图 6 所示,目前已经应用到京东之家业务中,为业务过滤掉了 40%左右的不良数据。
案例 2:vearch 可提供实时在线相似性图片搜索服务,比如在电商平台可以用来搜同款。详细流程如图 7 所示:
案例 3:海量重复图片去重,在目前已经应用到了京东重复铺货检测,如图 8 所示:
案例 4:可应用于搜索,推荐系统。比如视频网站推荐系统将各种特征 embedding 成向量后,利用向量相似性检索做召回,召回模型细节如图 9 所示:
6 应用案例一:贝壳找房 – 向量检索框架的选择
6.1 技术选型
在技术选型阶段,我们调研了业界已经比较成熟的工具,如facebook的faiss、微软的SPTAG,以及国内发起的开源项目Vearch,Milvus。
具体对比见表1,2。Vearch和Milvus属于同类型产品,对比faiss和SPTAG的优势在于,后两者为开发库,不能开箱即用,在生产环境中使用涉及更多的开发、维护成本。Milvus和Vearch是两款基于现有的开发库,开箱即用的应用,在实现基本的相似计算功能的基础上,围绕服务整体易用性、部署、稳定性等方面做了更多工作。
另外,Milvus对比Vearch,在社区活跃度、支持度上具有更明显的优势。基于以上的调研,综合考虑各方面的成本,我们选择Milvus作为底层引擎。
6.2 服务框架
Milvus基于Faiss、Annoy等比较成熟的开源库,并针对性做了定制,支持结构化查询、多模查询等业界比较急需的功能;Milvus支持cpu、gpu、arm等多种类型的处理器;同时使用mysql存储元数据,并且在共享存储的支持下,Milvus可以支持分布式部署。
贝壳找房整体架构分三层,网关层、应用层和引擎层。
7 应用案例二:58同城向量检索平台架构实践
为了满足业务上对向量检索的需求,降低学习成本,提高开发效率,我们开发并上线了向量检索平台。我们支持了Faiss算法库,实现了几种常用索引的全量索引构建、实时增量索引、实时在线检索,旨在帮助用户更快更好的使用海量高维向量相似性检索功能。
平台基于Facebook的Faiss进行向量索引的构建,目前支持三种比较具有代表性的索引全量构建,分别是IndexFlatL2(基于欧氏距离的暴力索引)、IndexIVFFlat(加聚类的倒排索引,支持欧式距离和向量内积两种距离算法)、IndexIVFPQ(加聚类、加量化的倒排索引),并且支持分布式索引(支持大规模数据的分布式索引构建)。
分布式索引构建Faiss本身只是一个能够单机运行的向量检索基础算法库,不支持分布式。在海量数据的场景下,向量数据集达到百亿级及以上时,单机构建索引会产生如下问题:
1、 单机处理数据量,构建索引耗时较长
· 2、 构建的索引,可能达到百GB以上甚至达到TB级别,会超过单机物理节点的内存资源上限针对以上问题,向量检索平台支持了分布式索引的构建,具体实现如下图所示:
8 拓展阅读
8.1 google – ScaNN
google-research/scanngithub.com/google-research/google-research/tree/master/scann
ICML 2020 论文“Accelerating Large-Scale Inference with Anisotropic Vector Quantization”中,我们通过关注如何压缩数据集向量来实现快速近似距离计算解决这一问题,并提出了一种新的压缩技术,与以前的工作相比,这项技术可以大大提高准确率。我们在近期开源的向量相似性搜索库 (ScaNN) 中应用了这项技术,与其他向量相似性搜索库相比,我们的性能高出两倍(在 ANN-Benchmarks 上测得)。
各向异性向量量化使 ScaNN 可以更好地估计前 k 个 MIPS 结果中的内积,从而实现更高的精度。在来自 ANN-Benchmarks 的 glove-100-angular 基准测试中,ScaNN 的性能优于其他 11 个经过精心调整的向量相似性搜索库,在给定的精度下,每秒处理的查询数量大约是第二快的库的两倍。*
Recall@k 是最近邻搜索精度的常用指标,用于衡量算法返回的 k 个近邻中存在的真正的最近 k 个近邻的比例:ScaNN(上面的紫色线)在速度-精度权衡的各个方面始终展现出优异的性能
我们已经将 ScaNN 在 GitHub 上开源。ScaNN 可以通过 Pip 直接安装,并具有用于 TensorFlow 和 Numpy 输入的接口。
原文链接:
揭开 ScaNN 的神秘面纱:高效的向量相似性搜索blog.csdn.net/jilrvrtrc/article/details/107969603
9 「繁星」:快手搜索在向量检索方向的探索和实践
2021-11-30更新;参考:
「繁星」:快手搜索在向量检索方向的探索和实践mp.weixin.qq.com/s/1ed9BDZKzjQIgDScyxpbHw
「繁星」向量检索平台
· 性能挑战:开源算法不一定代表最优性能!需要不断自研提升开源算法性能吞吐进而降低服务部署成本,吞吐 = 金钱;
· 易用性挑战:开源算法通常是不易用的。开源算法功能比较单一太底层,没有提供面向业务的功能,重复建设成本高;
· 超大规模挑战:如何设计合理的在线、离线架构支持超大规模数据集(百亿)、超高并发(百万级qps)等特殊业务场景需求,对工程能力挑战极大;
· 综合检索场景挑战:单纯向量检索能力已不能满足实际业务中复杂场景检索需求,更高级的结构化检索能力成为工业界新的发展方向,融合”非结构化数据向量检索”+”结构化数据布尔检索”的综合检索实现,才能满足类似于(Brand = Adidas) and (Pirce in [100-200]) and (Location = Beijing) and (Ann dis : top 100) results 等相关性限制条件下的复杂场景向量检索需求;
· 算法及超参挑战:实际生产中业务场景极度复杂,向量检索算法数十种,但没有’银弹’算法适用所有场景,每种算法又有众多的超参影响精度和性能,如何合理选择算法及其并使用合理参数来达到最优的效果是一项十分复杂的工程,需要不断的积累与探索;
· 接入效率挑战:需求到线上服务需要多长时间?在业务需求很多的情况下,效率往往会成为使用方更大的关注点;
向量检索平台具备丰富的“算法特性”、“功能特性”及”架构特性”,我们主要选择几个主要特性进行展开介绍:
参考文献
1 向量搜索 产品调研报告 jina AI 以及milvus
2 Milvus 向量搜索引擎开源了!
3 还在手撸faiss算法库?不如试试这个开源向量搜索系统,单机十亿好轻松
4 京东开源的分布式特征储存检索系统vearch理解
5 蚂蚁金服 ZSearch 在向量检索上的探索
6 贝壳商业化算法中台架构实践
7 比 Faiss 更胜一筹?达摩院自主研发的向量检索引擎 Proxima 首次公开!
8 Milvus 是一款开源的特征向量相似度搜索引擎
9 基于Milvus的向量搜索实践(一)
10 基于Milvus的向量搜索实践(二)
11 基于Milvus的向量搜索实践(三)
12 58同城向量检索平台架构实践
13 万变不离其宗:用统一框架理解向量化召回
14 完全解析 | 使用Faiss进行海量特征的相似度匹配
15 创立半年融资近千万美元,「Jina AI」打造下一代开源神经搜索引擎开发平台
16 京东分布式向量检索系统 vearch 如何一招搞定海量特征存储与计算?