Effectuer une recherche vectorielle


Ce tutoriel explique comment configurer et effectuer une recherche vectorielle dans AlloyDB pour PostgreSQL à l'aide de la console Google Cloud. Des exemples sont inclus pour montrer les fonctionnalités de recherche vectorielle. Ils sont destinés à des fins de démonstration uniquement.

Pour découvrir comment effectuer une recherche vectorielle avec des embeddings Vertex AI, consultez la page Premiers pas avec les embeddings vectoriels avec AlloyDB AI.

Objectifs

  • Créez un cluster et une instance principale AlloyDB.
  • 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 simple.
  • Effectuez une recherche vectorielle complexe avec un filtre et une jointure.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

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.

Avant de commencer

Activer la facturation et les API requises

  1. Dans la console Google Cloud, accédez à la page Clusters.

    Accéder au sélecteur de projet

  2. Assurez-vous que la facturation est activée pour votre projet Google Cloud .

  3. Activez les APIs Cloud nécessaires pour créer et vous connecter à AlloyDB pour PostgreSQL.

    Activer les API

    1. À l'étape Confirmer le projet, cliquez sur Suivant pour confirmer le nom du projet que vous allez modifier.
    2. À l'étape Activer les API, cliquez sur Activer pour activer les éléments suivants:

      • API AlloyDB
      • API Compute Engine
      • API Service Networking
      • API Vertex AI

Créer un cluster et une instance principale AlloyDB

  1. Dans la console Google Cloud, accédez à la page Clusters.

    accéder aux clusters

  2. Cliquez sur Créer un cluster.

  3. Dans ID de cluster, saisissez my-cluster.

  4. Saisissez un mot de passe. Notez ce mot de passe, car vous l'utiliserez dans ce tutoriel.

  5. Sélectionnez une région, par exemple us-central1 (Iowa).

  6. Sélectionnez le réseau par défaut.

    Si vous disposez d'une connexion d'accès privé, passez à l'étape suivante. Sinon, cliquez sur Configurer la connexion et procédez comme suit:

    1. Dans Allouer une plage d'adresses IP, cliquez sur Utiliser une plage d'adresses IP automatiquement allouée.
    2. Cliquez sur Continuer, puis sur Créer une connexion.
  7. Dans Disponibilité zonale, sélectionnez Zone unique.

  8. Sélectionnez le type de machine 2 vCPU,16 GB.

  9. Dans Connectivité, sélectionnez Activer l'adresse IP publique.

  10. Cliquez sur Créer un cluster. La création du cluster et son affichage sur la page Vue d'ensemble du cluster principal peuvent prendre plusieurs minutes.

  11. Dans Instances dans votre cluster, développez le volet Connectivité. Notez l'URI de connexion, car vous l'utiliserez dans ce tutoriel.

    L'URI de connexion est au format projects/<var>PROJECT_ID</var>/locations/<var>REGION_ID</var>/clusters/my-cluster/instances/my-cluster-primary.

Accorder une autorisation utilisateur Vertex AI à l'agent de service AlloyDB

Pour permettre à AlloyDB d'utiliser les modèles d'embeddings textuels Vertex AI, vous devez ajouter des autorisations utilisateur Vertex AI à l'agent de service AlloyDB pour le projet où se trouvent votre cluster et votre instance.

Pour savoir comment ajouter les autorisations, consultez la section Accorder l'autorisation de l'utilisateur Vertex AI à l'agent de service AlloyDB.

Se connecter à votre base de données à l'aide d'un navigateur Web

  1. Dans la console Google Cloud, accédez à la page Clusters.

    accéder aux clusters

  2. Dans la colonne Nom de la ressource, cliquez sur le nom de votre cluster, my-cluster.

  3. Dans le volet de navigation, cliquez sur AlloyDB Studio.

  4. Sur la page Se connecter à AlloyDB Studio, procédez comme suit:

    1. Sélectionnez la base de données postgres.
    2. Sélectionnez l'utilisateur postgres.
    3. Saisissez le mot de passe que vous avez créé dans Créer un cluster et son instance principale.
    4. Cliquez sur Authentifier. Le volet Explorer affiche la liste des objets de la base de données postgres.
  5. Ouvrez un nouvel onglet en cliquant sur + Nouvel onglet de l'éditeur SQL ou + Nouvel onglet.

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;

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

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

    • Stocke des informations de base sur les produits.
    • Inclut une colonne de vecteurs embedding qui calcule et stocke un vecteur d'embedding pour une description de produit 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-005', 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. Dans ce tutoriel, les tables product_inventory et product sont utilisées pour exécuter des requêtes de recherche vectorielle complexes.

    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: Exécutez la requête suivante pour vérifier que les données sont insérées dans la table product:

    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, qui tente de trouver des produits similaires au mot music. Cela signifie que même si le mot music n'est pas explicitement mentionné dans la description du produit, le résultat affiche les produits pertinents pour la requête:

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

    Le résultat de la requête se présente comme suit : Résultat de la requête de recherche de base

    Effectuer une recherche vectorielle de base sans créer d'index utilise la recherche des plus proches voisins exacts (KNN), qui fournit un rappel efficace. À grande échelle, l'utilisation de KNN peut avoir un impact sur les performances. Pour améliorer les performances des requêtes, nous vous recommandons d'utiliser l'index ScaNN pour la recherche de voisins approximatifs les plus proches (ANN), qui offre un rappel élevé avec des latences faibles.

    Sans créer d'index, AlloyDB utilise par défaut la recherche de type plus proches voisins exacts (KNN).

    Pour en savoir plus sur l'utilisation de ScaNN à grande échelle, consultez Premiers pas avec les embeddings vectoriels avec AlloyDB AI.

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

Exécutez la requête suivante pour créer un indice 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 de feuilles avec lesquels l'index basé sur une 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, les résultats affichent des produits pertinents pour 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;

Les résultats de la requête sont les suivants : Résultat de la requête de recherche vectorielle

Le paramètre de requête scann.num_leaves_to_search contrôle le nombre de nœuds feuilles qui sont 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.

Vous pouvez exécuter des requêtes de recherche vectorielle filtrées de manière efficace, même lorsque vous utilisez l'index SCANN. Exécutez la requête de recherche vectorielle complexe suivante, qui renvoie des résultats pertinents qui répondent 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

  1. Dans la console Google Cloud, accédez à la page Clusters.

    accéder aux clusters

  2. Cliquez sur le nom de votre cluster, my-cluster, dans la colonne Nom de la ressource.

  3. Cliquez sur Supprimer le cluster.

  4. Dans Supprimer le cluster my-cluster, saisissez my-cluster pour confirmer que vous souhaitez supprimer votre cluster.

  5. Cliquez sur Supprimer.

  6. Si vous avez créé une connexion privée lorsque vous avez créé un cluster, accédez à la page "Networking" (Réseaux) de la console Google Cloud, puis cliquez sur Delete VPC network (Supprimer le réseau VPC).

Étape suivante