Esegui la ricerca vettoriale in AlloyDB Omni

Seleziona una versione della documentazione:

Questo tutorial descrive come configurare ed eseguire una ricerca vettoriale in AlloyDB Omni. Esegui query utilizzando la ricerca esatta del vicino più prossimo (KNN) e l'indice ScaNN basato su Approximate Nearest Neighbor (ANN). Scopri anche come eseguire query di ricerca vettoriale filtrate in modo efficiente utilizzando l'indice ScaNN.

Obiettivi

  • Installa AlloyDB AI in AlloyDB Omni.
  • Connettiti al tuo database e installa le estensioni richieste.
  • Crea una tabella product e product inventory.
  • Inserisci i dati nelle tabelle product e product inventory ed esegui una ricerca vettoriale di base.
  • Crea un indice ScaNN nella tabella dei prodotti.
  • Esegui una ricerca vettoriale.
  • Esegui una ricerca vettoriale complessa con un filtro e un join.

Costi

In questo documento viene utilizzato il seguente componente fatturabile di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prerequisiti

Completa i seguenti prerequisiti prima di eseguire una ricerca vettoriale.

Installa AlloyDB AI in AlloyDB Omni in base al tuo ambiente di computing

A seconda dell'ambiente di computing che utilizzi, completa le istruzioni riportate in Installa AlloyDB AI in AlloyDB Omni per installare AlloyDB Omni.

Connettiti al database utilizzando psql

Connettiti al database utilizzando psql selezionando l'ambiente di computing che stai utilizzando:

Docker

  docker exec -it my-omni-1 psql -U postgres

Podman

  podman exec -it my-omni-1 psql -U postgres

Installare le estensioni richieste

Esegui la seguente query per installare le estensioni vector, alloydb_scann e 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;

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Inserisci i dati di prodotto e di inventario dei prodotti ed esegui una ricerca vettoriale di base

Le tabelle product_inventory e product vengono utilizzate in questo tutorial per eseguire query di ricerca vettoriale complesse.

  1. Esegui la seguente istruzione per creare una tabella product che:

    • Memorizza le informazioni di base sul prodotto.
    • Include una colonna vettoriale embedding che calcola e memorizza un vettore di incorporamento per la descrizione di ogni prodotto.
      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. Esegui la seguente query per creare una tabella product_inventory che memorizzi le informazioni sull'inventario disponibile e sui prezzi corrispondenti.

    CREATE TABLE product_inventory (
      id INT PRIMARY KEY,
      product_id INT REFERENCES product(id),
      inventory INT,
      price DECIMAL(10,2)
    );
    
  3. Esegui la seguente query per inserire i dati di prodotto nella tabella 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. (Facoltativo) Per verificare che i dati siano inseriti nella tabella product, esegui la seguente query:

    SELECT * FROM product;
    
  5. Esegui la seguente query per inserire i dati di inventario nella tabella 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. Esegui la seguente query di ricerca vettoriale per cercare prodotti simili alla parola music. Anche se la parola music non è menzionata esplicitamente nella descrizione del prodotto, il risultato mostra prodotti pertinenti alla query:

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

    Se esegui una ricerca vettoriale di base senza creare un indice, AlloyDB AI utilizza KNN, che fornisce un recupero efficiente; tuttavia, su larga scala, l'utilizzo di KNN potrebbe influire sulle prestazioni. Per migliorare le prestazioni delle query, ti consigliamo di utilizzare l'indice ScaNN per la ricerca ANN, che offre un richiamo elevato con latenze basse.

    Se non crei un indice, per impostazione predefinita AlloyDB Omni utilizza KNN.

Crea un indice ScaNN nella tabella dei prodotti

Esegui la seguente query per creare un indice ScaNN product_index nella tabella product:

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

Il parametro num_leaves indica il numero di nodi foglia con cui l'indice basato su albero crea l'indice. Per ulteriori informazioni su come ottimizzare questo parametro, consulta Ottimizzare le prestazioni delle query vettoriali.

Esegui la seguente query di ricerca vettoriale che tenta di trovare prodotti simili alla query in linguaggio naturale music. Anche se la parola music non è inclusa nella descrizione del prodotto, il risultato mostra prodotti pertinenti alla query:

SET LOCAL scann.num_leaves_to_search = 2;

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

Il parametro di query scann.num_leaves_to_search controlla il numero di nodi foglia in cui viene eseguita una ricerca di somiglianze. I valori dei parametri num_leaves e scann.num_leaves_to_search contribuiscono a bilanciare il rendimento e il richiamo delle query.

Esegui la seguente query di ricerca vettoriale complessa, che restituisce risultati pertinenti che soddisfano le condizioni della query, anche con i filtri:

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;

Esegui la pulizia

Docker

  docker container stop my-omni-1
  docker container rm my-omni-1

Podman

  podman container stop my-omni-1
  podman container rm my-omni-1

Passaggi successivi