目录

  • VectorRetrieval
  • github
  • 落地场景
  • 背景
  • 框架
  • 检索模型——暴力搜索、倒排索引
  • 检索模型——kd-Tree、Annoy
  • KD-Tree:
  • Annoy:
  • 检索模型——LSH
  • 检索模型——PQ
  • 检索模型——NSW、HNSW
  • NSW:
  • HNSW:
  • result:
  • 检索框架
  • Elastic Search
  • Faiss
  • Milvus
  • 业界的落地情况
  • Milvus
  • Faiss
  • Milvus
  • Faiss


VectorRetrieval

github

仿真代码:https://github.com/KATEhuang920909/VectorRetrieval

落地场景

落地场景:获取相似实体的需求都可以使用到

  • 图片搜索:以图搜图,通过图片检索图片。具体应用如:车辆检索和商品图片检索等。
  • 视频搜索:针对视频信息的实时轨迹跟踪。
  • 文本搜索:基于语义的文本检索和推荐,通过文本检索近似文本。
  • 语音搜索:声纹匹配,音频检索。
  • 文件去重:通过文件指纹去除重复文件。

背景

  • 高维及海量数据的存储:在常用的图片或视频处理场景中,向量数据通常在亿级别。
  • 高召回:为保证检索效果,精度召回率通常要求 95% 以上。
  • 高性能:为保证用户体验,向量检索的响应要求毫秒级。

框架

go支持向量检索的es库 向量搜索框架_聚类

检索模型——暴力搜索、倒排索引

  • BM25+semantic
  • 倒排索引+BM25/semantic
    特点:维护成本低
    缺陷:耗时,占用内存大,准确率有待提升

检索模型——kd-Tree、Annoy

go支持向量检索的es库 向量搜索框架_聚类_02

KD-Tree:

  • 构造:超平面去划分维度空间,方差最大的维度取中值
  • 检索:递归访问KD-Tree,回溯计算距离
  • 参数:返回个数K

go支持向量检索的es库 向量搜索框架_算法_03

Annoy:

构造:聚类数为2的Kmeans
检索:递归访问Annoy-Tree,回溯计算距离
参数:返回个数K、树的深度

检索模型——LSH

go支持向量检索的es库 向量搜索框架_算法_04

局部敏感哈希

通过hash映射,将向量集映射到不同的hash桶中。高维空间的两点若距离很近,那么设计一种哈希函数对这两点进行哈希值计算,使得他们哈希值有很大的概率是一样的,若两点之间的距离较远,他们哈希值相同的概率会很小。

  • 构造:通过hash函数映射,将向量集映射到不同的hash桶中
  • 检索:hash函数映射到相应hash桶,对桶内样本求距离
  • 余弦距离:H(V) = sign(V·R)
  • 参数:hash函数个数、向量片段个数
  • 特点:1.将高维数据降维到低维数据,内存耗用少;一定程度上保持原始数据的相似度不变。
  • 缺陷:对于非均匀分布的向量空间效率和准确率较差。
  • 改进:

向量切片

检索模型——PQ

go支持向量检索的es库 向量搜索框架_go支持向量检索的es库_05

针对N个训练样本,假设样本维度为128维,我们将其切分为4个子空间,则每一个子空间的维度为32维,然后我们在每一个子空间中,对子向量采用K-Means对其进行聚类(图中示意聚成256类),这样每一个子空间都能得到编码N*4。这样训练样本的每个子段,都可以用子空间的聚类中心来近似,对应的编码即为类中心的ID
搜索过程:比对目标向量与各个聚类中心的距离,选择出与目标向量最为接近的若干个聚类中心。接下来获取这些聚类中心所对应聚类中的所有向量及其子段,分别计算每个子段各向量与目标向量的距离,将这些子段的距离求和相加

  • 构造:通过 聚类方法将向量集合划分为多个聚类,并记录各个聚类的中心点的坐标
  • 检索:比对聚类中心向量,选择对应簇的样本计算距离
  • 参数:聚类簇个数、向量片段个数
  • 特点:1.内存耗用更小;2.数据动态增删更灵活
  • 缺陷:对于高维向量搜索效果一般。
  • 优化:降维或者在PQ乘积量化之前,增加了一个粗量化,采用K-Means进行聚类

检索模型——NSW、HNSW

go支持向量检索的es库 向量搜索框架_go支持向量检索的es库_06

跳表

go支持向量检索的es库 向量搜索框架_人工智能_07

HNSW

NSW:

  • 构造:向图中逐个插入点,查找到与这个全新点最近的m个点,连接全新点到m个点的连线。
  • 检索:贪婪算法
  • 参数:连线个数m

HNSW:

  • 构造:基于跳表构建多层图网络
  • 检索:从上往下依次查询,每一层达到局部最大值后跳转
  • 参数:连线个数m、跳转概率
  • 特点:较高的搜索效率;较高准确度;
  • 缺陷:构建索引慢;占用内存大;

result:

go支持向量检索的es库 向量搜索框架_信息检索_08

检索框架

Elastic Search

  • API
  • 可扩展
  • 7.2+: match all 查询类似于向量检索,暴力搜索
  • 向量检索插件

Faiss

  • 开源库
  • 提供多种检索方法
  • 可存在内存和磁盘中
  • C++实现,提供Python封装调用。
  • 大部分算法支持GPU实现

Milvus

  • API
  • 基于 Faiss等索引库之上
  • 多模态检索
  • 动态数据管理

业界的落地情况

Milvus

  • 贝壳找房:智能客服、户型检索
  • 爱奇艺:视频检索
  • 搜狗:新闻检索、文本辅助标注
  • 丁香园:文章检索、社区讨论检索、商品检索

Faiss

  • 58同城:职位检索

Milvus

  • 贝壳找房:智能客服、户型检索
  • 爱奇艺:视频检索
  • 搜狗:新闻检索、文本辅助标注
  • 丁香园:文章检索、社区讨论检索、商品检索

Faiss

  • 58同城:职位检索