Inizia a utilizzare gli incorporamenti vettoriali in Cloud SQL per MySQL

1. Introduzione

In questo codelab imparerai a utilizzare l'integrazione di Cloud SQL per MySQL Vertex AI combinando la ricerca vettoriale con gli embedding di Vertex AI.

8aa6ba3bc12a1593.png

Prerequisiti

  • Una conoscenza di base di Google Cloud e della console
  • Competenze di base nell'interfaccia a riga di comando e in Cloud Shell

Cosa imparerai a fare

  • Come eseguire il deployment di un'istanza Cloud SQL per PostgreSQL
  • Come creare un database e abilitare l'integrazione di Cloud SQL AI
  • Come caricare i dati nel database
  • Come utilizzare Cloud SQL Studio
  • Come utilizzare il modello di embedding Vertex AI in Cloud SQL
  • Come utilizzare Vertex AI Studio
  • Come arricchire il risultato utilizzando il modello generativo Vertex AI
  • Come migliorare il rendimento utilizzando l'indice vettoriale

Che cosa ti serve

  • Un account Google Cloud e un progetto Google Cloud
  • Un browser web come Chrome che supporta la console Google Cloud e Cloud Shell

2. Configurazione e requisiti

Configurazione del progetto

  1. Accedi alla console Google Cloud. Se non hai già un account Gmail o Google Workspace, devi crearne uno.

Utilizza un account personale anziché un account di lavoro o della scuola.

  1. Crea un nuovo progetto o riutilizzane uno esistente. Per creare un nuovo progetto nella console Google Cloud, fai clic sul pulsante Seleziona un progetto nell'intestazione per aprire una finestra popup.

295004821bab6a87.png

Nella finestra Seleziona un progetto, premi il pulsante Nuovo progetto per aprire una finestra di dialogo per il nuovo progetto.

37d264871000675d.png

Nella finestra di dialogo, inserisci il nome del progetto che preferisci e scegli la posizione.

96d86d3d5655cdbe.png

  • Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. Il nome del progetto non viene utilizzato dalle API Google e può essere modificato in qualsiasi momento.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Google Cloud genera automaticamente un ID univoco, ma puoi personalizzarlo. Se non ti piace l'ID generato, puoi generarne un altro casuale o fornire il tuo per verificarne la disponibilità. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto, che in genere è identificato con il segnaposto PROJECT_ID.
  • Per tua informazione, esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.

Abilita fatturazione

Per attivare la fatturazione, hai due opzioni. Puoi utilizzare il tuo account di fatturazione personale o riscattare i crediti seguendo questi passaggi.

Riscatta 5 $di crediti Google Cloud (facoltativo)

Per partecipare a questo workshop, devi disporre di un account di fatturazione con del credito. Se prevedi di utilizzare la tua fatturazione, puoi saltare questo passaggio.

  1. Fai clic su questo link e accedi con un Account Google personale.
  2. Visualizzerai un riquadro simile al seguente:

f54628965f465486.png

  1. Fai clic sul pulsante CLICCA QUI PER ACCEDERE AI TUOI CREDITI. Verrà visualizzata una pagina per configurare il tuo profilo di fatturazione. Se viene visualizzata una schermata di registrazione alla prova senza costi, fai clic su Annulla e continua a collegare la fatturazione.

20e88842cf2a732e.png

  1. Fai clic su Conferma. Ora sei connesso a un account di fatturazione di prova di Google Cloud.

cdc87f1c57777951.png

Configurare un account di fatturazione personale

Se hai configurato la fatturazione utilizzando i crediti Google Cloud, puoi saltare questo passaggio.

Per configurare un account di fatturazione personale, vai qui per abilitare la fatturazione in Cloud Console.

Alcune note:

  • Il completamento di questo lab dovrebbe costare meno di 3 $in risorse cloud.
  • Per evitare ulteriori addebiti, puoi seguire i passaggi alla fine di questo lab per eliminare le risorse.
  • I nuovi utenti hanno diritto alla prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere gestito da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

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

Attiva Cloud Shell

In alternativa, puoi premere G e poi S. Questa sequenza attiverà Cloud Shell se ti trovi nella console Google Cloud o utilizza questo link.

Bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere qualcosa di simile a questo:

Screenshot del terminale Google Cloud Shell che mostra che l'ambiente è connesso

Questa macchina virtuale è caricata con tutti gli strumenti di sviluppo di cui avrai bisogno. 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 devi installare nulla.

3. Prima di iniziare

Abilita l'API

Per utilizzare Cloud SQL, Compute Engine, Servizi di rete e Vertex AI, devi abilitare le rispettive API nel tuo progetto Google Cloud.

All'interno del terminale 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)

Attiva tutti i servizi necessari:

gcloud services enable sqladmin.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 sqladmin.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.

Presentazione delle API

  • L'API Cloud SQL Admin (sqladmin.googleapis.com) consente di creare, configurare e gestire le istanze Cloud SQL in modo programmatico. Fornisce il control plane per il servizio di database relazionale completamente gestito di Google (che supporta MySQL, PostgreSQL e SQL Server), gestendo attività come il provisioning, i backup, l'alta disponibilità e lo scaling.
  • L'API Compute Engine (compute.googleapis.com) consente di creare e gestire macchine virtuali (VM), dischi permanenti e impostazioni di rete. Fornisce le basi di Infrastructure as a Service (IaaS) necessarie per eseguire i carichi di lavoro e ospitare l'infrastruttura sottostante per molti servizi gestiti.
  • L'API Cloud Resource Manager (cloudresourcemanager.googleapis.com) ti consente di gestire in modo programmatico i metadati e la configurazione del tuo progetto Google Cloud. Consente di organizzare le risorse, gestire i criteri IAM (Identity and Access Management) e convalidare le autorizzazioni nella gerarchia dei progetti.
  • L'API Service Networking (servicenetworking.googleapis.com) ti consente di automatizzare la configurazione della connettività privata tra la tua rete Virtual Private Cloud (VPC) e i servizi gestiti di Google. È necessario in particolare per stabilire l'accesso IP privato per servizi come AlloyDB, in modo che possano comunicare in modo sicuro con le altre risorse.
  • L'API Vertex AI (aiplatform.googleapis.com) consente alle tue applicazioni di creare, eseguire il deployment e scalare modelli di machine learning. Fornisce l'interfaccia unificata per tutti i servizi di AI di Google Cloud, incluso l'accesso ai modelli di AI generativa (come Gemini) e l'addestramento di modelli personalizzati.

4. Crea un'istanza Cloud SQL

Crea l'istanza Cloud SQL con l'integrazione del database con Vertex AI.

Crea password database

Definisci la password per l'utente di database predefinito. Puoi definire la tua password o utilizzare una funzione casuale per generarla:

export CLOUDSQL_PASSWORD=`openssl rand -hex 12`

Prendi nota del valore generato per la password:

echo $CLOUDSQL_PASSWORD

Crea un'istanza Cloud SQL per MySQL

Il flag cloudsql_vector può essere abilitato durante la creazione di un'istanza. Il supporto dei vettori è attualmente disponibile per MySQL 8.0 R20241208.01_00 o versioni successive

Nella sessione di Cloud Shell esegui:

gcloud sql instances create my-cloudsql-instance \
--database-version=MYSQL_8_4 \
--tier=db-custom-2-8192 \
--region=us-central1 \
--enable-google-ml-integration \
--edition=ENTERPRISE \
--root-password=$CLOUDSQL_PASSWORD

Possiamo verificare la nostra connessione eseguendo il comando da Cloud Shell.

gcloud sql connect my-cloudsql-instance --user=root

Esegui il comando e inserisci la password nel prompt quando è pronto per la connessione.

Output previsto:

$gcloud sql connect my-cloudsql-instance --user=root
Allowlisting your IP for incoming connection for 5 minutes...done.                                                                                                                           
Connecting to database with SQL user [root].Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 8.4.4-google (Google)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Esci dalla sessione mysql per ora utilizzando la scorciatoia da tastiera Ctrl + D o eseguendo il comando exit

exit

Abilita l'integrazione di Vertex AI

Concedi i privilegi necessari al service account Cloud SQL interno per poter utilizzare l'integrazione di Vertex AI.

Trova l'email del service account interno di Cloud SQL ed esportala come variabile.

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

Concedi l'accesso a Vertex AI al service account Cloud SQL:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

Scopri di più sulla creazione e sulla configurazione delle istanze nella documentazione di Cloud SQL qui.

5. Prepara il database

Ora dobbiamo creare un database e attivare il supporto vettoriale.

Crea database

Crea un database con il nome quickstart_db .Per farlo, abbiamo diverse opzioni, come i client di database da riga di comando come mysql per MySQL, SDK o Cloud SQL Studio. Utilizzeremo l'SDK (gcloud) per creare il database.

In Cloud Shell, esegui il comando per creare il database

gcloud sql databases create quickstart_db --instance=my-cloudsql-instance

6. Carica dati

Ora dobbiamo creare oggetti nel database e caricare i dati. Utilizzeremo i dati fittizi di Cymbal Store. I dati sono disponibili in formato SQL (per lo schema) e CSV (per i dati).

Cloud Shell sarà il nostro ambiente principale per connetterci a un database, creare tutti gli oggetti e caricare i dati.

Innanzitutto, dobbiamo aggiungere l'IP pubblico di Cloud Shell all'elenco delle reti autorizzate per l'istanza Cloud SQL. In Cloud Shell, esegui:

gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)

Se la sessione è stata persa, ripristinata o se lavori da un altro strumento, esporta di nuovo la variabile CLOUDSQL_PASSWORD:

export CLOUDSQL_PASSWORD=...your password defined for the instance...

Ora possiamo creare tutti gli oggetti richiesti nel nostro database. A questo scopo, utilizzeremo l'utilità MySQL mysql in combinazione con l'utilità curl, che recupera i dati dall'origine pubblica.

In Cloud Shell, esegui:

export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

Che cosa abbiamo fatto esattamente nel comando precedente? Ci siamo connessi al nostro database ed abbiamo eseguito il codice SQL scaricato, che ha creato tabelle, indici e sequenze.

Il passaggio successivo consiste nel caricare i dati cymbal_products. Utilizziamo le stesse utilità curl e mysql.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_products FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Poi continuiamo con cymbal_stores.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_stores FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

e completalo con cymbal_inventory, che contiene il numero di ogni prodotto in ogni negozio.

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_inventory FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

Se disponi di dati di esempio e di file CSV compatibili con lo strumento di importazione Cloud SQL disponibile in Cloud Console, puoi utilizzarli al posto dell'approccio presentato.

7. Crea incorporamenti

Il passaggio successivo consiste nel creare incorporamenti per le descrizioni dei prodotti utilizzando il modello textembedding-005 di Google Vertex AI e memorizzarli nella nuova colonna della tabella cymbal_products.

Per archiviare i dati vettoriali, dobbiamo attivare la funzionalità vettoriale nella nostra istanza Cloud SQL. Esegui in Cloud Shell:

gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on

Connettiti al database:

mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

e crea una nuova colonna embedding nella tabella cymbal_products utilizzando la funzione di incorporamento. Questa nuova colonna conterrà gli incorporamenti dei vettori basati sul testo della colonna product_description.

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);

La generazione di incorporamenti vettoriali per 2000 righe richiede in genere meno di 5 minuti, ma a volte potrebbe richiedere un po' più di tempo e spesso termina molto più velocemente.

8. Esegui ricerca di somiglianze

Ora possiamo eseguire la ricerca utilizzando la ricerca di similarità basata sui valori dei vettori calcolati per le descrizioni e sul valore del vettore che generiamo per la nostra richiesta utilizzando lo stesso modello di embedding.

La query SQL può essere eseguita dalla stessa interfaccia a riga di comando o, in alternativa, da Cloud SQL Studio. È preferibile gestire query complesse e multiriga in Cloud SQL Studio.

Creare un utente

Abbiamo bisogno di un nuovo utente che possa utilizzare Cloud SQL Studio. Creeremo uno studente utente di tipo integrato con la stessa password che abbiamo utilizzato per l'utente root.

In Cloud Shell, esegui:

gcloud sql users create student  --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%

Avvia Cloud SQL Studio

Nella console, fai clic sull'istanza Cloud SQL che abbiamo creato in precedenza.

27f060eb2764a26a.png

Quando è aperto nel riquadro a destra, possiamo vedere Cloud SQL Studio. Cliccaci sopra.

f08ce4794fce5bce.png

Si aprirà una finestra di dialogo in cui fornire il nome del database e le credenziali:

  • Database: quickstart_db
  • Utente: student
  • Password: la password annotata per l'utente

e fai clic sul pulsante "AUTENTICA".

5c898e4a4a0adb96.png

Si aprirà la finestra successiva, in cui devi fare clic sulla scheda "Editor" sul lato destro per aprire l'editor SQL.

983d35d20f8a3dda.png

Ora siamo pronti per eseguire le query.

Esegui query

Esegui una query per ottenere un elenco dei prodotti disponibili più strettamente correlati alla richiesta di un cliente. La richiesta che passeremo a Vertex AI per ottenere il valore del vettore è: "Quali tipi di alberi da frutto crescono bene qui?"

Ecco la query che puoi eseguire per scegliere i primi 5 elementi più adatti alla nostra richiesta utilizzando la funzione cosine_distance:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cosine_distance(cp.embedding ,@query_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 5;

Copia e incolla la query nell'editor di Cloud SQL Studio e premi il pulsante "RUN" (ESECUZIONE) oppure incollala nella sessione della riga di comando che si connette al database quickstart_db.

a8be9da7d5c2b176.png

Ecco un elenco di prodotti scelti che corrispondono alla query.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.13 sec)

L'esecuzione della query ha richiesto 0,13 secondi con la funzione cosine_distance.

Ora eseguiamo la stessa query, ma utilizzando la ricerca KNN con la funzione approx_distance. Se non disponiamo di un indice ANN per i nostri incorporamenti, viene automaticamente ripristinata la ricerca esatta in background:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Ecco un elenco dei prodotti restituiti dalla query.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set, 1 warning (0.12 sec)

L'esecuzione della query ha richiesto solo 0,12 secondi. Abbiamo ottenuto gli stessi risultati della funzione cosine_distance.

9. Migliorare la risposta dell'LLM utilizzando i dati recuperati

Possiamo migliorare la risposta del LLM di AI generativa a un'applicazione client utilizzando il risultato della query eseguita e preparare un output significativo utilizzando i risultati della query fornita come parte del prompt per un modello linguistico di base generativo di Vertex AI.

Per farlo, dobbiamo generare un file JSON con i risultati della ricerca vettoriale, quindi utilizzare questo file JSON generato come aggiunta a un prompt per un modello LLM in Vertex AI per creare un output significativo. Nel primo passaggio generiamo il JSON, poi lo testiamo in Vertex AI Studio e nell'ultimo passaggio lo incorporiamo in un'istruzione SQL che può essere utilizzata in un'applicazione.

Generare l'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 l'esempio di query che utilizza la ricerca ANN:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
        (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1)
SELECT json_arrayagg(json_object('product_name',product_name,'description',description,'sale_price',sale_price,'zip_code',zip_code,'product_id',product_id)) FROM trees;

Ecco il JSON previsto nell'output:

[{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}]

Esegui il prompt in Vertex AI Studio

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

Apri il prompt di Vertex AI Studio nella console Google Cloud.

d48549b1b0f449b4.png

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

Inserisci un prompt in Studio.

2a6f5a338fefd229.png

Ecco il prompt che utilizzeremo:

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","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

Ecco come appare quando sostituiamo il segnaposto JSON con la risposta della query:

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","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

Ecco il risultato quando eseguiamo il prompt con i nostri valori JSON e utilizzando il modello gemini-2.5-flash:

62fccb783d4d4985.png

La risposta che abbiamo ottenuto dal modello in questo esempio segue l'utilizzo dei risultati della ricerca semantica e del prodotto con la migliore corrispondenza disponibile nel codice postale menzionato.

Esegui il prompt in SQL

Possiamo anche utilizzare l'integrazione di Cloud SQL AI con Vertex AI per ottenere la risposta simile da un modello generativo utilizzando SQL direttamente nel database.

Ora possiamo utilizzare il valore generato in una sottoquery con risultati JSON per fornirlo come parte del prompt al modello di testo di AI generativa utilizzando SQL.

Nella sessione mysql o Cloud SQL Studio al database, esegui la query

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
         (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1),
prompt AS (
SELECT
       CONCAT( '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_arrayagg(json_object('product_name',trees.product_name,'description',trees.description,'sale_price',trees.sale_price,'zip_code',trees.zip_code,'product_id',trees.product_id)) , '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
       mysql.ML_PREDICT_ROW('publishers/google/models/gemini-2.0-flash-001:generateContent',
        json_object('contents',
        json_object('role',
        'user',
        'parts',
        json_array(
        json_object('text',
        prompt_text))))) AS resp
FROM
        prompt)
SELECT
JSON_EXTRACT(resp, '$.candidates[0].content.parts[0].text')
FROM
        response;

Ecco l'output di esempio. L'output potrebbe variare a seconda della versione del modello e dei parametri:

"Okay, I see you're looking for fruit trees that grow well in your area. Based on the available product, the **Malus Domestica** (Apple Tree) is a great option to consider!\n\n* **Product:** Malus Domestica (Apple Tree)\n* **Description:** This classic apple tree grows to about 30 feet tall and provides beautiful seasonal color with green leaves in summer and fiery colors in the fall. It's known for its strength and provides good shade. Most importantly, it produces delicious apples!\n* **Price:** \\$100.00\n* **Growing Zones:** This particular apple tree is well-suited for USDA zones 4-8. Since your zip code is 93230, you are likely in USDA zone 9a or 9b. While this specific tree is rated for zones 4-8, with proper care and variety selection, apple trees can still thrive in slightly warmer climates. You may need to provide extra care during heat waves.\n\n**Recommendation:** I would recommend investigating varieties of Malus Domestica suited to slightly warmer climates or contacting a local nursery/arborist to verify if it is a good fit for your local climate conditions.\n"

L'output viene fornito in formato markdown.

10. Crea un indice dei vicini più prossimi

Il nostro set di dati è relativamente piccolo e il tempo di risposta dipende principalmente dalle interazioni con i modelli di AI. Tuttavia, quando hai milioni di vettori, la ricerca vettoriale può richiedere una parte significativa del nostro tempo di risposta e sovraccaricare il sistema. Per migliorare la possibilità di creare un indice in base ai nostri vettori.

Crea indice ScaNN

Per il nostro test, proveremo il tipo di indice ScANN.

Per creare l'indice per la colonna di embedding, dobbiamo definire la misurazione della distanza per la colonna di embedding. Puoi leggere informazioni dettagliate sui parametri nella documentazione.

CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;

Confronta risposta

Ora possiamo eseguire di nuovo la query di ricerca vettoriale e visualizzare i risultati

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Output previsto:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.08 sec)

Possiamo notare che il tempo di esecuzione è leggermente diverso, ma è previsto per un set di dati così piccolo. Dovrebbe essere molto più evidente per i set di dati di grandi dimensioni con milioni di vettori.

Possiamo esaminare il piano di esecuzione utilizzando il comando EXPLAIN:

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
EXPLAIN ANALYZE SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

Piano di esecuzione (estratto):

...
-> Nested loop inner join  (cost=443 rows=5) (actual time=1.14..1.18 rows=5 loops=1)
                                -> Vector index scan on cp  (cost=441 rows=5) (actual time=1.1..1.1 rows=5 loops=1)
                                -> Single-row index lookup on cp using PRIMARY (uniq_id=cp.uniq_id)  (cost=0.25 rows=1) (actual time=0.0152..0.0152 rows=1 loops=5)

...

Possiamo vedere che utilizzava la scansione dell'indice vettoriale su cp (alias della tabella cymbal_products).

Puoi sperimentare con i tuoi dati o testare diverse query di ricerca per vedere come funziona la ricerca semantica in MySQL.

11. Pulizia dell'ambiente

Elimina l'istanza Cloud SQL

Elimina l'istanza Cloud SQL al termine del lab

In Cloud Shell definisci le variabili di progetto e di ambiente se la connessione è stata interrotta e tutte le impostazioni precedenti sono andate perse:

export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)

Elimina l'istanza:

gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID

Output console previsto:

student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
All of the instance data will be lost when the instance is deleted.

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

Deleting Cloud SQL instance...done.                                                                                                                
Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].

12. Complimenti

Congratulazioni per aver completato il codelab.

Percorso di apprendimento di Google Cloud

Questo lab fa parte del percorso di apprendimento per l'AI pronta per la produzione con Google Cloud.

Argomenti trattati

  • Come eseguire il deployment di un'istanza Cloud SQL per PostgreSQL
  • Come creare un database e abilitare l'integrazione di Cloud SQL AI
  • Come caricare i dati nel database
  • Come utilizzare Cloud SQL Studio
  • Come utilizzare il modello di embedding Vertex AI in Cloud SQL
  • Come utilizzare Vertex AI Studio
  • Come arricchire il risultato utilizzando il modello generativo Vertex AI
  • Come migliorare il rendimento utilizzando l'indice vettoriale

Prova un codelab simile per AlloyDB o un codelab per Cloud SQL per PostgreSQL

13. Sondaggio

Output:

Come utilizzerai questo tutorial?

Solo leggere Leggere e completare gli esercizi