1.Miluvs索引支持:
内存索引
磁盘索引
GPU索引
2.内存索引
1.AUTOINDEX
调用create_index
方法时,如果没有指定index_type
,Milvus 会根据数据类型自动选择最合适的索引类型。
数据类型 | 自动索引算法 |
---|---|
VARCHAR | 反转索引 |
INT8 | 反转索引 |
INT16 | 反转索引 |
INT32 | 反转索引 |
INT64 | 反转索引 |
FLOAT | 反转索引 |
二进制 | 反转索引 |
反转索引
反转索引提供了一种灵活的方法,可通过手动指定索引参数为标量字段创建索引。这种方法适用于各种情况,包括点查询、模式匹配查询、全文检索、JSON 搜索、布尔搜索,甚至前缀匹配查询。
Milvus 中实现的倒排索引由全文搜索引擎库Tantivy 提供支持。Tantivy 确保 Milvus 中的倒排索引既高效又快速。
倒排索引有两个主要部分:术语字典和倒排列表。术语词典包括按字母顺序排列的所有标记词,而倒排列表则包含每个词出现的文档列表。这种设置使得点查询和范围查询比暴力搜索更快、更有效。
2.HNSW
HNSW索引是一种基于图的索引算法,可以提高搜索高维浮动向量时的性能。它具有出色的搜索精度和低延迟,但需要较高的内存开销来维护其分层图结构。
为了提高性能,HNSW 将图中每层节点的最大度数限制为M
。此外,您还可以使用efConstruction
(建立索引时)或ef
(搜索目标时)来指定搜索范围
分层导航小世界(HNSW)算法构建了一个多层图,有点像不同缩放级别的地图。底层包含所有数据点,而上层则由从底层采样的数据点子集组成。
在这种层次结构中,每一层都包含代表数据点的节点,节点之间由表示其接近程度的边连接。上层提供远距离跳转,以快速接近目标,而下层则进行细粒度搜索,以获得最准确的结果。
下面是它的工作原理:
- 入口点:搜索从顶层的一个固定入口点开始,该入口点是图中的一个预定节点。
- 贪婪搜索:算法贪婪地移动到当前层的最近邻居,直到无法再接近查询向量为止。上层起到导航作用,作为粗过滤器,为下层的精细搜索找到潜在的入口点。
- 层层下降:一旦当前层达到局部最小值,算法就会利
- 用预先建立的连接跳转到下层,并重复贪婪搜索。
- 最后 细化:这一过程一直持续到最底层,在最底层进行最后的细化步骤,找出最近的邻居。
HNSW 的性能取决于控制图结构和搜索行为的几个关键参数。这些参数包括
-
M
:图中每个节点在层次结构的每个层级所能拥有的最大边数或连接数。M
越高,图的密度就越大,搜索结果的召回率和准确率也就越高,因为有更多的路径可以探索,但同时也会消耗更多内存,并由于连接数的增加而减慢插入时间。如上图所示,M = 5表示 HNSW 图中的每个节点最多与 5 个其他节点直接相连。这就形成了一个中等密度的图结构,节点有多条路径到达其他节点。 efConstruction
:索引构建过程中考虑的候选节点数量。efConstruction
越高,图的质量越好,但需要更多时间来构建。ef
:搜索过程中评估的邻居数量。增加ef
可以提高找到最近邻居的可能性,但会减慢搜索过程。
3.IVF_FLAT
IVF_FLAT 将向量数据划分为nlist
个聚类单元,然后比较目标输入向量与每个聚类中心之间的距离。根据系统设置查询的簇数 (nprobe
),相似性搜索结果仅根据目标输入与最相似簇中向量的比较结果返回--大大缩短了查询时间。
通过调整nprobe
,可以在特定情况下找到准确性和速度之间的理想平衡。IVF_FLAT 性能测试的结果表明,随着目标输入向量数 (nq
) 和搜索簇数 (nprobe
) 的增加,查询时间也会急剧增加。
I VF_FLAT 是最基本的 IVF 索引,每个单元中存储的编码数据与原始数据一致。
4.IVF_PQ
PQ
(乘积量化)将原始高维向量空间均匀分解为 低维向量空间的笛卡尔乘积,然后对分解后的低维向量空间进行量化。乘积量化不需要计算目标向量与所有单元中心的距离,而是能够计算目标向量与每个低维空间聚类中心的距离,大大降低了算法的时间复杂度和空间复杂度。m
IVF_PQ 先进行 IVF 索引聚类,然后再对向量的乘积进行量化。其索引文件比 IVF_SQ8 更小,但在搜索向量时也会造成精度损失。
5.IVF_SO8
IVF_FLAT 不进行任何压缩,因此它生成的索引文件大小与原始的非索引向量数据大致相同。例如,如果原始的 1B SIFT 数据集为 476 GB,那么其 IVF_FLAT 索引文件就会稍小一些(~470 GB)。将所有索引文件加载到内存中将消耗 470 GB 的存储空间。
当磁盘、CPU 或 GPU 内存资源有限时,IVF_SQ8 是比 IVF_FLAT 更好的选择。这种索引类型可以通过执行标量量化(SQ)将每个 FLOAT(4 字节)转换为 UINT8(1 字节)。这样可以减少 70-75% 的磁盘、CPU 和 GPU 内存消耗。对于 1B SIFT 数据集,IVF_SQ8 索引文件仅需 140 GB 的存储空间。
6.FLAT
对于需要完美精确度且依赖相对较小(百万级别)数据集的向量相似性搜索应用,FLAT 不压缩向量,是唯一能保证精确搜索结果的索引。FLAT 的结果还可以作为其他召回率低于 100% 的索引所产生结果的比较点
FLAT 的精确度很高,因为它采用的是穷举搜索方法,这意味着每次查询都要将目标输入与数据集中的每一组向量进行比较。这使得 FLAT 成为我们列表中速度最慢的索引,而且不适合查询海量向量数据。在 Milvus 中,FLAT 索引不需要任何参数,使用它也不需要数据训练。
7.SCANN
ScaNN(可扩展近邻)在向量聚类和乘积量化方面与 IVF_PQ 相似。它们的不同之处在于乘积量化的实现细节和使用 SIMD(单指令/多数据)进行高效计算。
3.磁盘索引
DISKANN
4.GPU索引
1.GPU _CAGRA
2.GPU_IVF_FLAT
3.GPU _IVF_PO
4.GPU BRUTE FORCE
5.参数
1.度量类型(metric_type)
1.IP
即内积,是一种计算向量相似度的常用方法,如果你对查询和文档向量进行了规范化(使得它们的模长为 1),那么 内积 就等同于余弦相似度。
2.COSINE
余弦相似度,它能够衡量两个向量的方向相似度,而不受向量大小(模长)的影响。所以是RAG中最常用的一种相似度计算方法。
3.L2
欧几里得距离 衡量的是两个向量之间的直线距离。尽管欧几里得距离也是常见的距离度量方法,它更多地用于度量向量间的差异,而不是相似度。通常,欧几里得距离值越小,表示向量越相似。
适用场景:
- 图像特征向量:在计算机视觉中,图像的特征向量往往具有相似的数值范围,并且欧几里得距离适用于衡量不同图像之间的差异。
- 数值型数据:例如,客户的年龄、收入等数值特征可以用欧几里得距离计算客户之间的相似度。
2.efConstruction
控制在构建图时搜索的邻居数量,影响图的结构和搜索精度。较大的 efConstruction
提高构建精度但增加构建时间,较小的值提高构建速度但可能降低精度
参数 | 说明 | 范围 | 默认值 |
---|---|---|---|
efConstruction | ef_construction控制索引搜索速度/构建速度的权衡。增加 efConstruction 参数可能会提高索引质量,但也会延长索引编制时间。 | [1,int_max](最大值 | 无 |
3.M
控制每个节点的最大连接数(即每个节点的出度),影响图的密度和搜索精度。较大的 M
增加精度但降低查询速度,较小的 M
提高速度但可能降低精度。
m | 乘积量化因子数 | dim mod m == 0 |
4.nlist
nlist 是 Inverted File(IVF) 索引中一个重要的参数,用于控制索引的分桶数目。它代表了将向量数据集分割成多少个簇或子集合。向量会被划分为多个簇,每个簇会有一个索引,nlist
就是定义簇的数量。
在检索过程中,Milvus 会首先找到查询向量所属的簇,然后只对该簇中的向量进行精确的相似度计算,而不是对整个数据集进行计算,这样能够大大提高检索速度。
参数 | 说明 | 范围 | 默认值 |
---|---|---|---|
nlist | 群组单位数 | [1, 65536] | 128 |
- nlist 大小的影响:
- 较大的 nlist:会增加簇的数量,使得每个簇内的向量数量减少,从而提高检索的精确度。但增加簇的数量会增加内存使用,并使索引构建过程变得更长。
- 较小的 nlist:会减少簇的数量,从而加速查询过程,但可能会导致检索精度的下降,因为更多的向量被存储在每个簇中,可能会影响精确度。
- 通常设置:
nlist
设置的范围通常会根据数据的大小和特性来调整。在实际操作中,nlist
的选择需要权衡 检索速度 和 精度,并通过实验来选择合适的值。
nlist
决定了向量的分桶数,它影响索引的创建速度、存储要求和查询的效率。
5.with_raw_data(SCANN索引专用参数)
6.build_algo(GPU_CAGRA索引专用参数)
build_algo | 选择剪枝前的图形生成算法。可能的值:IVF_PQ :提供更高的质量,但构建时间较慢。NN_DESCENT 提供更快的生成速度,但召回率可能较低。 | IVF_PQ |
7.cache_dataset_on_device(GPU_CAGRA索引专用参数)
cache_dataset_on_device | 决定是否在 GPU 内存中缓存原始数据集。可能的值“true” :缓存原始数据集,通过完善搜索结果提高召回率。“false” 不缓存原始数据集,以节省 GPU 内存。 | “false” |