1. Descripción general
Imagina una app de moda que no solo te ayude a encontrar el atuendo perfecto, sino que también te brinde consejos de estilo en tiempo real, todo gracias al poder de la integración de IA generativa de vanguardia. En esta charla, exploraremos cómo creamos una app de este tipo con las funciones de búsqueda vectorial de AlloyDB, junto con el índice ScaNN de Google, lo que permite realizar búsquedas ultrarrápidas de atuendos a juego y ofrecer recomendaciones de moda instantáneas.
También analizaremos cómo el índice ScaNN de AlloyDB optimiza las consultas complejas para generar sugerencias de diseño personalizadas. También usaremos Gemini y Imagen, potentes modelos de IA generativa, para brindar inspiración de estilo creativo y hasta visualizar tus looks personalizados. Toda esta aplicación se compiló en una arquitectura sin servidores, lo que garantiza una experiencia fluida y escalable para los usuarios.
El desafío: Con la oferta de sugerencias de atuendos personalizados, la app pretende ayudar a las personas que tienen dificultades para decidir qué ponerse. También ayuda a evitar el agotamiento por la toma de decisiones que genera la planificación de atuendos.
La solución: La app de recomendación de atuendos resuelve el problema de proporcionar a los usuarios una experiencia de moda inteligente, personalizada y atractiva, a la vez que muestra las capacidades de AlloyDB, la IA generativa y las tecnologías sin servidores.
Qué compilarás
Como parte de este lab, aprenderás a realizar las siguientes tareas:
- Crea una instancia de AlloyDB y carga el conjunto de datos de comercio electrónico
- Habilita las extensiones de modelos de IA generativa y pgvector en AlloyDB
- Genera incorporaciones a partir de la descripción del producto
- Implementa la solución en Cloud Run Functions sin servidores
- Sube una imagen a Gemini y genera una instrucción de descripción de imagen.
- Genera resultados de la búsqueda en función de instrucciones combinadas con incorporaciones de conjuntos de datos de comercio electrónico.
- Agrega instrucciones adicionales para personalizar la instrucción y generar recomendaciones de estilo.
- Implementa la solución en Cloud Run Functions sin servidores
Requisitos
2. Arquitectura
La arquitectura de alto nivel de la app es la siguiente:
En las siguientes secciones, se destaca el flujo contextual del instructivo:
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 tareas:
- 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.
- 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.
- 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 productos, las opiniones y otros datos relevantes. Esto identifica los 25 "vecinos más cercanos" más relevantes.
Recomendación de Gemini:
El array de bytes de la imagen se pasa al modelo de Gemini a través de la API de Vertex AI, junto con la instrucción que solicita una descripción textual de la parte superior de la prenda y las sugerencias de recomendación de la parte inferior.
RAG y búsqueda de vectores de AlloyDB:
La descripción de la parte superior se usa para consultar la base de datos. La consulta convierte el texto de búsqueda (recomendación del modelo de Gemini para hacer coincidir la parte inferior de la prenda) en incorporaciones y realiza una Búsqueda de vectores en las incorporaciones almacenadas en la base de datos para encontrar los vecinos más cercanos (resultados coincidentes). Las incorporaciones de vectores en la base de datos de AlloyDB se indexan con el índice ScaNN para mejorar la recuperación.
Generación de imágenes de respuesta:
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.
Imagen para la generación de imágenes:
La instrucción de diseño del usuario, una recomendación seleccionada por el usuario y cualquier solicitud de personalización se combinan para mostrar la Imagen 3 con una imagen existente. La imagen con diseño se genera en función de esta instrucción con la API de Vertex AI.
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 hayas autenticado y que el proyecto esté configurado con tu ID de proyecto con el siguiente comando:
gcloud auth list
- Ejecuta el siguiente comando para confirmar que los próximos comandos de gcloud identificarán tu proyecto correctamente.
gcloud config list project
- Si tu proyecto no está configurado, usa el siguiente comando para hacerlo de forma explícita:
gcloud config set project <YOUR_PROJECT_ID>
- Habilita las API necesarias.
Sigue el vínculo para habilitar las APIs.
Si no habilitas alguna API, puedes hacerlo durante la implementación.
Para obtener más información sobre los comandos y el uso de gcloud, consulta la documentación.
4. Configuración de la base de datos
En este lab, usaremos AlloyDB como la base de datos para almacenar el conjunto de datos de comercio electrónico minorista. Usa clústeres para almacenar 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 son el recurso real que almacena los datos.
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
- En la consola de Google Cloud, busca AlloyDB. 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.
- Haz clic en CREAR CLÚSTER.
- 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
”
- En Red, cuando seleccionas la red predeterminada, aparece la siguiente opción. Haz clic en CONFIGURAR CONEXIÓN para configurar una red predeterminada.
- Selecciona Usar un rango de IP asignado automáticamente y haz clic en Continuar. Después de revisar la información, haz clic en CREAR CONEXIÓN.
Espera a que se complete la creación de la red predeterminada.
- En Configura tu instancia principal, establece el ID de la instancia como "
shopping-instance"
.
- Haz clic en CREAR CLÚSTER para completar la configuración del clúster de la siguiente manera:
5. Transferencia de datos
Ahora es el momento de agregar una tabla con los datos de la tienda. Espera a que se termine de crear la instancia. Una vez que se cree, podrás acceder a AlloyDB con las credenciales que estableciste cuando creaste el clúster.
Cómo autenticarse en la base de datos de AlloyDB
- En la consola de Google Cloud, ve a AlloyDB. Selecciona el clúster principal y, luego, haz clic en AlloyDB Studio en el panel de navegación de la izquierda:
- Ingresa los siguientes detalles para autenticar en la base de datos de AlloyDB:
- 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 ingresan en las pestañas del Editor. Puedes agregar varias ventanas del editor con el signo más que se encuentra a la derecha de la primera pestaña del editor.
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 incorporaciones 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;
- Ejecuta este comando SQL para verificar si las extensiones están instaladas:
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. En la siguiente imagen, se muestra un 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 del archivo SQL en una nueva pestaña del editor en AlloyDB Studio y haz clic en RUN.
- Expande la sección Explorador hasta que puedas ver la tabla llamada
apparels
. - Haz clic en el ícono de menú [⋮] y, luego, en Consulta. Se abrirá una sentencia SELECT en una nueva pestaña del editor.
- Haz clic en Run para verificar que se inserten las filas.
Otorga permiso al usuario
Le otorgaremos permiso al usuario postgres
para que genere incorporaciones desde AlloyDB..
En AlloyDB Studio, ejecuta la siguiente sentencia para otorgarle al usuario postgres
derechos de ejecución en la función embedding
:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
Otorga el rol de usuario de Vertex AI a la cuenta de servicio de AlloyDB
Usaremos los modelos de incorporación de texto de Vertex AI para generar incorporaciones para las que el rol de usuario de Vertex AI sea la cuenta de servicio de AlloyDB.
En la consola de Google Cloud, haz clic en el ícono de 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 de compilación
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 almacenaremos en la columna pdt_desc
de la tabla apparels
.
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.
En la pestaña Editor de AlloyDB Studio, ejecuta el siguiente comando que actualiza 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. Se puede llamar "on the water
, beachfront
, walk from your room to the ocean
, 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 estar muy cerca una de la otra.
Ahora que los datos y el contexto están listos, ejecutaremos la sentencia SQL para agregar las incorporaciones de la columna descripción del producto(pdt_desc
) a la tabla en el campo embedding
. Existen varios modelos de incorporación que puedes usar. Usamos text-embedding-005
de Vertex AI.
- En AlloyDB Studio, ejecuta el siguiente comando para generar incorporaciones y actualizar la columna
pdt_desc
con incorporaciones para los datos que almacena:
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- Ejecuta el siguiente comando para verificar que se generen las incorporaciones:
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
El siguiente es un ejemplo de vector de incorporaciones, que se parece a un array de números de punto flotante, para el texto de muestra en la consulta de la siguiente manera:
8. Realiza una búsqueda vectorial
Ahora que la tabla, los datos y las incorporaciones están listos, realicemos la búsqueda de vectores en tiempo real para el texto de búsqueda del usuario.
Supongamos que el texto de búsqueda del usuario es "pink color, casual, pure cotton tops for women
".
Para encontrar coincidencias para esta consulta, ejecuta la siguiente consulta en SQL:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
Veamos esta consulta en detalle:
En esta consulta,
- El texto de búsqueda del usuario es: "
I want womens tops, pink casual only pure cotton.
" - Convertimos este texto de búsqueda en incorporaciones con el método
embedding()
junto con el modelo:text-embedding-005
. 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. - "
<=>
" representa el uso del método de distancia COSINE SIMILARITY. 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 datos 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.
A continuación, se muestra un ejemplo de respuesta de esta consulta de SQL:
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.
Índice ScaNN de AlloyDB para el rendimiento de las consultas
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.
Si quieres usar el índice ScaNN, prueba los siguientes pasos:
- Como ya tenemos creado el clúster, la instancia, el contexto y las incorporaciones, solo tenemos que instalar la extensión ScaNN con la siguiente sentencia:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- Crea 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 el nombre de la tabla.scann
es el método de índice.embedding
es la columna de la tabla que deseas indexar.cosine
es el método de distancia que deseas usar con el índice.54
es la cantidad de particiones que se aplicarán a este índice. Se establece 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.
Según la recomendación del repositorio de ScaNN, usamos la RAIZ CUADRADA de la cantidad de datos. Cuando se particiona, num_leaves
debe ser aproximadamente la raíz cuadrada de la cantidad 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 con el índice de ScaNN.
- Prueba con una consulta de búsqueda simple con y sin el índice. Para realizar pruebas sin índice, debes descartarlo:
white tops for girls without any print
El texto de búsqueda anterior en la consulta de Búsqueda de vectores en los datos de incorporaciones INDEXED 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 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
- Verifica que
google_ml_integration
ya esté habilitado para tu clúster y tu instancia. En AlloyDB Studio, ejecuta el siguiente comando:
show google_ml_integration.enable_model_support;
Si el valor se muestra como "on", puedes omitir los siguientes 2 pasos y pasar directamente a la configuración.
la integración de modelos de AlloyDB y Vertex AI.
- Ve a la instancia principal del clúster de AlloyDB y haz clic en EDITAR INSTANCIA PRINCIPAL.
- En Opciones de configuración avanzadas, expande la sección Nueva marca de base de datos y asegúrate de que
google_ml_integration.enable_model_support flag
esté configurada como "on
" de la siguiente manera:
3. Si no está configurado en "
on
", configúralo en "on
" y, luego, haz clic en 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. Para ello, usa 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.
- En la consola de Google Cloud, ve a AlloyDB. Selecciona el clúster principal y, luego, haz clic en AlloyDB Studio en el panel de navegación de la izquierda.
- Usaremos el
gemini-1.5-pro:generateContent
que está disponible de forma predeterminada con la extensióngoogle_ml_integration
. - 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;
- Ejecuta el siguiente comando para otorgar permiso a los usuarios de la base de datos para que ejecuten la función ml_predict_row y ejecuten predicciones con los modelos de Google Vertex AI:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
Evalúa las respuestas
Si bien usaremos una consulta grande para la siguiente sección en la que llevaremos la aplicación a Cloud Run, para garantizar que las respuestas de la consulta sean razonables, la consulta puede ser difícil de entender.
Analizaremos las secciones individuales que se usan para crear la consulta más grande que finalmente usamos.
- 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. Estos datos se guardan en una tabla llamada xyz
, que es 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-005',
'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. El
La nueva tabla xyz
contendrá 5 filas, cada una con las siguientes columnas:
literature
content
user_text
- Para determinar qué tan válidas son las respuestas, usaremos una consulta complicada en la que explicaremos cómo evaluarlas. Usa
user_text
ycontent
en la tablaxyz
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."
- Con esa consulta, revisaremos la “calidad” de las respuestas en la tabla
xyz
. Cuando hablamos de bondad, nos referimos a qué tan precisas son las respuestas generadas en relación con lo que esperamos que sean.
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;
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.- Por último, para obtener el campo LLM, solo debes extraerlo de la tabla x:
SELECT
LLM_RESPONSE
FROM
x;
- Esto se puede combinar en una sola consulta de la siguiente manera:
Advertencia: Si ejecutaste las consultas anteriores para verificar los resultados intermedios,
Asegúrate de 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-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
La consulta más grande es una combinación de todas las consultas que ejecutamos en los pasos anteriores. 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:
10. Lleva la aplicación a la Web
Ahora alojaremos esta aplicación para que se pueda acceder a ella desde Internet.
Crea la función de Cloud Run
- En la consola de Google Cloud, ve a Cloud Run Functions con el siguiente vínculo:
https://console.cloud.google.com/run/create?deploymentType=function
- En Configure, establece el nombre de la función como "retail-engine" y selecciona la región como "us-central1".
- En URL del extremo, selecciona el entorno de ejecución como Java 17.
- En Autenticación, selecciona Permitir invocaciones no autenticadas.
- Expande Contenedores, volúmenes, Herramientas de redes y seguridad y haz clic en la pestaña Herramientas de redes.
- Selecciona Conéctate a una VPC para el tráfico saliente y, luego, haz clic en Usar conectores de Acceso a VPC sin servidores.
- En Red, haz clic en Agregar un nuevo conector de VPC. Habilita la API de Acceso a VPC sin servidores si aún no lo hiciste.
- En el conector Crear, establece el nombre en
alloydb-test-conn
. - Establece la región en
us-central
. - Deja el valor de red como predeterminada y establece subred como Rango de IP personalizado con el rango de IP 10.8.0.0 o algo similar que esté disponible.
- Expande la configuración de Show scaling y establece Minimum instances en 2 y Maximum instances en 3.
- Selecciona el tipo de instancia como f1-micro. A continuación, se muestran las opciones para crear un conector:
- Haz clic en Crear para crear el conector.
- En Enrutamiento de tráfico, selecciona Enrutar todo el tráfico a la VPC.
- Haz clic en Crear para crear la función.
Implemente la aplicación
Después de crear la función, actualiza la fuente y vuelve a implementar la aplicación.
- En Cloud Run, haz clic en la pestaña Servicios y, luego, en la función retail-engine.
- Haz clic en la pestaña Fuente. Deja el punto de entrada de la función predeterminado establecido en "
gcfv2.HelloHttpFunction
". - Reemplaza el contenido del archivo HelloHttpFunction.java por el contenido de este archivo Java.
- Actualiza los detalles de AlloyDbJdbcConnector en el archivo según los detalles de tu instancia y clúster de AlloyDB. Reemplaza
$PROJECT_ID
por el ID del proyecto de tu clúster y tu instancia de AlloyDB.
- Reemplaza el contenido del archivo pom.xml con el contenido de este archivo XML.
- Haz clic en Guardar y volver a implementar para implementar la función.
11. Prueba la aplicación de retail-engine
Una vez que se implemente la Cloud Function actualizada, deberías ver el extremo en el siguiente formato:
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
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://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
Y el resultado sería el siguiente:
Ahora que ejecutamos la búsqueda de vectores de similitud con el modelo de incorporaciones en los datos de AlloyDB, podemos avanzar hacia la creación de la aplicación que usa estas incorporaciones junto con tu imagen y solicita sugerencias de diseño.
12. Información sobre el flujo de recomendación de atuendos
La app de recomendación de atuendos es una aplicación de arranque de sprint que está configurada para funcionar con las incorporaciones que creamos en la aplicación del motor de venta minorista de AlloyDB junto con Gemini y Imagen para generar opciones de diseño de atuendos visuales. También te permite agregar instrucciones personalizadas y improvisar la recomendación.
Piénsalo de esta manera: subes a esta app una imagen de una blusa rosa intenso de tu armario. Cuando haces clic en Mostrar, según la instrucción establecida en el código de la aplicación y las incorporaciones en la base de datos de AlloyDB, la aplicación genera varias opciones que coinciden con la imagen original. Ahora te preguntas cómo se verían las opciones sugeridas con un collar azul, así que agregas una instrucción en esas líneas y haces clic en Estilo. Se genera la imagen final que combina la potente combinación de la imagen original y las recomendaciones para crear un atuendo a juego.
Para comenzar a crear la app de recomendación de atuendos, sigue estos pasos:
- En Cloud Run, abre la app retail-engine y anota la URL de tu aplicación. Este es el repositorio de incorporaciones que usaremos para generar sugerencias similares.
- En tu IDE, clona el repositorio https://github.com/AbiramiSukumaran/outfit-recommender/. En este ejercicio, los pasos que se muestran se realizan en el IDE de Visual Studio Code.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
Los siguientes son algunos de los archivos importantes del directorio de la app:
src/main
: Es el directorio de origen en el que residen los archivos de la aplicación y el HTML:HelloWorldApplication.java
: Es el punto de entrada principal de la aplicación de arranque de primavera.HelloWorldController.java
: Controlador REST de Spring Boot que controla las solicitudes HTTP relacionadas con una aplicación de recomendación de atuendos. Este archivo controla las solicitudes GET y POST, procesa las instrucciones del usuario, analiza las imágenes, interactúa con las incorporaciones de AlloyDB y muestra la respuesta final a la IU. Este controlador llama a la clase GenerateImageSample.GenerateImageSample.java
: Contiene la clase de generación de imágenes que se conecta a Vertex AI, da formato a la instrucción del usuario, realiza llamadas a la API al modelo de Imagen y muestra la imagen predicha a la clase del controlador.Resources
: Este directorio contiene imágenes y archivos HTML necesarios para generar la IU de la aplicación.Pom.xml
: Define las dependencias y configuraciones del proyecto.
- En el código de Visual Studio, abre el
HelloWorldController.java
y actualiza las instancias del ID y la ubicación del proyecto según la ubicación en la que se crea tu instancia de AlloyDB.
- Actualiza
endpoint
a la URL de la app de retail-engine que alojaste antes.
- Abre
GenerateImageSample.java
y actualiza el ID del proyecto y la ubicación según la ubicación en la que se crea tu instancia de AlloyDB.
- Guarda todos los archivos.
Ahora implementaremos esta aplicación en el entorno de ejecución sin servidores de Cloud Run.
13. Lleva la aplicación a la Web
Ahora que agregamos el proyecto, la ubicación y los detalles de la app de retail-engine relevantes a la aplicación de Spring Boot del recomendador de atuendos, podemos implementarla en Cloud Run.
Usaremos el comando gcloud run deploy
en la terminal de Visual Studio Code para implementar la aplicación. En Visual Studio Code, puedes instalar la extensión de Google Cloud Code para comenzar a usar gcloud CLI.
Para implementar la aplicación, sigue estos pasos:
- En tu IDE, abre el directorio clonado y, luego, inicia la terminal. En Visual Code Studio, haz clic en Terminal > Nueva terminal.
- Sigue las instrucciones de este documento para instalar gcloud CLI.
- Si usas Visual Studio Code, haz clic en Extensiones, busca Google Cloud Code y, luego, instálala.
- En la terminal de tu IDE, ejecuta el siguiente comando para autenticar tu Cuenta de Google:
gcloud auth application-default login
- Establece el ID de tu proyecto en el mismo proyecto en el que se encuentra tu instancia de AlloyDB.
gcloud config set project PROJECT_ID
- Inicia el proceso de implementación.
gcloud run deploy
- En
Source code location
, presiona Intro para seleccionar el directorio clonado de GitHub. - En
Service name
, ingresa un nombre para el servicio, como outfit-recommender, y presiona Intro. - En
Please specify a region
, ingresa la ubicación en la que se alojan tu instancia de AlloyDB y la aplicación de retail-engine, como 32 para us-central1, y presiona Intro.
- En
Allow unauthenticated invocations to [..]
, ingresa Y y presiona Intro.
En la siguiente imagen, se muestra el progreso de la implementación de tu aplicación:
14. Prueba la aplicación de recomendación de atuendos
Después de que la aplicación se implemente correctamente en Cloud Run, podrás ver el servicio en la consola de Google Cloud de la siguiente manera:
- En la consola de Google Cloud, ve a Cloud Run.
- En Servicios, haz clic en el servicio outfit recommender que implementaste. Deberías ver los servicios retail-engine y outfit-recommender de la siguiente manera:
- Haz clic en la URL de la aplicación para abrir la IU de la app del recomendador.
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
La aplicación implementada se puede ver de la siguiente manera:
Cómo usar la aplicación
Para comenzar a usar la aplicación, sigue estos pasos:
- Haz clic en Subir y sube una foto de una prenda de ropa.
- Después de subir la imagen, haz clic en Estilo. La aplicación usa la imagen como instrucción y genera opciones inferiores según la instrucción de la app de motor de venta minorista que incluye incorporaciones para el conjunto de datos de venta minorista.
La app genera sugerencias de imágenes junto con una instrucción basada en la imagen con recomendaciones de diseño. Por ejemplo, A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- Puedes pasar instrucciones adicionales a esta recomendación de estilo generada automáticamente. Por ejemplo,
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
- Haz clic en Mostrar para ver el diseño final.
15. Limpia
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.
16. Felicitaciones
¡Felicitaciones! Realizaste correctamente una búsqueda de similitud con AlloyDB, pgvector y Vector Search, junto con el uso del resultado de la búsqueda con el potente modelo de Imagen para generar recomendaciones de diseño.