Panoramica della ricerca vettoriale di Spanner Omni

La ricerca vettoriale in Spanner Omni è una funzionalità integrata ad alte prestazioni che consente la ricerca semantica e la corrispondenza di somiglianza su dati vettoriali ad alta dimensionalità. Archiviando e indicizzando gli incorporamenti vettoriali direttamente all'interno del database transazionale, Spanner Omni elimina database vettoriali separati e pipeline ETL (estrazione, trasformazione e caricamento) complesse.

Gli argomenti trattati in questo documento si applicano a Spanner Omni nello stesso modo in cui si applicano a Spanner.

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 Neighbors (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 i set di dati di grandi dimensioni.

  • Approximate Nearest Neighbors (ANN): utilizza un indice vettoriale per trovare corrispondenze rapide in set di dati di grandi dimensioni. Compromette una piccola quantità di accuratezza (richiamo) per ottenere vantaggi 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 la categoria è "scarpe" e il prezzo è inferiore a 100").
Ricerca vettoriale + ricerca a testo intero Combina la somiglianza semantica con la precisione delle parole chiave utilizzando la fusione del ranking reciproco (RRF) per migliorare la pertinenza della ricerca.
Vettore + grafico Utilizza la ricerca vettoriale per trovare punti di ingresso (nodi) pertinenti in un grafico delle proprietà e poi attraversare relazioni complesse.

Per saperne di più, consulta la Panoramica della ricerca vettoriale di Spanner nella documentazione di Spanner.

Spanner Omni supporta la ricerca K-Nearest Neighbor (KNN) utilizzando funzioni di distanza integrate. Puoi fornire un vector embedding 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 vettori

  • EUCLIDEAN_DISTANCE(): Misura la distanza in linea retta più breve tra due vettori

  • DOT_PRODUCT(): Calcola il coseno dell'angolo moltiplicato per il prodotto delle magnitudo dei vettori (ideale per i dati normalizzati)

Per saperne di più, consulta Eseguire la ricerca di similarità vettoriale trovando i K-Nearest Neighbors 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 incorporamenti.

Funzione Descrizione Relazione con l'aumento della somiglianza
Prodotto scalare Calcola il coseno dell'angolo moltiplicato per il prodotto delle magnitudo 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 incorporamenti sono normalizzati (magnitudine = 1), DOT_PRODUCT() è in genere una scelta efficiente. Per i dati non normalizzati, prova con COSINE_DISTANCE() o EUCLIDEAN_DISTANCE() per determinare quale produce risultati migliori per il tuo caso d'uso.

Per saperne di più, consulta la sezione Scegliere tra le funzioni di distanza vettoriale nella documentazione di Spanner.

Vicini più prossimi approssimati (ANN)

La ricerca ANN è progettata per set di dati molto grandi 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.

Senza worker di computing dedicati, la ricerca ANN in Spanner Omni supporta set di dati fino a 1 milione di vettori per vettori fino a 128 dimensioni di lunghezza. Se i vettori hanno più dimensioni, il numero supportato di vettori diminuisce proporzionalmente. Spanner Omni supporta tabelle più grandi quando esegui il deployment dei worker per creare gli indici vettoriali. Per saperne di più, consulta la pagina Crea e gestisci indici vettoriali.

Per eseguire una ricerca ANN, utilizza funzioni di distanza approssimativa 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 BY che utilizza la funzione di distanza approssimata.

  • Una clausola LIMIT per specificare il numero di risultati.

Per saperne di più, consulta Trovare i vicini più prossimi approssimativi (ANN) ed eseguire query sugli incorporamenti vettoriali nella documentazione di Spanner.

Creare e gestire indici vettoriali

Quando crei un indice vettoriale, specifica il vector_length della colonna di embedding e utilizza la clausola STORING per includere colonne aggiuntive per un filtraggio 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 Crea e gestisci indici vettoriali nella documentazione di Spanner.

La creazione di indici vettoriali su tabelle di grandi dimensioni che superano i limiti in Approximate Nearest Neighbors (ANN) richiede worker di calcolo dedicati per scaricare l'elaborazione dai server Spanner Omni. Per saperne di più, vedi Eseguire il deployment e gestire i worker.

Utilizza il campionamento durante la creazione di un indice vettoriale

Per set di dati di grandi dimensioni, ad esempio tabelle con decine di milioni di righe o più, puoi ridurre il tempo di creazione dell'indice vettoriale specificando una percentuale di campionamento. Utilizza l'opzione clustering_sampling_percentage nell'istruzione CREATE VECTOR INDEX per campionare un sottoinsieme del set di dati quando crei l'albero dell'indice iniziale.

Come linea guida generale, punta ad almeno 50 righe campionate per foglia. Ad esempio, per un set di dati di 10 milioni di righe con 10.000 foglie, una frequenza di campionamento del 5% (clustering_sampling_percentage = 5) campiona 500.000 righe, ovvero 50 righe per foglia, come mostrato nell'esempio seguente:

CREATE VECTOR INDEX VectorIndex
  ON BaseTable(Embedding)
  WHERE Embedding IS NOT NULL
  OPTIONS (
    tree_depth = 3,
    num_leaves = 10000,
    num_branches = 100,
    leaf_scatter_factor = 32,
    distance_type = 'COSINE',
    min_branch_splits = 10,
    min_leaf_splits = 10,
    clustering_sampling_percentage = 5
  );

Rispetto alla creazione di un indice sull'intero set di dati senza campionamento, il campionamento aumenta la latenza delle query e l'utilizzo della CPU per query per lo stesso richiamo target. L'aumento della percentuale di campionamento aumenta il tempo di creazione dell'indice, ma riduce la latenza delle query e il costo della CPU per query. Scegli una percentuale di campionamento che bilanci il tempo di creazione dell'indice e le prestazioni delle query in base alle risorse di calcolo disponibili per la creazione dell'indice.

Best practice per l'indicizzazione vettoriale

Per mantenere prestazioni di ricerca e richiamo elevate:

  • Ottimizza le opzioni di indice: regola num_leaves e num_leaves_to_search in base alle dimensioni dei dati e ai requisiti di rendimento.

  • Ricostruisci periodicamente: ricostruisci l'indice se la distribuzione dei vettori cambia in modo significativo nel tempo.

  • Utilizza i filtri in modo efficace: memorizza le colonne filtrate di frequente nell'indice per migliorare l'efficienza della ricerca.

Per saperne di più, consulta le best practice per l'indicizzazione vettoriale nella documentazione di Spanner.