1. Introducción
En este codelab, compilaremos una app de predicción y prescripción de puntuaciones de éxito de películas con consultas de BigQuery SQL y la API de PaLM de Vertex AI. El modelo que se usa para realizar la generación de texto es text-bison y se aloja como una función remota en BigQuery.
La lista de servicios que se usan es la siguiente:
- BigQuery ML
- API de PaLM de Vertex AI
- Cloud Shell
Qué compilarás
Crearás lo siguiente:
- Un conjunto de datos de BigQuery que contenga el modelo
- Un modelo de BigQuery ML que prediga la puntuación de éxito de una película en función de los atributos GENRE y RUNTIME de la película
- Un modelo de BigQuery que aloje la API de PaLM de Vertex AI como una función remota
- Una conexión externa para establecer la conexión entre BigQuery y Vertex AI
2. Requisitos
Antes de comenzar
- 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.
- Asegúrate de que todas las APIs necesarias (API de BigQuery, API de Vertex AI y API de conexión de BigQuery) estén habilitadas.
- Usarás Cloud Shell, un entorno de línea de comandos que se ejecuta en Google Cloud y que viene precargado con bq. Consulta la documentación para ver los comandos y el uso de gcloud.
En la consola de Cloud, haz clic en Activar Cloud Shell en la esquina superior derecha:

Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:
gcloud config set project <YOUR_PROJECT_ID>
- Para ir directamente a la consola de BigQuery, ingresa la siguiente URL en tu navegador: https://console.cloud.google.com/bigquery
3. Prepara datos
En este caso de uso, usaremos el conjunto de datos de películas derivado de la fuente de datos movielens.
- Crea un conjunto de datos:
Un conjunto de datos de BigQuery es una colección de tablas. Todas las tablas de un conjunto de datos se almacenan en la misma ubicación de datos location. También puedes adjuntar controles de acceso personalizados para limitar el acceso a un conjunto de datos y sus tablas.
En Cloud Shell, usa el comando bq mk para crear un conjunto de datos llamado "movie_insights".
bq mk --location=us-central1 movie_insights
- Clona el archivo fuente en tu máquina de Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
- Navega al nuevo directorio del proyecto que se creó en tu máquina de Cloud Shell:
cd movie_score_genai_insights
- Usa el comando bq load para cargar tu archivo CSV en una tabla de BigQuery (ten en cuenta que también puedes subirlo directamente desde la IU de BigQuery):
bq load --source_format=CSV --skip_leading_rows=1 movie_insights.movie_score \
./movies_data.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string
- Puedes consultar una muestra para verificar si la tabla movie_score y los datos se crearon en el conjunto de datos:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;
4. Datos a AA
Creemos un modelo de clasificación para predecir la puntuación de éxito de la película en función de los atributos GENRE y RUNTIME. Usaremos la instrucción CREATE MODEL con la opción ‘LOGISTIC_REG' para crear y entrenar un modelo de regresión logística.
Ejecuta la siguiente consulta en la sección EDITOR DE CONSULTAS del espacio de trabajo de SQL de la consola de BigQuery:
CREATE OR REPLACE MODEL
`movie_insights.model_rating_by_runtime_genre`
OPTIONS
( model_type='LOGISTIC_REG',
auto_class_weights=TRUE,
data_split_method='NO_SPLIT',
model_registry='vertex_ai',
vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
input_label_cols=['score']
) AS
SELECT name, genre,runtime, score
FROM
movie_insights.movie_score
WHERE
data_cat = 'TRAIN';
Detalles de la consulta:
- La instrucción CREATE MODEL entrena un modelo con los datos de entrenamiento en la instrucción SELECT.
- La cláusula OPTIONS especifica el tipo de modelo y las opciones de entrenamiento. Aquí, la opción LOGISTIC_REG especifica un tipo de modelo de regresión logística. No es necesario especificar un modelo de regresión logística binaria frente a un modelo de regresión logística de varias clases: BigQuery ML puede determinar cuál entrenar según la cantidad de valores únicos en la columna de la etiqueta.
- data_split_method=‘NO_SPLIT' obliga a BQML a entrenar los datos según las condiciones de la consulta (data_cat = ‘TRAIN'). También ten en cuenta que es mejor usar ‘AUTO_SPLIT' en esta opción para permitir que el framework (o el servicio en este caso) aleatorice la partición de las divisiones de entrenamiento y prueba.
- La opción input_label_cols especifica qué columna de la instrucción SELECT se usará como columna de la etiqueta. Aquí, la columna de la etiqueta es score, por lo que el modelo aprenderá cuál de los 10 valores de score es más probable que se base en los demás valores presentes en cada fila.
- La opción ‘auto_class_weights=TRUE' equilibra las etiquetas de clase en los datos de entrenamiento. De forma predeterminada, los datos de entrenamiento no están ponderados. Si las etiquetas en los datos de entrenamiento están desequilibradas, el modelo puede aprender a predecir en mayor medida la clase de etiquetas más popular.
- La instrucción SELECT consulta la tabla que cargamos con los datos CSV. La cláusula WHERE filtra las filas de la tabla de entrada para que solo se seleccione el conjunto de datos TRAIN en este paso.
- Las siguientes construcciones son OPCIONALES, por lo que BigQuery ML puede registrarlas de forma explícita en Vertex AI Model Registry. Puedes obtener más información al respecto en este blog
. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']
Una vez creado, aparecerá lo siguiente en la sección SCHEMA del espacio de trabajo de SQL de BigQuery:

Después de crear el modelo, debes evaluar su rendimiento con la función ML.EVALUATE. La función ML.EVALUATE compara los valores predichos con los reales.
También puedes ver las métricas de evaluación de tu modelo en la página MODEL:

Métricas clave de un vistazo:
Precisión: ¿Qué proporción de identificaciones positivas fue correcta? Precisión = Verdadero positivo / (Verdadero positivo + Falso positivo) Recuperación: ¿Qué proporción de positivos reales se identificó en forma correcta? Recuperación = Verdadero positivo / (Verdadero positivo + Falso negativo) Exactitud: Es una métrica para evaluar los modelos de clasificación. Es la fracción de predicciones que nuestro modelo realmente acertó. Exactitud = Cantidad de predicciones correctas / Cantidad total de predicciones
5. Predice la puntuación de la película con el modelo
¡Momento de la predicción! La siguiente consulta predice la puntuación de cada película en el conjunto de datos que se categoriza como datos "TEST".
Ejecuta la siguiente consulta en la sección EDITOR DE CONSULTAS del espacio de trabajo de SQL de la consola de BigQuery:
SELECT
*
FROM
ML.PREDICT (MODEL movie_insights.model_rating_by_runtime_genre,
(
SELECT
*
FROM
movie_insights.movie_score
WHERE
data_cat= 'TEST'
)
);
El resultado es similar al siguiente:

El resultado del modelo muestra el predicted_score de la película en una escala de 1 a 10 (clasificación). Te preguntarás por qué hay varias filas de predicción para cada película. Esto se debe a que el modelo mostró las posibles etiquetas predichas y la probabilidad de ocurrencia de cada una en orden descendente.
Analiza los resultados predichos y el modelo:
Puedes realizar dos pasos de análisis excelentes con la predicción para comprender los resultados:
- Para comprender por qué tu modelo genera estos resultados de predicción, puedes usar la función ML.EXPLAIN_PREDICT.
- Para saber qué atributos son los más importantes a la hora de determinar el rango de ingresos en general, puedes usar la función ML.GLOBAL_EXPLAIN.
Puedes leer sobre estos pasos en detalle en la documentación.
6. Datos a IA generativa
Entreguemos estadísticas sobre el conjunto de datos de películas preguntando al LLM (modelo de lenguaje grande) el resumen de los factores que influyen en que la puntuación de la película sea superior a 5, con la IA generativa que usa el modelo text-bison (más reciente) de Vertex AI con solo consultas en SQL.
- La tabla que creamos movie_score también será la entrada para este paso.
- Se creará una conexión externa para establecer el acceso entre BigQuery ML y los servicios de Vertex.
- Se usará la construcción GENERATE_TEXT de BigQuery para invocar la API de PaLM de forma remota desde Vertex AI.
7. Crea una conexión externa
Habilita la API de conexión de BQ si aún no lo hiciste y anota el ID de la cuenta de servicio de los detalles de configuración de la conexión:
- Haz clic en el botón +AGREGAR en el panel Explorador de BigQuery (a la izquierda de la consola de BigQuery) y haz clic en "Conexión a fuentes de datos externas" en las fuentes populares que se muestran.
- Selecciona Tipo de conexión como "BigLake y funciones remotas", proporciona el tipo de ubicación como "Región" y el valor como "us-central1 (Iowa)" y "bq_llm_connection" como ID de conexión.

- Una vez que se cree la conexión, toma nota de la cuenta de servicio generada a partir de los detalles de configuración de la conexión.
Otorga permisos
En este paso, otorgaremos permisos a la cuenta de servicio para acceder al servicio de Vertex AI:
Abre IAM y agrega la cuenta de servicio que copiaste después de crear la conexión externa como la principal y selecciona el rol "Usuario de Vertex AI".

8. Crea un modelo de AA remoto
Crea el modelo remoto que representa un modelo de lenguaje grande de Vertex AI alojado:
CREATE OR REPLACE MODEL
movie_insights.llm_model REMOTE
WITH CONNECTION `us-central1.bq_llm_connection` OPTIONS (remote_service_type = 'CLOUD_AI_LARGE_LANGUAGE_MODEL_V1');
Crea un modelo llamado llm_model en el conjunto de datos movie_insights que aprovecha la API de CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 de Vertex AI como una función remota. Este proceso puede tomar varios segundos en completarse.
9. Genera texto con el modelo de AA
Una vez creado el modelo, úsalo para generar, resumir o categorizar texto.
SELECT
ml_generate_text_result['predictions'][0]['content'] AS generated_text,
ml_generate_text_result['predictions'][0]['safetyAttributes']
AS safety_attributes,
* EXCEPT (ml_generate_text_result)
FROM
ML.GENERATE_TEXT(
MODEL `movie_insights.llm_model`,
(
SELECT
CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
FROM (
SELECT
REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
FROM (
SELECT
*
FROM
`movie_insights.movie_score`
WHERE
CAST(SCORE AS INT64) > 5
LIMIT
50) ) AS MOVIES
),
STRUCT(
0.2 AS temperature,
100 AS max_output_tokens));
**Explicación:
ml_generate_text_result** es la respuesta del modelo de generación de texto en formato JSON que contiene atributos de contenido y seguridad: a. Content representa el resultado de texto generado b. Los atributos de seguridad representan el filtro de contenido integrado con un umbral ajustable que está habilitado en la API de Vertex AI Palm para evitar respuestas no deseadas o imprevistas del modelo de lenguaje grande. La respuesta se bloquea si infringe el umbral de seguridad.
ML.GENERATE_TEXT es la construcción que usas en BigQuery para acceder al LLM de Vertex AI y realizar tareas de generación de texto.
CONCAT agrega tu instrucción PROMPT y el registro de la base de datos.
movie_insights es el nombre del conjunto de datos y movie_score es el nombre de la tabla que contiene los datos que usaremos en el diseño de instrucciones.
Temperature es el parámetro de la instrucción para controlar la aleatoriedad de la respuesta: cuanto menor sea, mayor será la relevancia.
Max_output_tokens es la cantidad de palabras que quieres en la respuesta.
La respuesta de la consulta es similar a la siguiente:

Como puedes ver, la respuesta está anidada y sin formato.
10. Aplanar el resultado de la consulta
Aplanemos el resultado para no tener que decodificar el JSON de forma explícita en la consulta:
SELECT
*
FROM
ML.GENERATE_TEXT( MODEL movie_insights.llm_model,
(
SELECT
CONCAT('FROM THE FOLLOWING TEXT ABOUT MOVIES, WHAT DO YOU THINK ARE THE FACTORS INFLUENCING A MOVIE SCORE TO BE GREATER THAN 5?: ', movie_data) AS prompt
FROM (
SELECT
REPLACE(STRING_AGG( CONCAT('A movie named ',name, ' from the country ', country, ' with a censor rating of ',rating, ' and a budget of ', budget, ' produced by ', company, ' with a runtime of about ', runtime, ' and in the genre ', genre, ' starring ', star, ' has had a success score of ', score, '') ), ',','. ') AS movie_data
FROM (
SELECT
*
FROM
`movie_insights.movie_score`
WHERE
CAST(SCORE AS INT64) > 5
LIMIT
50) ) AS MOVIES),
STRUCT( 0.2 AS temperature,
100 AS max_output_tokens,
TRUE AS flatten_json_output));
**Explicación:
Flatten_json_output** representa el valor booleano que, si se establece en true, muestra un texto plano comprensible extraído de la respuesta JSON.
La respuesta de la consulta es similar a la siguiente:

11. Limpia
Para evitar que se apliquen cargos a la cuenta de Google Cloud por los recursos que se usaron en esta publicación, puedes borrar el extremo de Vertex AI que creaste como parte del paso de AA. Para ello, navega a la página Extremo de Vertex AI.
12. ¡Felicitaciones!
¡Felicitaciones! Creaste correctamente un modelo de BQML y realizaste análisis basados en LLM con una API de Vertex AI en tu conjunto de datos de películas solo con consultas en SQL. Revisa la documentación del producto de LLM de Vertex AI para obtener más información sobre los modelos disponibles.