Introduzione agli incorporamenti vettoriali con AlloyDB AI

1. Introduzione

In questo codelab imparerai a utilizzare AlloyDB AI combinando la ricerca vettoriale con gli incorporamenti di Vertex AI.

17e86406ab251142.png

Prerequisiti

  • Conoscenza di base di Google Cloud e della console
  • Competenze di base dell'interfaccia a riga di comando e della shell di Google

Cosa imparerai a fare

  • Come eseguire il deployment del cluster AlloyDB e dell'istanza principale
  • Come connettersi ad AlloyDB dalla VM Google Compute Engine
  • Come creare un database e abilitare AlloyDB AI
  • Come caricare i dati nel database
  • Come utilizzare il modello di incorporamento di Vertex AI in AlloyDB
  • Come arricchire il risultato utilizzando il modello generativo di Vertex AI

Che cosa ti serve

  • Un account Google Cloud e un progetto Google Cloud
  • Un browser web come Chrome.

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo autonomo

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarla.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca. di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento al tuo ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, potresti generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. L'esecuzione di questo codelab non ha alcun costo. Per arrestare le risorse ed evitare di incorrere in fatturazione dopo questo tutorial, puoi eliminare le risorse che hai creato o eliminare il progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Avvia Cloud Shell

Anche se Google Cloud può essere utilizzato da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Dalla console Google Cloud, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:

55efc1aaa7a4d3ad.png

Dovrebbe richiedere solo qualche istante per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere una schermata simile al seguente:

7ffe5cbb04455448.png

Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Tutto il lavoro in questo codelab può essere svolto all'interno di un browser. Non occorre installare nulla.

3. Prima di iniziare

Abilita API

Output:

All'interno di Cloud Shell, assicurati che l'ID progetto sia configurato:

gcloud config set project [YOUR-PROJECT-ID]

Imposta la variabile di ambiente PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Abilita tutti i servizi necessari:

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com

Output previsto

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

Configura la regione predefinita per utilizzare i modelli di incorporamento di Vertex AI. Scopri di più sulle località disponibili per Vertex AI. Nell'esempio utilizziamo la regione us-central1.

gcloud config set compute/region us-central1

4. Esegui il deployment di AlloyDB

Prima di creare un cluster AlloyDB, abbiamo bisogno di un intervallo IP privato disponibile nel nostro VPC da utilizzare dalla futura istanza AlloyDB. Se non lo abbiamo, dobbiamo crearlo, assegnarlo affinché sia utilizzato dai servizi interni di Google e in seguito saremo in grado di creare il cluster e l'istanza.

Crea intervallo IP privato

Dobbiamo configurare la configurazione dell'accesso privato ai servizi nel nostro VPC per AlloyDB. Il presupposto qui è che abbiamo il "valore predefinito" rete VPC nel progetto e verrà utilizzata per tutte le azioni.

Crea l'intervallo IP privato:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

Crea una connessione privata utilizzando l'intervallo IP allocato:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

Output console previsto:

student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].

student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.

student@cloudshell:~ (test-project-402417)$

Crea un cluster AlloyDB

Crea un cluster AlloyDB nella regione us-central1.

Definisci la password per l'utente postgres. Puoi definire la tua password o utilizzare una funzione casuale per generarne una

export PGPASSWORD=`openssl rand -hex 12`

Output console previsto:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

Prendi nota della password PostgreSQL per uso futuro:

echo $PGPASSWORD

Output console previsto:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

Definisci la regione e il nome del cluster AlloyDB. Utilizzeremo la regione us-central1 e alloydb-aip-01 come nome del cluster:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Esegui il comando per creare il cluster:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

Output console previsto:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Crea istanza principale AlloyDB

Creare un'istanza principale AlloyDB per il nostro cluster nella stessa sessione di Cloud Shell. In caso di disconnessione, dovrai definire di nuovo le variabili di ambiente dei nomi del cluster e della regione.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Output console previsto:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

5. Connettiti ad AlloyDB

Il deployment di AlloyDB viene eseguito utilizzando una connessione solo privata, quindi abbiamo bisogno di una VM con un client PostgreSQL installato per lavorare con il database.

Esegui il deployment della VM GCE

Creare una VM GCE nella stessa regione e nella stessa regione del cluster AlloyDB.

In Cloud Shell, esegui:

export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Output console previsto:

student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
    --zone=$ZONE \
    --create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE: 
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.71.192.233
STATUS: RUNNING

Installa il client Postgres

Installa il software client PostgreSQL sulla VM di cui è stato eseguito il deployment

Connettiti alla VM:

gcloud compute ssh instance-1 --zone=us-central1-a

Output console previsto:

student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a
Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417].                                                                                                                                                         
Updating project ssh metadata...done.                                                                                                                                                                                                                                              
Waiting for SSH key to propagate.
Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts.
Linux instance-1.us-central1-a.c.gleb-test-short-001-418811.internal 6.1.0-18-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
student@instance-1:~$ 

Installa il comando in esecuzione del software all'interno della VM:

sudo apt-get update
sudo apt-get install --yes postgresql-client

Output console previsto:

student@instance-1:~$ sudo apt-get update
sudo apt-get install --yes postgresql-client
Get:1 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable InRelease [5146 B]
Get:2 https://packages.cloud.google.com/apt cloud-sdk-bullseye InRelease [6406 B]   
Hit:3 https://deb.debian.org/debian bullseye InRelease  
Get:4 https://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:5 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable/main amd64 Packages [1930 B]
Get:6 https://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:7 https://deb.debian.org/debian bullseye-backports InRelease [49.0 kB]
...redacted...
update-alternatives: using /usr/share/postgresql/13/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (13+225) ...
Processing triggers for man-db (2.9.4-2) ...
Processing triggers for libc-bin (2.31-13+deb11u7) ...

Connettiti all'istanza

Connettiti all'istanza principale dalla VM utilizzando psql.

Nella stessa scheda di Cloud Shell con la sessione SSH aperta per la VM instance-1.

Usa il valore della password AlloyDB (PGPASSWORD) annotato e l'ID cluster AlloyDB per connetterti ad AlloyDB dalla VM GCE:

export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"

Output console previsto:

student@instance-1:~$ export PGPASSWORD=CQhOi5OygD4ps6ty
student@instance-1:~$ ADBCLUSTER=alloydb-aip-01
student@instance-1:~$ REGION=us-central1
student@instance-1:~$ INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
gleb@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (15.6 (Debian 15.6-0+deb12u1), server 15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

Chiudi la sessione psql:

exit

6. Prepara database

Dobbiamo creare un database, abilitare l'integrazione con Vertex AI, creare oggetti di database e importare i dati.

Concedi le autorizzazioni necessarie ad AlloyDB

Aggiungi le autorizzazioni Vertex AI all'agente di servizio AlloyDB.

Apri un'altra scheda di Cloud Shell utilizzando il segno "+" in alto.

4ca978f5142bb6ce.png

Nella nuova scheda Cloud Shell esegui:

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"

Output console previsto:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
  --role="roles/aiplatform.user"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

Chiudi la scheda utilizzando il comando di esecuzione "exit" nella scheda:

exit

Crea database

Guida rapida per la creazione del database.

Nella sessione VM GCE, esegui:

Crea database:

psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"

Output console previsto:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
CREATE DATABASE
student@instance-1:~$  

Abilita l'integrazione di Vertex AI

Abilita l'integrazione di Vertex AI e le estensioni pgvector nel database.

Nella VM GCE, esegui:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"

Output console previsto:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
CREATE EXTENSION
CREATE EXTENSION
student@instance-1:~$ 

Importa dati

Scarica i dati preparati e importali nel nuovo database.

Nella VM GCE, esegui:

gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"

Output console previsto:

student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
SET
SET
SET
SET
SET
 set_config 
------------
 
(1 row)
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE SEQUENCE
ALTER TABLE
ALTER SEQUENCE
ALTER TABLE
ALTER TABLE
ALTER TABLE
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
COPY 941
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
COPY 263861
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
COPY 4654
student@instance-1:~$

7. Calcolare gli incorporamenti

Dopo aver importato i dati, abbiamo inserito i dati di prodotto nella tabella cymbal_products, l'inventario mostra il numero di prodotti disponibili in ogni negozio nella tabella cymbal_inventory e l'elenco dei negozi nella tabella cymbal_stores. Dobbiamo calcolare i dati vettoriali in base alle descrizioni dei nostri prodotti e per farlo utilizzeremo l'incorporamento. Utilizzando la funzione useremo l'integrazione di Vertex AI per calcolare i dati vettoriali in base alle descrizioni dei nostri prodotti e aggiungerli alla tabella. Puoi scoprire di più sulla tecnologia utilizzata nella documentazione.

Crea colonna di incorporamento

Connettiti al database utilizzando psql e crea una colonna virtuale con i dati vettoriali utilizzando la funzione di incorporamento nella tabella cymbal_products. La funzione di incorporamento restituisce dati vettoriali da Vertex AI in base ai dati forniti dalla colonna product_description.

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

Nella sessione psql dopo la connessione al database, esegui:

ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;

Il comando creerà la colonna virtuale e la completerà con dati vettoriali.

Output console previsto:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
psql (13.11 (Debian 13.11-0+deb11u1), server 14.7)
WARNING: psql major version 13, server major version 14.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;
ALTER TABLE
quickstart_db=> 

8. Esegui la ricerca di similitudine

Ora possiamo eseguire la nostra ricerca utilizzando la ricerca di somiglianze basata sui valori vettoriali calcolati per le descrizioni e il valore del vettore che otteniamo per la nostra richiesta.

La query SQL può essere eseguita dalla stessa interfaccia a riga di comando psql o, in alternativa, da AlloyDB Studio. Qualsiasi output multiriga e complesso potrebbe avere un aspetto migliore in AlloyDB Studio.

Collegarsi ad AlloyDB Studio

Nei capitoli seguenti, tutti i comandi SQL che richiedono la connessione al database possono essere eseguiti in alternativa in AlloyDB Studio. Per eseguire il comando devi aprire l'interfaccia della console web per il cluster AlloyDB facendo clic sull'istanza principale.

ef4bfbcf0ed2ef3a.png

Quindi fai clic su AlloyDB Studio a sinistra:

5c155cbcd7d43a1.png

Scegli il database quickstart_db, l'utente postgres e specifica la password annotata quando abbiamo creato il cluster. Fai clic sul pulsante "Autentica" .

432613065cac864f.png

Si aprirà l'interfaccia di AlloyDB Studio. Per eseguire i comandi nel database, fai clic su "Editor 1" sulla destra.

b36c28f8165119ca.png

Si apre un'interfaccia in cui puoi eseguire comandi SQL

cf43aa20f292797e.png

Se preferisci usare psql della riga di comando, segui la route alternativa e connettiti al database dalla sessione SSH della VM, come descritto nei capitoli precedenti.

Esegui la ricerca di Similarity da psql

Se la sessione del database è stata disconnessa, connettiti di nuovo al database utilizzando psql o AlloyDB Studio.

Connettiti al database:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

Esegui una query per ottenere un elenco dei prodotti disponibili maggiormente correlati alla richiesta di un cliente. La richiesta che trasmetteremo a Vertex AI per ottenere il valore del vettore è del tipo "Che tipo di alberi da frutto crescono bene qui?".

Ecco la query che puoi eseguire per scegliere i primi 10 elementi più adatti alla nostra richiesta:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;

Ecco l'output previsto:

quickstart_db=> SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;
    product_name     |                                   description                                    | sale_price | zip_code |      distance       
---------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree         | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 |   0.287184013172779
 Toyon               | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.30574073611569963
 Secateurs           | These secateurs are perfect for pruning small branches and vines.                |      15.00 |    93230 |  0.3264385326189635
 Trimming Shears     | These trimming shears are perfect for trimming hedges and bushes.                |      20.00 |    93230 | 0.33293036535756393
 Cypress Tree        | This is a beautiful cypress tree that will provide shade and privacy. It is an e |      75.00 |    93230 | 0.33485770716129326
 Madrone             | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.3354408801293012
 California Redwood  | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a |    1000.00 |    93230 |  0.3427243109636263
 California Lilac    | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.3427628377929176
 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.3430208475356905
 Maple Tree          | This is a beautiful maple tree that will produce colorful leaves in the fall. It |     100.00 |    93230 |  0.3432609589330091
(10 rows)

quickstart_db=> 

9. Migliora la risposta

Puoi migliorare la risposta a un'applicazione client utilizzando il risultato della query e preparare un output significativo utilizzando i risultati della query forniti come parte del prompt al modello linguistico di base generativo di Vertex AI.

Per raggiungere questo obiettivo, prevediamo di generare un JSON con i risultati della ricerca vettoriale, quindi utilizzeremo il file JSON generato oltre a un prompt per un modello LLM di testo in Vertex AI per creare un output significativo. Nel primo passaggio generiamo il file JSON, quindi lo testiamo in Vertex AI Studio e nell'ultimo lo incorporiamo in un'istruzione SQL che può essere utilizzata in un'applicazione.

Genera output in formato JSON

Modifica la query per generare l'output in formato JSON e restituire una sola riga da passare a Vertex AI

Ecco un esempio della query:

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

Ecco il codice JSON previsto nell'output:

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

Esegui il prompt in Vertex AI Studio

Possiamo utilizzare il JSON generato per fornirlo come parte del prompt al modello di testo dell'IA generativa in Vertex AI Studio

Apri Vertex AI Studio nella console Cloud.

e514b176aef7945e.png

54712e5ade7121f.png

Potrebbe chiederti di abilitare API aggiuntive, ma puoi ignorare la richiesta. Non abbiamo bisogno di altre API per completare il lab.

Ecco il prompt che utilizzeremo:

Sei un consulente cordiale che aiuta a trovare un prodotto in base alle esigenze del cliente.

In base alla richiesta del cliente, abbiamo caricato un elenco di prodotti strettamente correlati alla ricerca.

L'elenco in formato JSON con elenco di valori come {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}

Ecco l'elenco dei prodotti:

[dove trovare il nostro file JSON]

Il cliente ha chiesto: "Quale albero cresce meglio qui?".

Devi fornire informazioni sul prodotto, sul prezzo e su alcune informazioni supplementari. come prompt

Ed ecco il risultato quando eseguiamo il prompt con i nostri valori JSON e utilizzando il modello gemini-1.5-flash:

30e5072cd2975685.png

La risposta che abbiamo ottenuto dal modello in questo esempio segue. Tieni presente che la tua risposta potrebbe essere diversa a causa dei cambiamenti nel tempo del modello e dei parametri:

"Vedo che stai cercando un albero che prosperi nella tua zona. In base al tuo codice postale, 93230, l'albero di ciliegio sembra un'ottima opzione!

Viene descritto come un bellissimo albero che produce deliziose ciliegie. È attualmente in offerta da 75,00 $.

Non ho informazioni specifiche sul tasso di crescita nella tua zona, ma posso dirti che i ciliegi in genere preferiscono un terreno ben drenato e pieno sole.

Per ottenere risultati ottimali, ti consiglio di rivolgerti a un esperto di giardinaggio o vivaio locale che potrà fornirti consigli personalizzati in base alla tua posizione specifica e alle condizioni del suolo. Possono anche aiutarti a scegliere la varietà più adatta alle tue esigenze e offrirti suggerimenti sulla semina e sulla cura."

Esegui il prompt in PSQL

Possiamo utilizzare l'integrazione di AlloyDB AI con Vertex AI per ottenere la stessa risposta da un modello generativo utilizzando SQL direttamente nel database. Ma per usare il modello gemini-1.5-flash dobbiamo prima registrarlo.

Aggiorna l'estensione alla versione 1.3. Connettiti al database quickstart_db da pSQL come è stato mostrato in precedenza (o utilizza AlloyDB Studio) ed esegui:

ALTER EXTENSION google_ml_integration UPDATE TO '1.3'

Quindi dobbiamo impostare il flag di database google_ml_integration.enable_model_support su "on". A questo scopo, puoi utilizzare l'interfaccia della console web di AlloyDB o eseguire il seguente comando gcloud.

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
  --database-flags google_ml_integration.enable_model_support=on \
  --region=$REGION \
  --cluster=$ADBCLUSTER \
  --project=$PROJECT_ID \
  --update-mode=FORCE_APPLY

L'esecuzione in background del comando richiede circa 3-5 minuti. Quindi puoi verificare il nuovo flag nella sessione psql o utilizzando AlloyDB Studio collegandoti al database quickstart_db.

show google_ml_integration.enable_model_support;

L'output previsto dalla sessione psql è "on":

postgres=> show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

Poi dobbiamo registrare due modelli. Il primo è il modello text-embedding-004 già in uso. Deve essere registrato perché abbiamo abilitato le funzionalità di registrazione del modello.

Per registrare il modello eseguito in psql o AlloyDB Studio, utilizza il codice seguente:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    model_type => 'text_embedding',
    model_auth_type => 'alloydb_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

Il modello successivo che dobbiamo registrare è gemini-1.5-flash-001, che verrà utilizzato per generare l'output facile da usare.

CALL
  google_ml.create_model(
    model_id => 'gemini-1.5-flash-001',
    model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-001:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'alloydb_service_agent_iam');

Puoi sempre verificare l'elenco dei modelli registrati selezionando le informazioni da google_ml.model_info_view.

select model_id,model_type from google_ml.model_info_view;

Ecco un output di esempio

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
        model_id         |   model_type   
-------------------------+----------------
 textembedding-gecko     | text_embedding
 textembedding-gecko@001 | text_embedding
 text-embedding-004      | text_embedding
 gemini-1.5-flash-001    | generic
(4 rows)

Ora possiamo utilizzare il codice JSON generato in una sottoquery per fornirlo come parte del prompt al modello di testo di IA generativa utilizzando SQL.

Nella sessione psql o AlloyDB Studio sul database, esegui la query

WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-004',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        json_array_elements(google_ml.predict_row( model_id =>'gemini-1.5-flash-001',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
        string_agg(resp::text,
        ' ')
FROM
        response;

Questo è l'output previsto. L'output potrebbe essere diverso a seconda della versione e dei parametri del modello.

--------------------------------------------------------------------------------------------------------
 "I" " see you're interested in fruit trees! Based on your location, I found" " one great option:\n\n**Cherry Tree:** \n\nThis beautiful cherry tree will" " produce delicious cherries. It's a deciduous tree, meaning it loses its leaves in the fall, and can grow up to 15 feet tall. The" " leaves are a vibrant dark green in the summer, turning a beautiful red in the fall. \n\nCherry trees are known for their beauty and ability to provide shade" " and privacy. They prefer a cool, moist climate and sandy soil, making them a good fit for your area. \n\nThe Cherry Tree is currently on sale for $75.00.\n\nWould you like to know more about" " the Cherry Tree, or are you interested in exploring other fruit tree options? \n" ""
(1 row)

10. Pulisci l'ambiente

Al termine del lab, distruggi le istanze e il cluster AlloyDB

Elimina il cluster AlloyDB e tutte le istanze

Il cluster viene eliminato con un'opzione forzata, che elimina anche tutte le istanze appartenenti al cluster.

In Cloud Shell definisci le variabili di progetto e di ambiente se l'account è stato disconnesso e tutte le impostazioni precedenti vanno perse:

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

Elimina il cluster:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

Output console previsto:

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

Do you want to continue (Y/n)?  Y

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

Elimina i backup AlloyDB

Elimina tutti i backup di AlloyDB per il cluster:

for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

Output console previsto:

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

Ora possiamo eliminare la VM

Elimina VM GCE

In Cloud Shell, esegui:

export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet

Output console previsto:

student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
    --zone=$ZONE \
    --quiet
Deleted 

11. Complimenti

Complimenti per aver completato il codelab.

Argomenti trattati

  • Come eseguire il deployment del cluster AlloyDB e dell'istanza principale
  • Come connettersi ad AlloyDB dalla VM Google Compute Engine
  • Come creare un database e abilitare AlloyDB AI
  • Come caricare i dati nel database
  • Come utilizzare il modello di incorporamento di Vertex AI in AlloyDB
  • Come arricchire il risultato utilizzando il modello generativo di Vertex AI

12. Sondaggio

Output:

Come utilizzerai questo tutorial?

Da leggere solo Leggilo e completa gli esercizi