Vector Search
La ricerca vettoriale trova gli embedding memorizzati più vicini a un vettore di query, usando k-NN esatto o indici approssimati come HNSW e IVF per eseguire rapidamente ricerche su milioni di elementi.
La ricerca vettoriale recupera gli elementi i cui embedding sono più vicini a un embedding di query secondo una misura di similarità come la similarità coseno, il prodotto scalare o la distanza euclidea. Un modello di embedding colloca vicini gli elementi dal significato o dall'aspetto simile, quindi i vettori più vicini corrispondono ai documenti, alle immagini o ai prodotti più simili, anche quando non condividono parole chiave con la query. La ricerca vettoriale esatta consiste in una ricerca dei k vicini più prossimi (k-NN) su ogni vettore archiviato. Su larga scala, i sistemi usano indici dei vicini più prossimi approssimati (ANN), che confrontano la query con una piccola frazione dei vettori e restituiscono comunque quasi tutti i vicini effettivi.
Come funziona la ricerca vettoriale#
La query e gli elementi archiviati vengono trasformati in embedding dallo stesso modello o da una coppia di modelli addestrati insieme: un codificatore di frasi per il testo, CLIP per abbinare testo e immagini oppure una rete di visione per abbinare immagini tra loro. La metrica dovrebbe corrispondere al modo in cui il modello è stato addestrato. Per i vettori di lunghezza unitaria, la similarità coseno equivale al prodotto scalare e l'ordinamento per distanza euclidea dà lo stesso risultato. La ricerca esatta richiede un confronto per ogni vettore archiviato a ogni query: è rapida per decine di migliaia di vettori e troppo lenta per centinaia di milioni, quindi i sistemi di grandi dimensioni usano una delle quattro famiglie di indici ANN:
- Indici a grafo come HNSW: collegano ogni vettore ai vicini prossimi in un grafo a livelli e rispondono a una query procedendo in modo greedy verso di essa.
- Indici di clustering (IVF): raggruppano i vettori con k-means e analizzano soltanto i cluster i cui centroidi sono più vicini alla query.
- Quantizzazione vettoriale: comprime ogni vettore in pochi byte, come nella quantizzazione del prodotto, così le distanze vengono approssimate a partire da codici compatti mantenuti in memoria.
- Grafi basati su disco: mantengono un indice a grafo su SSD, come fa DiskANN, per cercare miliardi di vettori su un'unica macchina.
L'idea di base di un indice IVF si illustra con un breve esempio NumPy e scikit-learn che lo confronta con la ricerca esatta:
import numpy as np
from sklearn.cluster import KMeans
# 20,000 embeddings grouped by topic, normalized so a dot product is cosine similarity
rng = np.random.default_rng(0)
topics = rng.normal(size=(200, 64))
vectors = topics[rng.integers(200, size=20000)] + 0.5 * rng.normal(size=(20000, 64))
vectors /= np.linalg.norm(vectors, axis=1, keepdims=True)
query = vectors[0] + 0.1 * rng.normal(size=64)
# Exact search: score every stored vector
exact = np.argsort(-(vectors @ query))[:10]
# IVF index: cluster the vectors, then scan only the lists of the 5 closest centroids
kmeans = KMeans(n_clusters=100, n_init=1, random_state=0).fit(vectors)
probed = np.argsort(-(kmeans.cluster_centers_ @ query))[:5]
candidates = np.flatnonzero(np.isin(kmeans.labels_, probed))
approx = candidates[np.argsort(-(vectors[candidates] @ query))[:10]]
print(f"scanned {len(candidates) / len(vectors):.1%} of vectors")
print(f"recall@10: {len(set(exact) & set(approx)) / 10:.0%}")Esaminare 5 dei 100 cluster analizza il 5,1% dei vettori e trova comunque tutti i 10 vicini più prossimi effettivi, con un recupero@10 del 100%. Esaminare più cluster aumenta sia il recupero sia il costo, perciò il numero di cluster esaminati è la principale impostazione da ottimizzare in un indice IVF.
Ricerca vettoriale e termini correlati#
- Ricerca per parole chiave: cerca termini esatti in un indice invertito e li classifica con formule come BM25. È efficace con nomi, codici e parole rare, ma non rileva i sinonimi.
- Ricerca semantica: ricerca per significato, l'obiettivo a cui la ricerca vettoriale risponde più spesso. I sistemi di ricerca semantica aggiungono spesso una riscrittura della query o un riordinatore.
- Ricerca ibrida: esegue insieme la ricerca per parole chiave e quella vettoriale e unisce i due elenchi ordinati.
- Database vettoriale: il sistema che archivia vettori con metadati e offre la ricerca vettoriale con filtri, aggiornamenti e persistenza.
Applicazioni nel mondo reale#
- Generazione aumentata dal recupero (RAG): trova i passaggi dei documenti di cui un modello linguistico ha bisogno per rispondere a una domanda.
- Reidentificazione degli oggetti: confronta l'embedding dell'aspetto di una persona o di un veicolo con avvistamenti precedenti per collegare lo stesso oggetto tra telecamere.
- Riconoscimento facciale: confronta l'embedding di un volto con i volti registrati e accetta quello più vicino quando la distanza è sufficientemente ridotta.
- Sistemi di raccomandazione: suggeriscono prodotti, canzoni o video i cui embedding sono vicini alle scelte recenti di un utente.
Ultralytics Platform usa la ricerca vettoriale per ampliare i dataset di addestramento. La sua azione Trova immagini simili prende un'immagine selezionata, cerca le immagini più vicine in base agli embedding nei dataset pubblici e nei dataset personali e di team dell'utente, e mostra fino a 24 corrispondenze con i relativi punteggi di similarità, che possono essere aggiunte al dataset come immagini di addestramento senza etichette.










