Questa pagina descrive come trovare i vicini più prossimi approssimati (ANN) ed eseguire query sugli incorporamenti vettoriali utilizzando le funzioni di distanza ANN.
Quando un set di dati è piccolo, puoi utilizzare K-Nearest Neighbors (KNN) per trovare i vettori k-nearest esatti. Tuttavia, man mano che il set di dati cresce, aumentano anche la latenza e il costo di una ricerca KNN. Puoi utilizzare ANN per trovare i k-nearest neighbors approssimativi con latenza e costi notevolmente ridotti.
In una ricerca ANN, i k vettori restituiti non sono i k vicini più prossimi perché la ricerca ANN calcola distanze approssimative e potrebbe non esaminare tutti i vettori nel set di dati. Occasionalmente, vengono restituiti alcuni vettori che non rientrano tra i primi k-nearest neighbor. Questo fenomeno è noto come perdita di richiamo. La quantità di perdita di richiamo accettabile dipende dal caso d'uso, ma nella maggior parte dei casi, perdere un po' di richiamo in cambio di prestazioni del database migliorate è un compromesso accettabile.
Per maggiori dettagli sulle funzioni di distanza approssimativa supportate in Spanner, consulta le seguenti pagine di riferimento di GoogleSQL:
Eseguire query sugli incorporamenti vettoriali
Spanner accelera le ricerche vettoriali approssimative del vicino più prossimo (ANN) utilizzando un indice vettoriale. Puoi utilizzare un indice vettoriale per eseguire query sugli embedding vettoriali. Per eseguire query sugli incorporamenti vettoriali, devi prima creare un indice vettoriale. Puoi quindi utilizzare una delle tre funzioni di distanza approssimativa per trovare il vicino più prossimo.
Le limitazioni quando si utilizzano le funzioni di distanza approssimativa includono quanto segue:
- La funzione di distanza approssimativa deve calcolare la distanza tra una colonna di incorporamento e un'espressione costante (ad esempio, un parametro o un valore letterale).
- L'output della funzione di distanza approssimativa deve essere utilizzato in una clausola
ORDER BY
come unica chiave di ordinamento e dopoORDER BY
deve essere specificato unLIMIT
. - La query deve filtrare esplicitamente le righe non indicizzate. Nella maggior parte dei casi,
ciò significa che la query deve includere una clausola
WHERE <column_name> IS NOT NULL
che corrisponda alla definizione dell'indice vettoriale, a meno che la colonna non sia già contrassegnata comeNOT NULL
nella definizione della tabella.
Per un elenco dettagliato delle limitazioni, consulta la pagina di riferimento della funzione di distanza approssimativa.
Esempi
Prendi in considerazione una tabella Documents
con una colonna DocEmbedding
di incorporamenti di testo precalcolati dalla colonna DocContents
byte e una colonna NullableDocEmbedding
compilata da altre origini che potrebbero essere nulle.
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING(1024),
DocContents BYTES(MAX),
DocEmbedding ARRAY<FLOAT32> NOT NULL,
NullableDocEmbedding ARRAY<FLOAT32>,
WordCount INT64
) PRIMARY KEY (UserId, DocId);
Per cercare i 100 vettori più vicini a [1.0, 2.0, 3.0]
:
SELECT DocId
FROM Documents
WHERE WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], DocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
Se la colonna di embedding ammette valori nulli:
SELECT DocId
FROM Documents
WHERE NullableDocEmbedding IS NOT NULL AND WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], NullableDocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
Passaggi successivi
Scopri di più sugli indici vettoriali di Spanner.
Scopri di più sulle funzioni GoogleSQL
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
,APPROXIMATE_DOT_PRODUCT()
.Scopri di più sulle istruzioni
VECTOR INDEX
GoogleSQL.Scopri di più sulle best practice per gli indici vettoriali.
Prova la guida Inizia a utilizzare la ricerca vettoriale di Spanner per un esempio passo passo di utilizzo di ANN.