Eseguire una ricerca vettoriale


Questo tutorial descrive come configurare ed eseguire una ricerca vettoriale in AlloyDB per PostgreSQL utilizzando la console Google Cloud. Gli esempi sono inclusi per mostrare le funzionalità di ricerca vettoriale e sono destinati solo a scopo dimostrativo.

Per scoprire come eseguire una ricerca vettoriale con gli embedding di Vertex AI, consulta Iniziare a utilizzare gli embedding vettoriali con AlloyDB AI.

Obiettivi

  • Crea un cluster AlloyDB e un'istanza principale.
  • Connettiti al 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 prodotti.
  • Esegui una semplice ricerca vettoriale.
  • Esegui una ricerca vettoriale complessa con un filtro e un'unione.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero avere diritto a una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

Abilita la fatturazione e le API richieste

  1. Nella console Google Cloud, vai alla pagina Cluster.

    Vai al selettore dei progetti

  2. Assicurati che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  3. Abilita le API Cloud necessarie per creare e connetterti ad AlloyDB per PostgreSQL.

    Abilita le API

    1. Nel passaggio Conferma progetto, fai clic su Avanti per confermare il nome del progetto a cui apporterai modifiche.
    2. Nel passaggio Abilita API, fai clic su Abilita per attivare quanto segue:

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

Crea un cluster AlloyDB e un'istanza principale

  1. Nella console Google Cloud, vai alla pagina Cluster.

    Vai a Cluster

  2. Fai clic su Crea cluster.

  3. In ID cluster, inserisci my-cluster.

  4. Inserisci una password. Prendi nota di questa password perché la utilizzerai in questo tutorial.

  5. Seleziona una regione, ad esempio us-central1 (Iowa).

  6. Seleziona la rete predefinita.

    Se hai una connessione di accesso privato, vai al passaggio successivo. In caso contrario, fai clic su Configura connessione e segui questi passaggi:

    1. In Alloca un intervallo IP, fai clic su Utilizza un intervallo IP allocato automaticamente.
    2. Fai clic su Continua e poi su Crea connessione.
  7. In Disponibilità a livello di zona, seleziona Zona singola.

  8. Seleziona il tipo di macchina 2 vCPU,16 GB.

  9. In Connettività, seleziona Abilita IP pubblico.

  10. Fai clic su Crea cluster. Potrebbero essere necessari diversi minuti prima che AlloyDB crei il cluster e lo mostri nella pagina Panoramica del cluster principale.

  11. In Istanze nel tuo cluster, espandi il riquadro Connettività. Prendi nota dell'URI connessione, perché lo utilizzerai in questo tutorial.

    L'URI di connessione sia nel formato projects/<var>PROJECT_ID</var>/locations/<var>REGION_ID</var>/clusters/my-cluster/instances/my-cluster-primary.

Concedi l'autorizzazione utente Vertex AI all'agente di servizio AlloyDB

Per consentire ad AlloyDB di utilizzare i modelli di embedding di testo di Vertex AI, devi aggiungere le autorizzazioni utente di Vertex AI all'agente di servizio AlloyDB per il progetto in cui si trovano il cluster e l'istanza.

Per ulteriori informazioni su come aggiungere le autorizzazioni, consulta Concedere l'autorizzazione utente Vertex AI all'agente di servizio AlloyDB.

Connettiti al database utilizzando un browser web

  1. Nella console Google Cloud, vai alla pagina Cluster.

    Vai a Cluster

  2. Nella colonna Nome risorsa, fai clic sul nome del cluster, my-cluster.

  3. Nel riquadro di navigazione, fai clic su AlloyDB Studio.

  4. Nella pagina Accedi ad AlloyDB Studio, segui questi passaggi:

    1. Seleziona il database postgres.
    2. Seleziona l'utente postgres.
    3. Inserisci la password che hai creato in Creare un cluster e la relativa istanza principale.
    4. Fai clic su Authenticate (Autentica). Il riquadro Explorer mostra un elenco degli oggetti nel database postgres.
  5. Apri una nuova scheda facendo clic su + Nuova scheda dell'editor SQL o + Nuova scheda.

Installa 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;

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

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

    • Memorizza le informazioni di base sul prodotto.
    • Include una colonna di vettori embedding che calcola e memorizza un vettore di embedding per una descrizione del 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-005', description)) STORED
      );
    
  2. Esegui la seguente query per creare una tabella product_inventory che memorizzi le informazioni sull'inventario disponibile e sui prezzi corrispondenti. Le tabelle product_inventory e product vengono utilizzate in questo tutorial per eseguire query di ricerca vettoriale complesse.

    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) Esegui la seguente query per verificare che i dati siano inseriti nella tabella product:

    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 che tenta di trovare prodotti simili alla parola music. Ciò significa che, anche se la parola music non è menzionata esplicitamente nella descrizione del prodotto, il risultato mostra i prodotti pertinenti alla query:

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

    Il risultato della query è il seguente: Risultato di una query di ricerca di base

    L'esecuzione di una ricerca vettoriale di base senza creare un indice utilizza la ricerca esatta del vicino più prossimo (KNN), che offre un recupero efficiente. 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 del vicino più prossimo approssimato (ANN), che offre un elevato richiamo con basse latenze.

    Senza creare un indice, AlloyDB utilizza per impostazione predefinita la ricerca esatta del vicino più vicino (KNN).

    Per scoprire di più sull'utilizzo di ScaNN su larga scala, consulta Guida introduttiva agli incorporamenti vettoriali con l'AI di AlloyDB.

Crea un indice ScaNN nella tabella 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 fogli con cui viene creato l'indice basato su albero. Per ulteriori informazioni su come ottimizzare questo parametro, consulta Ottimizzare il rendimento delle query sui vettori.

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 i 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;

I risultati della query sono i seguenti: Risultato della query di ricerca vettoriale

Il parametro di query scann.num_leaves_to_search controlla il numero di nodi foglia sottoposti a ricerca durante una ricerca di somiglianza. I valori dei parametri num_leaves e scann.num_leaves_to_search contribuiscono a ottenere un equilibrio tra rendimento e richiamo.

Puoi eseguire query di ricerca vettoriale filtrata in modo efficiente anche quando utilizzi l'indice ScaNN. 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

  1. Nella console Google Cloud, vai alla pagina Cluster.

    Vai a Cluster

  2. Fai clic sul nome del tuo cluster, my-cluster, nella colonna Nome risorsa.

  3. Fai clic su Elimina cluster.

  4. In Elimina cluster my-cluster, inserisci my-cluster per confermare che vuoi eliminare il cluster.

  5. Fai clic su Elimina.

  6. Se hai creato una connessione privata quando hai creato un cluster, vai alla console Google Cloud pagina Networking e fai clic su Elimina rete VPC.

Passaggi successivi