IVF_FLAT
IVF_FLAT索引是一種可以提高浮點向量搜尋效能的索引演算法。
此索引類型適用於需要快速查詢回應和高準確度的大型資料集,尤其是當聚類資料集可縮小搜尋空間,且有足夠記憶體儲存聚類資料時。
概述
詞彙IVF_FLAT代表Inverted File Flat,它概括了其索引和搜尋浮點向量的雙層方法:
- Inverted File (IVF):指使用k-means 聚類將向量空間聚類為可管理的區域。每個簇都有一個中心點,作為簇內向量的參考點。
- Flat (扁平):表示在每個叢集內,向量都以原始形式 (扁平結構) 儲存,不做任何壓縮或量化,以進行精確的距離計算。
下圖顯示其運作方式:
ivf-flat-1.png
這種索引方法可以加快搜尋過程,但也有潛在的缺點:找到的最接近查詢嵌入的候選嵌入可能不是確切的最近嵌入。如果與查詢嵌入區最近的嵌入區所處的叢集與根據最近中心點選擇的叢集不同,就可能發生這種情況(請參閱下面的可視化圖)。
為了解決這個問題,IVF_FLAT提供了兩個我們可以調整的超參數:
nlist
:指定使用 k-means 演算法建立的分割數目。nprobe
:指定在搜尋候選人時要考慮的分區數目。
現在,如果我們將nprobe
設成 3,而不是 1,就會得到以下結果:
ivf-flat-2.png
透過增加nprobe
的值,您可以在搜尋中包含更多的分割區,這有助於確保不會遺漏與查詢最接近的嵌入,即使它位於不同的分割區中。不過,這樣做的代價是增加搜尋時間,因為需要評估更多的候選項目。有關索引參數調整的詳細資訊,請參閱索引參數。
建立索引
要在 Milvus 的向量場上建立IVF_FLAT
索引,請使用add_index()
方法,指定index_type
,metric_type
, 以及索引的附加參數。
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
:要建立的索引類型。在本範例中,設定值為IVF_FLAT
。metric_type
:用來計算向量間距離的方法。支援的值包括COSINE
,L2
, 和IP
。如需詳細資訊,請參閱公制類型。params
:建立索引的附加設定選項。nlist
:分割資料集的叢集數。
要瞭解
IVF_FLAT
索引可用的更多建立參數,請參閱索引建立參數。
一旦配置好索引參數,您就可以直接使用create_index()
方法或在create_collection
方法中傳入索引參數來建立索引。如需詳細資訊,請參閱建立集合。
在索引上搜尋
索引建立且實體插入後,您就可以在索引上執行相似性搜尋。
search_params = {
"params": {
"nprobe": 10, # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
在此配置中
params
:在索引上搜尋的其他設定選項。nprobe
:要搜尋的群集數量。
要瞭解
IVF_FLAT
索引可用的更多搜尋參數,請參閱特定於索引的搜尋參數。
索引參數
本節概述用於建立索引和在索引上執行搜尋的參數。
索引建立參數
下表列出了建立索引時可在params
中設定的參數。
參數 | 說明 | 值範圍 | 調整建議 |
---|---|---|---|
nlist | 在建立索引時,使用 k-means 演算法建立的叢集數量。每個叢集由一個中心點代表,儲存向量清單。增加此參數可減少每個叢集中的向量數量,建立更小、更集中的分割。 | 類型:整數 範圍:[1, 65536] 預設值: 128 | 較大的nlist 值會透過建立更精細的叢集來改善召回率,但會增加索引建立時間。根據資料集大小和可用資源進行最佳化。在大多數情況下,我們建議您設定此範圍內的值:[32, 4096]. |
特定於索引的搜尋參數
下表列出在索引上搜尋時,可在search_params.params
中設定的參數。
參數 | 說明 | 值範圍 | 調整建議 |
---|---|---|---|
nprobe | 搜尋候選資料的叢集數。較高的值允許搜尋更多的叢集,藉由擴大搜尋範圍來改善召回率,但代價是增加查詢延遲。 | 類型:整數 範圍:[1,nlist] 預設值: 8 | 增加此值可提高召回率,但可能會減慢搜尋速度。請依nlist 的比例設定nprobe ,以平衡速度與精確度。在大多數情況下,我們建議您設定此範圍內的值:[1, nlist]。 |