ysf
ysf
Published on 2025-12-27 / 4 Visits
0

向量数据库的索引算法

前言

向量数据库是RAG 应用的核心组件,不同于传统关系型数据库,向量数据库中的数据由具有固定维数的向量来表示。

向量数据库的核心目标在于解决这样一个问题:如何存储并管理海量非结构化数据,并对其实现高效的相似性搜索。

针对以上问题,向量数据库通常具备以下三个关键功能:

(1)向量嵌入(Vector Embeddings): 通过一组固定长度的浮点数组(其维度通常在 100 到 32,768 维之间)表示与捕捉非结构化数据的语义信息。这种表示形式可以将语义相近的数据映射到向量空间中相互靠近的位置,从而便于后续的相似性比较。例如,在经过良好训练的词向量模型中,“king”(国王)和“queen”(王后)的向量表示通常比它们与“automobile”(汽车)的距离更近,从而反映出它们在语义上的相关性。

(2)专用索引(Specialized Indexing): 利用针对高维向量空间优化的算法,实现快速的近似搜索。向量数据库通过构建专门的索引结构,加速相似向量的查找过程,同时借助多种机器学习算法对向量嵌入进行有效组织。在实际应用中,向量数据库最常见的操作是 k 近邻(KNN)查询,即查找与给定查询向量最相似的 k 个向量。对于大规模应用,通常采用近似最近邻(ANN)算法,通过在一定程度上牺牲精确度,换取大幅提升的搜索速度和效率。

(3)距离度量(Distance Metrics): 用于计算不同向量之间相似性的数学函数。选择合适的距离度量对于计算“相似度”至关重要,不同的场景可能需要不同的计算标准。距离度量的选择直接决定了相似性计算的方式。常用的距离度量包括:

欧式距离(Euclidean Distance): 计算两点间的直线距离,是最直观的度量方式。

余弦相似度(Cosine Similarity): 衡量两个向量之间夹角的余弦值,更侧重于比较向量的方向而非大小,通常适用于文本数据。

点积(Dot Product): 对于已归一化的向量,点积可以反映两个向量的对齐程度。

曼哈顿距离(L1 范数): 计算各坐标绝对差值的总和,适合某些特殊的应用场景。

不同的应用场景和数据类型可能需要选择不同的距离度量。例如,余弦相似度在文本相似性计算中效果较好,而欧式距离则可能更适合处理图像数据的相似性问题。

向量搜索

给定一个表示为查询向量 ​q(如,用户的提问、图片或产品描述的embedding结果),向量搜索的目的是在向量数据集 ​X=\{{x_1,x_2,\cdots,x_N}\}中找到与 ​q最相似的 ​k个向量。这个过程通常被称为k最近邻搜索(k-NN)。

那么应该如何量化这个高维空间中“相似性”呢?以下是几种常用的相似性度量标准:

设两个​n维向量,​A=(a_1,\cdots,a_n)​B=(b_1,\cdots,b_n)

  1. 欧式距离(L2距离):计算空间中两点之间的直线距离。距离越小说明两者的差异越小。
d(A,B) = \sqrt{ \sum_{i=1}^{n}(a_i-b_i)^2 }

其中,​D是向量的维度。距离越小表示相似度越高。

  1. 余弦相似度:计算两个向量之间夹角的余弦值,侧重于比较向量之间的方向而非大小,适用于文本数据向量。
\text{Cosine Similarity}(A,B)= \frac{A\cdot B}{\|A\|\|B\|} = \frac{\sum_{i=1}^na_ib_i} { \sqrt{\sum_{i=1}^{n}a_i^2} \sqrt{\sum_{i=1}^nb_i^2} }

其取值范围为 ​[-1,1]​-1表示方向完全相反,​1表示方向完全相同,​0表示正交(不相关)

  1. 曼哈顿距离(L1距离):衡量在网格状路径上,沿坐标轴方向移动的总距离。距离越小越相似。
d(A,B) = \sum_{i=1}^n |a_i-b_i|
  1. 点击(Dot Product/Inner Product):综合衡量向量在方向和大小上的差异。值越大越相似。
A\cdot B = \sum_{i=1}^{n}a_ib_i

有了这些相似性度量方法,应该怎么在向量数据库中实现向量检索呢?

最直接的实现方式就是对数据集进行暴力搜索:

  1. 获取查询向量​q
  2. 计算​q与数据集​X中每个向量​x_i之间的距离
  3. 对这些距离进行排序
  4. 返回距离最小的​k个向量

尽管暴力方法简单且保证能找到真正的最近邻,但它有一个显著缺点:计算成本高。对于一个包含 ​N 个向量 (vector),每个向量维度为 ​D 的数据集,计算查询向量与所有数据集向量之间的距离大约需要 ​N \times D 次浮点运算。排序还会增加额外开销,通常为 ​O(N \log N)​O(N \log k)

使用暴力法搜索十亿个 768 维向量,每次查询涉及数万亿次计算。这使得精确 k-NN 对于需要低延迟的实时应用(如检索增强生成(RAG)或交互式语义搜索)来说,在计算上是不可行的。

这个可扩展性瓶颈是近似最近邻(ANN)搜索的主要推动因素。ANN 算法牺牲了找到绝对精确最近邻的保证。它们旨在非常快速地找到极有可能的近邻,通常比精确搜索快几个数量级。它们通过使用巧妙的索引结构和搜索策略来避免将查询向量 (vector)与数据集中的每个向量进行比较,从而实现这一点。

常见向量数据库

索引算法

在向量数据库中,索引对于提升高维度数据空间内搜索操作的效率和速度至关重要。考虑到向量数据库中存储的数据的复杂性和数量,索引机制对于快速定位和检索与查询相关性最高的向量至关重要。

HNSW

IVF

乘积量化