Eseguire ricerche di somiglianza vettoriale in Spanner Graph

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 utilizzare DOT_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 utilizzare DOT_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:

  1. Crea un'istanza.
  2. Crea un database con uno schema di grafo Spanner.
  3. 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:

  1. Aggiungi una nuova colonna, nick_name_embeddings, alla tabella di input Account.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. 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;
    
  3. Crea gli embedding per il testo nella colonna nick_name e compilali nella nuova colonna nick_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;
    
  4. Aggiungi due nuove colonne alla tabella di input AccountTransferAccount: notes e notes_embeddings.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. Crea gli incorporamenti per il testo nella colonna notes e inseriscili nella colonna notes_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;
    
  6. Dopo aver aggiunto nuove colonne alle tabelle di input Account e AccountTransferAccount, 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