1. Introduzione
In questo codelab imparerai a utilizzare l'integrazione dell'AI di Cloud SQL per MySQL per la ricerca semantica utilizzando gli incorporamenti e a migliorare le prestazioni utilizzando un indice sui dati vettoriali.

Prerequisiti
- Una conoscenza di base di Google Cloud e della console Google Cloud
- Esperienza di base con l'interfaccia a riga di comando e Cloud Shell
Cosa imparerai a fare
- Come eseguire il deployment di un'istanza Cloud SQL per MySQL
- 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 Agent Platform Studio
- Come arricchire il risultato utilizzando un modello Gemini Enterprise Agent Platform
- 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
2. Configurazione e requisiti
Project Setup
- Accedi alla console Google Cloud. Se non hai già un account Gmail o Google Workspace, devi creare un Account Google.
Utilizza un account personale anziché un account di lavoro o della scuola.
- Crea un nuovo progetto o riutilizzane uno esistente. Per creare un nuovo progetto nella console Google Cloud, fai clic su Seleziona un progetto nella barra degli strumenti.

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

Nella finestra di dialogo, inserisci un nome progetto e seleziona la posizione.

- Il Nome progetto è il nome visualizzato per i partecipanti a questo progetto. Il nome del progetto non viene utilizzato dalle API di 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 fornirne uno tuo per verificarne la disponibilità. Nella maggior parte dei codelab, fai riferimento all'ID progetto, che in genere è identificato con il segnaposto
. - 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 Creare e gestire progetti.
Abilita fatturazione
Per attivare la fatturazione, hai due opzioni. Puoi utilizzare il tuo account di fatturazione personale o riscattare i crediti seguendo i passaggi riportati di seguito.
Riscatta i crediti Google Cloud (facoltativo)
Per eseguire questo workshop, è necessario un account di fatturazione con credito. Per iniziare, utilizza i crediti forniti dagli organizzatori del workshop o quelli indicati nel banner nella parte superiore di questo codelab. Se hai già collegato un account di fatturazione, puoi saltare questo passaggio.
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, attiva la fatturazione nella console Google Cloud Billing.
Note:
- Il completamento di questo lab costa meno di 5 $in risorse Google Cloud.
- Segui i passaggi alla fine di questo lab per eliminare le risorse ed evitare ulteriori addebiti.
- I nuovi utenti hanno diritto alla prova senza costi di 300$.
- Gli utenti nuovi ed esistenti possono iniziare a utilizzare Cloud SQL con l'istanza di prova senza costi di Cloud SQL.
Avvia Cloud Shell
Sebbene tu possa gestire Google Cloud da remoto dal tuo computer, 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:

In alternativa, premi G e poi S nella console Google Cloud o apri Cloud Shell.
Bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere il terminale connesso:

Questa macchina virtuale è caricata con tutti gli strumenti di sviluppo di cui hai bisogno. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando le prestazioni e l'autenticazione della rete. Tutto il lavoro in questo codelab può essere svolto all'interno di un browser.
3. Prima di iniziare
Abilita l'API
Per utilizzare Cloud SQL, Compute Engine, Service Networking e Gemini Enterprise Agent Platform, abilita le rispettive API nel tuo progetto Google Cloud.
Nel terminale Cloud Shell, assicurati che l'ID progetto sia impostato:
gcloud config get project
Se restituisce una stringa vuota, impostala con:
gcloud config set project [YOUR-PROJECT-ID]
Imposta la variabile di ambiente PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
Abilita tutte le API necessarie:
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.
Puoi leggere informazioni su ogni API abilitata nella documentazione.
4. Crea un'istanza Cloud SQL
Crea un'istanza Cloud SQL con l'integrazione del database Gemini Enterprise Agent Platform.
Crea password database
Definisci una password per l'utente del database predefinito. Puoi definire una password personalizzata o utilizzare una funzione casuale per generarla:
export CLOUDSQL_PASSWORD=`openssl rand -hex 16`
Visualizza il valore della password generata:
echo $CLOUDSQL_PASSWORD
Prendi nota della password generata per utilizzarla in un secondo momento.
Crea un'istanza Cloud SQL per MySQL
Le istanze Cloud SQL possono essere create utilizzando diversi metodi, tra cui la console Google Cloud, Terraform o Google Cloud CLI (gcloud). In questo codelab utilizzerai gcloud. Per scoprire come creare un'istanza con altri strumenti, consulta la documentazione Crea istanze.
Il flag cloudsql_vector può essere abilitato durante la creazione di un'istanza. Il supporto vettoriale è 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
Connettiti all'istanza utilizzando gcloud sql connect. Quando richiesto, inserisci la password:
gcloud sql connect my-cloudsql-instance --user=root
L'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 premendo Ctrl+D o inserendo exit:
exit
Abilitare l'integrazione di Gemini Enterprise Agent Platform
Concedi il ruolo IAM necessario al service account Cloud SQL per abilitare l'integrazione di Gemini Enterprise Agent Platform.
Recupera l'email del service account Cloud SQL ed esportala come variabile di ambiente:
SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL
Concedi il ruolo roles/aiplatform.user 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
Crea un database e abilita il supporto vettoriale.
Crea database
Crea un database denominato quickstart_db. Puoi creare database utilizzando client di database (come mysql), Google Cloud CLI o Cloud SQL Studio. In questo passaggio, utilizza gcloud.
In Cloud Shell, esegui questo comando per creare il database:
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
6. Carica dati
Crea tabelle nel database e carica i dati utilizzando i file del set di dati fittizio Cymbal Store archiviati in un bucket Cloud Storage pubblico in formato CSV.
Cloud Shell sarà il tuo ambiente principale per connetterti a un database, creare tutti gli oggetti e caricare i dati.
Aggiungi l'IP pubblico di Cloud Shell all'elenco delle reti autorizzate per la nostra istanza Cloud SQL.
In Cloud Shell, esegui:
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)
Se la sessione viene persa, reimposta o lavori da un altro strumento, esporta di nuovo la variabile CLOUDSQL_PASSWORD:
export CLOUDSQL_PASSWORD=...your password defined for the instance...
Crea gli oggetti di database richiesti. Utilizza mysql insieme a curl per scaricare e applicare lo schema 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
Suddivisione dei comandi. Nel passaggio precedente, ti sei connesso al database e hai eseguito lo script SQL per creare tabelle, indici e sequenze.
Poi, compila il database con i dati cymbal_products eseguendo 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;"
Continua 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;"
(Facoltativo) Se hai un tuo set di dati di esempio, puoi importare i file CSV compatibili utilizzando lo strumento di importazione nella console Google Cloud.
7. Crea incorporamenti
Crea incorporamenti per le descrizioni dei prodotti utilizzando il modello text-embedding-005 di Gemini Enterprise Agent Platform e archiviali come dati vettoriali.
Per archiviare i dati vettoriali, devi abilitare la funzionalità vettoriale nell'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
Crea una nuova colonna embedding nella tabella cymbal_products utilizzando la funzione di incorporamento. Questa nuova colonna conterrà gli embedding vettoriali 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);
Nota: la generazione degli incorporamenti per 2000 righe di solito termina in meno di 5 minuti.
Esci dalla sessione mysql:
exit
8. Esegui ricerca di somiglianze
Esegui una ricerca di somiglianze confrontando i vector embedding calcolati per le descrizioni dei prodotti con l'embedding per una query di ricerca.
Puoi eseguire query SQL dalla riga di comando o da Cloud SQL Studio. Cloud SQL Studio offre un modo più comodo per modificare ed eseguire istruzioni SQL lunghe con più righe nell'output.
Crea un utente MySQL per Cloud SQL Studio
Hai bisogno di un nuovo utente del database che possa utilizzare Cloud SQL Studio. Crea un utente di tipo integrato student con la stessa password che hai 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 Google Cloud, vai a Istanze Cloud SQL e fai clic su
my-cloudsql-instance.

- Nel menu di navigazione, fai clic su Cloud SQL Studio.

- Nella finestra di dialogo di autenticazione, inserisci il nome del database e le credenziali:
- Database:
quickstart_db - Utente:
student - Password:
- Database:
- Fai clic su Authenticate (Autentica).

- Fai clic sulla scheda Query senza titolo per aprire l'editor SQL.

Esegui query
Esegui una query per recuperare i 5 prodotti più pertinenti per la query del cliente: "Quali tipi di alberi da frutto crescono bene qui?"
Esegui query con cosine_distance per la ricerca vettoriale KNN (esatta)
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;
In Cloud SQL Studio, inserisci la query e fai clic su Esegui (o esegui la query nella sessione sql):

La query restituisce i prodotti corrispondenti ordinati in base alla distanza coseno:
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | 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)
Il tempo di esecuzione della query è di circa 0,13 secondi con la funzione cosine_distance.
Esegui query con approx_distance per la ricerca vettoriale KNN (esatta)
Esegui la stessa query, ma utilizzando la ricerca KNN con la funzione approx_distance. Se non hai un indice ANN per i tuoi 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 KNN esatta cosine_distance.
Scopri di più sulla funzione nella documentazione di Cloud SQL per MySQL.
9. Migliorare la risposta del modello LLM utilizzando i dati recuperati
Migliora la risposta dell'AI generativa a un'applicazione client passando i risultati della query come contesto fondato in un prompt a un modello linguistico di base di Gemini Enterprise Agent Platform.
A questo scopo:
- Genera un payload JSON dal risultato della ricerca vettoriale in Cloud SQL.
- Testa il prompt in Agent Platform Studio.
- Esegui il prompt end-to-end direttamente da SQL utilizzando l'integrazione
google_ml.
Generare l'output in formato JSON
Modifica la query per formattare il risultato come JSON e restituire una riga:
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;
Output JSON previsto:
[{"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 Agent Platform Studio
Fornisci il JSON generato come contesto in un prompt a un modello generativo in Agent Platform Studio.
- Nella console Google Cloud, apri Agent Platform Studio.

- Inserisci il seguente prompt in Agent Platform Studio:

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:
<JSON_OUTPUT>
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.
Sostituisci con la risposta JSON 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.

- Esegui il prompt.

La risposta include prezzo, descrizione e informazioni supplementari che il modello ottiene da fonti esterne in base alle informazioni sull'albero e sulla posizione.
Esegui il prompt in SQL
Puoi anche utilizzare l'integrazione di Cloud SQL AI con Gemini Enterprise Agent Platform per ricevere risposte da un modello generativo direttamente in SQL.
Innanzitutto, registra il modello.
- Registra il modello
gemini-3.5-flashper generare risposte (sostituiscicon l'ID progetto):
CALL
mysql.ml_create_model_registration(
'gemini-3.5-flash',
'https://aiplatform.googleapis.com/v1/projects/<PROJECT_ID>/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
'google',
'GENERIC',
NULL,
'auth_type_cloudsql_service_agent_iam',
NULL, NULL, NULL, NULL);
Possiamo anche utilizzare l'integrazione di Cloud SQL AI con Gemini Enterprise Agent Platform per ottenere una risposta simile da un modello generativo utilizzando SQL direttamente nel database.
Ora possiamo utilizzare il risultato 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('gemini-3.5-flash',
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:
"Hello there! I'd be happy to help you find the perfect fruit tree for your space. \n\nBased on your area, a wonderful option we currently have in stock is the **Malus Domestica** (the classic Apple Tree)!\n\nHere are the key details:\n\n* **Product Name:** Malus Domestica (Classic Apple Tree)\n* **Price:** $100.00\n\n### Why it's a great choice:\n* **Beautiful Seasonal Foliage:** It features vibrant green leaves during the summer that turn into gorgeous shades of red, orange, and yellow in the autumn. \n* **Shade & Size:** It grows to approximately 30 feet tall, making it a strong, durable tree that offers excellent shade for your yard alongside delicious fresh fruit.\n* **Growing Conditions:** It thrives best in cool, moist climates with well-draining, loamy soil and is ideal for USDA Hardiness Zones 4–8.\n\n### Supplemental Care Tips:\n* **Planting Location:** Choose a spot that gets full sunlight (at least 6 hours a day) to ensure maximum fruit production.\n* **Soil:** Make sure the soil is rich and loamy with good drainage so the roots stay healthy.\n* **Cross-Pollination:** Apple trees often produce a higher yield when planted near another compatible apple tree variety, so if you have extra space, adding a companion tree in the future can boost your harvest!\n\nLet me know if you have any questions about planting or care, or if you'd like help adding this to your cart!"
L'output viene fornito in formato Markdown.
10. Crea un indice dei vicini più prossimi
Per i set di dati di grandi dimensioni con milioni di vettori, la ricerca vettoriale può richiedere risorse di calcolo significative. Per migliorare le prestazioni delle query, crea un indice sugli embedding vettoriali.
Crea indice ScaNN
Per il nostro test, proveremo il tipo di indice ScaNN.
Per creare l'indice per la colonna degli incorporamenti, devi definire la misurazione della distanza per la colonna degli incorporamenti. 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
Esegui di nuovo la query di ricerca vettoriale e visualizza 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)
I miglioramenti del rendimento sono solo leggermente diversi, ma è previsto per un set di dati così piccolo. Sarebbe molto più evidente per i set di dati di grandi dimensioni con milioni di vettori.
Controlla 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)
...
Mostra la scansione dell'indice vettoriale nella tabella cp(alias della tabella cymbal_products).
Provalo con i tuoi dati o testa diverse query di ricerca per vedere come funziona la ricerca semantica in MySQL.
11. Liberare spazio nell'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.
- Esplora il curriculum completo per colmare il divario tra prototipo e produzione.
- Condividi i tuoi progressi con l'hashtag
#ProductionReadyAI.
Argomenti trattati
- Come eseguire il deployment di un'istanza Cloud SQL per MySQL
- 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 Agent Platform Studio
- Come arricchire il risultato utilizzando un modello Gemini Enterprise Agent Platform
- Come migliorare il rendimento utilizzando l'indice vettoriale
Prova un codelab simile per AlloyDB o un codelab per Cloud SQL per PostgreSQL.
Sondaggio
Output: