Questa pagina descrive come eseguire la ricerca di similarità vettoriale in Spanner Graph per trovare i vicini k più prossimi (KNN) e i vicini più prossimi approssimativi (ANN). Puoi utilizzare le funzioni di distanza vettoriale per eseguire ricerche vettoriali KNN e ANN per casi d'uso come la ricerca di somiglianza o la generazione basata sul recupero per applicazioni di AI generativa.
Spanner Graph supporta le seguenti funzioni di distanza per eseguire la ricerca di somiglianza di vettori KNN:
COSINE_DISTANCE()
: misura la distanza più breve tra due vettori.EUCLIDEAN_DISTANCE()
: misura il coseno dell'angolo tra due vettori.DOT_PRODUCT()
: calcola la cotangente dell'angolo moltiplicata per il prodotto delle magnitudini dei vettori corrispondenti. Se sai che tutti gli embedding vettoriali nel tuo set di dati sono normalizzati, puoi utilizzareDOT_PRODUCT()
come funzione di distanza.
Per ulteriori informazioni, consulta Eseguire la ricerca di somiglianza vettoriale in Spanner trovando i K vicini più prossimi.
Spanner Graph supporta anche le seguenti funzioni di distanza approssimativa per eseguire la ricerca di somiglianza vettoriale ANN:
APPROX_COSINE_DISTANCE
: misura la distanza approssimativa più breve tra due vettori.APPROX_EUCLIDEAN_DISTANCE
: misura il coseno approssimativo dell'angolo tra due vettori.APPROX_DOT_PRODUCT
: calcola la cotangente approssimativa dell'angolo moltiplicata per il prodotto delle grandezze vettoriali corrispondenti. Se sai che tutti gli embedding vettoriali nel tuo set di dati sono normalizzati, puoi utilizzareDOT_PRODUCT()
come funzione di distanza.
Per ulteriori informazioni, consulta Trovare i vicini più prossimi approssimativi, creare un indice vettoriale e eseguire query sugli incorporamenti vettoriali.
Prima di iniziare
Per eseguire gli esempi in questo documento, devi prima seguire i passaggi descritti in Configurare e eseguire query su Spanner Graph per:
- Crea un'istanza.
- Crea un database con uno schema di grafo Spanner.
- Inserisci i dati essenziali del grafico.
Dopo aver inserito i dati essenziali del grafico, apporta i seguenti aggiornamenti al database.
Inserire dati vettoriali aggiuntivi nel database grafico
Per apportare gli aggiornamenti necessari al database grafico:
Aggiungi una nuova colonna,
nick_name_embeddings
, alla tabella di inputAccount
.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
Aggiungi i dati alla colonna
nick_name
.UPDATE Account SET nick_name = "Fund for a refreshing tropical vacation" WHERE id = 7; UPDATE Account SET nick_name = "Fund for a rainy day!" WHERE id = 16; UPDATE Account SET nick_name = "Saving up for travel" WHERE id = 20;
Crea gli embedding per il testo nella colonna
nick_name
e compilali nella nuova colonnanick_name_embeddings
.Per generare gli incorporamenti Vertex AI per i tuoi dati operativi in Spanner Graph, consulta Ottenere gli incorporamenti di testo di Vertex AI.
A scopo illustrativo, i nostri esempi utilizzano valori di vettori artificiali a bassa dimensione.
UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 7; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.4, 0.9, 0.7, 0.1] WHERE id = 16; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.2, 0.5, 0.6, 0.6] WHERE id = 20;
Aggiungi due nuove colonne alla tabella di input
AccountTransferAccount
:notes
enotes_embeddings
.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
Crea gli incorporamenti per il testo nella colonna
notes
e inseriscili nella colonnanotes_embeddings
.Per generare gli incorporamenti Vertex AI per i tuoi dati operativi in Spanner Graph, consulta Ottenere gli incorporamenti di testo di Vertex AI.
A scopo illustrativo, i nostri esempi utilizzano valori di vettori artificiali a bassa dimensione.
UPDATE AccountTransferAccount SET notes = "for shared cost of dinner", notes_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 16 AND to_id = 20; UPDATE AccountTransferAccount SET notes = "fees for tuition", notes_embeddings = ARRAY<FLOAT32>[0.1, 0.9, 0.1, 0.7] WHERE id = 20 AND to_id = 7; UPDATE AccountTransferAccount SET notes = 'loved the lunch', notes_embeddings = ARRAY<FLOAT32>[0.4, 0.5, 0.7, 0.9] WHERE id = 20 AND to_id = 16;
Dopo aver aggiunto nuove colonne alle tabelle di input
Account
eAccountTransferAccount
, aggiorna la definizione del grafo delle proprietà utilizzando le seguenti istruzioni. Per ulteriori informazioni, consulta Aggiornare le definizioni di nodi o archi esistenti.CREATE OR REPLACE PROPERTY GRAPH FinGraph NODE TABLES (Account, Person) EDGE TABLES ( PersonOwnAccount SOURCE KEY (id) REFERENCES Person (id) DESTINATION KEY (account_id) REFERENCES Account (id) LABEL Owns, AccountTransferAccount SOURCE KEY (id) REFERENCES Account (id) DESTINATION KEY (to_id) REFERENCES Account (id) LABEL Transfers );
Trovare i K vicini più prossimi
Nell'esempio seguente, utilizza la funzione EUCLIDEAN_DISTANCE()
per eseguire la ricerca di vettori KNN sui nodi e sugli archi del tuo database grafico.
Esegui una ricerca vettoriale KNN sui nodi del grafico
Puoi eseguire una ricerca vettoriale KNN sulla proprietà nick_name_embeddings
del node Account
. Questa ricerca di vettori KNN restituisce il name
del proprietario dell'account e il nick_name
dell'account. Nell'esempio seguente, il risultato mostra i due migliori vicini di K più vicini per gli account per viaggi e vacanze, rappresentato dall'embedding vettoriale [0.2, 0.4, 0.9, 0.6]
.
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(a:Account)
RETURN p.name, a.nick_name
ORDER BY EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
Risultati
nome | nick_name |
---|---|
Alex | Risparmia per una vacanza tropicale rigenerante |
Dana | Risparmiare per i viaggi |
Esegui la ricerca vettoriale KNN sugli archi del grafo
Puoi eseguire una ricerca di vettori KNN sulla proprietà notes_embeddings
del Owns
bordo. Questa ricerca di vettori KNN restituisce il name
del proprietario dell'account e il notes
del trasferimento. Nell'esempio seguente, il risultato mostra i due migliori vicini di K per le spese per il cibo, rappresentato dall'embedding vettoriale [0.2, 0.4, 0.9, 0.6]
.
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(:Account)-[t:Transfers]->(:Account)
WHERE t.notes_embeddings IS NOT NULL
RETURN p.name, t.notes
ORDER BY EUCLIDEAN_DISTANCE(t.notes_embeddings,
-- An illustrative vector embedding for 'food expenses'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
Risultati
nome | note |
---|---|
Lee | per il costo condiviso della cena |
Dana | Il pranzo è stato fantastico |
Crea un indice vettoriale e trova i vicini più prossimi approssimativi
Per eseguire una ricerca con reti neurali artificiali, devi creare un indice vettoriale specializzato
utilizzato da Spanner Graph per accelerare la ricerca vettoriale. L'indice del vettore deve utilizzare una metrica di distanza specifica. Puoi scegliere la metrica della distanza più adatta al tuo caso d'uso impostando il parametro distance_type
su COSINE
, DOT_PRODUCT
o EUCLIDEAN
. Per ulteriori informazioni, consulta
Comandi INDICE VETTORIALE.
Nell'esempio seguente viene creato un indice vettoriale utilizzando il tipo di distanza euclidea nella colonna nick_name_embedding
della tabella di input Account
:
CREATE VECTOR INDEX NickNameEmbeddingIndex
ON Account(nick_name_embeddings)
WHERE nick_name_embeddings IS NOT NULL
OPTIONS (distance_type = 'EUCLIDEAN', tree_depth = 2, num_leaves = 1000);
Esegui la ricerca vettoriale ANN sui nodi del grafico
Dopo aver creato un indice di vettori, puoi eseguire una ricerca di vettori ANN sulla proprietà nick_name
del nodo Account
. La ricerca di vettori ANN restituisce il valore name
del proprietario dell'account e il valore nick_name
dell'account. Nell'esempio seguente, il risultato mostra i due vicini più prossimi approssimativi per gli account per viaggi e vacanze, che è rappresentato dall'embedding vettoriale [0.2, 0.4, 0.9, 0.6]
.
L'suggerimento grafico obbliga lo strumento di ottimizzazione delle query a utilizzare l'indice di vettore specificato nel piano di esecuzione della query.
GRAPH FinGraph
MATCH (@{FORCE_INDEX=NickNameEmbeddingIndex} a:Account)
WHERE a.nick_name_embeddings IS NOT NULL
RETURN a, APPROX_EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6],
options => JSON '{"num_leaves_to_search": 10}') AS distance
ORDER BY distance
LIMIT 2
NEXT
MATCH (p:Person)-[:Owns]->(a)
RETURN p.name, a.nick_name;
Risultati
nome | nick_name |
---|---|
Alex | Risparmia per una vacanza tropicale rigenerante |
Dana | Risparmiare per i viaggi |
Passaggi successivi
- Esegui la ricerca di somiglianza vettoriale in Spanner trovando i K vicini più prossimi.
- Trova i risultati più simili approssimativi, crea l'indice vettoriale ed esegui query sugli incorporamenti vettoriali.
- Ottenere gli embedding di testo di Vertex AI
- Scopri di più sulle query di Spanner Graph.
- Scopri le best practice per l'ottimizzazione delle query.