SCANN
Alimentato dalla libreria ScaNN di Google, l'indice SCANN di Milvus è stato progettato per affrontare le sfide della ricerca di similarità vettoriale in scala, trovando un equilibrio tra velocità e precisione, anche su grandi insiemi di dati che tradizionalmente porrebbero problemi alla maggior parte degli algoritmi di ricerca.
Panoramica
ScaNN è stato costruito per risolvere una delle maggiori sfide della ricerca vettoriale: trovare in modo efficiente i vettori più rilevanti in spazi ad alta dimensionalità, anche quando i set di dati diventano più grandi e complessi. La sua architettura suddivide il processo di ricerca vettoriale in fasi distinte:
Scannerizzazione
Partizione: Suddivide il set di dati in cluster. Questo metodo restringe lo spazio di ricerca concentrandosi solo su sottoinsiemi di dati rilevanti invece di scansionare l'intero set di dati, risparmiando tempo e risorse di elaborazione. ScaNN utilizza spesso algoritmi di clustering, come k-means, per identificare i cluster, il che consente di eseguire ricerche di similarità in modo più efficiente.
Quantizzazione: ScaNN applica un processo di quantizzazione noto come quantizzazione vettoriale anisotropica dopo il partizionamento. La quantizzazione tradizionale si concentra sulla minimizzazione della distanza complessiva tra i vettori originali e quelli compressi, il che non è ideale per compiti come la ricerca del prodotto interno massimo (MIPS), in cui la somiglianza è determinata dal prodotto interno dei vettori piuttosto che dalla distanza diretta. La quantizzazione anisotropa dà invece priorità alla conservazione delle componenti parallele tra i vettori, ovvero le parti più importanti per il calcolo di prodotti interni accurati. Questo approccio consente a ScaNN di mantenere un'elevata precisione MIPS allineando accuratamente i vettori compressi con la query, consentendo ricerche di similarità più rapide e precise.
Ri-classificazione: La fase di re-ranking è la fase finale, in cui ScaNN mette a punto i risultati della ricerca ottenuti dalle fasi di partizione e quantizzazione. Il re-ranking applica precisi calcoli del prodotto interno ai vettori candidati migliori, assicurando che i risultati finali siano altamente accurati. Il re-ranking è fondamentale nei motori di raccomandazione ad alta velocità o nelle applicazioni di ricerca di immagini, dove il filtraggio e il raggruppamento iniziali servono come strato grossolano e la fase finale assicura che all'utente vengano restituiti solo i risultati più rilevanti.
Le prestazioni di SCANN sono controllate da due parametri chiave che consentono di regolare con precisione l'equilibrio tra velocità e accuratezza:
with_raw_data: Controlla se i dati vettoriali originali vengono memorizzati insieme alle rappresentazioni quantizzate. L'attivazione di questo parametro migliora l'accuratezza durante la ri-classificazione, ma aumenta i requisiti di memorizzazione.reorder_k: Determina il numero di candidati che vengono raffinati durante la fase finale di ri-classificazione. Valori più alti migliorano l'accuratezza ma aumentano la latenza di ricerca.
Per una guida dettagliata sull'ottimizzazione di questi parametri per il vostro caso d'uso specifico, fate riferimento a Parametri dell'indice.
Creare l'indice
Per costruire un indice SCANN su un campo vettoriale in Milvus, utilizzare il metodo add_index(), specificando i parametri index_type, metric_type e altri 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="SCANN", # 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={
"with_raw_data": True, # Whether to hold raw data
} # Index building params
)
In questa configurazione:
index_type: Il tipo di indice da costruire. In questo esempio, impostare il valore suSCANN.metric_type: Il metodo utilizzato per calcolare la distanza tra i vettori. I valori supportati sonoCOSINE,L2eIP. Per maggiori dettagli, consultare Tipi di metriche.params: Opzioni di configurazione aggiuntive per la creazione dell'indice.with_raw_data: Se memorizzare i dati vettoriali originali insieme alla rappresentazione quantizzata.
Per conoscere gli altri parametri di costruzione disponibili per l'indice
SCANN, 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": {
"reorder_k": 10, # Number of candidates to refine
"nprobe": 8 # Number of clusters to search
}
}
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
)
In questa configurazione:
params: Opzioni di configurazione aggiuntive per la ricerca sull'indice.reorder_k: Numero di candidati da affinare durante la fase di ri-classificazione.nprobe: Numero di cluster da ricercare.
Per conoscere altri parametri di ricerca disponibili per l'indice
SCANN, fare riferimento a Parametri di ricerca specifici per l'indice.
Parametri dell'indice
Questa sezione fornisce una panoramica dei parametri utilizzati per la costruzione 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 |
|---|---|---|---|
|
Numero di unità di cluster |
[1, 65536] |
Un nlist più alto aumenta l'efficienza della potatura e di solito accelera la ricerca grossolana, ma le partizioni possono diventare troppo piccole, riducendo il richiamo; un nlist più basso scansiona cluster più grandi, migliorando il richiamo ma rallentando la ricerca. |
|
Se memorizzare i dati vettoriali originali insieme alla rappresentazione quantizzata. Se abilitata, questa opzione consente di calcolare la somiglianza in modo più accurato durante la fase di ri-classificazione, utilizzando i vettori originali invece delle approssimazioni quantizzate. |
Tipo: Booleano Intervallo: Valore predefinito: |
Impostare su Impostare su Consigliato: Utilizzare |
Parametri di ricerca specifici per l'indice
La tabella seguente elenca i parametri che possono essere configurati in search_params.params per la ricerca sull'indice.
Parametro |
Descrizione |
Intervallo di valori |
Suggerimento di ottimizzazione |
|---|---|---|---|
|
Controlla il numero di vettori candidati che vengono raffinati durante la fase di ri-classificazione. Questo parametro determina il numero di candidati migliori delle fasi iniziali di partizione e quantizzazione che vengono rivalutati utilizzando calcoli di somiglianza più precisi. |
Tipo: Intero Intervallo: [1, int_max] Valore predefinito: Nessuno |
Un valore maggiore di Si consiglia di aumentare Considerare di diminuire Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo:[limite, limite * 5]. |
|
Numero di cluster in cui cercare i candidati. |
Tipo: Intero Intervallo: [1, nlist] Valore predefinito: |
Valori più alti consentono di cercare più cluster, migliorando il richiamo grazie all'espansione dell'ambito di ricerca, ma al costo di una maggiore latenza della query. Impostare Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [1, nlist]. |