Cómo comenzar a usar las incorporaciones vectoriales en Cloud SQL para MySQL

1. Introducción

En este codelab, aprenderás a usar la integración de IA de Cloud SQL para MySQL para la búsqueda semántica con embeddings y a mejorar el rendimiento con un índice en los datos de vectores.

8aa6ba3bc12a1593.png

Requisitos previos

  • Conocimientos básicos de Google Cloud y la consola de Google Cloud
  • Experiencia básica con la interfaz de línea de comandos y Cloud Shell

Qué aprenderás

  • Cómo implementar una instancia de Cloud SQL para MySQL
  • Cómo crear una base de datos y habilitar la integración de IA de Cloud SQL
  • Cómo cargar datos en la base de datos
  • Cómo usar Cloud SQL Studio
  • Cómo usar el modelo de embeddings de Vertex AI en Cloud SQL
  • Cómo usar Agent Platform Studio
  • Cómo enriquecer el resultado con un modelo de Gemini Enterprise Agent Platform
  • Cómo mejorar el rendimiento con el índice de vectores

Requisitos

  • Una cuenta de Google Cloud y un proyecto de Google Cloud
  • Un navegador web, como Chrome

2. Configuración y requisitos

Configuración del proyecto

  1. Accede a la consola de Google Cloud. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una Cuenta de Google.

Usa una cuenta personal en lugar de una cuenta laboral o educativa.

  1. Crea un proyecto nuevo o reutiliza uno existente. Para crear un proyecto nuevo en la consola de Google Cloud, haz clic en Seleccionar un proyecto en la barra de herramientas.

295004821bab6a87.png

En la ventana Select a project, presiona el botón New Project, que abrirá un cuadro de diálogo para el proyecto nuevo.

37d264871000675d.png

En el diálogo, ingresa un Nombre del proyecto y selecciona la Ubicación.

96d86d3d5655cdbe.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Las APIs de Google no usan el nombre del proyecto, y se puede cambiar en cualquier momento.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Google Cloud genera automáticamente un ID único, pero puedes personalizarlo. Si no te gusta el ID generado, puedes generar otro aleatorio o proporcionar el tuyo para verificar su disponibilidad. En la mayoría de los codelabs, se hace referencia al ID del proyecto, que suele identificarse con el marcador de posición .
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación de Creación y administración de proyectos.

Habilitar facturación

Para habilitar la facturación, tienes dos opciones. Puedes usar tu cuenta de facturación personal o canjear créditos siguiendo estos pasos.

Canjea créditos de Google Cloud (opcional)

Para realizar este taller, necesitas una cuenta de facturación con crédito. Para comenzar, usa los créditos que proporcionan los organizadores del taller o los que se indican en el banner que se encuentra en la parte superior de este codelab. Si ya te conectaste a una cuenta de facturación, puedes omitir este paso.

Configura una cuenta de facturación personal

Si configuraste la facturación con créditos de Google Cloud, puedes omitir este paso.

Para configurar una cuenta de facturación personal, habilita la facturación en la consola de Facturación de Google Cloud.

Notas:

  • Completar este lab cuesta menos de USD 5 en recursos de Google Cloud.
  • Sigue los pasos que se indican al final de este lab para borrar los recursos y evitar cargos adicionales.
  • Los usuarios nuevos pueden acceder a la prueba gratuita de USD 300.
  • Los usuarios nuevos y existentes pueden comenzar a usar Cloud SQL con la instancia de prueba gratuita de Cloud SQL

Inicia Cloud Shell

Si bien puedes operar Google Cloud de forma remota desde tu computadora, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

En la consola de Google Cloud, haz clic en el ícono de Cloud Shell en la barra de herramientas de la parte superior derecha:

Activar Cloud Shell

Como alternativa, presiona G y, luego, S en la consola de Google Cloud, o bien abre Cloud Shell.

El aprovisionamiento y la conexión al entorno solo tardan unos minutos. Cuando termine, deberías ver la terminal conectada:

Captura de pantalla de la terminal de Google Cloud Shell que muestra que el entorno se conectó

Esta máquina virtual está cargada con todas las herramientas de desarrollo necesarias. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que mejora el rendimiento de la red y la autenticación. Todo tu trabajo en este codelab se puede hacer en un navegador.

3. Antes de comenzar

Habilitar API

Para usar Cloud SQL, Compute Engine, Service Networking y Gemini Enterprise Agent Platform, habilita sus respectivas APIs en tu proyecto de Google Cloud.

En la terminal de Cloud Shell, asegúrate de que esté establecido tu ID del proyecto:

gcloud config get project

Si devuelve una cadena vacía, configúrala con lo siguiente:

gcloud config set project [YOUR-PROJECT-ID]

Establece la variable de entorno PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Habilita todas las APIs necesarias:

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

Resultado esperado

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.

Puedes leer sobre cada API habilitada en la documentación.

4. Cree una instancia de Cloud SQL

Crea una instancia de Cloud SQL con la integración de la base de datos de Gemini Enterprise Agent Platform.

Crea una contraseña para la base de datos

Define una contraseña para el usuario de base de datos predeterminado. Puedes definir tu propia contraseña o usar una función aleatoria para generar una:

export CLOUDSQL_PASSWORD=`openssl rand -hex 16`

Muestra el valor de la contraseña generada:

echo $CLOUDSQL_PASSWORD

Toma nota de la contraseña generada para usarla más adelante.

Crea una instancia de Cloud SQL para MySQL

Las instancias de Cloud SQL se pueden crear con varios métodos, como la consola de Google Cloud, Terraform o Google Cloud CLI (gcloud). En este codelab, usarás gcloud. Para aprender a crear una instancia con otras herramientas, consulta la documentación de Crear instancias.

La marca cloudsql_vector se puede habilitar cuando se crea una instancia. La compatibilidad con vectores está disponible para MySQL 8.0 R20241208.01_00 o versiones posteriores.

En la sesión de Cloud Shell, ejecuta el siguiente comando:

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

Conéctate a la instancia mediante gcloud sql connect. Cuando se te solicite, ingresa la contraseña:

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

El resultado esperado es el siguiente:

$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>

Para salir de la sesión de mysql, presiona Ctrl + D o ingresa exit:

exit

Habilita la integración de Gemini Enterprise Agent Platform

Otorga el rol de IAM necesario a la cuenta de servicio de Cloud SQL para habilitar la integración de Gemini Enterprise Agent Platform.

Recupera el correo electrónico de la cuenta de servicio de Cloud SQL y expórtalo como una variable de entorno:

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

Otorga el rol roles/aiplatform.user a la cuenta de servicio de Cloud SQL:

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

Obtén más información sobre la creación y configuración de instancias aquí en la documentación de Cloud SQL.

5. Prepara la base de datos

Crea una base de datos y habilita la compatibilidad con vectores.

Crear base de datos

Crea una base de datos con el nombre quickstart_db. Puedes crear bases de datos con clientes de bases de datos (como mysql), Google Cloud CLI o Cloud SQL Studio. En este paso, usa gcloud.

En Cloud Shell, ejecuta el siguiente comando para crear la base de datos:

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

6. Cargar datos

Crea tablas en la base de datos y carga datos con archivos de conjuntos de datos ficticios de Cymbal Store almacenados en un bucket público de Cloud Storage en formato CSV.

Cloud Shell será tu entorno principal para conectarte a una base de datos, crear todos los objetos y cargar los datos.

Agrega tu IP pública de Cloud Shell a la lista de redes autorizadas para nuestra instancia de Cloud SQL.

En Cloud Shell, ejecuta lo siguiente:

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

Si se pierde tu sesión, restablece o trabaja desde otra herramienta y, luego, vuelve a exportar tu variable CLOUDSQL_PASSWORD:

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

Crea los objetos de base de datos necesarios. Usa mysql junto con curl para descargar y aplicar el esquema de la fuente pública.

En Cloud Shell, ejecuta lo siguiente:

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

Desglose del comando. En el paso anterior, te conectaste a tu base de datos y ejecutaste la secuencia de comandos de SQL para crear tablas, índices y secuencias.

A continuación, propaga la base de datos con datos de cymbal_products ejecutando curl y 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;"

Continúa 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;"

Y se completa con cymbal_inventory, que tiene la cantidad de cada producto en cada tienda.

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

Opcional: Si tienes tu propio conjunto de datos de muestra, puedes importar archivos CSV compatibles con la herramienta de importación de la consola de Google Cloud.

7. Crear embeddings

Crea embeddings para las descripciones de los productos con el modelo text-embedding-005 de Gemini Enterprise Agent Platform y almacénalos como datos vectoriales.

Para almacenar los datos vectoriales, debes habilitar la funcionalidad de vectores en tu instancia de Cloud SQL.

Ejecuta el siguiente comando en Cloud Shell:

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

Conéctate a la base de datos:

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

Crea una columna nueva embedding en la tabla cymbal_products con la función de embedding. Esa nueva columna contendrá los embeddings de vectores basados en el texto de la columna 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: Por lo general, la generación de la incorporación para 2,000 filas finaliza en menos de 5 minutos.

Sal de la sesión de MySQL:

exit

8. Ejecuta la búsqueda de similitud

Ejecuta una búsqueda de similitud comparando los embeddings de vectores calculados para las descripciones de los productos con el embedding de una búsqueda.

Puedes ejecutar consultas en SQL desde la línea de comandos o desde Cloud SQL Studio. Cloud SQL Studio proporciona una forma más conveniente de editar y ejecutar sentencias de SQL largas con varias filas en el resultado.

Crea un usuario de MySQL para Cloud SQL Studio

Necesitas un nuevo usuario de base de datos que pueda usar Cloud SQL Studio. Crea un usuario de tipo integrado student con la misma contraseña que usaste para el usuario raíz.

En Cloud Shell, ejecuta lo siguiente:

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

Inicia Cloud SQL Studio

  1. En la consola de Google Cloud, navega a Instancias de Cloud SQL y haz clic en my-cloudsql-instance.

Lista de instancias de Cloud SQL en la consola de Google Cloud

  1. En el menú de navegación, haz clic en Cloud SQL Studio.

Elemento de menú de Cloud SQL Studio

  1. En el diálogo de autenticación, ingresa el nombre y las credenciales de la base de datos:
    • Base de datos: quickstart_db
    • Usuario: student
    • Contraseña:
  2. Haz clic en Autenticar.

Diálogo de autenticación de Cloud SQL Studio

  1. Haz clic en la pestaña Consulta sin título para abrir el editor de SQL.

Pestaña del editor de SQL de Cloud SQL Studio

Ejecutar consulta

Ejecuta una búsqueda para recuperar los 5 productos más relevantes para la búsqueda del cliente: "¿Qué tipo de árboles frutales crecen bien aquí?"

Esta es la consulta que puedes ejecutar para elegir los primeros 5 elementos más adecuados para nuestra solicitud con la función 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;

En Cloud SQL Studio, ingresa la consulta y haz clic en Ejecutar (o ejecuta la consulta en tu sesión de sql):

Ejecuta una consulta en SQL en Cloud SQL Studio

La búsqueda devuelve los productos coincidentes ordenados por distancia de 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)

El tiempo de ejecución de la consulta es de aproximadamente 0.13 s con la función cosine_distance.

Ejecuta la misma consulta, pero usa la búsqueda de KNN con la función approx_distance. Si no tienes un índice de ANN para tus incorporaciones, se revertirá automáticamente a la búsqueda exacta en segundo plano:

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;

Y aquí se muestra una lista de los productos que devolvió la búsqueda.

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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)

La ejecución de la consulta tardó solo 0.12 segundos. Obtuvimos los mismos resultados que con la función KNN exacta cosine_distance.

Obtén más información sobre la función en la documentación de Cloud SQL para MySQL

9. Mejora la respuesta del LLM con los datos recuperados

Mejora la respuesta de la IA generativa a una aplicación cliente pasando los resultados de la búsqueda como contexto fundamentado en una instrucción a un modelo de lenguaje de base de Gemini Enterprise Agent Platform.

Entonces:

  1. Genera una carga útil de JSON a partir del resultado de la búsqueda vectorial en Cloud SQL.
  2. Prueba la instrucción en Agent Platform Studio.
  3. Ejecuta la instrucción de extremo a extremo directamente desde SQL con la integración de google_ml.

Genera el resultado en formato JSON

Modifica la consulta para dar formato al resultado como JSON y devolver una fila:

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;

Resultado JSON esperado:

[{"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"}]

Ejecuta la instrucción en Agent Platform Studio

Proporciona el JSON generado como contexto en una instrucción a un modelo generativo en Agent Platform Studio.

  1. En la consola de Google Cloud, abre Agent Platform Studio.

Navegación por Agent Platform Studio

  1. Ingresa la siguiente instrucción en Agent Platform Studio:

Cómo ingresar instrucciones en 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.

Reemplaza por la respuesta JSON de tu búsqueda:

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.

La instrucción en Agent Platform Studio

  1. Ejecuta la instrucción.

Resultado de la instrucción en Agent Platform Studio

La respuesta incluye el precio, la descripción y la información complementaria que el modelo obtiene de fuentes externas en función de la información sobre el árbol y la ubicación.

Ejecuta la instrucción en SQL

También puedes usar la integración de IA de Cloud SQL con Gemini Enterprise Agent Platform para obtener respuestas de un modelo generativo directamente en SQL.

Primero, registra el modelo.

  1. Registra el modelo gemini-3.5-flash para generar respuestas (reemplaza por el ID de tu proyecto):
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);

También podemos usar la integración de IA de Cloud SQL con Gemini Enterprise Agent Platform para obtener una respuesta similar de un modelo generativo usando SQL directamente en la base de datos.

Ahora podemos usar los resultados JSON generados en una subconsulta para proporcionarlos como parte de la instrucción al modelo de texto de IA generativa con SQL.

En la sesión de mysql o Cloud SQL Studio de la base de datos, ejecuta la consulta.

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;

Y aquí está el resultado de muestra. Tu resultado puede variar según la versión y los parámetros del modelo:

"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!"

El resultado se proporciona en formato Markdown.

10. Crea un índice de vecinos más cercanos

Para los conjuntos de datos grandes con millones de vectores, la búsqueda de vectores puede requerir una gran cantidad de recursos de procesamiento. Para mejorar el rendimiento de las consultas, crea un índice en los embeddings de vectores.

Crea el índice de ScaNN

Probaremos el tipo de índice ScaNN para nuestra prueba.

Para compilar el índice de la columna de incorporación, debes definir nuestra medición de distancia para la columna de incorporación. Puedes leer sobre los parámetros en detalle en la documentación.

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

Compare Response

Vuelve a ejecutar la consulta de búsqueda vectorial y observa los resultados:

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;

Resultado esperado:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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)

Las mejoras en el rendimiento solo son ligeramente diferentes, pero se espera que sea así para un conjunto de datos tan pequeño. Sería mucho más notable en conjuntos de datos grandes con millones de vectores.

Verifica el plan de ejecución con el 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;

Plan de ejecución (fragmento):

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

...

Muestra el análisis del índice vectorial en la tabla cp(alias de la tabla cymbal_products).

Pruébala con tus propios datos o prueba diferentes búsquedas para ver cómo funciona la búsqueda semántica en MySQL.

11. Limpia el entorno

Borra la instancia de Cloud SQL.

Cuando termines el lab, destruye la instancia de Cloud SQL

En Cloud Shell, define el proyecto y las variables de entorno si te desconectaste y se perdieron todos los parámetros de configuración anteriores:

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

Borra la instancia:

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

Resultado esperado en la consola:

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

Felicitaciones por completar el codelab.

Ruta de aprendizaje de Google Cloud

Este lab forma parte de la ruta de aprendizaje de IA lista para producción con Google Cloud.

Temas abordados

  • Cómo implementar una instancia de Cloud SQL para MySQL
  • Cómo crear una base de datos y habilitar la integración de IA de Cloud SQL
  • Cómo cargar datos en la base de datos
  • Cómo usar Cloud SQL Studio
  • Cómo usar el modelo de embeddings de Vertex AI en Cloud SQL
  • Cómo usar Agent Platform Studio
  • Cómo enriquecer el resultado con un modelo de Gemini Enterprise Agent Platform
  • Cómo mejorar el rendimiento con el índice de vectores

Prueba un codelab similar para AlloyDB o un codelab para Cloud SQL para Postgres

Encuesta

Resultado:

¿Cómo usarás este instructivo?

Solo lo leeré Lo leeré y completaré los ejercicios