Effectuer une recherche vectorielle dans AlloyDB Omni

Sélectionnez une version de la documentation :

Ce tutoriel explique comment configurer et effectuer une recherche vectorielle dans AlloyDB Omni. Vous exécutez des requêtes à l'aide de la recherche exacte des voisins les plus proches (KNN) et de l'index ScaNN basé sur les voisins les plus proches approximatifs (ANN). Vous apprendrez également à exécuter efficacement des requêtes de recherche vectorielle filtrées à l'aide de l'index ScaNN.

Objectifs

  • Installez AlloyDB AI dans AlloyDB Omni.
  • Connectez-vous à votre base de données et installez les extensions requises.
  • Créez une table product et product inventory.
  • Insérez des données dans les tables product et product inventory, puis effectuez une recherche vectorielle de base.
  • Créez un index ScaNN sur la table "products".
  • Effectuez une recherche vectorielle.
  • Effectuez une recherche vectorielle complexe avec un filtre et une jointure.

Coûts

Dans ce document, vous utilisez le composant facturable suivant de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Prérequis

Avant d'effectuer une recherche vectorielle, remplissez les conditions préalables suivantes.

Installer AlloyDB AI dans AlloyDB Omni en fonction de votre environnement informatique

En fonction de l'environnement de calcul que vous utilisez, suivez les instructions de la section Installer AlloyDB AI dans AlloyDB Omni pour installer AlloyDB Omni.

Se connecter à la base de données à l'aide de psql

Connectez-vous à votre base de données à l'aide de psql :

    export DBPOD=`kubectl get pod --selector=alloydbomni.internal.dbadmin.goog/dbcluster=my-db-cluster,alloydbomni.internal.dbadmin.goog/task-type=database -o jsonpath='{.items[0].metadata.name}'`
    kubectl exec -ti $DBPOD -c database -- psql -h localhost -U postgres

Installer les extensions requises

Exécutez la requête suivante pour installer les extensions vector, alloydb_scann et google_ml_integration :

  CREATE EXTENSION IF NOT EXISTS vector;
  CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section "Effectuer un nettoyage".

Insérer des données produit et d'inventaire de produits, et effectuer une recherche vectorielle de base

Les tables product_inventory et product sont utilisées dans ce tutoriel pour exécuter des requêtes de recherche vectorielle complexes.

  1. Exécutez l'instruction suivante pour créer une table product qui effectue les opérations suivantes :

    • Stocke les informations de base sur les produits.
    • Inclut une colonne de vecteur embedding qui calcule et stocke un vecteur d'embedding pour la description de chaque produit.
      CREATE TABLE product (
        id INT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        description TEXT,
        category VARCHAR(255),
        color VARCHAR(255),
        embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004', description)) STORED
      );
    
  2. Exécutez la requête suivante pour créer une table product_inventory qui stocke des informations sur l'inventaire disponible et les prix correspondants.

    CREATE TABLE product_inventory (
      id INT PRIMARY KEY,
      product_id INT REFERENCES product(id),
      inventory INT,
      price DECIMAL(10,2)
    );
    
  3. Exécutez la requête suivante pour insérer des données produit dans la table product :

    INSERT INTO product (id, name, description,category, color) VALUES
    (1, 'Stuffed Elephant', 'Soft plush elephant with floppy ears.', 'Plush Toys', 'Gray'),
    (2, 'Remote Control Airplane', 'Easy-to-fly remote control airplane.', 'Vehicles', 'Red'),
    (3, 'Wooden Train Set', 'Classic wooden train set with tracks and trains.', 'Vehicles', 'Multicolor'),
    (4, 'Kids Tool Set', 'Toy tool set with realistic tools.', 'Pretend Play', 'Multicolor'),
    (5, 'Play Food Set', 'Set of realistic play food items.', 'Pretend Play', 'Multicolor'),
    (6, 'Magnetic Tiles', 'Set of colorful magnetic tiles for building.', 'Construction Toys', 'Multicolor'),
    (7, 'Kids Microscope', 'Microscope for kids with different magnification levels.', 'Educational Toys', 'White'),
    (8, 'Telescope for Kids', 'Telescope designed for kids to explore the night sky.', 'Educational Toys', 'Blue'),
    (9, 'Coding Robot', 'Robot that teaches kids basic coding concepts.', 'Educational Toys', 'White'),
    (10, 'Kids Camera', 'Durable camera for kids to take pictures and videos.', 'Electronics', 'Pink'),
    (11, 'Walkie Talkies', 'Set of walkie talkies for kids to communicate.', 'Electronics', 'Blue'),
    (12, 'Karaoke Machine', 'Karaoke machine with built-in microphone and speaker.', 'Electronics', 'Black'),
    (13, 'Kids Drum Set', 'Drum set designed for kids with adjustable height.', 'Musical Instruments', 'Blue'),
    (14, 'Kids Guitar', 'Acoustic guitar for kids with nylon strings.', 'Musical Instruments', 'Brown'),
    (15, 'Kids Keyboard', 'Electronic keyboard with different instrument sounds.', 'Musical Instruments', 'Black'),
    (16, 'Art Easel', 'Double-sided art easel with chalkboard and whiteboard.', 'Arts & Crafts', 'White'),
    (17, 'Finger Paints', 'Set of non-toxic finger paints for kids.', 'Arts & Crafts', 'Multicolor'),
    (18, 'Modeling Clay', 'Set of colorful modeling clay.', 'Arts & Crafts', 'Multicolor'),
    (19, 'Watercolor Paint Set', 'Watercolor paint set with brushes and palette.', 'Arts & Crafts', 'Multicolor'),
    (20, 'Beading Kit', 'Kit for making bracelets and necklaces with beads.', 'Arts & Crafts', 'Multicolor'),
    (21, '3D Puzzle', '3D puzzle of a famous landmark.', 'Puzzles', 'Multicolor'),
    (22, 'Race Car Track Set', 'Race car track set with cars and accessories.', 'Vehicles', 'Multicolor'),
    (23, 'RC Monster Truck', 'Remote control monster truck with oversized tires.', 'Vehicles', 'Green'),
    (24, 'Train Track Expansion Set', 'Expansion set for wooden train tracks.', 'Vehicles', 'Multicolor');
    
  4. Facultatif : Pour vérifier que les données sont insérées dans la table product, exécutez la requête suivante :

    SELECT * FROM product;
    
  5. Exécutez la requête suivante pour insérer des données d'inventaire dans la table product_inventory :

    INSERT INTO product_inventory (id, product_id, inventory, price) VALUES
    (1, 1, 9, 13.09),
    (2, 2, 40, 79.82),
    (3, 3, 34, 52.49),
    (4, 4, 9, 12.03),
    (5, 5, 36, 71.29),
    (6, 6, 10, 51.49),
    (7, 7, 7, 37.35),
    (8, 8, 6, 10.87),
    (9, 9, 7, 42.47),
    (10, 10, 3, 24.35),
    (11, 11, 4, 10.20),
    (12, 12, 47, 74.57),
    (13, 13, 5, 28.54),
    (14, 14, 11, 25.58),
    (15, 15, 21, 69.84),
    (16, 16, 6, 47.73),
    (17, 17, 26, 81.00),
    (18, 18, 11, 91.60),
    (19, 19, 8, 78.53),
    (20, 20, 43, 84.33),
    (21, 21, 46, 90.01),
    (22, 22, 6, 49.82),
    (23, 23, 37, 50.20),
    (24, 24, 27, 99.27);
    
  6. Exécutez la requête de recherche vectorielle suivante pour rechercher des produits similaires au mot music. Même si le mot music n'est pas explicitement mentionné dans la description du produit, le résultat affiche les produits correspondant à la requête :

    SELECT * FROM product
    ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
    LIMIT 3;
    

    Si vous effectuez une recherche vectorielle de base sans créer d'index, AlloyDB/AI utilise KNN, qui offre un rappel efficace. Toutefois, à grande échelle, l'utilisation de KNN peut avoir un impact sur les performances. Pour de meilleures performances de requête, nous vous recommandons d'utiliser l'index ScaNN pour la recherche ANN, qui offre un rappel élevé avec de faibles latences.

    Si vous ne créez pas d'index, AlloyDB Omni utilise KNN par défaut.

Créer un index ScaNN sur la table "products"

Exécutez la requête suivante pour créer un index ScaNN product_index sur la table product :

  CREATE INDEX product_index ON product
  USING scann (embedding cosine)
  WITH (num_leaves=5);

Le paramètre num_leaves indique le nombre de nœuds feuilles avec lesquels l'index basé sur l'arborescence crée l'index. Pour savoir comment ajuster ce paramètre, consultez Ajuster les performances des requêtes vectorielles.

Exécutez la requête de recherche vectorielle suivante qui tente de trouver des produits similaires à la requête en langage naturel music. Même si le mot music n'est pas inclus dans la description du produit, le résultat affiche les produits qui correspondent à la requête :

SET LOCAL scann.num_leaves_to_search = 2;

SELECT * FROM product
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
  LIMIT 3;

Le paramètre de requête scann.num_leaves_to_search contrôle le nombre de nœuds feuilles recherchés lors d'une recherche de similarité. Les valeurs des paramètres num_leaves et scann.num_leaves_to_search permettent d'équilibrer les performances et le rappel des requêtes.

Exécutez la requête de recherche vectorielle complexe suivante, qui renvoie des résultats pertinents répondant aux conditions de la requête, même avec des filtres :

SET LOCAL scann.num_leaves_to_search = 2;

SELECT * FROM product p
JOIN product_inventory pi ON p.id = pi.product_id
WHERE pi.price < 80.00
ORDER BY embedding <=> embedding('text-embedding-005', 'music')::vector
LIMIT 3;

Effectuer un nettoyage

Supprimer votre cluster de bases de données

      kubectl patch dbclusters.alloydbomni.dbadmin.goog my-db-cluster -p '{"spec":{"isDeleted":true}}' --type=merge

Désinstaller l'opérateur AlloyDB Omni

Pour désinstaller l'opérateur Kubernetes AlloyDB Omni de votre cluster Kubernetes, procédez comme suit :

  1. Supprimez tous vos clusters de bases de données :

          for ns in $(kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces -o=jsonpath='{range .items[*]}{.metadata.namespace}{"\n"}{end}'); do
          for cr in $(kubectl get dbclusters.alloydbomni.dbadmin.goog -n $ns -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'); do
          kubectl patch dbclusters.alloydbomni.dbadmin.goog $cr -n $ns --type=merge -p '{"spec":{"isDeleted":true}}'
          done
          done
      ```
  2. Vérifiez que l'opérateur Kubernetes AlloyDB Omni a supprimé tous vos clusters de bases de données en exécutant la commande suivante :

        kubectl get dbclusters.alloydbomni.dbadmin.goog --all-namespaces
  3. Supprimez les autres ressources créées par l'opérateur Kubernetes AlloyDB Omni :

        kubectl delete failovers.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete restores.alloydbomni.dbadmin.goog --all --all-namespaces
        kubectl delete switchovers.alloydbomni.dbadmin.goog --all --all-namespaces
  4. Désinstallez l'opérateur Kubernetes AlloyDB Omni :

        helm uninstall alloydbomni-operator --namespace alloydb-omni-system
  5. Supprimez les secrets, les descriptions de ressources personnalisées et les espaces de noms associés à l'opérateur Kubernetes AlloyDB Omni :

        kubectl delete certificate -n alloydb-omni-system --all
        kubectl get secrets --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,ANNOTATION:.metadata.annotations.cert-manager\.io/issuer-name | grep -E 'alloydbomni|dbs-al' | awk '{print $1 " " $2}' | xargs -n 2 kubectl delete secret -n
        kubectl delete crd -l alloydb-omni=true
        kubectl delete ns alloydb-omni-system

Étapes suivantes