Perché e quando è necessario un database vettoriale ad hoc?
Questo articolo è stato pubblicato originariamente su AIAI e viene ripubblicato qui con l'autorizzazione.
La crescente popolarità di ChatGPT e di altri modelli linguistici di grandi dimensioni (LLM) ha alimentato l'ascesa delle tecnologie di ricerca vettoriale, tra cui database vettoriali appositamente costruiti come Milvus e Zilliz Cloud, librerie di ricerca vettoriale come FAISS e plugin di ricerca vettoriale integrati nei database tradizionali. Tuttavia, la scelta della soluzione migliore per le proprie esigenze può essere impegnativa. Come la scelta tra un ristorante di alto livello e una catena di fast-food, la selezione della giusta tecnologia di ricerca vettoriale dipende dalle vostre esigenze e aspettative.
In questo post fornirò una panoramica della ricerca vettoriale e del suo funzionamento, confronterò le diverse tecnologie di ricerca vettoriale e spiegherò perché è fondamentale optare per un database vettoriale appositamente creato.
Cos'è la ricerca vettoriale e come funziona?
Laricerca vettoriale, nota anche come ricerca per similarità vettoriale, è una tecnica per recuperare i risultati top-k più simili o semanticamente correlati a un determinato vettore di interrogazione tra un'ampia raccolta di dati vettoriali densi.
Prima di effettuare le ricerche di somiglianza, utilizziamo le reti neurali per trasformare i dati non strutturati, come testo, immagini, video e audio, in vettori numerici ad alta dimensione chiamati vettori di incorporamento. Ad esempio, possiamo utilizzare la rete neurale convoluzionale ResNet-50 pre-addestrata per trasformare l'immagine di un uccello in un insieme di embeddings di 2.048 dimensioni. Qui elenchiamo i primi tre e gli ultimi tre elementi del vettore: [0.1392, 0.3572, 0.1988, ..., 0.2888, 0.6611, 0.2909]
.
Immagine di un uccello di Patrice Bouchard
Dopo aver generato i vettori embedding, i motori di ricerca vettoriale confrontano la distanza spaziale tra il vettore della query in ingresso e i vettori presenti negli archivi vettoriali. Più sono vicini nello spazio, più sono simili.
Aritmetica di incorporazione
Tecnologie di ricerca vettoriale più diffuse
Sul mercato sono disponibili diverse tecnologie di ricerca vettoriale, tra cui librerie di machine learning come NumPy di Python, librerie di ricerca vettoriale come FAISS, plugin di ricerca vettoriale costruiti su database tradizionali e database vettoriali specializzati come Milvus e Zilliz Cloud.
Librerie di apprendimento automatico
L'uso di librerie di machine learning è il modo più semplice per implementare le ricerche vettoriali. Per esempio, possiamo usare NumPy di Python per implementare un algoritmo di nearest neighbor in meno di 20 righe di codice.
import numpy as np
# Function to calculate euclidean distance
def euclidean_distance(a, b):
return np.linalg.norm(a - b)
# Function to perform knn
def knn(data, target, k):
# Calculate distances between target and all points in the data
distances = [euclidean_distance(d, target) for d in data]
# Combine distances with data indices
distances = np.array(list(zip(distances, np.arange(len(data)))))
# Sort by distance
sorted_distances = distances[distances[:, 0].argsort()]
# Get the top k closest indices
closest_k_indices = sorted_distances[:k, 1].astype(int)
# Return the top k closest vectors
return data[closest_k_indices]
Possiamo generare 100 vettori bidimensionali e trovare il vicino più prossimo al vettore [0,5, 0,5].
# Define some 2D vectors
data = np.random.rand(100, 2)
# Define a target vector
target = np.array([0.5, 0.5])
# Define k
k = 3
# Perform knn
closest_vectors = knn(data, target, k)
# Print the result
print("The closest vectors are:")
print(closest_vectors)
Le librerie di apprendimento automatico, come NumPy di Python, offrono una grande flessibilità a basso costo. Tuttavia, hanno alcune limitazioni. Ad esempio, possono gestire solo una piccola quantità di dati e non garantiscono la persistenza dei dati.
Consiglio di utilizzare NumPy o altre librerie di apprendimento automatico per la ricerca vettoriale solo quando:
- Avete bisogno di una prototipazione rapida.
- Non vi interessa la persistenza dei dati.
- La dimensione dei dati è inferiore a un milione e non è necessario un filtro scalare.
- Non avete bisogno di prestazioni elevate.
Librerie di ricerca vettoriale
Le librerie di ricerca vettoriale possono aiutare a costruire rapidamente un prototipo di sistema di ricerca vettoriale ad alte prestazioni. FAISS è un esempio tipico. È open-source e sviluppata da Meta per la ricerca efficiente di similarità e il clustering vettoriale denso. FAISS è in grado di gestire collezioni di vettori di qualsiasi dimensione, anche quelle che non possono essere caricate completamente in memoria. Inoltre, FAISS offre strumenti per la valutazione e la regolazione dei parametri. Anche se scritto in C++, FAISS offre un'interfaccia Python/NumPy.
Di seguito è riportato il codice di un esempio di ricerca vettoriale basato su FAISS:
import numpy as np
import faiss
# Generate some example data
dimension = 64 # dimension of the vector space
database_size = 10000 # size of the database
query_size = 100 # number of queries to perform
np.random.seed(123) # make the random numbers predictable
# Generating vectors to index in the database (db_vectors)
db_vectors = np.random.random((database_size, dimension)).astype('float32')
# Generating vectors for query (query_vectors)
query_vectors = np.random.random((query_size, dimension)).astype('float32')
# Building the index
index = faiss.IndexFlatL2(dimension) # using the L2 distance metric
print(index.is_trained) # should return True
# Adding vectors to the index
index.add(db_vectors)
print(index.ntotal) # should return database_size (10000)
# Perform a search
k = 4 # we want to see 4 nearest neighbors
distances, indices = index.search(query_vectors, k)
# Print the results
print("Indices of nearest neighbors: \n", indices)
print("\nL2 distances to the nearest neighbors: \n", distances)
Le librerie di ricerca vettoriale come FAISS sono facili da usare e sufficientemente veloci per gestire ambienti di produzione su piccola scala con milioni di vettori. È possibile migliorare le prestazioni delle query utilizzando la quantizzazione e le GPU e riducendo le dimensioni dei dati.
Tuttavia, queste librerie presentano alcune limitazioni quando vengono utilizzate in produzione. Ad esempio, FAISS non supporta l'aggiunta e la cancellazione di dati in tempo reale, le chiamate remote, le lingue multiple, il filtraggio scalare, la scalabilità o il disaster recovery.
Diversi tipi di database vettoriali
I database vettoriali sono nati per risolvere le limitazioni delle librerie di cui sopra, fornendo una soluzione più completa e pratica per le applicazioni di produzione.
Sul campo di battaglia sono disponibili quattro tipi di database vettoriali:
- Database relazionali o colonnari esistenti che incorporano un plugin di ricerca vettoriale. PG Vector ne è un esempio.
- Motori di ricerca tradizionali a indice invertito con supporto per l'indicizzazione vettoriale densa. ElasticSearch ne è un esempio.
- Database vettoriali leggeri costruiti su librerie di ricerca vettoriale. Chroma ne è un esempio.
- Database vettoriali costruiti ad hoc. Questo tipo di database è specificamente progettato e ottimizzato per la ricerca vettoriale dal basso verso l'alto. I database vettoriali appositamente creati offrono in genere funzionalità più avanzate, tra cui l'elaborazione distribuita, il disaster recovery e la persistenza dei dati. Milvus ne è un esempio primario.
Non tutti i database vettoriali sono uguali. Ogni stack presenta vantaggi e limiti unici, che li rendono più o meno adatti a diverse applicazioni.
Preferisco i database vettoriali specializzati ad altre soluzioni perché sono l'opzione più efficiente e conveniente e offrono numerosi vantaggi unici. Nelle sezioni seguenti, utilizzerò Milvus come esempio per spiegare le ragioni della mia preferenza.
I principali vantaggi dei database vettoriali creati ad hoc
Milvus è un database vettoriale open-source, distribuito e costruito appositamente, in grado di memorizzare, indicizzare, gestire e recuperare miliardi di vettori di incorporazione. È anche uno dei database vettoriali più popolari per la generazione aumentata di LLM retrieval. Come esempio di database vettoriali appositamente costruiti, Milvus condivide molti vantaggi unici con le sue controparti.
Persistenza dei dati e conservazione a costi contenuti
Sebbene la prevenzione della perdita di dati sia il requisito minimo per un database, molti database vettoriali leggeri e a macchina singola non danno priorità all'affidabilità dei dati. Al contrario, i database vettoriali distribuiti appositamente costruiti, come Milvus, danno priorità alla resilienza del sistema, alla scalabilità e alla persistenza dei dati, separando l'archiviazione dal calcolo.
Inoltre, la maggior parte dei database vettoriali che utilizzano indici approssimati di prossimità (ANN) necessitano di molta memoria per eseguire la ricerca vettoriale, poiché caricano gli indici ANN esclusivamente in memoria. Tuttavia, Milvus supporta gli indici su disco, rendendo la memorizzazione dieci volte più conveniente rispetto agli indici in memoria.
Prestazioni ottimali delle query
Un database vettoriale specializzato offre prestazioni ottimali rispetto ad altre opzioni di ricerca vettoriale. Ad esempio, Milvus è dieci volte più veloce nel gestire le query rispetto ai plugin di ricerca vettoriale. Milvus utilizza l'algoritmo ANN invece dell'algoritmo di ricerca brutale KNN per una ricerca vettoriale più veloce. Inoltre, suddivide i suoi indici, riducendo il tempo necessario per costruire un indice all'aumentare del volume dei dati. Questo approccio consente a Milvus di gestire facilmente miliardi di vettori con aggiunte e cancellazioni di dati in tempo reale. Al contrario, altri componenti aggiuntivi per la ricerca vettoriale sono adatti solo a scenari con meno di decine di milioni di dati e aggiunte e cancellazioni poco frequenti.
Milvus supporta anche l'accelerazione via GPU. I test interni dimostrano che l'indicizzazione vettoriale accelerata dalle GPU può raggiungere oltre 10.000 QPS quando si ricercano decine di milioni di dati, una velocità almeno dieci volte superiore a quella dell'indicizzazione tradizionale su CPU per le prestazioni di una singola macchina.
Affidabilità del sistema
Molte applicazioni utilizzano database vettoriali per interrogazioni online che richiedono una bassa latenza di interrogazione e un'elevata produttività. Queste applicazioni richiedono il failover su una sola macchina a livello di minuti, e alcune richiedono persino il ripristino di emergenza tra regioni per gli scenari critici. Le strategie di replica tradizionali basate su Raft/Paxos soffrono di un grave spreco di risorse e necessitano di un aiuto per il pre-sharding dei dati, con conseguente scarsa affidabilità. Al contrario, Milvus ha un'architettura distribuita che sfrutta le code di messaggi di K8s per un'elevata disponibilità, riducendo i tempi di ripristino e risparmiando risorse.
Operabilità e osservabilità
Per servire meglio gli utenti aziendali, i database vettoriali devono offrire una serie di funzionalità di livello enterprise per una migliore operatività e osservabilità. Milvus supporta diversi metodi di distribuzione, tra cui K8s Operator e Helm chart, docker-compose e pip install, rendendolo accessibile a utenti con esigenze diverse. Milvus offre anche un sistema di monitoraggio e di allarme basato su Grafana, Prometheus e Loki, migliorando la sua osservabilità. Con un'architettura cloud-native distribuita, Milvus è il primo database vettoriale del settore a supportare l'isolamento multi-tenant, RBAC, la limitazione delle quote e gli aggiornamenti rolling. Tutti questi approcci rendono la gestione e il monitoraggio di Milvus molto più semplice.
Iniziare con Milvus in 3 semplici passi in 10 minuti
Costruire un database vettoriale è un compito complesso, ma usarne uno è semplice come usare Numpy e FAISS. Anche gli studenti che non hanno familiarità con l'IA possono implementare una ricerca vettoriale basata su Milvus in soli dieci minuti. Per sperimentare servizi di ricerca vettoriale altamente scalabili e performanti, seguite questi tre passaggi:
- Installare Milvus sul proprio server con l'aiuto del documento di implementazione di Milvus.
- Implementare la ricerca vettoriale con sole 50 righe di codice facendo riferimento al documento Hello Milvus.
- Esplorare i documenti di esempio di Towhee per comprendere i casi d'uso più comuni dei database vettoriali.
- Cos'è la ricerca vettoriale e come funziona?
- Tecnologie di ricerca vettoriale più diffuse
- I principali vantaggi dei database vettoriali creati ad hoc
- Iniziare con Milvus in 3 semplici passi in 10 minuti
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word