Questa pagina descrive come eseguire la ricerca di vettori di somiglianza in Spanner utilizzando la distanza coseno, la distanza euclidea e le funzioni di vettore del prodotto scalare per trovare i vicini K più vicini. Prima di leggere questa pagina, è importante comprendere i seguenti concetti:
- Distanza euclidea: misura la distanza più breve tra due vettori.
- Distanza in cosino: misura il coseno dell'angolo tra due vettori.
- Prodotto di punti: calcola il coseno dell'angolo moltiplicato per il prodotto delle magnitudini vettoriali corrispondenti. Se sai che tutti gli incorporamenti vettoriali nel tuo set di dati sono normalizzati, puoi utilizzare
DOT_PRODUCT()
come funzione di distanza. - KNN (KN-Nus): un algoritmo di machine learning supervisionato utilizzato per risolvere problemi di classificazione o regressione.
Puoi utilizzare le funzioni di distanza vettoriale per eseguire una ricerca vettoriale di vicini più vicini K (KNN) per casi d'uso come la ricerca di somiglianze o la generazione aumentata del recupero. Spanner supporta le funzioni COSINE_DISTANCE()
,
EUCLIDEAN_DISTANCE()
e DOT_PRODUCT()
, che operano su incorporamenti
vettoriali, consentendoti di trovare la KNN dell'incorporamento di input.
Ad esempio, dopo aver generato e salvato i dati operativi di Spanner come incorporamenti vettoriali, puoi fornire questi incorporamenti vettoriali come parametro di input nella query per trovare i vettori più vicini nello spazio n-dimensionale per cercare elementi semanticamente simili o correlati.
Tutte e tre le funzioni di distanza prendono gli argomenti vector1
e vector2
, che
sono del tipo array<>
e devono avere le stesse dimensioni e
la stessa lunghezza. Per ulteriori dettagli su queste funzioni, consulta:
COSINE_DISTANCE()
in GoogleSQLEUCLIDEAN_DISTANCE()
in GoogleSQLDOT_PRODUCT()
in GoogleSQL- Funzioni matematiche in PostgreSQL
(
spanner.cosine_distance()
,spanner.euclidean_distance()
espanner.dot_product()
) - Scegli tra le funzioni di distanza vettoriale per misurare la somiglianza con gli incorporamenti vettoriali.
Esempi
I seguenti esempi mostrano la ricerca KNN, la ricerca KNN su dati partizionati e l'utilizzo di un indice secondario con KNN.
Tutti gli esempi utilizzano EUCLIDEAN_DISTANCE()
. Puoi anche utilizzare
COSINE_DISTANCE()
. Inoltre, se tutti gli incorporamenti vettoriali nel tuo set di dati sono normalizzati, puoi utilizzare DOT_PRODUCT()
come funzione di distanza.
Esempio 1: ricerca KNN
Considera una tabella Documents
con una colonna (DocEmbedding
) di incorporamenti di testo precalcolati
dalla colonna DocContents
byte.
GoogleSQL
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING(1024),
DocContents BYTES,
DocEmbedding ARRAY<FLOAT32>
) PRIMARY KEY (UserId, DocId);
PostgreSQL
CREATE TABLE Documents (
UserId bigint primary key,
DocId bigint primary key,
Author varchar(1024),
DocContents bytea,
DocEmbedding float4[]
);
Supponendo che l'incorporamento di input per "baseball, ma non di baseball professionistico" sia l'array [0.3, 0.3, 0.7, 0.7]
, puoi trovare i primi cinque documenti più vicini corrispondenti, con la seguente query:
GoogleSQL
SELECT DocId, DocEmbedding FROM Documents
ORDER BY EUCLIDEAN_DISTANCE(DocEmbedding,
ARRAY<FLOAT32>[0.3, 0.3, 0.7, 0.8])
LIMIT 5;
PostgreSQL
SELECT DocId, DocEmbedding FROM Documents
ORDER BY spanner.euclidean_distance(DocEmbedding,
'{0.3, 0.3, 0.7, 0.8}'::float4[])
LIMIT 5;
I risultati previsti per questo esempio:
Documents
+---------------------------+-----------------+
| DocId | DocEmbedding |
+---------------------------+-----------------+
| 24 | [8, ...] |
+---------------------------+-----------------+
| 25 | [6, ...] |
+---------------------------+-----------------+
| 26 | [3.2, ...] |
+---------------------------+-----------------+
| 27 | [38, ...] |
+---------------------------+-----------------+
| 14229 | [1.6, ...] |
+---------------------------+-----------------+
Esempio 2: ricerca KNN su dati partizionati
La query nell'esempio precedente può essere modificata aggiungendo condizioni alla clausola WHERE
per limitare la ricerca vettoriale a un sottoinsieme di dati. Un'applicazione comune di questa operazione è la ricerca di dati partizionati, ad esempio le righe che appartengono a un UserId
specifico.
GoogleSQL
SELECT UserId, DocId, DocEmbedding FROM Documents
WHERE UserId=18
ORDER BY EUCLIDEAN_DISTANCE(DocEmbedding,
ARRAY<FLOAT32>[0.3, 0.3, 0.7, 0.8])
LIMIT 5;
PostgreSQL
SELECT UserId, DocId, DocEmbedding FROM Documents
WHERE UserId=18
ORDER BY spanner.euclidean_distance(DocEmbedding,
'{0.3, 0.3, 0.7, 0.8}'::float4[])
LIMIT 5;
I risultati previsti per questo esempio:
Documents
+-----------+-----------------+-----------------+
| UserId | DocId | DocEmbedding |
+-----------+-----------------+-----------------+
| 18 | 234 | [12, ...] |
+-----------+-----------------+-----------------+
| 18 | 12 | [1.6, ...] |
+-----------+-----------------+-----------------+
| 18 | 321 | [22, ...] |
+-----------+-----------------+-----------------+
| 18 | 432 | [3, ...] |
+-----------+-----------------+-----------------+
Esempio 3: ricerca KNN su intervalli di indici secondari
Se il filtro con la clausola WHERE
che stai utilizzando non fa parte della chiave primaria della tabella, puoi creare un indice secondario per accelerare l'operazione con una scansione solo dell'indice.
GoogleSQL
CREATE INDEX DocsByAuthor
ON Documents(Author)
STORING (DocEmbedding);
SELECT Author, DocId, DocEmbedding FROM Documents
WHERE Author="Mark Twain"
ORDER BY EUCLIDEAN_DISTANCE(DocEmbedding,
<embeddings for "book about the time traveling American">)
LIMIT 5;
PostgreSQL
CREATE INDEX DocsByAuthor
ON Documents(Author)
INCLUDE (DocEmbedding);
SELECT Author, DocId, DocEmbedding FROM Documents
WHERE Author="Mark Twain"
ORDER BY spanner.euclidean_distance(DocEmbedding,
<embeddings for "that book about the time traveling American">)
LIMIT 5;
I risultati previsti per questo esempio:
Documents
+------------+-----------------+-----------------+
| Author | DocId | DocEmbedding |
+------------+-----------------+-----------------+
| Mark Twain | 234 | [12, ...] |
+------------+-----------------+-----------------+
| Mark Twain | 12 | [1.6, ...] |
+------------+-----------------+-----------------+
| Mark Twain | 321 | [22, ...] |
+------------+-----------------+-----------------+
| Mark Twain | 432 | [3, ...] |
+------------+-----------------+-----------------+
| Mark Twain | 375 | [9, ...] |
+------------+-----------------+-----------------+
Passaggi successivi
Scopri di più sulle funzioni GoogleSQL
COSINE_DISTANCE()
,EUCLIDEAN_DISTANCE()
eDOT_PRODUCT()
.Scopri di più sulle funzioni PostgreSQL
spanner.cosine_distance()
,spanner.euclidean_distance()
espanner.dot_product()
.Scopri di più su come scegliere tra le funzioni di distanza vettoriale per misurare la somiglianza con gli incorporamenti vettoriali.