栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

基于elasticsearch实现大规模向量检索

基于elasticsearch实现大规模向量检索

什么是向量搜索?

向量检索是基于向量之间的距离对已有documents进行相关性排序,和输入document向量距离越小则认为在某个维度上越相似会优先排在前面。
document可以是世界万物,比如图片,一段音视频,一段文字,一张人脸等,对于任何种document, 你都可以根据自己的需求对其进行模型训练,基于训练好的模型抽取特征进完成documents相似性检索。

已有向量搜索方案的对比以及优势

向量检索技术已经出现很久了,相关的技术方案也挺多的,比如:

  1. faiss
  2. Milvus

还有很多其他的, 就不一一列举了。
但是它们大多都是单独的专门为向量检索说下的框架。
我们知道目前最流行的搜索框架是elasticsearch, 有大量的用户群体,它们对传统的搜索提供了丰富的支持,而且性能以及架构都具有很好的可扩展性。
如果想引入向量检索的话,对于已经有搜索框架的公司来说,需要单独搭建一个独立的服务专门提供向量检索服务,如果想要和已有的搜索服务结合的话,那么用于一次请求就需要处理两次,两次的结果再进行整合过滤,这样就明显降低了请求的效率以及增加了资源利用率。
本文介绍的基于elaticsearch提供向量搜索的方案就可以解决这个问题,通过把向量搜索转成全文检索,这样向量检索和传统的检索完美的融合到一起,不仅提升了请求的效率还能提升物理资源的利用率。
不仅如此,还能更好的支持document向量的添加,更新或者删除操作。

基于elasticsearch方案的实现

  • 根据具体的需求选择合适的模型

    第一步就是明确自己的向量检索的需求,最核心的部分就是确定document相似的维度。
    document相似的维度又决定了用什么样的模型去抽取document的特征。
    比如普通图片相似搜索,我们需要的就是图片里面的物体的相似度, 那么我们就可以选择网上很多的基于imagenet数据集训练 好的cnn模型进行特征抽取,为什么呢?
    因为imagenet训练集就是针对的图片里面的物体进行训练的, 所以模型对物体的概念很清楚,它抽取的特征也能较好的反应图片中的各种物体。
    我们假设另外一种相似搜索的场景, 比如字体相似搜索,给定很多的单个字的字体图片, 你用上面的模型抽取特征可行么? 肯定不行,因为上面的模型对字体没有进行任何学习,没有任何概念
    如果我们想要完成字体相似搜索怎么办?
    那我们就需要自己重新训练字体识别模型,比如采集成百上前个字体,然后每个字体形成3500个汉字的图片,接着针对字体图片训练集训练一个分类模型,训练好之后, 这个模型就会理解不同字体的区别,
    抽取的特征也能在距离的远近上区别不通的字体, 相似的字体距离就更近,否则就更远。
    现在我们假设已经有了模型,那么下一步就是抽取documents的特征。

  • 基于模型针对自己的数据进行特征抽取

    一般来说一个document 对应一个特征,document 是你自己需要处理的数据, 比如图像搜索,是一张图片,音乐搜索是一段音频,字体搜索针对的是某种字体, 酒店风格搜索对应的是某个酒店的特征
    我们可以基于gpu对documents进行特征抽取, 如果documents很多的话我们也可以结合spark , hadoop on yarn (gpu) 多台GPU服务器快速的进行documents的特征抽取, 抽取之后的特征我们可以临时保存到hbase供后续处理使用。
    可以参考之前的博客:https://blog.csdn.net/jasstion/article/details/104178360

  • 对documents的特征进行处理然后形成codes

    这里我们定义一下几个关键的术语:
    subSpace: 向量经过均匀的切割形成的子向量成为subSpace
    subSpaceNum: 单个向量切割形成的字向量数目
    clusterNum: 每个字向量或者subSpace进行kmeans聚类定义的cluster number或者聚类结果中的center number
    code: 每个subSpace都会映射到一个数字, 这个数字表示的是和这个subSpace或者子向量距离最近的cluster center 向量
    codeSize: 表示code 的总的数量,类似于所有文档的去重之后的词汇量.
    我们可以用一些框架快速的对特征进行PQ, 比如:faiss
    faiss也提供了OPQ,效果要比PQ更好一些
    OPQ主要是在对原始向量切割之前,先对原始向量中的每个元素按照一定的算法进行重新的排序,通过这种方式尽量避免切分之后的各个subSpace的信息量相对差距太大,
    形成的codes也更加的准确。
    具体PQ以及OPQ的区别,大家可以参考论文,这里就不详细的描述了
    OPQ: Optimized Product Quantization
    现在我们已经完成了对特征的OPQ, 这样每个documenet都会对应一组codes。
    让我们以常用的图片的特征向量距离,加入cnn model 抽取的图片的特征是2048,我们可以定义subSpaceNum: 32,
    clusterNum: 256,那么最终的codeSzie会是多少?
    codeSize= subSpace256=32256
    特别注意的是每个subSpace的code都是小于256的数字,但是对于一个向量,不通位置的subSpace的code 即使一致也代表不通的code, 所以
    最后我们会对code进行简单的变化,每个code都会加上:_subSpaceIndex.
    比如: 原始向量: 0.1,0.3,0.5,0.01
    假设subSpaceNum:2, clusterNum: 256
    那么最终的codes变成:234_0, 234_1
    现在我们已经完成了documents的codes的映射,就剩下最后一步了, 提交到elasticsearch中。

  1. 将所有的documents提交到elasticsearch
    这一步比较简单了,直接多线程批量更新或者插入elasticsearch中对应documents的index中。

我们看下图像相似搜索的效果,图片库包含了六百多万普通的图片,然后输入一张图片检索,返回的相似的图片:

输入图片:

相似图片:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/307540.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号