Estadísticas generativas con BigQuery SQL y Vertex AI

1. Introducción

En este codelab, compilaremos una app de predicción y prescripción de calificaciones de éxito de películas con consultas en SQL de BigQuery 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:

  1. BigQuery ML
  2. API de PaLM de Vertex AI
  3. Cloud Shell

Qué compilarás

Crearás

  • Un conjunto de datos de BigQuery que contenga el modelo
  • Un modelo de BigQuery ML que predice la puntuación de éxito de una película según los atributos GENRE y RUNTIME de la película
  • Un modelo de BigQuery que aloja 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

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

Antes de comenzar

  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. Asegúrate de que todas las APIs necesarias (API de BigQuery, API de Vertex AI y API de BigQuery Connection) estén habilitadas.
  4. 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:

51622c00acec2fa.png

Si tu proyecto no está configurado, usa el siguiente comando para hacerlo:

gcloud config set project <YOUR_PROJECT_ID>
  1. Para navegar 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, utilizaremos el conjunto de datos de películas derivado de la fuente movielens.

  1. 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. 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
  1. Clona el archivo fuente en tu máquina de Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Navega al directorio del proyecto nuevo que se creó en tu máquina de Cloud Shell:
cd movie_score_genai_insights
  1. 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
  1. Puedes consultar una muestra para verificar si se crearon la tabla movie_score y los datos en el conjunto de datos:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. De los datos al 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:

  1. La declaración CREATE MODEL entrena un modelo con los datos de entrenamiento en la declaración SELECT.
  2. 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.
  3. data_split_method=‘NO_SPLIT' obliga a BQML a entrenar con 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.
  4. 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.
  5. 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 no tienen un equilibrio, el modelo puede aprender a predecir la clase de etiquetas más popular, lo que podría no ser conveniente.
  6. 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 de TRAIN en este paso.
  7. Las siguientes construcciones son OPCIONALES, por lo que BigQuery ML puede registrarlas explícitamente 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:

2e43087f914aa466.png

Después de crear el modelo, evalúa 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:

7f2dc168bac0ac1a.png

Métricas clave de un vistazo:

Precisión: ¿Qué proporción de identificaciones positivas fue correcta? Precisión = Verdaderos positivos / (Verdaderos positivos + Falsos positivos) Recuperación: ¿Qué proporción de positivos reales se identificó en forma correcta? Recuperación = Verdaderos positivos / (Verdaderos positivos + Falsos negativos) Precisión: Es una métrica para evaluar los modelos de clasificación. Es la fracción de predicciones que nuestro modelo acertó. Precisión = Cantidad de predicciones correctas / Cantidad total de predicciones

5. Predicción de 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 del conjunto de datos que se categoriza como datos de "PRUEBA".

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 se ve de la siguiente manera:

c719844860ce7c27.png

El resultado del modelo muestra el predicted_score de la película en una escala del 1 al 10 (clasificación). Seguramente te preguntarás por qué hay varias filas de predicción para cada película. Esto se debe a que el modelo devolvió las posibles etiquetas predichas y la probabilidad de ocurrencia de cada una en orden decreciente.

Analiza los resultados predichos y el modelo:

Puedes realizar dos excelentes pasos de análisis con la predicción para comprender los resultados:

  1. Para comprender por qué el modelo genera estos resultados de predicción, puedes usar la función ML.EXPLAIN_PREDICT.
  2. Para saber qué atributos son los más importantes a fin 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 para la IA generativa

Proporcionemos estadísticas sobre el conjunto de datos de películas preguntándole 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 solo con consultas SQL.

  1. La tabla que creamos, movie_score, también será la entrada para este paso.
  2. Se creará una conexión externa para establecer el acceso entre los servicios de BigQuery ML y Vertex.
  3. La construcción GENERATE_TEXT de BigQuery se usará para invocar la API de PaLM de forma remota desde Vertex AI.

7. Crea una conexión externa

Habilita la API de BQ Connection 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:

  1. Haz clic en el botón +AGREGAR en el panel del Explorador de BigQuery (a la izquierda de la consola de BigQuery) y, luego, en "Conexión a fuentes de datos externas" en las fuentes populares que se enumeran.
  2. Selecciona el tipo de conexión como "BigLake and remote functions", 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.

8a87802ab0846a6.png

  1. Una vez que se cree la conexión, anota 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 principal y selecciona el rol "Usuario de Vertex AI".

ff8e1d730879f972.png

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');

Se 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 se habilita en la API de PaLM de Vertex AI para evitar respuestas no deseadas o imprevistas del modelo de lenguaje grande. La respuesta se bloquea si incumple 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 sentencia 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 a la consulta se ve de la siguiente manera:

a3691afc0a97e724.png

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 como verdadero, devuelve un texto plano comprensible extraído de la respuesta JSON.

La respuesta a la consulta se ve de la siguiente manera:

1aaa0c514fccab59.png

11. Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste 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. Consulta la documentación del producto de LLM de Vertex AI para obtener más información sobre los modelos disponibles.