Acerca de este codelab
1. Introducción
En este lab, aprenderás a usar BigQuery Machine Learning para la inferencia con modelos remotos ( modelos de Gemini) para analizar imágenes de afiches de películas y generar resúmenes de las películas en función de los afiches directamente en tu almacén de datos de BigQuery.
En la imagen de arriba, se muestra una muestra de las imágenes de los pósteres de películas que analizarás.
BigQuery es una plataforma de análisis de datos completamente administrada y lista para la IA que te ayuda a maximizar el valor de tus datos y está diseñada para ser multimotor, multiformato y de múltiples nubes. Una de sus funciones clave es BigQuery Machine Learning para la inferencia, que te permite crear y ejecutar modelos de aprendizaje automático (AA) a través de consultas en GoogleSQL.
Gemini es una familia de modelos de IA generativa que desarrolló Google y que están diseñados para casos de uso multimodales.
Ejecuta modelos de AA con consultas de GoogleSQL
Por lo general, ejecutar el AA o la Inteligencia Artificial (IA) en conjuntos de datos grandes requiere una programación extensa y conocimiento de los frameworks de AA. Esto limita el desarrollo de soluciones a un pequeño grupo de especialistas dentro de cada empresa. Con el aprendizaje automático de BigQuery para la inferencia, los profesionales de SQL pueden usar herramientas y habilidades de SQL existentes para crear modelos y generar resultados a partir de LLM y APIs de Cloud AI.
Requisitos previos
- Conocimientos básicos sobre la consola de Google Cloud
- Experiencia con BigQuery (se valorará)
Qué aprenderás
- Cómo configurar tu entorno y cuenta para usar APIs
- Cómo crear una conexión de recursos de Cloud en BigQuery
- Cómo crear un conjunto de datos y una tabla de objetos en BigQuery para las imágenes de afiches de películas
- Cómo crear los modelos remotos de Gemini en BigQuery
- Cómo solicitarle al modelo de Gemini que proporcione resúmenes de películas para cada afiche
- Cómo generar incorporaciones de texto para la película representada en cada afiche
- Cómo usar
VECTOR_SEARCH
de BigQuery para hacer coincidir las imágenes de los afiches de películas con películas estrechamente relacionadas en el conjunto de datos
Requisitos
- Una cuenta de Google Cloud y un proyecto de Google Cloud, con la facturación habilitada
- Un navegador web, como Chrome
2. Configuración y requisitos
Configuración del entorno de autoaprendizaje
- Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.
- El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla cuando quieras.
- El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID de tu proyecto (suele identificarse como
PROJECT_ID
). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usa el mismo durante todo el proyecto. - Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
- A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no costará mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.
Inicia Cloud Shell
Si bien Google Cloud y Spanner se pueden operar de manera remota desde tu laptop, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.
En Google Cloud Console, haz clic en el ícono de Cloud Shell en la barra de herramientas en la parte superior derecha:
El aprovisionamiento y la conexión al entorno deberían tomar solo unos minutos. Cuando termine el proceso, debería ver algo como lo siguiente:
Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Todo tu trabajo en este codelab se puede hacer en un navegador. No es necesario que instales nada.
3. Antes de comenzar
Existen algunos pasos de configuración para trabajar con modelos de Gemini en BigQuery, como habilitar las APIs, crear una conexión de recursos de Cloud y otorgarle ciertos permisos a la cuenta de servicio de la conexión de recursos de Cloud. Estos pasos son únicos por proyecto y se analizarán en las siguientes secciones.
Habilita las APIs
En Cloud Shell, asegúrate de que tu ID del proyecto esté configurado:
gcloud config set project [YOUR-PROJECT-ID]
Establece la variable de entorno PROJECT_ID
:
PROJECT_ID=$(gcloud config get-value project)
Configura la región predeterminada que se usará para los modelos de Vertex AI. Obtén más información sobre las ubicaciones disponibles para Vertex AI. En el ejemplo, usamos la región us-central1
.
gcloud config set compute/region us-central1
Establece la variable de entorno REGION
:
REGION=$(gcloud config get-value compute/region)
Habilita todos los servicios necesarios con el siguiente comando:
gcloud services enable bigqueryconnection.googleapis.com \
aiplatform.googleapis.com
Resultado esperado después de ejecutar todos los comandos anteriores:
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417 Updated property [core/project]. student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-14650] student@cloudshell:~ (test-project-001-402417)$ student@cloudshell:~ (test-project-001-402417)$ gcloud services enable bigqueryconnection.googleapis.com \ aiplatform.googleapis.com Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
4. Crea una conexión de recursos de Cloud
En esta tarea, crearás una conexión de recursos de Cloud, que permite que BigQuery acceda a los archivos de imagen en Cloud Storage y realice llamadas a Vertex AI.
- En el menú de navegación (
) de la consola de Google Cloud, haz clic en BigQuery.
- Para crear una conexión, haz clic en + AGREGAR y, a continuación, en Conexiones a fuentes de datos externas.
- En la lista Tipo de conexión, selecciona Modelos remotos de Vertex AI, funciones remotas y BigLake (Cloud Resource).
- En el campo ID de conexión, escribe gemini_conn para tu conexión.
- En Tipo de ubicación, selecciona Multirregión y, luego, en el menú desplegable, selecciona la multirregión EE.UU.
- Usa los valores predeterminados para el resto de la configuración.
- Haz clic en Crear conexión.
- Haz clic en IR A LA CONEXIÓN.
- En el panel Información de conexión, copia el ID de cuenta de servicio en un archivo de texto para usarlo en la siguiente tarea. También verás que la conexión se agrega en la sección Conexiones externas de tu proyecto en el panel Explorador de BigQuery.
5. Otorga permisos de IAM a la cuenta de servicio de las conexiones
En esta tarea, otorgarás los permisos de IAM a la cuenta de servicio de la conexión de recursos de Cloud, a través de un rol, para que pueda acceder a los servicios de Vertex AI.
- En el menú de navegación de la consola de Google Cloud, haz clic en IAM y administración.
- Haz clic en Otorgar acceso.
- En el campo Principales nuevas, ingresa el ID de cuenta de servicio que copiaste antes.
- En el campo Selecciona un rol, escribe Vertex AI y, a continuación, selecciona el rol Usuario de Vertex AI.
- Haz clic en Guardar. Ahora, el resultado es el ID de la cuenta de servicio que incluye el rol de usuario de Vertex AI.
6. Crea el conjunto de datos y una tabla de objetos en BigQuery para las imágenes de afiches de películas
En esta tarea, crearás un conjunto de datos para el proyecto y una tabla de objetos dentro de él para almacenar las imágenes de afiches.
El conjunto de datos de imágenes de pósteres de películas que se usa en este instructivo se almacena en un bucket público de Google Cloud Storage: gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters
Crea un conjunto de datos
Crearás un conjunto de datos para almacenar objetos de base de datos, incluidos modelos y tablas, que se usarán en este instructivo.
- En la consola de Google Cloud, selecciona el menú de navegación (
) y, luego, BigQuery.
- En el panel Explorador, junto al nombre de tu proyecto, selecciona Ver acciones (
) y, luego, Crear conjunto de datos.
- En el panel Crear conjunto de datos, ingresa la información que se encuentra a continuación:
- ID del conjunto de datos: gemini_demo
- Tipo de ubicación: selecciona Multirregión.
- Multirregión: Selecciona EE.UU.
- Deja los demás campos en la configuración predeterminada.
- Haz clic en Crear conjunto de datos.
El resultado es el conjunto de datos gemini_demo
que se crea y aparece debajo de tu proyecto en el panel Explorador de BigQuery.
Crea la tabla de objetos
BigQuery no solo contiene datos estructurados, sino que también puede acceder a datos no estructurados (como las imágenes de afiches) a través de tablas de objetos.
Para crear una tabla de objetos, debes apuntar a un bucket de Cloud Storage. La tabla de objetos resultante tendrá una fila para cada objeto del bucket con su ruta de almacenamiento y metadatos.
Para crear la tabla de objetos, usarás una consulta en SQL.
- Haz clic en el signo + para crear una consulta en SQL nueva.
- En el editor de consultas, pega la consulta que figura a continuación.
CREATE OR REPLACE EXTERNAL TABLE
`gemini_demo.movie_posters`
WITH CONNECTION `us.gemini_conn`
OPTIONS (
object_metadata = 'SIMPLE',
uris = ['gs://cloud-samples-data/vertex-ai/dataset-management/datasets/classic-movie-posters/*']
);
- Ejecuta la consulta. El resultado es una tabla de objetos
movie_posters
que se agrega al conjunto de datosgemini_demo
y se carga con elURI
(la ubicación de Cloud Storage) de cada imagen de afiche de película. - En el panel Explorador, haz clic en
movie_posters
y revisa el esquema y los detalles. Puedes consultar la tabla para revisar registros específicos.
7. Crea el modelo remoto de Gemini en BigQuery
Ahora que se creó la tabla de objetos, puedes comenzar a trabajar con ella. En esta tarea, crearás un modelo remoto para Gemini 1.5 Flash para que esté disponible en BigQuery.
Crea el modelo de control remoto Gemini 1.5 Flash
- Haz clic en el signo + para crear una consulta en SQL nueva.
- En el editor de consultas, pega la consulta que figura a continuación y ejecútala.
CREATE OR REPLACE MODEL `gemini_demo.gemini_1_5_flash`
REMOTE WITH CONNECTION `us.gemini_conn`
OPTIONS (endpoint = 'gemini-1.5-flash')
El resultado es que se crea el modelo gemini_1_5_flash
y lo verás agregado al conjunto de datos gemini_demo
en la sección de modelos.
- En el panel Explorador, haz clic en el modelo
gemini_1_5_flash
y revisa los detalles.
8. Envía una instrucción al modelo de Gemini para que proporcione resúmenes de películas para cada afiche
En esta tarea, usarás el modelo remoto de Gemini que acabas de crear para analizar las imágenes de los afiches de películas y generar resúmenes para cada película.
Puedes enviar solicitudes al modelo con la función ML.GENERATE_TEXT
y hacer referencia al modelo en los parámetros.
Analiza las imágenes con el modelo Gemini 1.5 Flash
- Crea y ejecuta una nueva consulta con la siguiente instrucción de SQL:
CREATE OR REPLACE TABLE
`gemini_demo.movie_posters_results` AS (
SELECT
uri,
ml_generate_text_llm_result
FROM
ML.GENERATE_TEXT( MODEL `gemini_demo.gemini_1_5_flash`,
TABLE `gemini_demo.movie_posters`,
STRUCT( 0.2 AS temperature,
'For the movie represented by this poster, what is the movie title and year of release? Answer in JSON format with two keys: title, year. title should be string, year should be integer. Do not use JSON decorators.' AS PROMPT,
TRUE AS FLATTEN_JSON_OUTPUT)));
Cuando se ejecuta la consulta, BigQuery le solicita al modelo Gemini cada fila de la tabla de objetos y combina la imagen con la instrucción estática especificada. Como resultado, se crea la tabla movie_posters_results
.
- Ahora veamos los resultados. Crea y ejecuta una nueva consulta con la siguiente instrucción de SQL:
SELECT * FROM `gemini_demo.movie_posters_results`
El resultado es que se muestran filas para cada afiche de película con el URI
(la ubicación de Cloud Storage de la imagen del afiche de la película) y un resultado de JSON que incluye el título de la película y el año en que se estrenó a partir del modelo de Gemini 1.5 Flash.
Puedes recuperar estos resultados de una forma más legible por humanos con la siguiente consulta. Esta consulta usa SQL para extraer el título de la película y el año de lanzamiento de estas respuestas en columnas nuevas.
- Crea y ejecuta una nueva consulta con la siguiente instrucción de SQL:
CREATE OR REPLACE TABLE
`gemini_demo.movie_posters_results_formatted` AS (
SELECT
uri,
JSON_VALUE(ml_generate_text_llm_result, "$.title") AS title,
JSON_VALUE(ml_generate_text_llm_result, "$.year") AS year
FROM
`gemini_demo.movie_posters_results` results )
Como resultado, se crea la tabla movie_posters_result_formatted
.
- Para ver las filas que se crearon, puedes consultar la tabla con la consulta que figura a continuación.
SELECT * FROM `gemini_demo.movie_posters_results_formatted`
Observa cómo los resultados de la columna URI
siguen siendo los mismos, pero el formato JSON ahora se convierte en las columnas title
y year
de cada fila.
Cómo enviar una instrucción al modelo Gemini 1.5 Flash para que proporcione resúmenes de películas
¿Qué pasaría si quisieras obtener un poco más de información sobre cada una de estas películas, por ejemplo, un resumen de texto de cada una? Este caso de uso de generación de contenido es perfecto para un modelo de LLM, como el modelo Gemini 1.5 Flash.
- Puedes usar Gemini 1.5 Flash para proporcionar resúmenes de películas para cada afiche. Para ello, ejecuta la siguiente consulta:
SELECT
uri,
title,
year,
prompt,
ml_generate_text_llm_result
FROM
ML.GENERATE_TEXT( MODEL `gemini_demo.gemini_1_5_flash`,
(
SELECT
CONCAT('Provide a short summary of movie titled ',title, ' from the year ',year,'.') AS prompt,
uri,
title,
year
FROM
`gemini_demo.movie_posters_results_formatted`
LIMIT
20 ),
STRUCT(0.2 AS temperature,
TRUE AS FLATTEN_JSON_OUTPUT));
Observa el campo ml_generate_text_llm_result
de los resultados, que incluye un breve resumen de la película.
9. Genera embeddings de texto con un modelo remoto
Ahora puedes unir los datos estructurados que creaste con otros datos estructurados en tu almacén. El conjunto de datos público de IMDB disponible en BigQuery contiene una gran cantidad de información sobre películas, incluidas las calificaciones de los usuarios y algunas opiniones de usuarios de formato libre de muestra. Estos datos pueden ayudarte a profundizar en el análisis de los pósteres de las películas y comprender cómo se percibieron estas películas.
Para unir datos, necesitarás una clave. En este caso, es posible que los títulos de las películas que genera el modelo de Gemini no coincidan perfectamente con los títulos del conjunto de datos de IMDB.
En esta tarea, generarás incorporaciones de texto de los títulos y años de las películas de ambos conjuntos de datos y, luego, usarás la distancia entre estas incorporaciones para unir el título de IMDB más cercano con los títulos de los afiches de películas de tu conjunto de datos recién creado.
Crea el modelo remoto
Para generar las incorporaciones de texto, deberás crear un nuevo modelo remoto que apunte al extremo text-multilingual-embedding-002.
- Crea y ejecuta una nueva consulta con la siguiente instrucción de SQL:
CREATE OR REPLACE MODEL `gemini_demo.text_embedding`
REMOTE WITH CONNECTION `us.gemini_conn`
OPTIONS (endpoint = 'text-multilingual-embedding-002')
El resultado es que se crea el modelo text_embedding
y aparece en el explorador debajo del conjunto de datos gemini_demo
.
Genera incorporaciones de texto para el título y el año asociados con los afiches
Ahora, usarás este modelo remoto con la función ML.GENERATE_EMBEDDING
para crear una incorporación para cada título y año de póster de película.
- Crea y ejecuta una nueva consulta con la siguiente instrucción de SQL:
CREATE OR REPLACE TABLE
`gemini_demo.movie_posters_results_embeddings` AS (
SELECT
*
FROM
ML.GENERATE_EMBEDDING(
MODEL `gemini_demo.text_embedding`,
(
SELECT
CONCAT('The movie titled ', title, ' from the year ', year,'.') AS content,
title,
year,
uri
FROM
`gemini_demo.movie_posters_results_formatted` ),
STRUCT(TRUE AS flatten_json_output)));
El resultado es que se crea la tabla movie_poster_results_embeddings
que contiene las incorporaciones para el contenido de texto concatenado para cada fila de la tabla gemini_demo.movie_posters_results_formatted
.
- Puedes ver los resultados de la consulta con la nueva consulta que se muestra a continuación:
SELECT * FROM `gemini_demo.movie_posters_results_embeddings`
Aquí puedes ver los embeddings (vectores representados por números) que genera el modelo para cada película.
Genera embeddings de texto para un subconjunto del conjunto de datos de IMDB
Crearás una vista nueva de datos de un conjunto de datos públicos de IMDB que contenga solo las películas que se estrenaron antes de 1935 (el período conocido de las películas de las imágenes de pósteres).
- Crea y ejecuta una nueva consulta con la siguiente instrucción de SQL:
CREATE OR REPLACE VIEW
`gemini_demo.imdb_movies` AS (
WITH
reviews AS (
SELECT
reviews.movie_id AS movie_id,
title.primary_title AS title,
title.start_year AS year,
reviews.review AS review
FROM
`bigquery-public-data.imdb.reviews` reviews
LEFT JOIN
`bigquery-public-data.imdb.title_basics` title
ON
reviews.movie_id = title.tconst)
SELECT
DISTINCT(movie_id),
title,
year
FROM
reviews
WHERE
year < 1935)
El resultado es una vista nueva que contiene una lista de IDs, títulos y años de lanzamiento de distintas películas de la tabla bigquery-public-data.imdb.reviews
para todas las películas del conjunto de datos lanzadas antes de 1935.
- Ahora, crearás embeddings para el subconjunto de películas de IMDB con un proceso similar al de la sección anterior. Crea y ejecuta una nueva consulta con la siguiente instrucción de SQL:
CREATE OR REPLACE TABLE
`gemini_demo.imdb_movies_embeddings` AS (
SELECT
*
FROM
ML.GENERATE_EMBEDDING( MODEL `gemini_demo.text_embedding`,
(
SELECT
CONCAT('The movie titled ', title, ' from the year ', year,'.') AS content,
title,
year,
movie_id
FROM
`gemini_demo.imdb_movies` ),
STRUCT(TRUE AS flatten_json_output) )
WHERE
ml_generate_embedding_status = '' );
El resultado de la consulta es una tabla que contiene las incorporaciones para el contenido de texto de la tabla gemini_demo.imdb_movies
.
Relaciona las imágenes de los afiches de películas con movie_id
de IMDB con BigQuery VECTOR_SEARCH
Ahora, puedes unir las dos tablas con la función VECTOR_SEARCH
.
- Crea y ejecuta una nueva consulta con la siguiente instrucción de SQL:
SELECT
query.uri AS poster_uri,
query.title AS poster_title,
query.year AS poster_year,
base.title AS imdb_title,
base.year AS imdb_year,
base.movie_id AS imdb_movie_id,
distance
FROM
VECTOR_SEARCH( TABLE `gemini_demo.imdb_movies_embeddings`,
'ml_generate_embedding_result',
TABLE `gemini_demo.movie_posters_results_embeddings`,
'ml_generate_embedding_result',
top_k => 1,
distance_type => 'COSINE');
La consulta usa la función VECTOR_SEARCH
para encontrar el vecino más cercano en la tabla gemini_demo.imdb_movies_embeddings
para cada fila de la tabla gemini_demo.movie_posters_results_embeddings
. El vecino más cercano se encuentra con la métrica de distancia coseno, que determina qué tan similares son dos embeddings.
Esta consulta se puede usar para encontrar la película más similar en el conjunto de datos de IMDB para cada una de las películas que Gemini 1.5 Flash identificó en los afiches de películas. Por ejemplo, puedes usar esta consulta para encontrar la coincidencia más cercana de la película "Au Secours!" en el conjunto de datos públicos de IMDB, que hace referencia a esta película por su título en inglés, "Help!".
- Crea y ejecuta una nueva consulta para unir información adicional sobre las calificaciones de películas que se proporciona en el conjunto de datos públicos de IMDB:
SELECT
query.uri AS poster_uri,
query.title AS poster_title,
query.year AS poster_year,
base.title AS imdb_title,
base.year AS imdb_year,
base.movie_id AS imdb_movie_id,
distance,
imdb.average_rating,
imdb.num_votes
FROM
VECTOR_SEARCH( TABLE `gemini_demo.imdb_movies_embeddings`,
'ml_generate_embedding_result',
TABLE `gemini_demo.movie_posters_results_embeddings`,
'ml_generate_embedding_result',
top_k => 1,
distance_type => 'COSINE') DATA
LEFT JOIN
`bigquery-public-data.imdb.title_ratings` imdb
ON
base.movie_id = imdb.tconst
ORDER BY
imdb.average_rating DESC
Esta consulta es similar a la anterior. Sigue usando representaciones numéricas especiales llamadas embeddings de vectores para encontrar películas similares a un afiche de película determinado. Sin embargo, también une la calificación promedio y la cantidad de votos para cada película que es el vecino más cercano de una tabla separada del conjunto de datos públicos de IMDB.
10. Felicitaciones
Felicitaciones por completar el codelab. Creaste correctamente una tabla de objetos para tus imágenes de afiches en BigQuery, creaste un modelo de Gemini remoto, usaste el modelo para pedirle que analice las imágenes y proporcionara resúmenes de películas, generaste incorporaciones de texto para los títulos de las películas y usaste esas incorporaciones para hacer coincidir las imágenes de los afiches de películas con el título de la película relacionado en el conjunto de datos de IMDB.
Temas abordados
- Cómo configurar tu entorno y cuenta para usar APIs
- Cómo crear una conexión de recursos de Cloud en BigQuery
- Cómo crear un conjunto de datos y una tabla de objetos en BigQuery para las imágenes de afiches de películas
- Cómo crear los modelos remotos de Gemini en BigQuery
- Cómo solicitarle al modelo de Gemini que proporcione resúmenes de películas para cada afiche
- Cómo generar incorporaciones de texto para la película representada en cada afiche
- Cómo usar
VECTOR_SEARCH
de BigQuery para hacer coincidir las imágenes de los afiches de películas con películas estrechamente relacionadas en el conjunto de datos
Próximos pasos y más información