Accelerare la ricerca di similarità su dati davvero grandi con l'indicizzazione vettoriale
Dalla computer vision alla scoperta di nuovi farmaci, i motori di ricerca per similarità vettoriale alimentano molte popolari applicazioni di intelligenza artificiale (AI). Una componente enorme di ciò che rende possibile interrogare in modo efficiente i dataset da milioni, miliardi o persino trilioni di vettori su cui si basano i motori di ricerca per similarità è l’indicizzazione, un processo di organizzazione dei dati che accelera drasticamente la ricerca su big data. Questo articolo illustra il ruolo che l’indicizzazione svolge nel rendere efficiente la ricerca per similarità vettoriale, i diversi tipi di indice vector inverted file (IVF) e consigli su quale indice utilizzare in scenari diversi.
Vai a:
- In che modo l’indicizzazione vettoriale accelera la ricerca per similarità e il machine learning?
- Quali sono i diversi tipi di indici IVF e per quali scenari sono più adatti?
- FLAT: indicato per cercare in dataset relativamente piccoli (su scala di milioni) quando è richiesto il 100% di recall.
- IVF_FLAT: migliora la velocità a scapito dell’accuratezza (e viceversa).
- IVF_SQ8: più veloce e meno esigente in termini di risorse rispetto a IVF_FLAT, ma anche meno accurato.
- IVF_SQ8H: nuovo approccio ibrido GPU/CPU ancora più veloce di IVF_SQ8.
- Scopri di più su Milvus, una piattaforma di gestione dei dati vettoriali su vastissima scala.
In che modo l’indicizzazione vettoriale accelera la ricerca per similarità e il machine learning?
I motori di ricerca per similarità funzionano confrontando un input con un database per trovare gli oggetti più simili all’input. L’indicizzazione è il processo di organizzazione efficiente dei dati e svolge un ruolo fondamentale nel rendere utile la ricerca per similarità, accelerando drasticamente query dispendiose in termini di tempo su grandi dataset. Dopo che un enorme dataset vettoriale è stato indicizzato, le query possono essere indirizzate verso cluster, o sottoinsiemi di dati, che hanno maggiori probabilità di contenere vettori simili a una query di input. In pratica, ciò significa che viene sacrificato un certo grado di accuratezza per velocizzare le query su dati vettoriali davvero grandi.
Si può fare un’analogia con un dizionario, in cui le parole sono ordinate alfabeticamente. Quando si cerca una parola, è possibile navigare rapidamente verso una sezione che contiene solo parole con la stessa iniziale, accelerando drasticamente la ricerca della definizione della parola di input.
Quali sono i diversi tipi di indici IVF e per quali scenari sono più adatti?
Esistono numerosi indici progettati per la ricerca per similarità vettoriale ad alta dimensionalità, e ciascuno comporta compromessi in termini di prestazioni, accuratezza e requisiti di archiviazione. Questo articolo tratta diversi tipi comuni di indici IVF, i loro punti di forza e di debolezza, nonché i risultati dei test di prestazione per ciascun tipo di indice. I test di prestazione quantificano il tempo di query e i tassi di recall per ciascun tipo di indice in Milvus, una piattaforma open-source di gestione dei dati vettoriali. Per ulteriori informazioni sull’ambiente di test, consulta la sezione metodologia in fondo a questo articolo.
FLAT: indicato per cercare in dataset relativamente piccoli (su scala di milioni) quando è richiesto il 100% di recall.
Per le applicazioni di ricerca per similarità vettoriale che richiedono un’accuratezza perfetta e dipendono da dataset relativamente piccoli (su scala di milioni), l’indice FLAT è una buona scelta. FLAT non comprime i vettori ed è l’unico indice in grado di garantire risultati di ricerca esatti. I risultati di FLAT possono anche essere utilizzati come punto di confronto per i risultati prodotti da altri indici che hanno un recall inferiore al 100%.
FLAT è accurato perché adotta un approccio esaustivo alla ricerca, il che significa che per ogni query l'input target viene confrontato con ogni vettore in un dataset. Questo rende FLAT l'indice più lento della nostra lista e poco adatto all'interrogazione di dati vettoriali massivi. Non ci sono parametri per l'indice FLAT in Milvus, e utilizzarlo non richiede addestramento dei dati né archiviazione aggiuntiva.
Risultati del test delle prestazioni di FLAT:
Il test delle prestazioni del tempo di query di FLAT è stato condotto in Milvus utilizzando un dataset composto da 2 milioni di vettori a 128 dimensioni.
Risultati del test del tempo di query per l'indice FLAT in Milvus.
Punti chiave:
- All'aumentare di nq (il numero di vettori target per una query), il tempo di query aumenta.
- Utilizzando l'indice FLAT in Milvus, possiamo vedere che il tempo di query aumenta bruscamente una volta che nq supera 200.
- In generale, l'indice FLAT è più veloce e più coerente quando Milvus viene eseguito su GPU rispetto alla CPU. Tuttavia, le query FLAT su CPU sono più veloci quando nq è inferiore a 20.
IVF_FLAT: migliora la velocità a scapito dell'accuratezza (e viceversa).
Un modo comune per accelerare il processo di ricerca per similarità a scapito dell'accuratezza è condurre una ricerca approssimata del vicino più prossimo (ANN). Gli algoritmi ANN riducono i requisiti di archiviazione e il carico computazionale raggruppando insieme vettori simili, risultando in una ricerca vettoriale più rapida. IVF_FLAT è il tipo più basilare di indice a file invertito e si basa su una forma di ricerca ANN.
IVF_FLAT divide i dati vettoriali in un numero di unità di cluster (nlist), quindi confronta le distanze tra il vettore di input target e il centro di ciascun cluster. A seconda del numero di cluster che il sistema è impostato per interrogare (nprobe), i risultati della ricerca per similarità vengono restituiti in base ai confronti tra l'input target e i vettori solo nei cluster più simili, riducendo drasticamente il tempo di query.
Regolando nprobe, è possibile trovare un equilibrio ideale tra accuratezza e velocità per un determinato scenario. I risultati del nostro test delle prestazioni di IVF_FLAT dimostrano che il tempo di query aumenta bruscamente all'aumentare sia del numero di vettori di input target (nq), sia del numero di cluster da cercare (nprobe). IVF_FLAT non comprime i dati vettoriali, tuttavia i file di indice includono metadati che aumentano marginalmente i requisiti di archiviazione rispetto al dataset vettoriale grezzo non indicizzato.
Risultati del test delle prestazioni di IVF_FLAT:
Il test delle prestazioni del tempo di query di IVF_FLAT è stato condotto in Milvus utilizzando il dataset pubblico 1B SIFT, che contiene 1 miliardo di vettori a 128 dimensioni.
Risultati del test del tempo di query per l'indice IVF_FLAT in Milvus.
Punti chiave:
- Quando eseguito su CPU, il tempo di query per l'indice IVF_FLAT in Milvus aumenta sia con nprobe sia con nq. Ciò significa che più vettori di input contiene una query, o più cluster una query cerca, più lungo sarà il tempo di query.
- Su GPU, l'indice mostra una minore variazione di tempo rispetto ai cambiamenti in nq e nprobe. Questo perché i dati dell'indice sono grandi, e la copia dei dati dalla memoria della CPU alla memoria della GPU rappresenta la maggior parte del tempo totale di query.
- In tutti gli scenari, tranne quando nq = 1.000 e nprobe = 32, l'indice IVF_FLAT è più efficiente quando eseguito su CPU.
Il test delle prestazioni di recall di IVF_FLAT è stato condotto in Milvus utilizzando sia il dataset pubblico 1M SIFT, che contiene 1 milione di vettori a 128 dimensioni, sia il dataset glove-200-angular, che contiene oltre 1 milione di vettori a 200 dimensioni, per la costruzione dell'indice (nlist = 16.384).
Risultati del test del tasso di recall per l'indice IVF_FLAT in Milvus.
Punti chiave:
- L'indice IVF_FLAT può essere ottimizzato per l'accuratezza, raggiungendo un tasso di recall superiore a 0,99 sul dataset 1M SIFT quando nprobe = 256.
IVF_SQ8: Più veloce e meno esigente in termini di risorse rispetto a IVF_FLAT, ma anche meno accurato.
IVF_FLAT non esegue alcuna compressione, quindi i file di indice che produce hanno all'incirca la stessa dimensione dei dati vettoriali originali, grezzi e non indicizzati. Ad esempio, se il dataset SIFT 1B originale è di 476 GB, i suoi file di indice IVF_FLAT saranno leggermente più grandi (~470 GB). Il caricamento di tutti i file di indice in memoria consumerà 470 GB di storage.
Quando le risorse di disco, CPU o memoria GPU sono limitate, IVF_SQ8 è un'opzione migliore rispetto a IVF_FLAT. Questo tipo di indice può convertire ogni FLOAT (4 byte) in UINT8 (1 byte) eseguendo la quantizzazione scalare. Ciò riduce il consumo di memoria su disco, CPU e GPU del 70–75%. Per il dataset SIFT 1B, i file di indice IVF_SQ8 richiedono solo 140 GB di storage.
Risultati dei test delle prestazioni di IVF_SQ8:
I test del tempo di query di IVF_SQ8 sono stati condotti in Milvus utilizzando il dataset pubblico SIFT 1B, che contiene 1 miliardo di vettori a 128 dimensioni, per la creazione dell'indice.
Risultati dei test del tempo di query per l'indice IVF_SQ8 in Milvus.
Punti chiave:
- Riducendo la dimensione dei file di indice, IVF_SQ8 offre miglioramenti delle prestazioni evidenti rispetto a IVF_FLAT. IVF_SQ8 segue una curva di prestazioni simile a IVF_FLAT, con il tempo di query che aumenta con nq e nprobe.
- Analogamente a IVF_FLAT, IVF_SQ8 registra prestazioni più rapide quando viene eseguito su CPU e quando nq e nprobe sono più piccoli.
I test delle prestazioni di recall di IVF_SQ8 sono stati condotti in Milvus utilizzando sia il dataset pubblico SIFT 1M, che contiene 1 milione di vettori a 128 dimensioni, sia il dataset glove-200-angular, che contiene oltre 1 milione di vettori a 200 dimensioni, per la creazione dell'indice (nlist = 16.384).
Risultati dei test del tasso di recall per l'indice IVF_SQ8 in Milvus.
Punti chiave:
- Nonostante comprima i dati originali, IVF_SQ8 non registra una diminuzione significativa dell'accuratezza delle query. In varie impostazioni di nprobe, IVF_SQ8 ha al massimo un tasso di recall inferiore dell'1% rispetto a IVF_FLAT.
IVF_SQ8H: Nuovo approccio ibrido GPU/CPU ancora più veloce di IVF_SQ8.
IVF_SQ8H è un nuovo tipo di indice che migliora le prestazioni delle query rispetto a IVF_SQ8. Quando viene interrogato un indice IVF_SQ8 in esecuzione su CPU, la maggior parte del tempo totale di query viene spesa per trovare i cluster nprobe più vicini al vettore di input target. Per ridurre il tempo di query, IVF_SQ8 copia i dati per le operazioni del quantizzatore grossolano, che sono più piccoli dei file di indice, nella memoria GPU — accelerando notevolmente le operazioni del quantizzatore grossolano. Quindi gpu_search_threshold determina quale dispositivo esegue la query. Quando nq >= gpu_search_threshold, la GPU esegue la query; altrimenti, la CPU esegue la query.
IVF_SQ8H è un tipo di indice ibrido che richiede che CPU e GPU lavorino insieme. Può essere utilizzato solo con Milvus abilitato per GPU.
Risultati dei test delle prestazioni di IVF_SQ8H:
I test delle prestazioni del tempo di query di IVF_SQ8H sono stati condotti in Milvus utilizzando il dataset pubblico SIFT 1B, che contiene 1 miliardo di vettori a 128 dimensioni, per la creazione dell'indice.
Risultati dei test del tempo di query per l'indice IVF_SQ8H in Milvus.
Punti chiave:
- Quando nq è minore o uguale a 1.000, IVF_SQ8H registra tempi di query quasi due volte più veloci rispetto a IVFSQ8.
- Quando nq = 2000, i tempi di query per IVFSQ8H e IVF_SQ8 sono gli stessi. Tuttavia, se il parametro gpu_search_threshold è inferiore a 2000, IVF_SQ8H supererà IVF_SQ8.
- Il tasso di recall delle query di IVF_SQ8H è identico a quello di IVF_SQ8, il che significa che si ottiene un tempo di query inferiore senza perdita di accuratezza della ricerca.
Scopri di più su Milvus, una piattaforma di gestione dei dati vettoriali su scala massiva.
Milvus è una piattaforma di gestione dei dati vettoriali che può alimentare applicazioni di ricerca per similarità in ambiti che spaziano dall'intelligenza artificiale, al deep learning, ai calcoli vettoriali tradizionali e altro ancora. Per ulteriori informazioni su Milvus, consulta le seguenti risorse:
- Milvus è disponibile con una licenza open-source su GitHub.
- Tipi di indici aggiuntivi, inclusi indici basati su grafi e alberi, sono supportati in Milvus. Per un elenco completo dei tipi di indici supportati, consulta la documentazione sugli indici vettoriali in Milvus.
- Per saperne di più sull'azienda che ha lanciato Milvus, visita Zilliz.com.
- Chatta con la community di Milvus o ottieni aiuto per un problema su Slack.
Metodologia
Ambiente di test delle prestazioni
La configurazione del server utilizzata in tutti i test delle prestazioni citati in questo articolo è la seguente:
- Intel (R) Xeon (R) Platinum 8163 @ 2.50GHz, 24 core
- GeForce GTX 2080Ti x 4
- 768 GB di memoria
Concetti tecnici rilevanti
Sebbene non siano necessari per comprendere questo articolo, ecco alcuni concetti tecnici utili per interpretare i risultati dei nostri test sulle prestazioni degli indici:
Blog_Accelerating Similarity Search on Really Big Data with Vector Indexing_8.png
Risorse
Le seguenti fonti sono state utilizzate per questo articolo:
- “Encyclopedia of database systems,” Ling Liu e M. Tamer Özsu.
Qual è il prossimo passo
Continua a leggere Accelerating Similarity Search on Really Big Data with Vector Indexing: Part II.
Continua a leggere

The Great AI Agent Protocol Race: Function Calling vs. MCP vs. A2A
Compare Function Calling, MCP, and A2A protocols for AI agents. Learn which standard best fits your development needs and future-proof your applications.

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.

What is the K-Nearest Neighbors (KNN) Algorithm in Machine Learning?
KNN is a supervised machine learning technique and algorithm for classification and regression. This post is the ultimate guide to KNN.



