1. Descripción general
En el vertiginoso panorama minorista actual, es fundamental brindar un servicio al cliente excepcional y, al mismo tiempo, ofrecer experiencias de compra personalizadas. Te llevaremos en un recorrido técnico por la creación de una aplicación de chat basada en conocimiento diseñada para responder preguntas de los clientes, guiar el descubrimiento de productos y personalizar los resultados de la búsqueda. Esta innovadora solución combina la potencia de AlloyDB para el almacenamiento de datos, un motor de análisis interno para la comprensión contextual, Gemini (modelo de lenguaje grande) para la validación de relevancia y Agent Builder de Google para iniciar rápidamente un asistente inteligente de conversación.
El desafío: Los clientes minoristas modernos esperan respuestas instantáneas y recomendaciones de productos que se alineen con sus preferencias únicas. Los métodos de búsqueda tradicionales a menudo no logran proporcionar este nivel de personalización.
La solución: Nuestra aplicación de chat basada en conocimiento aborda este desafío de frente. Aprovecha una base de conocimiento enriquecida derivada de tus datos de comercio minorista para comprender la intención del cliente, responder de forma inteligente y ofrecer resultados hiperrelevantes.
Qué compilarás
Como parte de este lab (Parte 1), harás lo siguiente:
- Crea una instancia de AlloyDB y carga el conjunto de datos de comercio electrónico
- Habilita las extensiones de pgvector y del modelo de IA generativa en AlloyDB
- Genera incorporaciones a partir de la descripción del producto
- Realiza una búsqueda de similitud de coseno en tiempo real para el texto de búsqueda del usuario
- Implementa la solución en Cloud Run Functions sin servidores
En la segunda parte del lab, se abarcarán los pasos de Agent Builder.
Requisitos
2. Arquitectura
Flujo de datos: Analicemos con más detalle cómo se mueven los datos a través de nuestro sistema:
Transferencia:
El primer paso es transferir los datos de Retail (inventario, descripciones de productos, interacciones con los clientes) a AlloyDB.
Motor de Analytics:
Usaremos AlloyDB como motor de análisis para realizar las siguientes acciones:
- Extracción de contexto: El motor analiza los datos almacenados en AlloyDB para comprender las relaciones entre los productos, las categorías, el comportamiento del cliente, etc., según corresponda.
- Creación de embeddings: Se generan embeddings (representaciones matemáticas del texto) tanto para la búsqueda del usuario como para la información almacenada en AlloyDB.
- Vector Search: El motor realiza una búsqueda de similitud, comparando el embedding de la búsqueda con los embeddings de las descripciones, las opiniones y otros datos relevantes del producto. Esto identifica los 25 "vecinos más cercanos" más relevantes.
Validación de Gemini:
Estas posibles respuestas se envían a Gemini para su evaluación. Gemini determina si son realmente relevantes y seguros para compartirlos con el usuario.
Generación de respuestas:
Las respuestas validadas se estructuran en un array JSON, y todo el motor se empaqueta en una función de Cloud Run sin servidores que se invoca desde Agent Builder.
Interacción conversacional:
Agent Builder presenta las respuestas al usuario en un formato de lenguaje natural, lo que facilita un diálogo de ida y vuelta. Esta parte se tratará en un lab de seguimiento.
3. Antes de comenzar
Crea un proyecto
- En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
- Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información para verificar si la facturación está habilitada en un proyecto .
- Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud y que viene precargado con bq. Haz clic en Activar Cloud Shell en la parte superior de la consola de Google Cloud.

- Una vez que te conectes a Cloud Shell, verifica que ya te autenticaste y que el proyecto se configuró con tu ID del proyecto con el siguiente comando:
gcloud auth list
- En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project
- Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <YOUR_PROJECT_ID>
- Habilita las APIs necesarias.
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
La alternativa al comando de gcloud es buscar cada producto en la consola o usar este vínculo.
Si olvidas alguna API, siempre puedes habilitarla durante el curso de la implementación.
Consulta la documentación para ver los comandos y el uso de gcloud.
4. Configuración de la base de datos
En este lab, usaremos AlloyDB como la base de datos para almacenar los datos de venta minorista. Utiliza clústeres para contener todos los recursos, como bases de datos y registros. Cada clúster tiene una instancia principal que proporciona un punto de acceso a los datos. Las tablas contendrán los datos reales.
Creemos un clúster, una instancia y una tabla de AlloyDB en los que se cargará el conjunto de datos de comercio electrónico.
Crea un clúster y una instancia
- Navega por la página de AlloyDB en Cloud Console. Una forma sencilla de encontrar la mayoría de las páginas en la consola de Cloud es buscarlas con la barra de búsqueda de la consola.
- Selecciona CREATE CLUSTER en esa página:

- Verás una pantalla como la que se muestra a continuación. Crea un clúster y una instancia con los siguientes valores:
- ID del clúster: "
shopping-cluster" - contraseña: "
alloydb" - Compatible con PostgreSQL 15
- Región: "
us-central1" - Conexiones: "
default"

- Cuando selecciones la red predeterminada, verás una pantalla como la que se muestra a continuación. Selecciona CONFIGURAR CONEXIÓN.

- Allí, selecciona "Usar un rango de IP asignado automáticamente" y haz clic en Continuar. Después de revisar la información, selecciona CREAR CONEXIÓN.

- Una vez que configures tu red, podrás continuar con la creación del clúster. Haz clic en CREAR CLÚSTER para completar la configuración del clúster como se muestra a continuación:

Asegúrate de cambiar el ID de la instancia a "shopping-instance"".
Ten en cuenta que la creación del clúster tardará alrededor de 10 minutos. Una vez que se complete correctamente, deberías ver una pantalla similar a esta:

5. Transferencia de datos
Ahora es el momento de agregar una tabla con los datos de la tienda. Navega a AlloyDB, selecciona el clúster principal y, luego, AlloyDB Studio:

Es posible que debas esperar a que termine de crearse la instancia. Una vez que lo hagas, accede a AlloyDB con las credenciales que creaste cuando creaste el clúster. Usa los siguientes datos para autenticarte en PostgreSQL:
- Nombre de usuario : "
postgres" - Base de datos : "
postgres" - Contraseña : "
alloydb"
Una vez que te autentiques correctamente en AlloyDB Studio, ingresa los comandos SQL en el editor. Puedes agregar varias ventanas del editor con el signo más que se encuentra a la derecha de la última ventana.

Ingresarás comandos para AlloyDB en ventanas del editor, y usarás las opciones Ejecutar, Formatear y Borrar según sea necesario.
Habilitar extensiones
Para compilar esta app, usaremos las extensiones pgvector y google_ml_integration. La extensión pgvector te permite almacenar y buscar embeddings de vectores. La extensión google_ml_integration proporciona funciones que usas para acceder a los extremos de predicción de Vertex AI y obtener predicciones en SQL. Habilita estas extensiones ejecutando los siguientes DDL:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
Si quieres verificar las extensiones que se habilitaron en tu base de datos, ejecuta este comando de SQL:
select extname, extversion from pg_extension;
Crea una tabla
Crea una tabla con la siguiente declaración DDL:
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
Si el comando anterior se ejecuta correctamente, podrás ver la tabla en la base de datos. A continuación, se muestra una captura de pantalla de ejemplo:

Transfiere datos
Para este lab, tenemos datos de prueba de alrededor de 200 registros en este archivo SQL. Contiene id, category, sub_category, uri, image y content. Los demás campos se completarán más adelante en el lab.
Copia las 20 líneas o instrucciones de inserción y pégalas en una pestaña del editor en blanco. Luego, selecciona EJECUTAR.
Para ver el contenido de la tabla, expande la sección Explorador hasta que veas la tabla llamada prendas. Selecciona los dos puntos verticales (⋮) para ver la opción de consultar la tabla. Se abrirá una instrucción SELECT en una nueva pestaña del editor.

Otorgar permiso
Ejecuta la siguiente instrucción para otorgar derechos de ejecución en la función embedding al usuario postgres:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Otorga el rol de usuario de Vertex AI a la cuenta de servicio de AlloyDB
Ve a la terminal de Cloud Shell y ejecuta el siguiente comando:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
6. Contexto
Regresa a la página Instancia de AlloyDB.
Para crear una incorporación, necesitaremos un context, es decir, toda la información que queremos incluir en un solo campo. Para ello, crearemos una descripción del producto (a la que llamaremos pdt_desc). En nuestro caso, usaremos toda la información sobre cada producto, pero cuando lo hagas con tus propios datos, no dudes en diseñarlos de la manera que te resulte más significativa para tu empresa.
Ejecuta la siguiente instrucción desde AlloyDB Studio de la instancia que acabas de crear. Esto actualizará el campo pdt_desc con datos de contexto:
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
Este DML crea un resumen de contexto simple con la información de todos los campos disponibles en la tabla y otras dependencias (si hay alguna en tu caso de uso). Para crear una variedad más precisa de información y contexto, no dudes en diseñar los datos de la manera que consideres más significativa para tu empresa.
7. Crea embeddings para el contexto
Es mucho más fácil para las computadoras procesar números que texto. Un sistema de embedding convierte el texto en una serie de números de punto flotante que deberían representar el texto, sin importar cómo se redacte, qué idioma use, etcétera.
Considera describir una ubicación costera. Podría llamarse "en el agua", "frente a la playa", "a pie de la habitación al océano", "sur la mer", "на берегу океана", etcétera. Todos estos términos se ven diferentes, pero su significado semántico o, en la terminología del aprendizaje automático, sus incorporaciones deberían estar muy cerca entre sí.
Ahora que los datos y el contexto están listos, ejecutaremos el código SQL para agregar los embeddings de la descripción del producto a la tabla en el campo embedding. Puedes usar una variedad de modelos de embedding. Usamos text-embedding-004 de Vertex AI. Asegúrate de usar el mismo modelo de incorporación en todo el proyecto.
Nota: Si usas un proyecto existente de Google Cloud que se creó hace un tiempo, es posible que debas seguir usando versiones anteriores del modelo de incorporación de texto, como textembedding-gecko.
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
Vuelve a mirar la tabla apparels para ver algunos embeddings. Asegúrate de volver a ejecutar la instrucción SELECT para ver los cambios.
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
Esto debería devolver el vector de embeddings, que se ve como un array de números de punto flotante, para el texto de muestra en la búsqueda, como se muestra a continuación:

Nota: Los proyectos de Google Cloud creados recientemente en el nivel gratuito pueden tener problemas de cuota en cuanto a la cantidad de solicitudes de incorporación permitidas por segundo para los modelos de Embedding. Te sugerimos que uses una consulta de filtro para el ID y, luego, elijas de forma selectiva de 1 a 5 registros, y así sucesivamente, mientras generas la incorporación.
8. Realiza una búsqueda de vectores
Ahora que la tabla, los datos y los embeddings están listos, realicemos la búsqueda de vectores en tiempo real para el texto de búsqueda del usuario.
Supongamos que el usuario pregunta lo siguiente:
"Quiero camisas de mujer, solo de algodón puro y de color rosa".
Para encontrar coincidencias, ejecuta la siguiente consulta:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
Analicemos esta consulta en detalle:
En esta consulta,
- El texto de búsqueda del usuario es: "Quiero camisas de mujer, solo de algodón puro y rosa informal".
- Lo convertimos en embeddings en el método
embedding()con el modelotext-embedding-004. Este paso debería resultarte familiar después del paso anterior, en el que aplicamos la función de incorporación a todos los elementos de la tabla. - "
<=>" representa el uso del método de distancia SIMILITUD DEL COSENO. Puedes encontrar todas las medidas de similitud disponibles en la documentación de pgvector. - Convertimos el resultado del método de incorporación al tipo de vector para que sea compatible con los vectores almacenados en la base de datos.
- LIMIT 5 representa que queremos extraer 5 vecinos más cercanos para el texto de búsqueda.
El resultado se ve de la siguiente manera:

Como puedes observar en los resultados, las coincidencias son bastante cercanas al texto de búsqueda. Intenta cambiar el color para ver cómo cambian los resultados.
Nota importante:
Ahora supongamos que queremos aumentar el rendimiento (tiempo de consulta), la eficiencia y la recuperación de este resultado de la Búsqueda de vectores con el índice ScaNN. Lee los pasos de este blog para comparar la diferencia en el resultado con y sin el índice. Para mayor comodidad, aquí se enumeran los pasos para crear el índice:
- Como ya creamos el clúster, la instancia, el contexto y las incorporaciones, solo tenemos que instalar la extensión de ScaNN con la siguiente instrucción:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- A continuación, crearemos el índice (ScaNN):
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
En el DDL anterior, apparel_index es el nombre del índice.
"apparels" es mi tabla
"scann" es el método de indexación.
"embedding" es la columna de la tabla que quiero indexar.
"cosine" es el método de distancia que quiero usar con el índice.
"54" es la cantidad de particiones que se aplicarán a este índice. Se puede establecer en cualquier valor entre 1 y 1048576. Para obtener más información sobre cómo decidir este valor, consulta Cómo ajustar un índice de ScaNN.
Usé la raíz cuadrada de la cantidad de puntos de datos, como se recomienda en el repo de ScaNN (cuando se particiona, num_leaves debe ser aproximadamente la raíz cuadrada de la cantidad de puntos de datos).
- Verifica si se creó el índice con la siguiente consulta:
SELECT * FROM pg_stat_ann_indexes;
- Realiza una búsqueda vectorial con la misma consulta que usamos sin el índice:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
La consulta anterior es la misma que usamos en el lab en el paso 8. Sin embargo, ahora tenemos el campo indexado.
- Prueba con una búsqueda simple con y sin el índice (borrando el índice):
white tops for girls without any print
El texto de búsqueda anterior en la consulta de Vector Search sobre los datos de incorporaciones INDEXADAS genera resultados de búsqueda de calidad y eficiencia. La eficiencia mejora considerablemente (en términos de tiempo de ejecución: 10.37 ms sin ScaNN y 0.87 ms con ScaNN) con el índice. Para obtener más información sobre este tema, consulta este blog.
9. Validación de coincidencias con el LLM
Antes de continuar y crear un servicio para devolver las mejores coincidencias a una aplicación, usemos un modelo de IA generativa para validar si estas posibles respuestas son realmente relevantes y seguras para compartirlas con el usuario.
Cómo asegurarse de que la instancia esté configurada para Gemini
Primero, verifica si la integración de Google ML ya está habilitada para tu clúster y tu instancia. En AlloyDB Studio, ingresa el siguiente comando:
show google_ml_integration.enable_model_support;
Si el valor se muestra como "on", puedes omitir los próximos 2 pasos y pasar directamente a configurar la integración del modelo de AlloyDB y Vertex AI.
- Ve a la instancia principal de tu clúster de AlloyDB y haz clic en EDITAR INSTANCIA PRINCIPAL.

- Navega a la sección Flags en las Opciones de configuración avanzada. y asegúrate de que
google_ml_integration.enable_model_support flagesté configurado como "on", como se muestra a continuación:

Si no está configurado como "activado", configúralo como "activado" y, luego, haz clic en el botón ACTUALIZAR INSTANCIA. Este paso tardará unos minutos.
Integración de modelos de AlloyDB y Vertex AI
Ahora puedes conectarte a AlloyDB Studio y ejecutar la siguiente instrucción DML para configurar el acceso al modelo de Gemini desde AlloyDB, usando el ID de tu proyecto donde se indique. Es posible que se te advierta sobre un error de sintaxis antes de ejecutar el comando, pero debería ejecutarse sin problemas.
Primero, creamos la conexión del modelo de Gemini 1.5, como se muestra a continuación. Recuerda reemplazar $PROJECT_ID en el siguiente comando por el ID de tu proyecto de Google Cloud.
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
Puedes verificar los modelos configurados para el acceso con el siguiente comando en AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;
Por último, debemos otorgar permiso a los usuarios de la base de datos para que ejecuten la función ml_predict_row y realicen predicciones a través de los modelos de Google Vertex AI. Ejecuta el siguiente comando:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Nota: Si usas un proyecto de Google Cloud existente y un clúster o una instancia de AlloyDB existentes creados hace un tiempo, es posible que debas quitar las referencias antiguas al modelo gemini-1.5 y volver a crearlas con la instrucción CALL anterior, y volver a ejecutar grant execute on function ml_predict_row en caso de que tengas problemas en las próximas invocaciones de gemini-1.5.
Cómo evaluar las respuestas
Si bien terminaremos usando una consulta grande en la siguiente sección para garantizar que las respuestas de la consulta sean razonables, la consulta puede ser difícil de comprender. Ahora veremos las partes y cómo se unen en unos minutos.
- Primero, enviaremos una solicitud a la base de datos para obtener las 5 coincidencias más cercanas a la búsqueda de un usuario. Codificaremos la consulta de forma rígida para que sea simple, pero no te preocupes, la interpolaremos en la consulta más adelante. Incluiremos la descripción del producto de la tabla
apparelsy agregaremos dos campos nuevos: uno que combine la descripción con el índice y otro con la solicitud original. Todo esto se guarda en una tabla llamadaxyz(solo un nombre de tabla temporal).
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
El resultado de esta consulta serán las 5 filas más similares relacionadas con la búsqueda del usuario. La nueva tabla xyz contendrá 5 filas, en las que cada una tendrá las siguientes columnas:
literaturecontentuser_text
- Para determinar la validez de las respuestas, usaremos una consulta compleja en la que explicaremos cómo evaluar las respuestas. Usa
user_textycontenten la tablaxyzcomo parte de la consulta.
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- Con esa consulta, revisaremos la "calidad" de las respuestas en la tabla
xyz.
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
- El
predict_rowdevuelve su resultado en formato JSON. El código "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"" se usa para extraer el texto real de ese JSON. Para ver el JSON real que se devuelve, puedes quitar este código. - Por último, para obtener el campo del LLM, solo debes extraerlo de la tabla x:
SELECT
LLM_RESPONSE
FROM
x;
- Esto se puede combinar en una sola próxima consulta de la siguiente manera.
Si ejecutaste las consultas anteriores para verificar los resultados intermedios, deberás borrar o quitar las tablas xyz y x de la base de datos de AlloyDB antes de ejecutar esta.
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
Si bien esto aún puede parecer abrumador, esperamos que ahora lo entiendas un poco mejor. Los resultados indican si hay una coincidencia, qué porcentaje representa y una explicación de la clasificación.
Ten en cuenta que el modelo de Gemini tiene la transmisión activada de forma predeterminada, por lo que la respuesta real se distribuye en varias líneas: 
10. Lleva la aplicación a la Web
¿Todo listo para llevar esta app a la Web? Sigue los pasos que se indican a continuación para hacer que este motor de conocimiento sea sin servidores con las funciones de Cloud Run:
- Ve a Cloud Run Functions en la consola de Google Cloud para CREAR una nueva función de Cloud Run o usa el siguiente vínculo: https://console.cloud.google.com/functions/add.
- Selecciona el entorno como "Cloud Run function". Proporciona el nombre de la función "retail-engine" y elige la región "us-central1". Establece la autenticación en "Permitir invocaciones no autenticadas" y haz clic en SIGUIENTE. Elige Java 17 como entorno de ejecución y Editor directo para el código fuente.
- De forma predeterminada, se establecería el punto de entrada en "
gcfv2.HelloHttpFunction". Reemplaza el código de marcador de posición enHelloHttpFunction.javaypom.xmlde tu Cloud Run Function por el código del archivo Java y el XML, respectivamente. - Recuerda cambiar el marcador de posición $PROJECT_ID y las credenciales de conexión de AlloyDB por tus valores en el archivo Java. Las credenciales de AlloyDB son las que usamos al comienzo de este codelab. Si usaste valores diferentes, modifícalos en el archivo Java.
- Haz clic en Deploy.
Una vez implementada, para permitir que Cloud Function acceda a nuestra instancia de base de datos de AlloyDB, crearemos el conector de VPC.
PASO IMPORTANTE:
Una vez que hayas configurado la implementación, deberías poder ver las funciones en la consola de Cloud Run Functions de Google. Busca la función recién creada (retail-engine), haz clic en ella y, luego, en EDITAR y cambia lo siguiente:
- Ir a Configuración del entorno de ejecución, la compilación, las conexiones y la seguridad
- Aumenta el tiempo de espera a 180 segundos.
- Ve a la pestaña CONEXIONES:

- En la configuración de entrada, asegúrate de que esté seleccionada la opción "Permitir todo el tráfico".
- En la sección Configuración de salida, haz clic en el menú desplegable Red, selecciona la opción "Agregar un conector de VPC nuevo" y sigue las instrucciones que aparecen en el cuadro de diálogo emergente:

- Proporciona un nombre para el conector de VPC y asegúrate de que la región sea la misma que la de tu instancia. Deja el valor de la red como predeterminado y establece la subred como rango de IP personalizado con el rango de IP 10.8.0.0 o uno similar que esté disponible.
- Expande SHOW SCALING SETTINGS y asegúrate de que la configuración sea exactamente la siguiente:

- Haz clic en CREAR. Este conector debería aparecer ahora en la configuración de salida.
- Selecciona el conector recién creado.
- Opta por que todo el tráfico se enrute a través de este conector de VPC.
- Haz clic en SIGUIENTE y, luego, en IMPLEMENTAR.
11. Prueba la aplicación
Una vez que se implemente la Cloud Function actualizada, deberías ver el extremo en el siguiente formato:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
Para probarlo desde la terminal de Cloud Shell, ejecuta el siguiente comando:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
También puedes probar la función de Cloud Run de la siguiente manera:
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
Y el resultado sería el siguiente:

Eso es todo. Así de simple es realizar una búsqueda de vectores de similitud con el modelo de Embeddings en los datos de AlloyDB.
Cómo compilar el agente conversacional
El agente se compila en la parte 2 de este lab.
12. Limpia
Si planeas completar la parte 2 de este lab, omite este paso, ya que se borrará el proyecto actual.
Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta publicación:
- En la consola de Google Cloud, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar.
- En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrarlo.
13. Felicitaciones
¡Felicitaciones! Realizaste correctamente una búsqueda por similitud con AlloyDB, pgvector y la búsqueda de vectores. Combinando las capacidades de AlloyDB, Vertex AI y Vector Search, dimos un gran paso para que las búsquedas contextuales y vectoriales sean accesibles, eficientes y verdaderamente basadas en el significado. En la siguiente parte de este lab, se explican los pasos para compilar el agente.