IVF_FLAT
L'indice IVF_FLAT è un algoritmo di indicizzazione che può migliorare le prestazioni di ricerca per i vettori in virgola mobile.
Questo tipo di indice è ideale per i dataset di grandi dimensioni che richiedono risposte rapide alle query e un'elevata precisione, soprattutto quando il clustering del dataset può ridurre lo spazio di ricerca e la memoria disponibile è sufficiente per memorizzare i dati del cluster.
Panoramica
Il termine IVF_FLAT è l'acronimo di Inverted File Flat, che racchiude l'approccio a doppio livello all'indicizzazione e alla ricerca di vettori in virgola mobile:
- File invertito (IVF): Si riferisce al raggruppamento dello spazio vettoriale in regioni gestibili utilizzando il clustering k-means. Ogni cluster è rappresentato da un centroide, che serve come punto di riferimento per i vettori al suo interno.
- Flat: indica che all'interno di ogni cluster i vettori sono memorizzati nella loro forma originale (struttura piatta), senza alcuna compressione o quantizzazione, per un calcolo preciso delle distanze.
La figura seguente ne illustra il funzionamento:
ivf-flat-1.png
Questo metodo di indicizzazione accelera il processo di ricerca, ma presenta un potenziale inconveniente: il candidato trovato come il più vicino all'incorporazione interrogata potrebbe non essere quello esattamente più vicino. Questo può accadere se l'embedding più vicino all'embedding della query risiede in un cluster diverso da quello selezionato in base al centroide più vicino (si veda la visualizzazione sotto).
Per risolvere questo problema, IVF_FLAT fornisce due iperparametri che possono essere regolati:
nlist
: Specifica il numero di partizioni da creare con l'algoritmo k-means.nprobe
: Specifica il numero di partizioni da considerare durante la ricerca dei candidati.
Se impostiamo nprobe
a 3 invece che a 1, otterremo il seguente risultato:
ivf-flat-2.png
Aumentando il valore di nprobe
, si possono includere più partizioni nella ricerca, il che può aiutare a garantire che l'incorporamento più vicino alla query non venga perso, anche se risiede in una partizione diversa. Tuttavia, ciò comporta un aumento del tempo di ricerca, poiché è necessario valutare un maggior numero di candidati. Per ulteriori informazioni sulla regolazione dei parametri dell'indice, consultare la sezione Parametri dell'indice.
Creare un indice
Per costruire un indice IVF_FLAT
su un campo vettoriale in Milvus, utilizzare il metodo add_index()
, specificando i parametri index_type
, metric_type
e i parametri aggiuntivi per l'indice.
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
)
In questa configurazione:
index_type
: Il tipo di indice da costruire. In questo esempio, impostare il valore suIVF_FLAT
.metric_type
: Il metodo utilizzato per calcolare la distanza tra i vettori. I valori supportati sonoCOSINE
,L2
eIP
. Per maggiori dettagli, consultare Tipi di metriche.params
: Opzioni di configurazione aggiuntive per la creazione dell'indice.nlist
: Numero di cluster in cui suddividere l'insieme di dati.
Per conoscere i parametri di costruzione disponibili per l'indice
IVF_FLAT
, fare riferimento a Parametri di costruzione dell'indice.
Una volta configurati i parametri dell'indice, è possibile creare l'indice utilizzando direttamente il metodo create_index()
o passando i parametri dell'indice nel metodo create_collection
. Per i dettagli, fare riferimento a Creare una raccolta.
Ricerca nell'indice
Una volta costruito l'indice e inserite le entità , è possibile eseguire ricerche di similarità sull'indice.
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
)
In questa configurazione:
params
: Opzioni di configurazione aggiuntive per la ricerca sull'indice.nprobe
: Numero di cluster da ricercare.
Per conoscere altri parametri di ricerca disponibili per l'indice
IVF_FLAT
, fare riferimento a Parametri di ricerca specifici dell'indice.
Parametri dell'indice
Questa sezione fornisce una panoramica dei parametri utilizzati per la creazione di un indice e per l'esecuzione di ricerche sull'indice.
Parametri di costruzione dell'indice
La tabella seguente elenca i parametri che possono essere configurati in params
quando si costruisce un indice.
Parametro | Descrizione | Valore Intervallo | Suggerimento per la messa a punto |
---|---|---|---|
nlist | Numero di cluster da creare con l'algoritmo k-means durante la costruzione dell'indice. Ogni cluster, rappresentato da un centroide, memorizza un elenco di vettori. Aumentando questo parametro si riduce il numero di vettori in ogni cluster, creando partizioni più piccole e mirate. | Tipo: Intero Intervallo: [1, 65536] Valore predefinito: 128 | Valori maggiori di nlist migliorano il richiamo creando cluster più raffinati, ma aumentano il tempo di costruzione dell'indice. Ottimizzare in base alle dimensioni del set di dati e alle risorse disponibili. Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [32, 4096]. |
Parametri di ricerca specifici per l'indice
La tabella seguente elenca i parametri che possono essere configurati in search_params.params
durante la ricerca sull'indice.
Parametro | Descrizione | Valore Intervallo | Suggerimento per la messa a punto |
---|---|---|---|
nprobe | Il numero di cluster da ricercare per i candidati. Valori più alti consentono di ricercare più cluster, migliorando il richiamo grazie all'espansione dell'ambito di ricerca, ma al costo di una maggiore latenza della query. | Tipo: Intero Intervallo: [1, nlist] Valore predefinito: 8 | L'aumento di questo valore migliora il richiamo, ma può rallentare la ricerca. Impostare nprobe proporzionalmente a nlist per bilanciare velocità e precisione.Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [1, nlist]. |