Crea un asistente de Shopping inteligente con AlloyDB y Vertex AI Agent Builder (parte 1)

1. Descripción general

En el entorno de venta minorista actual, que se caracteriza por un ritmo acelerado, es fundamental ofrecer un servicio de atención al cliente excepcional y, al mismo tiempo, permitir experiencias de compra personalizadas. Te llevaremos a un recorrido técnico por la creación de una aplicación de chat basada en el conocimiento diseñada para responder las preguntas de los clientes, guiar el descubrimiento de productos y personalizar los resultados de la búsqueda. Esta solución innovadora combina la potencia de AlloyDB para el almacenamiento de datos, un motor de estadísticas interno para la comprensión contextual, Gemini (modelo de lenguaje extenso) para la validación de relevancia y el Agente Builder de Google para iniciar rápidamente un asistente de conversación inteligente.

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 suelen no proporcionar este nivel de personalización.

La solución: Nuestra aplicación de chat basada en el conocimiento aborda este desafío de frente. Aprovecha una base de conocimiento rica derivada de tus datos de venta minorista para comprender la intención de los clientes, responder de forma inteligente y ofrecer resultados muy relevantes.

Qué compilarás

Como parte de este lab (Parte 1), harás lo siguiente:

  1. Crea una instancia de AlloyDB y carga el conjunto de datos de comercio electrónico
  2. Habilita las extensiones de modelos de IA generativa y pgvector en AlloyDB
  3. Genera incorporaciones a partir de la descripción del producto
  4. Realiza una búsqueda de similitud de coseno en tiempo real para el texto de búsqueda del usuario
  5. Implementa la solución en Cloud Run Functions sin servidores

En la segunda parte del lab, se abordarán los pasos de Agent Builder.

Requisitos

  • Un navegador, como Chrome o Firefox.
  • Un proyecto de Google Cloud con facturación habilitada.

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 venta minorista (inventario, descripciones de productos, interacciones con los clientes) a AlloyDB.

Motor de estadísticas:

Usaremos AlloyDB como motor de análisis para realizar las siguientes acciones:

  1. Extracción de contexto: El motor analiza los datos almacenados en AlloyDB para comprender las relaciones entre los productos, las categorías, el comportamiento de los clientes, etcétera, según corresponda.
  2. Creación de incorporaciones: Las incorporaciones (representaciones matemáticas del texto) se generan para la consulta del usuario y la información almacenada en AlloyDB.
  3. Búsqueda de vectores: El motor realiza una búsqueda de similitud y compara la incorporación de la consulta con las incorporaciones de las descripciones de los productos, las opiniones y otros datos relevantes. 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 el compilador de agentes.

Interacción conversacional:

El compilador de agentes presenta las respuestas al usuario en un formato de lenguaje natural, lo que facilita un diálogo de ida y vuelta. Esta parte se abordará en un lab de seguimiento.

3. Antes de comenzar

Crea un proyecto

  1. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
  2. 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 .
  3. 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.

Imagen del botón Activar Cloud Shell

  1. Una vez que te conectes a Cloud Shell, verifica que ya te hayas autenticado y que el proyecto esté configurado con tu ID de proyecto con el siguiente comando:
gcloud auth list
  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que el comando gcloud conoce tu proyecto.
gcloud config list project
  1. Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <YOUR_PROJECT_ID>
  1. Habilita las API 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 gcloud es buscar cada producto en la consola o usar este vínculo.

Si falta alguna API, puedes habilitarla durante el transcurso 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 contener los datos de venta minorista. Usa 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.

Crearé 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

  1. Navega a 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.
  2. Selecciona CREATE CLUSTER en esa página:

f76ff480c8c889aa.png

  1. Verás una pantalla como la siguiente. Crea un clúster y una instancia con los siguientes valores:
  • cluster id: "shopping-cluster"
  • contraseña: “alloydb
  • Compatible con PostgreSQL 15
  • Región: "us-central1"
  • Redes: “default

538dba58908162fb.png

  1. Cuando selecciones la red predeterminada, verás una pantalla como la que se muestra a continuación. Selecciona CONFIGURAR CONEXIÓN.
    7939bbb6802a91bf.png
  2. 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. 768ff5210e79676f.png
  3. Una vez que se configure la red, puedes 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:

e06623e55195e16e.png

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 la siguiente:

24eec29fa5cfdb3e.png

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:

847e35f1bf8a8bd8.png

Es posible que debas esperar a que se termine de crear 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 hayas autenticado correctamente en AlloyDB Studio, los comandos SQL se ingresarán en el editor. Puedes agregar varias ventanas del editor con el signo más que se encuentra a la derecha de la última ventana.

91a86d9469d499c4.png

Ingresarás comandos para AlloyDB en las ventanas del editor, con las opciones Ejecutar, Formatear y Borrar según sea necesario.

Habilita las 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. Para habilitar estas extensiones, ejecuta 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 SQL:

select extname, extversion from pg_extension;

Crea una tabla

Crea una tabla con la siguiente sentencia 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, deberías poder ver la tabla en la base de datos. A continuación, se muestra una captura de pantalla de ejemplo:

908e33bbff58a6d.png

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 desde allí y, luego, pégalas en una pestaña del editor en blanco y selecciona EJECUTAR.

Para ver el contenido de la tabla, expande la sección Explorador hasta que puedas ver la tabla llamada apparels. Selecciona los tres puntos (⋮) para ver la opción de consultar la tabla. Se abrirá una sentencia SELECT en una nueva pestaña del editor.

b31ece70e670ab89.png

Otorgar permiso

Ejecuta la siguiente sentencia 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 escribe 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 tener un context, es decir, toda la información que queremos incluir en un solo campo. Para ello, crearemos una descripción del producto (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 forma que consideres más adecuada para tu empresa.

Ejecuta la siguiente sentencia 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;

Esta DML crea un resumen de contexto simple con la información de todos los campos disponibles en la tabla y otras dependencias (si las hay en tu caso de uso). Para obtener una variedad más precisa de información y creación de contexto, no dudes en diseñar los datos de la forma que consideres más adecuada para tu empresa.

7. Crea incorporaciones para el contexto

Para las computadoras, es mucho más fácil procesar números que procesar texto. Un sistema de incorporación convierte el texto en una serie de números de punto flotante que deberían representarlo, sin importar cómo esté redactado, qué idioma use, etcétera.

Considera describir una ubicación junto al mar. Puede llamarse "junto al agua", "frente a la playa", "caminar desde tu habitación hasta el océano", "sur la mer", "на берегу океана", etc. Todos estos términos se ven diferentes, pero su significado semántico o, en la terminología del aprendizaje automático, sus incorporaciones deben ser muy similares entre sí.

Ahora que los datos y el contexto están listos, ejecutaremos la sentencia SQL para agregar las incorporaciones de la descripción del producto a la tabla en el campo embedding. Existen varios modelos de incorporación que puedes usar. 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 de Google Cloud existente que se creó hace 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 algunas incorporaciones. Asegúrate de volver a ejecutar la sentencia SELECT para ver los cambios.

SELECT
 id,
 category,
 sub_category,
 content,
 embedding
FROM
 apparels;

Se debería mostrar el vector de incorporaciones, que se parece a un array de números de punto flotante, para el texto de muestra en la consulta, como se muestra a continuación:

c69c08d085389f74.png

Nota: Es posible que los proyectos de Google Cloud creados recientemente en el nivel gratuito tengan problemas de cuota en relación con la cantidad de solicitudes de incorporación permitidas por segundo a los modelos de incorporación. Te sugerimos que uses una consulta de filtro para el ID y, luego, elijas de forma selectiva entre 1 y 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 blusas para mujer, informales, rosadas y de algodón puro".

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;

Veamos esta consulta en detalle:

En esta consulta,

  1. El texto de la búsqueda del usuario es: "Quiero blusas para mujer, informales, rosadas y de algodón puro".
  2. Lo convertimos en incorporaciones en el método embedding() con el modelo: text-embedding-004. Este paso debería resultarte familiar después del último, en el que aplicamos la función de incorporación a todos los elementos de la tabla.
  3. "<=>" representa el uso del método de distancia COSINE SIMILARITY. Puedes encontrar todas las medidas de similitud disponibles en la documentación de pgvector.
  4. Convertimos el resultado del método de incorporación en un tipo de vector para que sea compatible con los vectores almacenados en la base de datos.
  5. LIMIT 5 representa que queremos extraer 5 vecinos más cercanos para el texto de búsqueda.

El resultado se verá de la siguiente manera:

4193a68737400535.png

Como puedes observar en los resultados, las coincidencias son bastante cercanas al texto de la búsqueda. Intenta cambiar el color para ver cómo cambian los resultados.

9. Validación de coincidencias con el LLM

Antes de continuar y crear un servicio para mostrar 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 compartir con el usuario.

Cómo garantizar 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 aparece como "on", puedes omitir los siguientes 2 pasos y pasar directamente a configurar la integración de modelos de AlloyDB y Vertex AI.

  1. Ve a la instancia principal de tu clúster de AlloyDB y haz clic en EDITAR INSTANCIA PRINCIPAL.

456ffdf292d3c0e0.png

  1. Navega a la sección Marcas en las opciones de configuración avanzada. y asegúrate de que google_ml_integration.enable_model_support flag esté configurado como “on”, como se muestra a continuación:

6a59351fcd2a9d35.png

Si no está activado, hazlo y, luego, haz clic en el botón UPDATE INSTANCE. Este paso tardará unos minutos.

Integración de modelos de AlloyDB y Vertex AI

Ahora puedes conectarte a AlloyDB Studio y ejecutar la siguiente sentencia DML para configurar el acceso al modelo de Gemini desde AlloyDB, con el ID de tu proyecto donde se indique. Es posible que se te advierta un error de sintaxis antes de ejecutar el comando, pero debería ejecutarse correctamente.

Primero, creamos la conexión del modelo 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 que se crearon hace un tiempo, es posible que debas descartar las referencias anteriores al modelo gemini-1.5 y volver a crearlo con la sentencia CALL anterior y ejecutar grant execute en la función ml_predict_row nuevamente en caso de que tengas problemas en las próximas invocaciones de gemini-1.5.

Evalúa las respuestas

Si bien usaremos una consulta grande en la siguiente sección para asegurarnos de que las respuestas sean razonables, puede ser difícil de entender. Ahora veremos las piezas y cómo se unen en unos minutos.

  1. Primero, enviaremos una solicitud a la base de datos para obtener las 5 coincidencias más cercanas a una consulta del usuario. Estamos codificando la consulta de forma fija para que sea más simple, pero no te preocupes, la interpolaremos en la consulta más adelante. Incluiremos la descripción del producto de la tabla apparels y 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 llamada xyz (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, cada una con las siguientes columnas:

  • literature
  • content
  • user_text
  1. Para determinar qué tan válidas son las respuestas, usaremos una consulta complicada en la que explicaremos cómo evaluarlas. Usa user_text y content en la tabla xyz como 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."
  1. 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;
  1. predict_row muestra 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 muestra, puedes quitar este código.
  2. Por último, para obtener el campo LLM, solo debes extraerlo de la tabla x:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. Esto se puede combinar en una sola consulta de Next 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 consulta.

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 puede parecer abrumador, espero que puedas entenderlo mejor. Los resultados indican si hay o no una coincidencia, qué porcentaje es y una explicación de la calificació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: 14e74d71293b7b9.png

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 crear este motor de conocimiento sin servidores con funciones de Cloud Run:

  1. Ve a Funciones de Cloud Run en la consola de Google Cloud para CREAR una nueva función de Cloud Run o usa el vínculo: https://console.cloud.google.com/functions/add.
  2. Selecciona el entorno como “Función de Cloud Run”. 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 NEXT. Elige Java 17 como entorno de ejecución y Editor intercalado para el código fuente.
  3. De forma predeterminada, se establecería el punto de entrada en "gcfv2.HelloHttpFunction". Reemplaza el código del marcador de posición en HelloHttpFunction.java y pom.xml de tu función de Cloud Run por el código del archivo Java y el XML, respectivamente.
  4. 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, modifica los mismos en el archivo Java.
  5. Haz clic en Implementar.

Una vez que se implemente, 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. Cambia lo siguiente:

  1. Ve a Configuración del entorno de ejecución, la compilación, las conexiones y la seguridad
  2. Aumenta el tiempo de espera a 180 segundos
  3. Ve a la pestaña CONEXIONES:

4e83ec8a339cda08.png

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

8126ec78c343f199.png

  1. 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 red como predeterminado y establece la subred como rango de IP personalizado con el rango de IP 10.8.0.0 o algo similar que esté disponible.
  2. Expande MOSTRAR LA CONFIGURACIÓN DE ESCALA y asegúrate de que la configuración sea exactamente la siguiente:

7baf980463a86a5c.png

  1. Haz clic en CREATE y este conector debería aparecer en la configuración de salida.
  2. Selecciona el conector recién creado
  3. Elige que todo el tráfico se enrute a través de este conector de VPC.
  4. Haz clic en NEXT y, luego, en DEPLOY.

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"}'

Como alternativa, 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:

88bc1ddfb5644a28.png

Eso es todo. Es así de simple realizar la búsqueda de vectores de similitud con el modelo de embeddings en los datos de AlloyDB.

Crea 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:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.
  2. En la lista de proyectos, elige el proyecto que deseas borrar y haz clic en Borrar.
  3. 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 de similitud con AlloyDB, pgvector y la búsqueda de vectores. Combinando las capacidades de AlloyDB, Vertex AI y Búsqueda de vectores, dimos un gran paso adelante para que las búsquedas contextuales y vectoriales sean accesibles, eficientes y realmente orientadas al significado. En la siguiente parte de este lab, se abordan los pasos para compilar el agente.