摘要: 本系列文章分为三部分,第一部分主要讲基本概念、背景、选型及服务的整体架构;第二部分主要讲针对低延时、高吞吐需求,我们对Milvus部署方式的一种定制;第三部分主要讲实现数据更新、保证数据一致性,以及保证服务稳定及提高资源利用率做的一些事情。

1.名词解释

Milvus[1]:一种基于Faiss[5],NMSLIB[6] 和 Annoy[7]的相似特征向量搜索引擎。

向量:即特征向量,是对客观世界物体特征的数值表示;比如我们用RGB(红绿蓝)三元色来表示物体的颜色,那么对于一个像素点,我们可以用数组[255,255,255]表示白色,用数组[0,0,0]表示黑色,这里[255,255,255]、[0,0,0]可以认为是物体该像素点的特征向量。

向量搜索:也叫最邻近搜索,是指按照一定的相似/距离算法[9-12],从指定集合中搜索(计算)出与输入的某个向量最相似的N个向量(即topN)。

2.背景

随着计算机技术及机器学习技术的发展,特征向量作为一种对多媒体数据(复杂文本、语音、图片)的描述方式,逐渐成熟起来,而向量搜索(向量相似计算)也逐渐成为一种通用的需求。

近些年,贝壳找房业务迅猛发展,在搜索、推荐、图谱、智能客服等业务场景下,对向量搜索提出了比较强的需求。

面对多业务的需求,结合对业界已有工具的调研,最终选择了milvus做为底层引擎,建设了一个通用的向量搜索平台,以解决 向量相似计算 这个共性的问题。

3. 技术选型

在技术选型阶段,我们调研了业界已经比较成熟的工具,如facebook的faiss[5]、微软的SPTAG[8],以及国内发起的开源项目Vearch[13],Milvus[1]。具体对比见表1,2。

Vearch和Milvus属于同类型产品,对比faiss和SPTAG的优势在于,后两者为开发库,不能开箱即用,在生产环境中使用涉及更多的开发、维护成本。Milvus和Vearch是两款基于现有的开发库,开箱即用的应用,在实现基本的相似计算功能的基础上,围绕服务整体易用性、部署、稳定性等方面做了更多工作。另外,Milvus对比Vearch,在社区活跃度、支持度上具有更明显的优势。基于以上的调研,综合考虑各方面的成本,我们选择Milvus作为底层引擎。

表1:Milvus对比FAISS、SPTAG[3]

表2:Milvus对比Vearch(2019.11数据)

4. Milvus引擎简介

如图1所示,Milvus基于Faiss、Annoy等比较成熟的开源库,并针对性做了定制,支持结构化查询、多模查询等业界比较急需的功能;Milvus支持cpu、gpu、arm等多种类型的处理器;同时使用mysql存储元数据,并且在共享存储的支持下,Milvus可以支持分布式部署。

图1 Milvus架构[1]

5.服务整体架构

图2 服务整体架构如图2所示,整体架构分三层,网关层、应用层和引擎层。

网关层:主要负责服务整体的访问控制和监控报警,并对外暴露api,属于应用的通用能力,这里不详细讲。

应用层:应用层的定位是面向使用方,提供通用的向量搜索能力,同时屏蔽掉底层引擎的细节;应用层主要分为读模块、写模块以及管理模块。写模块定位是数据更新,抽象出了一组通用的写入api,以实现对数据的更新,并保证数据更新的一致性。读模块定位是支撑向量搜索,适配用户的查询请求,转换成具体引擎的查询,最后把结果转换成通用格式;读模块借助读缓存,来提高有重复查询�