Questa pagina descrive come trovare i vicini più prossimi approssimati (ANN) ed eseguire query sugli embedding vettoriali utilizzando le funzioni di distanza ANN.
Quando un set di dati è piccolo, puoi utilizzare i vicini più prossimi (KNN) per trovare i vettori k-più prossimi 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-vicini più prossimi approssimati con latenza e costi notevolmente ridotti.
In una ricerca ANN, i vettori k restituiti non sono i primi k-vicini più prossimi effettivi perché la ricerca ANN calcola le distanze approssimative e potrebbe non esaminare tutti i vettori nel set di dati. A volte vengono restituiti alcuni vettori che non rientrano tra i primi k-vicini più prossimi. Questo è 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 un miglioramento delle prestazioni del database è un compromesso accettabile.
Per maggiori dettagli sulle funzioni di distanza approssimativa supportate in Spanner, consulta le seguenti pagine di riferimento per il dialetto del database:
- GoogleSQL
- PostgreSQL
Eseguire query sugli embedding vettoriali
Spanner accelera le ricerche vettoriali dei vicini più prossimi approssimati (ANN) utilizzando un indice vettoriale. Puoi utilizzare un indice vettoriale per eseguire query sugli embedding vettoriali. Per eseguire query sugli embedding vettoriali, devi prima creare un indice vettoriale. Puoi quindi utilizzare una delle tre funzioni di distanza approssimativa per trovare l'ANN.
Le limitazioni quando si utilizzano le funzioni di distanza approssimativa includono le seguenti:
- La funzione di distanza approssimativa deve calcolare la distanza tra una colonna di embedding 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 BYcome unica chiave di ordinamento e dopoORDER BYdeve 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
WHERE <column_name> IS NOT NULLclausola che corrisponda alla definizione dell'indice vettoriale, a meno che la colonna non sia già contrassegnata comeNOT NULLnella definizione della tabella.
Per un elenco dettagliato delle limitazioni, consulta la pagina di riferimento della funzione di distanza approssimativa.
Esempi
Considera una tabella Documents con una colonna DocEmbedding di embedding di testo precalcolati dalla colonna di byte DocContents e una colonna NullableDocEmbedding compilata da altre origini che potrebbero essere nulle.
GoogleSQL
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);
PostgreSQL
CREATE TABLE documents (
user_id bigint not null,
doc_id bigint not null,
author varchar(1024),
doc_contents bytea,
doc_embedding float4[] not null,
nullable_doc_embedding float4[],
word_count bigint,
PRIMARY KEY (user_id, doc_id)
);
Per cercare i 100 vettori più vicini a [1.0, 2.0, 3.0]:
GoogleSQL
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
PostgreSQL
SELECT doc_id
FROM documents
WHERE word_count > 1000
ORDER BY spanner.approx_euclidean_distance(
ARRAY[1.0, 2.0, 3.0]::float4[], doc_embedding,
options=>jsonb'{"num_leaves_to_search": 10}'
)
LIMIT 100;
Se la colonna di embedding ammette valori nulli:
GoogleSQL
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
PostgreSQL
SELECT doc_id
FROM documents
WHERE nullable_doc_embedding IS NOT NULL AND word_count > 1000
ORDER BY spanner.approx_euclidean_distance(
ARRAY[1.0, 2.0, 3.0]::float4[], nullable_doc_embedding,
options=>jsonb'{"num_leaves_to_search": 10}'
)
LIMIT 100;
Passaggi successivi
Scopri di più sugli indici vettoriali di Spanner .
Scopri di più sulle funzioni di distanza approssimativa in GoogleSQL e PostgreSQL.
Scopri di più sulle istruzioni di indice per GoogleSQL
VECTOR INDEXe PostgreSQLINDEX.Scopri di più sulle best practice per gli indici vettoriali.
Prova la guida Introduzione alla ricerca vettoriale di Spanner per un esempio passo passo dell'utilizzo di ANN.