Inizia a utilizzare gli incorporamenti vettoriali in Cloud SQL per MySQL

Inizia a utilizzare gli incorporamenti vettoriali in Cloud SQL per MySQL

Informazioni su questo codelab

subjectUltimo aggiornamento: apr 22, 2025
account_circleScritto da: Gleb Otochkin

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.

30b7c4dcdd8bb68f.png

  • Conoscenza di base della console Google Cloud
  • Competenze di base nell'interfaccia a riga di comando e in Cloud Shell
  • Come eseguire il deployment di un'istanza Cloud SQL per MySQL
  • Come creare un database e attivare l'integrazione dell'IA di Cloud SQL
  • Come caricare i dati nel database
  • Come utilizzare il modello di embedding Vertex AI in Cloud SQL
  • Come arricchire il risultato utilizzando il modello generativo di 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 dell'ambiente a tuo ritmo

  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 del progetto è il nome visualizzato per i partecipanti al progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarlo.
  • L'ID progetto è univoco per 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 interessa quale 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 piace, puoi generarne un altro casuale. In alternativa, puoi provare il tuo e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimane invariato per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un Numero 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 le API/risorse Cloud. La partecipazione a questo codelab non ha costi, o quasi. Per arrestare le risorse ed evitare di incorrere in fatturazione al termine di questo tutorial, puoi eliminare le risorse che hai creato o il progetto. I nuovi utenti di Google Cloud sono idonei al programma Prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere utilizzato 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:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

Questa macchina virtuale contiene 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 e l'autenticazione di rete. Tutto il lavoro in questo codelab può essere svolto in un browser. Non devi installare nulla.

3. Prima di iniziare

Attiva l'API

In 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

Risultato 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.

4. Crea un'istanza Cloud SQL

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

Crea password database

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

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 attivato durante la creazione di un'istanza. Il supporto di Vector è attualmente disponibile per MySQL 8.0 R20241208.01_00 o versioni successive

Nella sessione 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 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 è tutto pronto per la connessione.

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>

Abilita l'integrazione di Vertex AI

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

Individua l'indirizzo email dell'account di servizio interno Cloud SQL ed esportalo 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 all'account di servizio 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 dei vettori.

Crea database

Crea un database con il nome quickstart_db .A tale scopo, sono disponibili diverse opzioni, ad esempio client di database a 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 dati fittizi del negozio Cymbal. 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 la nostra istanza Cloud SQL. In Cloud Shell, esegui:

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

Se la sessione è andata persa, è stata reimpostata o 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 tale 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 collegati al nostro database ed eseguito il codice SQL scaricato che ha creato tabelle, indici e sequenze.

Il passaggio successivo consiste nel caricare i dati di 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 completa con cymbal_inventory che contiene il numero di ciascun 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 hai dati di esempio e file CSV compatibili con lo strumento di importazione Cloud SQL disponibile nella console Cloud, puoi utilizzarlo anziché l'approccio presentato.

7. Crea incorporamenti

Il passaggio successivo consiste nel creare embedding 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 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 anche una colonna virtuale embedding nella tabella cymbal_products utilizzando la funzione di incorporamento.

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 embedding di vettori per 2000 righe in genere richiede meno di 5 minuti, ma a volte potrebbe essere necessario un po' più di tempo e spesso il completamento è molto più rapido.

8. Esegui ricerca di somiglianza

Ora possiamo eseguire la ricerca utilizzando la ricerca di similarità in base ai valori vettoriali calcolati per le descrizioni e al valore vettoriale 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. È meglio gestire qualsiasi query complessa e con più righe in Cloud SQL Studio.

Creare un utente

Abbiamo bisogno di un nuovo utente che possa utilizzare Cloud SQL Studio. Creeremo un utente di tipo studente integrato con la stessa password utilizzata 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.

667b658dbf98eb0b.png

Quando è aperto, nel riquadro a destra possiamo vedere Cloud SQL Studio. Fai clic.

a879e8ac914a8ce9.png

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

  • Database: quickstart_db
  • Utente: student
  • Password: la password dell'utente che hai annotato

Fai clic sul pulsante "AUTENTICATI".

36e6036847333d18.png

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

d803b7b6a798094f.png

Ora siamo pronti per eseguire le query.

Esegui query

Esegui una query per ottenere un elenco dei prodotti disponibili più correlati alla richiesta di un cliente. La richiesta che passeremo a Vertex AI per ottenere il valore del vettore è simile a "Quali 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 "Esegui" o incollala nella sessione della riga di comando connettendoti al database quickstart_db.

dffc70835901cf03.png

Ecco un elenco di prodotti scelti corrispondenti 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 abbiamo un indice ANN per i nostri embedding, viene ripristinata automaticamente la ricerca esatta dietro le quinte:

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 dell'LLM di AI generativa a un'applicazione client utilizzando il risultato della query eseguita e preparare un output significativo utilizzando i risultati della query forniti 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 di vettori, quindi utilizzare il 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 un 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;

Ed 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 IA generativa in Vertex AI Studio

Apri Vertex AI Studio Prompt nella console cloud.

411ffb9d164ac140.png

Potrebbe chiederti di attivare API aggiuntive, ma puoi ignorare la richiesta. Non sono necessarie API aggiuntive per completare il lab.

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.

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

9839af512686130d.png

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

Esegui il prompt in PSQL

Possiamo anche utilizzare l'integrazione dell'IA di Cloud SQL con Vertex AI per ottenere una 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 del 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;

Ed ecco l'output di esempio. L'output potrebbe essere diverso a seconda della versione e dei parametri del modello.:

"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. Creare un indice del vicino più vicino

Il nostro set di dati è relativamente piccolo e il tempo di risposta dipende principalmente dalle interazioni con i modelli di IA. Tuttavia, quando hai milioni di vettori, la ricerca di vettori può richiedere una parte significativa del tempo di risposta e comportare un carico elevato sul sistema. Per migliorare questo aspetto, possiamo creare un indice sui nostri vettori.

Creare un indice ScANN

Proveremo il tipo di indice ScANN per il nostro test.

Per creare l'indice per la colonna di embedding, dobbiamo definire la misurazione della distanza per la colonna di embedding. Puoi trovare una descrizione dettagliata dei 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;

Risultato 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 vedere che il tempo di esecuzione è stato solo leggermente diverso, ma è previsto per un set di dati così piccolo. Dovrebbe essere molto più evidente per set di dati di grandi dimensioni con milioni di vettori.

Possiamo dare un'occhiata al 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 per la tabella cymbal_products).

Puoi fare esperimenti con i tuoi dati o testare diverse query di ricerca per scoprire come funziona la ricerca semantica in MySQL.

11. Ripulire l'ambiente

Elimina l'istanza Cloud SQL

Distruggi l'istanza Cloud SQL al termine del lab

In Cloud Shell, definisci le variabili di progetto e di ambiente se la connessione è stata disconnessa 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 della 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

Complimenti per aver completato il codelab.

Argomenti trattati

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

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

13. Sondaggio

Output:

Come utilizzerai questo tutorial?