La ricerca vettoriale in Spanner Omni è una funzionalità integrata ad alte prestazioni che consente la ricerca semantica e la corrispondenza di similarità su dati vettoriali ad alta dimensione. Archiviando e indicizzando gli embedding vettoriali direttamente nel database transazionale, Spanner Omni elimina i database vettoriali separati e le complesse pipeline di estrazione, trasformazione e caricamento (ETL).
Gli argomenti trattati in questo documento si applicano a Spanner Omni nello stesso modo in cui si applicano a Spanner.
Panoramica della ricerca vettoriale
La ricerca vettoriale consente di trovare elementi semanticamente simili rappresentando i dati come vettori numerici (embedding). Spanner Omni supporta due metodi di ricerca principali:
K-Nearest Neighbor (KNN): esegue una ricerca esatta calcolando la distanza tra la query e ogni vettore nel set di dati. Fornisce il richiamo più elevato, ma può essere costoso dal punto di vista computazionale per set di dati di grandi dimensioni.
Approximate Nearest Neighbor (ANN): utilizza un indice vettoriale per trovare rapidamente le corrispondenze in set di dati di grandi dimensioni. Compensa una piccola quantità di accuratezza (richiamo) con guadagni in termini di velocità e scalabilità.
La ricerca vettoriale è particolarmente efficace se combinata con altre funzionalità:
| Combinazione | Vantaggio |
|---|---|
| Ricerca vettoriale con filtro SQL | Combina in modo efficiente la ricerca vettoriale con i filtri (ad esempio, "Trova immagini simili in cui categoria = 'scarpe' e prezzo < 100"). |
| Ricerca vettoriale + ricerca a testo intero | Combina la similarità semantica con la precisione delle parole chiave utilizzando la fusione del rango reciproco (RRF) per migliorare la pertinenza della ricerca. |
| Vettore + grafo | Utilizza la ricerca vettoriale per trovare punti di ingresso (nodi) pertinenti in un grafico delle proprietà e poi attraversa relazioni complesse. |
Per saperne di più, consulta la panoramica della ricerca vettoriale di Spanner nella documentazione di Spanner.
Eseguire la ricerca K-Nearest Neighbor
Spanner Omni supporta la ricerca K-Nearest Neighbor (KNN) utilizzando le funzioni di distanza integrate. Puoi fornire un embedding vettoriale come parametro di input per trovare i vettori più vicini nello spazio N-dimensionale.
Sono disponibili le seguenti funzioni di distanza:
COSINE_DISTANCE(): misura il coseno dell'angolo tra due vettoriEUCLIDEAN_DISTANCE(): misura la distanza in linea retta più breve tra due vettoriDOT_PRODUCT(): calcola il coseno dell'angolo moltiplicato per il prodotto delle magnitudini dei vettori (ideale per i dati normalizzati)
Per saperne di più, consulta Eseguire la ricerca di similarità vettoriale trovando i K-Nearest Neighbor nella documentazione di Spanner.
Scegliere la funzione di distanza vettoriale migliore
La scelta della funzione di distanza appropriata dipende dai dati e dal modello utilizzato per generare gli embedding.
| Funzione | Descrizione | Relazione con l'aumento della similarità |
|---|---|---|
| Prodotto scalare | Calcola il coseno dell'angolo moltiplicato per il prodotto delle magnitudini dei vettori corrispondenti. | Aumenta |
| Distanza coseno | Misura il coseno dell'angolo tra due vettori (1 - similarità del coseno). | Diminuisce |
| Distanza euclidea | Misura la distanza in linea retta tra due vettori. | Diminuisce |
Se gli embedding sono normalizzati (magnitudine = 1.0), DOT_PRODUCT() è in genere una scelta efficiente. Per i dati non normalizzati, prova COSINE_DISTANCE() o EUCLIDEAN_DISTANCE() per determinare quale produce risultati migliori per il tuo caso d'uso.
Per saperne di più, consulta Scegliere tra le funzioni di distanza vettoriale nella documentazione di Spanner.
Approximate Nearest Neighbor (ANN)
La ricerca ANN è progettata per set di dati di grandi dimensioni in cui la ricerca KNN esatta diventa troppo lenta o costosa. Utilizza un indice vettoriale per fornire risultati rapidi con un piccolo compromesso nel richiamo.
La ricerca Approximate Nearest Neighbor (ANN) in Spanner Omni supporta set di dati fino a 1 milione di vettori per vettori di lunghezza massima di 128 dimensioni. Se i vettori hanno più dimensioni, il numero di vettori supportato diminuisce proporzionalmente.
Eseguire la ricerca ANN con gli indici vettoriali
Per eseguire una ricerca ANN, utilizza funzioni di distanza approssimative come APPROX_COSINE_DISTANCE(), APPROX_EUCLIDEAN_DISTANCE() o APPROX_DOT_PRODUCT(). Queste funzioni richiedono:
Un indice vettoriale esistente nella colonna degli embedding.
Una clausola
ORDER BYche utilizza la funzione di distanza approssimativa.Una clausola
LIMITper specificare il numero di risultati.
Per saperne di più, consulta Trovare i vicini più prossimi approssimativi (ANN) ed eseguire query sugli embedding vettoriali nella documentazione di Spanner.
Creare e gestire gli indici vettoriali
Quando crei un indice vettoriale, devi specificare la vector_length della colonna degli embedding e puoi utilizzare la clausola STORING per includere colonne aggiuntive per un filtro più rapido.
Di seguito è riportato un esempio di come creare un indice vettoriale:
CREATE VECTOR INDEX INDEX_NAME
ON TABLE_NAME(EMBEDDING_COLUMN)
OPTIONS (distance_type = 'DISTANCE_TYPE', tree_depth = 2, num_leaves = 1000);
Per saperne di più, consulta Creare e gestire gli indici vettoriali nella documentazione di Spanner.
Best practice per l'indicizzazione vettoriale
Per mantenere un elevato rendimento di ricerca e richiamo:
Ottimizzare le opzioni dell'indice: regola
num_leavesenum_leaves_to_searchin base alle dimensioni dei dati e ai requisiti di rendimento.Ricostruire periodicamente: ricostruisci l'indice se la distribuzione dei tuoi vettori cambia in modo significativo nel tempo.
Utilizzare i filtri in modo efficace: archivia le colonne filtrate di frequente nell'indice per migliorare l'efficienza della ricerca.
Per saperne di più, consulta Best practice per l'indicizzazione vettoriale nella documentazione di Spanner.