Utiliser la recherche vectorielle avec Spanner Graph

Cette page explique comment utiliser la recherche vectorielle dans Spanner Graph pour trouver les k plus proches voisins (KNN) et les plus proches voisins approximatifs (ANN). Vous pouvez utiliser des fonctions de distance vectorielle pour effectuer une recherche vectorielle KNN et ANN pour des cas d'utilisation tels que la recherche de similarités ou la génération augmentée par récupération pour les applications d'IA générative.

Spanner Graph accepte les fonctions de distance suivantes pour effectuer une recherche de similarité vectorielle KNN :

  • COSINE_DISTANCE() : mesure la distance la plus courte entre deux vecteurs.
  • EUCLIDEAN_DISTANCE() : mesure le cosinus de l'angle entre deux vecteurs.
  • DOT_PRODUCT() : calcule le cosinus de l'angle multiplié par le produit des magnitudes de vecteurs correspondantes. Si vous savez que tous les embeddings vectoriels de votre ensemble de données sont normalisés, vous pouvez utiliser DOT_PRODUCT() comme fonction de distance.

Pour en savoir plus, consultez Effectuer une recherche de similarité vectorielle dans Spanner en recherchant les k plus proches voisins.

Spanner Graph accepte également les fonctions de distance approximative suivantes pour effectuer une recherche de similarité vectorielle ANN :

  • APPROX_COSINE_DISTANCE : mesure la distance la plus courte approximative entre deux vecteurs.
  • APPROX_EUCLIDEAN_DISTANCE : mesure le cosinus approximatif de l'angle entre deux vecteurs.
  • APPROX_DOT_PRODUCT : calcule le cosinus approximatif de l'angle multiplié par le produit des magnitudes de vecteurs correspondantes. Si vous savez que toutes les représentations vectorielles continues de votre ensemble de données sont normalisées, vous pouvez utiliser DOT_PRODUCT() comme fonction de distance.

Pour en savoir plus, consultez Rechercher les plus proches voisins approximatifs, créer un index vectoriel et interroger des embeddings vectoriels.

Avant de commencer

Pour exécuter les exemples de ce document, vous devez d'abord suivre les étapes de la section Configurer et interroger Spanner Graph pour effectuer les opérations suivantes :

  1. Créer une instance
  2. Créez une base de données avec un schéma Spanner Graph.
  3. Insérez les données essentielles du graphique.

Après avoir inséré les données graphiques essentielles, apportez les modifications suivantes à votre base de données.

Insérer des données vectorielles supplémentaires dans la base de données de graphiques

Pour apporter les modifications requises à votre base de données de graphiques, procédez comme suit :

  1. Ajoutez une colonne nick_name_embeddings à la table d'entrée Account.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. Ajoutez des données à la colonne 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. Créez des embeddings pour le texte de la colonne nick_name et insérez-les dans la nouvelle colonne nick_name_embeddings.

    Pour générer des embeddings Gemini Enterprise Agent Platform pour vos données opérationnelles dans Spanner Graph, consultez Obtenir des embeddings textuels Agent Platform.

    À des fins d'illustration, nos exemples utilisent des valeurs vectorielles artificielles de faible dimension.

    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. Ajoutez deux colonnes à la table d'entrée AccountTransferAccount : notes et notes_embeddings.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. Créez des embeddings pour le texte de la colonne notes et insérez-les dans la colonne notes_embeddings.

    Pour générer des embeddings Agent Platform pour vos données opérationnelles dans Spanner Graph, consultez Obtenir des embeddings de texte Agent Platform.

    À des fins d'illustration, nos exemples utilisent des valeurs vectorielles artificielles de faible dimension.

    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. Après avoir ajouté des colonnes aux tables d'entrée Account et AccountTransferAccount, mettez à jour la définition du graphique de propriétés à l'aide des instructions suivantes. Pour en savoir plus, consultez Mettre à jour les définitions de nœuds ou d'arêtes existantes.

    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
    );
    

Trouver les k plus proches voisins

Dans l'exemple suivant, utilisez la fonction EUCLIDEAN_DISTANCE() pour effectuer une recherche vectorielle KNN sur les nœuds et les arêtes de votre base de données de graphiques.

Effectuer une recherche vectorielle KNN sur les nœuds de graphe

Vous pouvez effectuer une recherche vectorielle KNN sur la propriété nick_name_embeddings du nœud Account. Cette recherche vectorielle KNN renvoie le name du propriétaire du compte et le nick_name du compte. Dans l'exemple suivant, le résultat affiche les deux voisins les plus proches pour comptes pour les voyages de loisirs et les vacances, qui est représenté par l'embedding vectoriel [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;

Résultats

nom nick_name
Alex Fonds pour des vacances tropicales rafraîchissantes
Dana Économiser pour voyager

Effectuer une recherche vectorielle KNN sur les arêtes du graphique

Vous pouvez effectuer une recherche vectorielle KNN sur la propriété notes_embeddings de l'arête Owns. Cette recherche vectorielle KNN renvoie le name du titulaire du compte et le notes du transfert. Dans l'exemple suivant, le résultat affiche les deux voisins les plus proches pour food expenses (dépenses alimentaires), qui est représenté par l'embedding vectoriel [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;

Résultats

nom notes
Lee pour partager les frais du dîner
Dana j'ai adoré le déjeuner

Créer un index vectoriel et trouver les voisins les plus proches approximatifs

Pour effectuer une recherche ANN, vous devez créer un index vectoriel spécialisé que Spanner Graph utilise pour accélérer la recherche vectorielle. L'index vectoriel doit utiliser une métrique de distance spécifique. Vous pouvez choisir la métrique de distance la plus adaptée à votre cas d'utilisation en définissant le paramètre distance_type sur COSINE, DOT_PRODUCT ou EUCLIDEAN. Pour en savoir plus, consultez Instructions VECTOR INDEX.

Dans l'exemple suivant, vous créez un index vectoriel à l'aide du type de distance euclidienne sur la colonne nick_name_embedding de la table d'entrée 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);

Effectuer une recherche vectorielle ANN sur les nœuds de graphe

Une fois que vous avez créé un index vectoriel, vous pouvez effectuer une recherche vectorielle ANN sur la propriété nick_name du nœud Account. La recherche vectorielle ANN renvoie le name et le nick_name du propriétaire du compte. Dans l'exemple suivant, le résultat affiche les deux voisins les plus proches approximatifs pour comptes pour les voyages de loisirs et les vacances, qui est représenté par l'embedding vectoriel [0.2, 0.4, 0.9, 0.6].

L'indication de graphique force l'optimiseur de requêtes à utiliser l'index vectoriel spécifié dans le plan d'exécution de la requête.

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;

Résultats

nom nick_name
Alex Fonds pour des vacances tropicales rafraîchissantes
Dana Économiser pour voyager

Étapes suivantes