跳到主要内容

IVF_FLAT

IVF_FLAT index 是一种可以提高浮点向量搜索性能的索引算法。

此 index 类型非常适合需要快速查询响应和高准确性的大规模数据集,特别是当对数据集进行聚类可以减少搜索空间并有足够内存存储聚类数据时。

概述

术语 IVF_FLAT 代表 Inverted File Flat,它概括了其对浮点向量进行索引和搜索的双层方法:

  • Inverted File (IVF): 指使用 k-means 聚类 将向量空间聚类为可管理的区域。每个聚类由一个质心表示,作为其中向量的参考点。

  • Flat: 表示在每个聚类内,向量以其原始形式(平面结构)存储,没有任何压缩或量化,以便进行精确的距离计算。

下图显示了它的工作原理:

IVF FLAT Workflow

这种索引方法加速了搜索过程,但它伴随着一个潜在缺点:找到的与查询嵌入最接近的候选可能不是确切的最近邻。如果与查询嵌入最近的嵌入位于不同于基于最近质心选择的聚类中,就会发生这种情况(见下面的可视化)。

为了解决这个问题,IVF_FLAT 提供了两个我们可以调整的超参数:

  • nlist:指定使用 k-means 算法创建的分区数量。

  • nprobe:指定在搜索候选时考虑的分区数量。

现在如果我们将 nprobe 设置为 3 而不是 1,我们得到以下结果:

IVF FLAT Workflow 2

通过增加 nprobe 值,您可以在搜索中包含更多分区,这有助于确保即使查询的最近嵌入位于不同分区中也不会被遗漏。但是,这会以增加搜索时间为代价,因为需要评估更多候选。有关 index 参数调优的更多信息,请参阅 Index 参数

构建 Index

要在 Milvus 中的向量 field 上构建 IVF_FLAT index,使用 add_index() 方法,指定 index_typemetric_type 和 index 的其他参数。

from pymilvus import MilvusClient

# Prepare index building params
index_params = MilvusClient.prepare_index_params()

index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_FLAT", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 64, # Number of clusters for the index
} # Index building params
)

在此配置中:

  • index_type:要构建的 index 类型。在此示例中,将值设置为 IVF_FLAT

  • metric_type:用于计算向量之间距离的方法。支持的值包括 COSINEL2IP。有关详细信息,请参阅 度量类型

  • params:构建 index 的其他配置选项。

    • nlist:用于划分数据集的聚类数量。

    要了解 IVF_FLAT index 可用的更多构建参数,请参阅 Index 构建参数

配置 index 参数后,您可以直接使用 create_index() 方法创建 index,或在 create_collection 方法中传递 index 参数。有关详细信息,请参阅 创建 Collection

在 Index 上搜索

构建 index 并插入 entity 后,您可以在 index 上执行相似性搜索。

search_params = {
"params": {
"nprobe": 10, # Number of clusters to search
}
}

res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field",
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)

在此配置中:

  • params:在 index 上搜索的其他配置选项。

    • nprobe:要搜索的聚类数量。

    要了解 IVF_FLAT index 可用的更多搜索参数,请参阅 Index 特定搜索参数

Index 参数

本节概述了用于构建 index 和在 index 上执行搜索的参数。

Index 构建参数

下表列出了在构建 index 时可以在 params 中配置的参数。

参数

描述

值范围

调优建议

nlist

在索引构建期间使用 k-means 算法创建的聚类数量。每个聚类由质心表示,存储向量列表。增加此参数会减少每个聚类中的向量数量,创建更小、更集中的分区。

类型:整数 范围:[1, 65536]

默认值128

更大的 nlist 值通过创建更精细的聚类来提高召回率,但会增加索引构建时间。根据数据集大小和可用资源进行优化。在大多数情况下,我们建议您在此范围内设置值:[32, 4096]。

Index 特定搜索参数

下表列出了在在 index 上搜索时可以在 search_params.params 中配置的参数。

参数

描述

值范围

调优建议

nprobe

要搜索候选的聚类数量。更高的值允许搜索更多聚类,通过扩展搜索范围来提高召回率,但会增加查询延迟。

类型:整数 范围:[1, nlist]

默认值8

增加此值可提高召回率,但可能会减慢搜索速度。将 nprobenlist 成比例设置以平衡速度和准确性。

在大多数情况下,我们建议您在此范围内设置值:[1, nlist]。