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é ou la génération augmentée de 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 grandeurs vectorielles 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 la section 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 grandeurs vectorielles 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 la section Trouver des voisins les plus proches approximatifs, créer un indice vectoriel et interroger des embeddings vectoriels.

Avant de commencer

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

  1. Créez 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 de graphique essentielles, apportez les modifications suivantes à votre base de données.

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

Pour effectuer les mises à jour requises dans 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 représentations vectorielles continues pour le texte de la colonne nick_name, puis insérez-les dans la nouvelle colonne nick_name_embeddings.

    Pour générer des représentations vectorielles continues Vertex AI pour vos données opérationnelles dans Spanner Graph, consultez la section Obtenir des représentations vectorielles continues sémantiques Vertex AI.

    À des fins d'illustration, nos exemples utilisent des valeurs vectorielles artificielles à 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 représentations vectorielles continues pour le texte de la colonne notes, puis insérez-les dans la colonne notes_embeddings.

    Pour générer des représentations vectorielles continues Vertex AI pour vos données opérationnelles dans Spanner Graph, consultez la section Obtenir des représentations vectorielles continues sémantiques Vertex AI.

    À des fins d'illustration, nos exemples utilisent des valeurs vectorielles artificielles à 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é à l'aide des instructions suivantes. Pour en savoir plus, consultez la section Mettre à jour les définitions de nœud ou d'arc 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 graphique

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 montre les deux voisins les plus proches de comptes pour les voyages et les vacances de loisirs, représenté par l'encapsulation vectorielle [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 Épargner pour des vacances tropicales rafraîchissantes
Dana Épargner pour voyager

Effectuer une recherche vectorielle KNN sur les arêtes de graphes

Vous pouvez effectuer une recherche vectorielle KNN sur la propriété notes_embeddings de la périphérie 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 de dépenses alimentaires, représentés par l'encapsulation vectorielle [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 le coût partagé 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'indice 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 la section Instructions VECTOR INDEX.

Dans l'exemple suivant, vous créez un indice 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 graphique

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

L'indice 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 Épargner pour des vacances tropicales rafraîchissantes
Dana Épargner pour voyager

Étape suivante