Generative Insights avec BigQuery SQL et Vertex AI

1. Introduction

Dans cet atelier de programmation, nous allons créer une application de prédiction et de prescription de notes de réussite d'un film à l'aide de requêtes SQL BigQuery et de l'API Vertex AI PaLM. Le modèle utilisé pour générer du texte est text-bison. Il est hébergé en tant que fonction distante dans BigQuery.

Voici la liste des services utilisés:

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

Ce que vous allez faire

Vous allez créer

  • Un ensemble de données BigQuery qui contiendra le modèle
  • Un modèle BigQuery ML qui prédit le score de réussite d'un film en fonction des attributs GENRE et RUNTIME de ce film
  • Un modèle BigQuery qui héberge l'API Vertex AI PaLM en tant que fonction distante
  • Une connexion externe pour établir la connexion entre BigQuery et Vertex AI

2. Conditions requises

  • Un navigateur tel que Chrome ou Firefox
  • Un projet Google Cloud avec facturation activée

Avant de commencer

  1. Dans la console Google Cloud, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.
  2. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.
  3. Assurez-vous que toutes les API nécessaires (API BigQuery, API Vertex AI, API BigQuery Connection) sont activées
  4. Vous allez utiliser Cloud Shell, un environnement de ligne de commande qui s'exécute dans Google Cloud et qui est préchargé avec bq. Consultez la documentation pour en savoir plus sur les commandes gcloud et leur utilisation.

Dans la console Cloud, cliquez sur "Activer Cloud Shell" en haut à droite :

51622c00acec2fa.png

Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :

gcloud config set project <YOUR_PROJECT_ID>
  1. Accédez directement à la console BigQuery en saisissant l'URL suivante dans votre navigateur: https://console.cloud.google.com/bigquery.

3. Préparation des données…

Dans ce cas d'utilisation, nous allons utiliser l'ensemble de données "movies" issu de la source movielens.

  1. Créez un ensemble de données:

Un ensemble de données BigQuery est un ensemble de tables. Toutes les tables d'un ensemble de données sont stockées dans le même emplacement de données. Vous pouvez également associer des contrôles d'accès personnalisés pour limiter l'accès à un ensemble de données et à ses tables.

Dans Cloud Shell, utilisez la commande bq mk pour créer un ensemble de données nommé "movie_insights".

bq mk --location=us-central1 movie_insights
  1. Clonez le fichier source sur votre machine Cloud Shell:
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
  1. Accédez au répertoire de projet créé sur votre machine Cloud Shell:
cd movie_score_genai_insights
  1. Utilisez la commande bq load pour charger votre fichier CSV dans une table BigQuery (notez que vous pouvez également importer directement depuis l'interface utilisateur 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. Vous pouvez interroger un exemple pour vérifier si la table "movie_score" et les données ont été créées dans le jeu de données:
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;

4. Des données au ML

Nous allons maintenant créer un modèle de classification pour prédire le taux de réussite du film en fonction des attributs GENRE et RUNTIME. Nous allons utiliser l'instruction CREATE MODEL avec l'option "LOGISTIC_REG". pour créer et entraîner un modèle de régression logistique.

Exécutez la requête ci-dessous dans la section "ÉDITEUR DE REQUÊTES D'Espace de travail SQL" de la console 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';

Détails de la requête:

  1. L'instruction CREATE MODEL entraîne un modèle à l'aide des données d'entraînement de l'instruction SELECT.
  2. La clause OPTIONS spécifie le type de modèle et les options d'entraînement. Ici, l'option LOGISTIC_REG spécifie un type de modèle de régression logistique. Il n'est pas nécessaire de spécifier un modèle de régression logistique binaire plutôt qu'un modèle de régression logistique multiclasse: BigQuery ML peut déterminer quel modèle entraîner en fonction du nombre de valeurs uniques dans la colonne d'étiquette.
  3. data_split_method=‘NO_SPLIT&#39; Force BQML à s'entraîner sur les données en fonction des conditions de la requête (data_cat = "TRAIN"). Notez également qu'il est préférable d'utiliser la valeur "AUTO_SPLIT" dans cette option pour permettre au framework (ou au service, dans ce cas) de randomiser la partition des divisions entraînement/test.
  4. L'option "input_label_cols" spécifie la colonne de l'instruction SELECT à utiliser comme colonne d'étiquette. Ici, la colonne d'étiquette correspond au score. Le modèle détermine donc laquelle des 10 valeurs de score est la plus probable en fonction des autres valeurs présentes dans chaque ligne.
  5. La valeur "auto_class_weights=TRUE" équilibre les étiquettes de classe dans les données d'entraînement. Par défaut, les données d'entraînement ne sont pas pondérées. Si les étiquettes des données d'entraînement sont déséquilibrées, le modèle peut apprendre à prédire en priorité la classe d'étiquettes la plus populaire.
  6. L’instruction SELECT interroge la table que nous avons chargée avec les données csv. La clause WHERE filtre les lignes de la table d'entrée afin que seul l'ensemble de données TRAIN soit sélectionné à cette étape.
  7. Les constructions suivantes sont FACULTATIVEs afin que BigQuery ML puisse les enregistrer explicitement dans le registre de modèles Vertex AI. Pour en savoir plus, consultez ce blog.. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']

Une fois créé, le code ci-dessous apparaît dans la section SCHEMA de l'espace de travail BigQuery SQL:

2e43087f914aa466.png

Après avoir créé votre modèle, évaluez ses performances à l'aide de la fonction ML.EVALUATE. Cette fonction compare les valeurs prédites aux données réelles.

Vous pouvez également afficher les métriques d'évaluation de votre modèle à partir de la page MODÈLE:

7f2dc168bac0ac1a.png

Aperçu des métriques clés:

Précision : quelle proportion d'identifications positives était réellement correcte ? Précision = Vrai positif / Rappel (vrai positif + faux positif) - Quelle proportion de positifs réels a été identifiée correctement ? Rappel = Vrai positif / Précision (Vrai positif + Faux négatif) - Métrique permettant d'évaluer les modèles de classification, c'est la fraction de prédictions que notre modèle a réellement correctes Précision = Nombre de prédictions correctes / Nombre total de prédictions

5. Prédire le score d'un film à l'aide du modèle

C'est l'heure de la prédiction ! La requête suivante prédit le score de chaque film de l'ensemble de données classé dans la catégorie "TEST" données.

Exécutez la requête ci-dessous dans la section "ÉDITEUR DE REQUÊTES D'Espace de travail SQL" de la console BigQuery:

SELECT
  *
FROM
  ML.PREDICT (MODEL movie_insights.model_rating_by_runtime_genre,
    (
    SELECT
      *
    FROM
      movie_insights.movie_score
    WHERE
      data_cat= 'TEST'
     )
  );

Le résultat ressemble à ceci:

c719844860ce7c27.png

Le résultat du modèle affiche le score_prédictif du film sur une échelle de 1 à 10 (classification). Vous devez vous demander pourquoi il y a plusieurs lignes de prédiction pour chaque film. En effet, le modèle a renvoyé les étiquettes prédites possibles et la probabilité d'occurrence de chacune d'elles dans l'ordre décroissant.

Analysez les résultats prédits et le modèle:

Vous pouvez effectuer deux grandes étapes d'analyse avec la prédiction pour comprendre les résultats:

  1. Pour comprendre pourquoi votre modèle génère ces résultats de prédiction, vous pouvez utiliser la fonction ML.EXPLAIN_PREDICT.
  2. Afin d'identifier les caractéristiques les plus importantes pour déterminer la tranche de revenu en général, vous pouvez utiliser la fonction ML.GLOBAL_EXPLAIN.

Pour en savoir plus sur ces étapes, consultez la documentation.

6. Des données à l'IA générative

À présent, fournissons des insights sur l'ensemble de données de films en demandant au LLM (Large Language Model) le résumé des facteurs qui font que le score d'un film doit être supérieur à 5. L'IA générative utilise le modèle text-bison (le plus récent) de Vertex AI, en utilisant uniquement des requêtes SQL.

  1. La table que nous avons créée "movie_score" servira également d'entrée pour cette étape.
  2. Une connexion externe sera créée pour établir l'accès entre les services BigQuery ML et Vertex.
  3. La construction BigQuery GENERATE_TEXT sera utilisée pour appeler l'API PaLM à distance depuis Vertex AI.

7. Créer une connexion externe

Si ce n'est pas déjà fait, activez l'API BQ Connection et notez l'ID du compte de service dans les détails de la configuration de la connexion:

  1. Cliquez sur le bouton "+ AJOUTER" dans le volet "Explorateur BigQuery" (à gauche de la console BigQuery), puis cliquez sur "Connexion à des sources de données externes". dans les sources populaires listées
  2. Sélectionnez "Type de connexion" sur "BigLake et fonctions distantes", indiquez "Région" comme type d'emplacement et la valeur "us-central1 (Iowa)" et "bq_llm_connection" comme ID de connexion

8a87802ab0846a6.png

  1. Une fois la connexion créée, notez le compte de service généré à partir des détails de la configuration de la connexion.

Octroyer des autorisations

Au cours de cette étape, nous allons autoriser le compte de service à accéder au service Vertex AI:

Ouvrez IAM et ajoutez le compte de service que vous avez copié après avoir créé la connexion externe en tant que compte principal, puis sélectionnez "Utilisateur Vertex AI" Rôle

ff8e1d730879f972.png

8. Créer un modèle de ML distant

Créez le modèle distant qui représente un grand modèle de langage Vertex AI hébergé:

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

Elle crée un modèle nommé llm_model dans l'ensemble de données movie_insights, qui exploite l'API CLOUD_AI_LARGE_LANGUAGE_MODEL_V1 de Vertex AI en tant que fonction distante. Cette opération prend quelques secondes.

9. Générer du texte à l'aide du modèle de ML

Une fois le modèle créé, utilisez-le pour générer, résumer ou catégoriser le texte.

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

**Explication:

ml_generate_text_result** est la réponse du modèle de génération de texte au format JSON qui contient à la fois les attributs de contenu et de sécurité: a. "Contenu" représente le résultat textuel généré : b. Les attributs de sécurité représentent le filtre de contenu intégré avec un seuil ajustable activé dans l'API Vertex AI Palm pour éviter toute réponse inattendue ou imprévue du grand modèle de langage. La réponse est bloquée si elle ne respecte pas le seuil de sécurité.

ML.GENERATE_TEXT est la construction que vous utilisez dans BigQuery pour accéder au LLM Vertex AI afin d'effectuer des tâches de génération de texte.

CONCAT ajoute votre instruction PROMPT et l'enregistrement de la base de données

movie_insights est le nom de l'ensemble de données et movie_score le nom de la table qui contient les données que nous utiliserons dans la conception de la requête.

La température est le paramètre d'invite permettant de contrôler le caractère aléatoire de la réponse. Plus la température est faible, mieux c'est en termes de pertinence.

Max_output_tokens correspond au nombre de mots que vous souhaitez inclure dans la réponse.

La réponse à la requête se présente comme suit:

a3691afc0a97e724.png

Comme vous pouvez le voir, la réponse est imbriquée et sans mise en forme.

10. Aplatir le résultat de la requête

Aplatissons le résultat pour ne pas avoir à décoder le JSON explicitement dans la requête:

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

**Explication:

Flatten_json_output** représente la valeur booléenne qui, si elle est définie sur "true", renvoie un texte compréhensible plat extrait de la réponse JSON.

La réponse à la requête se présente comme suit:

1aaa0c514fccab59.png

11. Effectuer un nettoyage

Pour éviter que les ressources utilisées dans cet article soient facturées sur votre compte Google Cloud, vous pouvez supprimer le point de terminaison Vertex AI que vous avez créé lors de l'étape de ML en accédant à la page "Point de terminaison Vertex AI".

12. Félicitations

Félicitations ! Vous avez créé un modèle BigQuery ML et effectué des analyses basées sur un LLM à l'aide d'une API Vertex AI sur votre ensemble de données de films en utilisant uniquement des requêtes SQL. Pour en savoir plus sur les modèles disponibles, consultez la documentation sur les LLM de Vertex AI.