向量搜索简介

2024-09-21 database

简介

Vector Embeddings 向量嵌入是自然语言处理 NLP 的基本概念,作为单词、句子、文档、图像、音频、视频的数字表示,以此表示对象的语义以及上下文信息。

用来保存嵌入向量的数据库就被称为向量数据库,为了加速查询,一般会引入向量索引,可以准确进行相似性搜索和模式识别。

距离度量

判断向量之间的距离,决定了空间划分、候选节点和查询节点的距离和排序等等。

kNN/ANN

k-Nearest Neighbors Algorithm, kNN 最早在 1967 年的 Nearest neighbor pattern classification 中提出,其尝试解决的是,给定一个向量数据集和查询向量 Q,计算 Q 与数据集中所有向量之间的距离,根据距离大小找到最接近 Q 的 K 个向量。

默认采用的是暴力搜索,导致其效率极低,所以,可以通过缩小查询范围、向量维度提高效率,也就是 Approximate Nearest Neighbor, ANN 算法。

  • 缩小查询范围,对数据集进行划分,子集合中的数据可以通过树、图、倒排索引方式组织。
  • 减少向量纬度,通过量化有损压缩高维向量,常用的是 Product Quantization, PQ 乘积量化。

向量量化

用来将高维向量进行压缩,通常是有损压缩,如上所述,最常用的是 PQ 算法。

总结

FAISS 官方文档中有相关的论文整理,优化的核心包括了倒排索引的提升、PQ 编码的优化,还有就是通过 GPU、SIMD 等的加速以及应用。

索引

简单介绍一些常见的索引技术。

IVF

Inverted File, IVF 倒排索引,根据 K-Means 等聚类技术将数据分成多个簇,数据库中每个向量都分配给特定的簇,每个簇对应一个倒排列表,保存了该簇的向量索引。这样大大减少了需要比较的向量数量,从而提高检索速度。

上述在每个簇内部以平坦 (Flat) 方式保存,也被称为 IVFFLAT 实现,在簇内部需要暴力搜索,缺点是需要存储原始的向量,导致内存开销比较大,因此,有了如下几个常见变体。

IVF-PQ

在数据量大时,会占用太多的内存,可以通过 Product Quantization, PQ 乘积量化方法压缩向量数据,将高维向量分为多个子向量,但是量化过程会引入误差,从而导致其搜索精度降低,可能会导致召回率无法满足需求。

HNSW

Hierarchical Navigable Small World, HNSW 用于大规模高维数据近似最近邻搜索算法,其基于跳表和导航小世界实现,通常可以在几毫秒内从数百万个向量中找到最邻近的结果。

MSTG

Multi-Stage Tree Graph, MSTG 是由 MyScale 实现的索引。

其它

过滤

上述的向量搜索是基于向量表示,在数据集中查找相似向量的方法,不过现实使用时,向量通常会带有元数据,用户需要对元数据应用过滤器,以此提高搜索的准确性,这也被称为过滤向量搜索。

GPU 加速

包括 Faiss 以及 Milvus 都提供了 GPU 加速能力,在原有的基础上可以有近 10 倍的性能提升。

参考

  • MyScale 在 Blog 中有很多不错的文章。
  • FAISS 由 FaceBook 开源的向量相似搜索库,部分支持 GPU 加速,全称是 Facebook AI Similarity Search 。