Estadísticas generativas con BigQuery SQL y Vertex AI

1. Introducción

En este codelab, compilaremos una app de predicción y receta para la clasificación de éxito de películas con consultas en SQL de BigQuery y la API PaLM de Vertex AI. El modelo que se usa para generar texto es text-bison y se aloja como una función remota en BigQuery.

La lista de servicios usados 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 AA de BigQuery 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 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 consola de Google Cloud, en la página del selector de proyectos, 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 más 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, 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 su 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. Ingresa la siguiente URL en tu navegador para navegar directamente a la consola de BigQuery: https://console.cloud.google.com/bigquery

3. Prepara datos

En este caso de uso, usaremos el conjunto de datos películas que deriva 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 en 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 nuevo directorio del proyecto que se crea 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 comprobar si la tabla movie_score y los datos se crean 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 según los atributos GENRE y RUNTIME. Usaremos la sentencia 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 del EDITOR de consultas de SQL de Workspace 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 instrucción CREATE MODEL entrena un modelo con los datos de entrenamiento en la instrucció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 multiclase: 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&#39; 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 sentencia SELECT usar como columna de etiqueta. Aquí, la columna de etiquetas es puntaje, por lo que el modelo aprenderá cuál de los 10 valores de calificación es más probable en función de los otros valores presentes en cada fila.
  5. El valor ‘auto_class_weights=TRUE’ balancea 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 están equilibradas, el modelo puede aprender a predecir la clase de etiquetas más popular con mayor precisión.
  6. La instrucción SELECT consulta la tabla que cargamos con los datos csv. La cláusula WHERE filtra las filas en la tabla de entrada para que solo se seleccione el conjunto de datos TRAIN en este paso.
  7. Las siguientes construcciones son OPCIONALES, por lo que BigQuery ML puede registrarlo explícitamente en Vertex AI Model Registry. Obtén más información sobre este tema 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 de ESQUEMA del lugar 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:

8f2dc168bac0ac1a.png

Resumen de las métricas clave:

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ó correctamente? Recuperación = Verdadero positivo / (Verdadero positivo + falso negativo) Exactitud - Es una métrica para evaluar 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 una película con el modelo

¡Hora de predicción! La siguiente consulta predice la puntuación de cada película en el conjunto de datos que se categoriza como “PRUEBA” de datos no estructurados.

Ejecuta la siguiente consulta en la sección del EDITOR de consultas de SQL de Workspace 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 puntaje_predicho de la película en una escala del 1 al 10 (clasificación). Debes estar preguntándote por qué hay varias filas de predicción en cada película. Esto se debe a que el modelo devolvió las posibles etiquetas predichas y la probabilidad de que ocurra cada una en orden descendente.

Analiza los resultados previstos y el modelo:

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

  1. Para comprender por qué tu 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 para 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. De datos a IA generativa

Hagamos una entrega de estadísticas sobre el conjunto de datos de películas pidiéndole al LLM (modelo de lenguaje grande) el resumen de factores que influyen en la puntuación de una película para que sea superior a 5, con la IA generativa que usa el modelo text-bison (más reciente) de Vertex AI usando solo consultas en 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 BigQuery ML y los servicios de 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 que aparece en los detalles de la configuración de la conexión:

  1. Haz clic en el botón +AGREGAR en el panel del Explorador de BigQuery (en el lado izquierdo de la consola de BigQuery) y, luego, en “Conexión a fuentes de datos externas”. en las fuentes populares enumeradas
  2. Selecciona el tipo de conexión como “BigLake and remote functions” y proporciona el tipo de ubicación como “Region”. y su 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, 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 que acceda 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 “Usuario de Vertex AI”. Rol

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

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 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 incluye atributos de contenido y de seguridad: a. El contenido 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 Vertex AI Palm para evitar respuestas no deseadas o imprevistas del modelo grande de lenguaje. 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 para realizar tareas de generación de texto

CONCAT adjunta 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.

La temperatura es el parámetro del mensaje que controla la aleatorización de la respuesta; cuanto menor, mejor en términos de relevancia.

Max_output_tokens es la cantidad de palabras que deseas como respuesta.

La respuesta de la consulta luce de la siguiente manera:

a3691afc0a97e724.png

Como puedes ver, la respuesta está anidada y no tiene formato.

10. Compacta el resultado de la consulta

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

La respuesta de la consulta luce 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 navegando a la página Extremo de Vertex AI.

12. ¡Felicitaciones!

¡Felicitaciones! Creaste correctamente un modelo BQML y realizaste análisis basados en LLM usando una API de Vertex AI en tu conjunto de datos de películas solo con consultas en SQL. Consulta la documentación del producto Vertex AI LLM para obtener más información sobre los modelos disponibles.