概述通过深度学习的神经网络模型,可以将图片、视频、语音、文本等非结构化数据转化为特征向量。除了结构化向量之外,这些数据往往还需要添加其他属性。例如人脸图片,可以添加性别、是否戴眼镜、拍摄时间等标签;对于文本,可以添加语言类型、语料分类、文本创建时间等标签。过去,人们通常将特征向量存储在结构化的标签属性表中。然而,传统数据库无法有效地搜索海量、高维的特征向量。这时候就需要一个特征向量数据库来高效地存储和检索特征向量。解决方案Milvus是一个向量搜索引擎,可以轻松实现海量向量的高性能检索。结合PostgreSQL等传统关系型数据库,用于存储Milvus对向量的唯一ID以及向量对应的属性。通过在PostgreSQL中进一步查询Milvus向量检索结果,可以快速得到混合查询结果。具体解决方案如下:特征向量存储上图中的蓝色实线代表了Milvus混合查询的特征向量存储过程。首先将源特征向量数据存入Milvus特征向量数据库,Milvus会返回每个源向量数据对应的ID。然后将每个特征向量及其标签属性的唯一ID存储在关系数据库中,如PostgreSQL,从而完成特征向量和标签属性的存储。特征向量检索上图中的橙色实线表示Milvus混合查询的特征向量检索过程。将需要查询的特征向量数据传入Milvus,Milvus会得到与搜索向量相似度最高的查询结果ID,使用结果ID在PostgreSQL中查询,最终得到搜索向量的混合查询结果。Milvus混合查询说到这里,你可能会有疑问,为什么不直接将特征向量和对应的属性存储在关系数据库中呢?接下来我们将使用Milvus(0.6.0版本)对ANN_SIFT1B中的1亿条数据进行测试,为您一一解答,参考链接。1.特征向量数据集本次实现的Mivus混合查询,特征向量是从ANN_SIFT1B中BaseSet文件中的1亿条数据(128维)中提取的。检索时从Query集中提取特征向量。假设ANN_SIFT1B数据集是人脸特征向量,并为每个向量加上性别、是否戴眼镜、图片拍摄时间的标签:#提取BaseSet文件中的一亿条数据,用用于导入Milvusvectors=load_bvecs_data(FILE_PATH,10000000)#随机生成向量的性别,是否戴眼镜,图片抓拍时间标签sex=random.choice(['female','male'])get_time=fake.past_datetime(start_date="-120d",tzinfo=None)is_glasses=random.choice(['True','False'])复制代码2.特征向量存储将一亿数据导入Milvus,返回的id是向量ID对应的唯一表示,在PostgreSQL中存储ids和向量标签,当然原始特征向量也可以存储在PostgreSQL中(可选):#将一亿原始数据导入Milvusstatus,ids=milvus.add_vectors(table_name=MILVUS_TABLE,records=vectors)#存储PostgreSQLsql中的ID和向量标签="INSERTINTOPG_TABLE_NAMEVALUES(ids,sex,get_time,is_glasses);"cur.execute(sql)复制代码3.特征向量检索将要搜索的向量传入Milvus。设置TOP_K=10和DISTANCE_THRESHOLD=1(可根据需要修改),TOP_K表示搜索和查询向量相似度最高的前10个结果,DISTANCE_THRESHOLD表示查询向量和搜索结果向量之间的距离阈值。ANN_SIFT1B采用欧式距离计算。设置参数后,Milvus会返回查询结果的id,并在PostgreSQL中使用这些id进行查询,最终混合查询结果。#根据query_location从Queryset中提取要搜索的vectorvector=load_query_list(QUERY_PATH,query_location)#将要搜索的vectorsstatus传入Milvus,results=milvus.search_vectors(table_name=MILVUS_TABLE,query_records=vector,top_k=TOP_K)#使用Milvus返回的results.ids在PostgreSQL中查询sql="select*fromPG_TABLE_NAMEwhereids=results.ids;"复制代码时,对1亿条数据进行混合查询时,Milvus特征向量搜索仅需70ms。在PostgreSQL中查询Milvus搜索结果的id不到7毫秒。总的来说,使用Milvus特征向量数据库,可以快速实现向量和结构化数据的混合查询。如果仅使用传统的关系型数据库进行向量查询,不仅难以存储大规模的向量数据,而且无法完成高性能的特征向量检索。MilvuseigenvectorsearchtimePostgreSQLsearchidstime70ms1ms~7ms总结本演示基于Milvus实现了混合查询。对于1亿个特征向量的数据集,混合查询时间不超过77ms。并且基于Milvus易管理、易使用的特点,参考Milvus混合查询方案提供的工具,可以轻松实现向量和结构化数据的混合查询,更好的支持业务需求.Milvus正在构建一个在线开发者社区。如果你对Milvus的技术讨论和试用感兴趣,欢迎加入我们的Slack频道,在群里交流。
