Pour savoir comment utiliser la recherche vectorielle filtrée afin d'affiner vos recherches de similarité, consultez Recherche vectorielle filtrée dans AlloyDB Omni.
Pour découvrir comment effectuer une recherche vectorielle avec des embeddings Vertex AI, consultez Premiers pas avec les embeddings vectoriels AlloyDB Omni AI.
Objectifs
- Créer un cluster et une instance principale AlloyDB Omni.
- Se connecter à votre base de données et installer les extensions requises.
- Créer une table
productet une tableproduct inventory. - Insérer des données dans les tables
productetproduct inventory, puis effectuer une recherche vectorielle de base. - Créer un index ScaNN sur la table des produits.
- Effectuer une recherche vectorielle de base.
- Effectuer 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 Google Cloud utilisateurs depeuvent bénéficier d'un essai sans frais.
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 Libérer de l'espace.
Prérequis
Avant d'effectuer une recherche vectorielle, remplissez les conditions préalables suivantes :
- Installer AlloyDB AI dans AlloyDB Omni
-
Exécuter AlloyDB Omni et s'y connecter
en tant qu'utilisateur
postgres. -
Installer les extensions
vector,alloydb_scannetgoogle_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 de produits, puis effectuer une recherche vectorielle de base
Exécutez l'instruction suivante pour créer une table
productqui effectue les opérations suivantes :- Stocke les informations produit de base.
- Inclut une colonne de vecteur
embeddingqui 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-005', description)) STORED );Si nécessaire, vous pouvez afficher les journaux et résoudre les erreurs.
Exécutez la requête suivante pour créer une table
product_inventoryqui stocke des informations sur l'inventaire disponible et les prix correspondants. Les tablesproduct_inventoryetproductsont utilisées dans ce tutoriel 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) );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');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;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);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 motmusicn'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 est le suivant :

L'exécution d'une recherche vectorielle de base sans créer d'index utilise la recherche exacte du voisin le plus proche (KNN), qui offre un rappel efficace. À 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 approximative du voisin le plus proche (ANN), qui offre un rappel élevé avec de faibles latences.
Sans créer d'index, AlloyDB Omni utilise par défaut la recherche exacte du voisin le plus proche (KNN).
Pour en savoir plus sur l'utilisation de ScaNN à grande échelle, consultez Premiers pas avec les embeddings vectoriels AlloyDB AI.
Créer un index ScaNN ajusté manuellement sur la table des produits
Exécutez la requête suivante pour créer un product_index index ScaNN sur la product
table :
CREATE INDEX product_index ON product
USING scann (embedding cosine)
WITH (mode='MANUAL', num_leaves=4);
Pour en savoir plus sur la création d'un index ScaNN, consultez Créer un index ScaNN.
Effectuer une recherche vectorielle
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 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 :

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.
Effectuer une recherche vectorielle qui utilise un filtre et une jointure
Vous pouvez exécuter efficacement des requêtes de recherche vectorielle filtrées, même lorsque vous utilisez l'index ScaNN. 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;
Accélérer votre recherche vectorielle filtrée
Vous pouvez utiliser le store de contenu du moteur de données en colonnes pour améliorer les performances des recherches de similarité vectorielle, en particulier les recherches du voisin le plus proche (KNN), lorsqu'elles sont combinées à un filtrage de prédicat très sélectif (par exemple, à l'aide de LIKE) dans les bases de données. Dans cette section, vous utilisez l'extension vector et
l'extension AlloyDB Omni
google_columnar_engine.
Pour en savoir plus sur le fonctionnement du moteur de données en colonnes, consultez
Présentation du moteur de données en colonnes.
Les améliorations des performances proviennent de l'efficacité intégrée du moteur de données en colonnes pour analyser de grands ensembles de données et appliquer des filtres (tels que les prédicats LIKE), ainsi que de sa capacité, grâce à la prise en charge des vecteurs, à préfiltrer les lignes. Cette fonctionnalité réduit le nombre de sous-ensembles de données requis pour les calculs de distance vectorielle KNN suivants et permet d'optimiser les requêtes analytiques complexes impliquant un filtrage standard et une recherche vectorielle.
Le store orienté colonnes propose deux options pour gérer son contenu :
- Gérer automatiquement le contenu du store orienté colonnes : les nouvelles instances AlloyDB Omni utilisent par défaut l'organisation automatique en colonnes. Vous pouvez également exécuter manuellement la fonctionnalité d'organisation automatique en colonnes.
- Gérer manuellement le contenu du store orienté colonnes: si vous devez gérer manuellement les colonnes du store orienté colonnes pour votre charge de travail, vous pouvez désactiver l'organisation automatique en colonnes.
Pour comparer le temps d'exécution d'une recherche vectorielle KNN filtrée par un prédicat LIKE avant et après l'activation du moteur de données en colonnes, procédez comme suit :
-
Activez l'extension
vectorpour prendre en charge les types de données et les opérations vectorielles. Exécutez les instructions suivantes pour créer un exemple de table (éléments) avec un ID, une description textuelle et une colonne d'embedding vectoriel à 512 dimensions.CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE items ( id SERIAL PRIMARY KEY, description TEXT, embedding VECTOR(512) );
-
Remplissez les données en exécutant les instructions suivantes pour insérer 1 million de lignes dans l'exemple de table
items.-- Simplified example of inserting matching (~0.1%) and non-matching data INSERT INTO items (description, embedding) SELECT CASE WHEN g % 1000 = 0 THEN 'product_' || md5(random()::text) || '_common' -- ~0.1% match ELSE 'generic_item_' || g || '_' || md5(random()::text) -- ~99.9% don't match END, (SELECT array_agg(random()) FROM generate_series(1, 512))::vector FROM generate_series(1, 999999) g;
-
Mesurez les performances de référence de la recherche de similarité vectorielle sans le moteur de données en colonnes.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
Activez le moteur de données en colonnes et la prise en charge des vecteurs.
-
Activez les
google_columnar_engine.enabledetgoogle_columnar_engine.enable_vector_supportindicateurs de base de données.ALTER SYSTEM SET google_columnar_engine.enabled = 'on'; ALTER SYSTEM SET google_columnar_engine.enable_vector_support = 'on';
-
Redémarrez AlloyDB Omni.
systemctl restart alloydbomni18
-
-
Ajoutez la table
itemsau moteur de données en colonnes :SELECT google_columnar_engine_add('items');
-
Mesurez les performances de la recherche de similarité vectorielle à l'aide du moteur de données en colonnes. Vous réexécutez la requête que vous avez exécutée précédemment pour mesurer les performances de référence.
SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
-
Pour vérifier si la requête a été exécutée avec le moteur de données en colonnes, exécutez la commande suivante :
explain (analyze) SELECT id, description, embedding <-> '[...]' AS distance FROM items WHERE description LIKE '%product_%_common%' ORDER BY embedding <-> '[...]' LIMIT 100;
Libérer de l'espace
Pour désinstaller AlloyDB Omni, consultez Gérer et surveiller AlloyDB Omni.
Étape suivante
- Découvrez comment créer des applications d'IA générative à l'aide d'AlloyDB AI.
- Créez un index ScaNN.