Introducción a las embeddings de vectores en Cloud SQL para PostgreSQL

1. Introducción

En este codelab, aprenderás a usar la integración de IA de Cloud SQL para PostgreSQL combinando la búsqueda de vectores con los embeddings de Gemini Enterprise Agent Platform.

Diagrama de arquitectura que muestra la integración de Cloud SQL con Gemini Enterprise Agent Platform

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

Actividades

Requisitos

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

2. Configuración y requisitos

Configura el proyecto

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

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.

Cuadro de diálogo para seleccionar un proyecto en la consola de Google Cloud

En el diálogo Selecciona un proyecto, haz clic en Nuevo proyecto.

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 .
  • Algunas APIs usan un tercer valor, el número de proyecto. Obtén más información sobre estos tres valores en la documentación de Creación y administración de proyectos.

Habilita la facturación

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.

Inicie 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 barra de herramientas de la consola de Google Cloud, haz clic en Activar Cloud Shell:

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. Habilita las APIs

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 set project <PROJECT_ID>

Establece la variable de entorno PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Habilita todos los servicios obligatorios:

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 PostgreSQL

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 Crea instancias.

En Cloud Shell, ejecuta el siguiente comando para crear la instancia:

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_18 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on

Después de crear la instancia, establece una contraseña para el usuario predeterminado (postgres) y verifica que puedas conectarte:

gcloud sql users set-password postgres \
    --instance=my-cloudsql-instance \
    --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=postgres

Para salir de la sesión de psql, 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:

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

Para obtener más información sobre la creación y configuración de instancias, consulta Integra Cloud SQL con Gemini Enterprise Agent Platform.

5. Prepara la base de datos

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

Crea una 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 psql), 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

Habilita las extensiones

Para trabajar con Gemini Enterprise Agent Platform y vectores, habilita dos extensiones en la base de datos quickstart_db: google_ml_integration y vector.

En Cloud Shell, conéctate a la base de datos:

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Cuando se te solicite, ingresa la contraseña de la base de datos.

En la sesión de SQL, ejecuta los siguientes comandos:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;

Sal de la sesión de SQL:

exit;

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.

Primero, crea los objetos de esquema necesarios. Ejecuta gcloud sql connect y gcloud storage para descargar e importar el esquema:

En Cloud Shell, ejecuta el siguiente comando (cuando se te solicite, ingresa la contraseña que creaste para la instancia):

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql | gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Este comando se conecta a la base de datos y ejecuta el código SQL descargado para crear tablas, índices y secuencias.

A continuación, descarga los archivos de datos CSV de Cloud Storage:

gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .

Conéctate a la base de datos:

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Importa datos de los archivos CSV:

\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header

Si usas tus propios datos y los archivos CSV son compatibles con la herramienta de importación de Cloud SQL en la consola de Google Cloud, puedes usar la consola en lugar de la línea de comandos.

7. Crear incorporaciones

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.

Si se desconectó tu sesión, conéctate a la base de datos:

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Crea una columna generada llamada embedding en la tabla cymbal_products con la función embedding. Este comando crea una columna generada almacenada que contiene los embeddings de vectores generados a partir de la columna product_description para todas las filas de la tabla. El modelo se especifica como el primer parámetro y la columna de texto fuente como el segundo parámetro:

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (google_ml.embedding('text-embedding-005', product_description)) STORED;

Para entre 900 y 1,000 filas, este proceso suele tardar entre 1 y 5 minutos.

Cuando insertas una fila nueva en la tabla o actualizas product_description en una fila existente, la columna embedding se actualiza automáticamente.

8. Ejecuta una 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 con gcloud sql connect 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.

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: postgres
    • Contraseña:
  2. Haz clic en Autenticar.

Diálogo de autenticación de Cloud SQL Studio

  1. Haz clic en la pestaña Editor 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 10 productos más relevantes para la búsqueda del cliente: "¿Qué tipo de árboles frutales crecen bien aquí?"

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

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

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       
-------------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree             | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.43922018972266397
 Meyer Lemon Tree        | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by  |         34 |    93230 |  0.4685112926118228
 Toyon                   | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 |  0.4835677149651668
 California Lilac        | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.4947204525907498
 California Peppertree   | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 |  0.5054166905547247
 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d |     100.00 |    93230 |  0.5084219510932597
 California Sycamore     | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.5140519790508755
 Coast Live Oak          | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev |     500.00 |    93230 |  0.5143126438081371
 Fremont Cottonwood      | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i |     200.00 |    93230 |  0.5174774727252058
 Madrone                 | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.5227400803389093
(10 rows)

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:

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

Resultado JSON esperado:

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

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, "product_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, "product_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
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 psql

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. Si es necesario, actualiza la extensión a la versión 1.4.3 o posterior. Conéctate a quickstart_db y ejecuta lo siguiente:
SELECT extversion from pg_extension where extname='google_ml_integration';

Si la versión que se muestra es inferior a 1.4.3, ejecuta el siguiente comando:

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.3';
  1. Verifica la marca de base de datos google_ml_integration.enable_model_support:
SHOW google_ml_integration.enable_model_support;

Si la marca es off, actualiza la marca de base de datos en Cloud Shell:

gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on

Esta operación tarda entre 1 y 3 minutos. Vuelve a verificar el parámetro de configuración:

SHOW google_ml_integration.enable_model_support;
  1. Registra el modelo gemini-3.5-flash para generar respuestas (reemplaza por el ID de tu proyecto):
CALL
  google_ml.create_model(
    model_id => 'gemini-3.5-flash',
    model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
    model_provider => 'google',
    model_auth_type => 'cloudsql_service_agent_iam');

Verifica los modelos registrados:

SELECT model_id, model_type FROM google_ml.model_info_view WHERE model_id='gemini-3.5-flash';
  1. Ejecuta la consulta en SQL completa para recuperar los resultados de la búsqueda vectorial y pasarlos directamente a gemini-3.5-flash:
WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-005',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        google_ml.predict_row( model_id =>'gemini-3.5-flash',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
REPLACE(resp::text, '\n', CHR(10))
FROM
        response;

Resultado esperado:

"Hello there! If you're looking for a wonderful fruit tree to plant, I have a fantastic option for you: ### **Cherry Tree** * **Price:** $75.00 * **Product ID:** `d536e9e823296a2eba198e52dd23e712` --- ### **Why it's a great choice:** * **Fruit & Shade:** Not only will it produce delicious, sweet cherries, but it also grows into a beautiful 15-foot deciduous tree that provides excellent shade and privacy for your yard. * **Seasonal Beauty:** Its leaves are a lovely dark green throughout the summer and transition into a striking red during the fall. * **Ideal Growing Conditions:** Cherry trees thrive best in cool, moist climates with sandy soil and are suitable for **USDA hardiness zones 4–9**. If your local climate matches these conditions, this Cherry Tree would make a beautiful and tasty addition to your garden! Let me know if you'd like more details or help placing an order."

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 un índice de HNSW

El índice de vectores Hierarchical Navigable Small World (HNSW) se basa en un gráfico.

Para compilar un índice HNSW en la columna embedding, especifica la función de distancia (vector_cosine_ops) y los parámetros opcionales, como m y ef_construction. Para obtener más información, consulta Trabaja con embeddings vectoriales.

CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

Resultado esperado:

quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
CREATE INDEX
quickstart_db=>

Compara el rendimiento de las búsquedas

Ejecuta la búsqueda vectorial con EXPLAIN (ANALYZE) para verificar que el optimizador de consultas use el índice:

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

Resultado esperado:

 Aggregate  (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
   ->  Subquery Scan on trees  (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
         ->  Limit  (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
               ->  Nested Loop  (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
                     ->  Nested Loop  (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
                           ->  Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp  (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
...
 Planning Time: 112.398 ms
 Execution Time: 1.221 ms

El plan de ejecución muestra Index Scan using cymbal_products_embeddings_hnsw.

Ejecuta la consulta sin EXPLAIN:

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

Resultado esperado:

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

Para obtener más información y ejemplos con LangChain y los índices vectoriales, consulta la documentación de la descripción general de la IA de Cloud SQL.

11. Limpia los recursos

Borra la instancia de Cloud SQL después de terminar el codelab.

En Cloud Shell, configura el proyecto y las variables de entorno si se desconectó tu sesión:

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:

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! Completaste el codelab.

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

Resumen

Aprendiste todo esto:

Prueba el codelab de embeddings de vectores de AlloyDB AI con el índice ScaNN en lugar de HNSW.