IVF_SQ8
IVF_SQ8索引是一種基於量化的索引演算法,專為解決大規模相似性搜尋的挑戰而設計。與窮盡搜尋方法相比,此索引類型能以更小的記憶體佔用量達到更快的搜尋速度。
概述
IVF_SQ8 索引建基於兩個關鍵元件:
反向檔案 (IVF):將資料組織成叢集,使搜尋演算法僅能專注於最相關的向量子集。
標量量化 (SQ8):將向量壓縮成更精簡的形式,大幅降低記憶體使用量,同時維持足夠的精確度以進行快速相似性計算。
IVF
IVF 就像是在書本中建立索引。您不需要掃描每一頁 (或在我們的情況中,掃描每一個向量),而是在索引中查找特定的關鍵字(叢集),以快速找到相關的頁面 (向量)。在我們的情況中,向量會被歸類為叢集,演算法會在幾個與查詢向量接近的叢集內進行搜尋。
以下是其運作方式:
聚類:使用 k-means 之類的聚類演算法,將向量資料集分為指定數量的叢集。每個叢集都有一個中心點(叢集的代表向量)。
分派:每個向量會被分派到其中心點最接近的叢集。
反向索引:建立一個索引,將每個群集的中心點對應到分配給該群集的向量清單。
搜尋:搜尋最近鄰居時,搜尋演算法會比較您的查詢向量與群集中心點,並選擇最有希望的群集。然後將搜尋範圍縮小到這些選定叢集中的向量。
要瞭解更多技術細節,請參閱IVF_FLAT。
SQ8
標量量化 (Scalar Quantization, SQ) 是一種用更小、更緊湊的表示來取代高維向量的值,從而縮小其大小的技術。SQ8變體使用 8 位元整數取代典型的 32 位元浮點數來儲存向量的每個維度值。這大大降低了儲存資料所需的記憶體數量。
以下是 SQ8 的運作方式:
範圍識別:首先,識別向量內的最小值和最大值。此範圍定義了量化的邊界。
歸一化:使用公式將向量值歸一為 0 至 1 的範圍:
這可確保所有值都在標準範圍內按比例映射,為壓縮做好準備。
8 位元壓縮:將標準化值乘以 255(8 位元整數的最大值),然後將結果四捨五入為最接近的整數。這可有效地將每個值壓縮為 8 位元表示。
假設您有一個尺寸值為 1.2,最小值為 -1.7,最大值為 2.3。下圖顯示如何應用 SQ8 將 float32 值轉換為 int8 整數。
Ivf Sq8
IVF + SQ8
IVF_SQ8 索引結合了 IVF 和 SQ8 來有效率地執行相似性搜尋:
IVF 縮小搜尋範圍:資料集被分成叢集,當發出查詢時,IVF 會先比較查詢與叢集中心點,選擇最相關的叢集。
SQ8 加速距離計算:在選定的叢集內,SQ8 會將向量壓縮為 8 位元整數,以減少記憶體使用量並加速距離計算。
透過使用 IVF 聚焦搜尋和 SQ8 加速計算,IVF_SQ8 可同時達到快速搜尋時間和記憶體效率。
建立索引
要在 Milvus 的向量場上建立IVF_SQ8 索引,請使用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_SQ8", # 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 to create using the k-means algorithm during index building
} # Index building params
)
在此設定中
index_type:要建立的索引類型。在本範例中,設定值為IVF_SQ8。metric_type:用來計算向量間距離的方法。支援的值包括COSINE,L2, 和IP。如需詳細資訊,請參閱公制類型。params:建立索引的附加設定選項。nlist:在索引建立過程中使用 k-means 演算法建立的叢集數目。
要瞭解
IVF_SQ8索引可用的更多建立參數,請參閱索引建立參數。
索引參數設定完成後,您可以直接使用create_index() 方法或在create_collection 方法中傳入索引參數來建立索引。如需詳細資訊,請參閱建立集合。
在索引上搜尋
索引建立且實體插入後,您就可以在索引上執行相似性搜尋。
search_params = {
"params": {
"nprobe": 8, # Number of clusters to search for candidates
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=10, # TopK results to return
search_params=search_params
)
在此配置中
params:在索引上搜尋的其他設定選項。nprobe:搜尋候選人的叢集數。
要瞭解
IVF_SQ8索引可用的更多搜尋參數,請參閱特定於索引的搜尋參數。
索引參數
本節概述用於建立索引和在索引上執行搜尋的參數。
索引建立參數
下表列出了建立索引時可以在params 中設定的參數。
參數 |
說明 |
值範圍 |
調整建議 |
|
|---|---|---|---|---|
IVF |
|
在建立索引時使用 k-means 演算法建立的叢集數。 |
類型:整數範圍:[1, 65536] 預設值: |
較大的 |
特定於索引的搜尋參數
下表列出在索引上搜尋時,可在search_params.params 中設定的參數。
參數 |
說明 |
值範圍 |
調整建議 |
|
|---|---|---|---|---|
IVF |
|
搜尋候選人的叢集數。 |
類型: 整數整數範圍:[1、nlist] 預設值: |
較高的值允許搜尋更多的叢集,藉由擴大搜尋範圍來改善召回率,但代價是增加查詢延遲。請將 在大多數情況下,我們建議您設定此範圍內的值:[1, nlist]。 |