1. Introduction
Dans cet atelier de programmation, nous allons créer une application de prédiction et de recommandation de films à succès à l'aide de requêtes BigQuery SQL et de l'API Vertex AI PaLM. Le modèle utilisé pour effectuer la génération de texte est text-bison. Il est hébergé en tant que fonction distante dans BigQuery.
Voici la liste des services utilisés :
- BigQuery ML
- API Vertex AI PaLM
- Cloud Shell
Objectifs de l'atelier
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 succès d'un film en fonction de ses attributs GENRE et RUNTIME ;
- 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
Avant de commencer
- Dans la console Google Cloud, sur la page du sélecteur de projet, sélectionnez ou créez un projet Google Cloud.
- Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier si la facturation est activée pour un projet.
- Assurez-vous que toutes les API nécessaires (API BigQuery, API Vertex AI, API BigQuery Connection) sont activées
- Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et fourni avec bq. Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.
Dans la console Cloud, cliquez sur "Activer Cloud Shell" en haut à droite :

Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <YOUR_PROJECT_ID>
- 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 dérivé de la source movielens.
- Créez un ensemble de données :
Un ensemble de données BigQuery est une collection de tables. Toutes les tables d'un ensemble de données sont stockées au même emplacement de données location. 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 appelé "movie_insights".
bq mk --location=us-central1 movie_insights
- Clonez le fichier source sur votre machine Cloud Shell :
git clone https://github.com/AbiramiSukumaran/movie_score_genai_insights
- Accédez au nouveau répertoire de projet créé sur votre machine Cloud Shell :
cd movie_score_genai_insights
- Utilisez la commande bq load pour charger votre fichier CSV dans une table BigQuery (notez que vous pouvez également effectuer l'importation directement depuis l'interface utilisateur 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
- Vous pouvez interroger un échantillon pour vérifier si la table movie_score et les données sont créées dans l'ensemble de données :
bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movie_insights.movie_score limit 3;
4. Données vers ML
Créons un modèle de classification pour prédire le score de succès 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ÊTE de l'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 :
- L'instruction CREATE MODEL entraîne un modèle à l'aide des données d'entraînement de l'instruction SELECT.
- 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 s'il s'agit d'un modèle de régression logistique binaire ou d'un modèle de régression logistique à classes multiples. En effet, BigQuery ML peut déterminer lequel entraîner en fonction du nombre de valeurs uniques de la colonne d'étiquette.
- data_split_method="NO_SPLIT" force BQML à effectuer l'entraînement 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 "AUTO_SPLIT" dans cette option pour permettre au framework (ou au service dans ce cas) d'aléatoriser la partition des divisions d'entraînement/de test.
- L'option input_label_cols spécifie la colonne de l'instruction SELECT à utiliser comme colonne d'étiquette. Ici, la colonne d'étiquette est 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.
- L'option "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.
- 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.
- Les constructions suivantes sont FACULTATIVES. BigQuery ML peut donc les enregistrer explicitement dans le registre de modèles Vertex AI. Pour en savoir plus, consultez cet article de blog
. model_registry='vertex_ai', vertex_ai_model_version_aliases=['logistic_reg', 'experimental']
Une fois créé, le code ci-dessous s'affiche dans la section SCHÉMA de l'espace de travail SQL BigQuery :

Après avoir créé le modèle, vous allez évaluer 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 sur la page MODÈLE :

Principales métriques en un coup d'œil :
Précision : quelle proportion d'identifications positives était effectivement correcte ? Précision = Vrai positif / (Vrai positif + Faux positif) Rappel : quelle proportion de résultats positifs réels a été identifiée correctement ? Rappel = Vrai positif / (Vrai positif + Faux négatif) Justesse : métrique d'évaluation des modèles de classification, il s'agit de la fraction des prédictions que notre modèle a réellement obtenues. Justesse = Nombre de prédictions correctes / Nombre total de prédictions
5. Prédiction du score d'un film à l'aide du modèle
Passons aux prédictions ! La requête suivante prédit le score de chaque film de l'ensemble de données classé comme données "TEST".
Exécutez la requête ci-dessous dans la section ÉDITEUR DE REQUÊTE de l'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 est semblable à ce qui suit :

Le résultat du modèle affiche le predicted_score du film sur une échelle de 1 à 10 (classification). Vous vous demandez peut-être pourquoi il existe 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 par ordre décroissant.
Analyser les résultats prédits et le modèle :
Vous pouvez effectuer deux étapes d'analyse importantes avec la prédiction pour comprendre les résultats :
- Pour comprendre pourquoi votre modèle génère ces résultats de prédiction, vous pouvez utiliser la fonction ML.EXPLAIN_PREDICT.
- 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. Données vers IA générative
Fournissons des insights sur l'ensemble de données movies en demandant au LLM (grand modèle de langage) le résumé des facteurs qui influencent le score du film à être supérieur à 5, avec l'IA générative à l'aide du modèle text-bison (le plus récent) de Vertex AI en utilisant uniquement des requêtes SQL.
- La table movie_score que nous avons créée sera également l'entrée de cette étape.
- Une connexion externe sera créée pour établir l'accès entre BigQuery ML et les services Vertex.
- La construction GENERATE_TEXT de BigQuery sera utilisée pour appeler l'API PaLM à distance depuis Vertex AI.
7. Créer une connexion externe
Activez l'API BQ Connection si ce n'est pas déjà fait et notez l'ID du compte de service à partir des détails de configuration de la connexion :
- Cliquez sur le bouton +AJOUTER dans le volet Explorateur BigQuery (à gauche de la console BigQuery), puis sur "Connexion à des sources de données externes" dans les sources populaires listées.
- Sélectionnez "BigLake et fonctions distantes" comme type de connexion, "Région" comme type d'emplacement et "us-central1 (Iowa)" comme valeur, puis "bq_llm_connection" comme ID de connexion.

- Une fois la connexion créée, notez le compte de service généré à partir des détails de configuration de la connexion.
Octroyer des autorisations
À cette étape, nous allons accorder des autorisations au compte de service pour accéder au service Vertex AI :
Ouvrez IAM, ajoutez le compte de service que vous avez copié après avoir créé la connexion externe en tant que principal, puis sélectionnez le rôle "Utilisateur Vertex AI".

8. Créer un modèle 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');
Il 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 ML
Une fois le modèle créé, utilisez-le pour générer, résumer ou catégoriser du 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 des attributs de contenu et de sécurité : a. Le contenu représente le résultat de texte généré. b. Les attributs de sécurité représentent le filtre de contenu intégré avec un seuil réglable qui est activé dans l'API Vertex AI Palm pour éviter toute réponse involontaire ou imprévue du grand modèle de langage. La réponse est bloquée si elle dépasse 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 est le nom de la table contenant les données que nous allons utiliser dans la conception de l'invite.
Température est le paramètre d'invite permettant de contrôler le caractère aléatoire de la réponse. Plus il est faible, mieux c'est en termes de pertinence.
Max_output_tokens correspond au nombre de mots que vous souhaitez dans la réponse.
La réponse à la requête se présente comme suit :

Comme vous pouvez le voir, la réponse est imbriquée et non formatée.
10. Aplatir le résultat de la requête
Aplatissons le résultat afin de ne pas avoir à décoder explicitement le JSON 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 plat compréhensible extrait de la réponse JSON.
La réponse à la requête se présente comme suit :

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 ML en accédant à la page Point de terminaison Vertex AI.
12. Félicitations
Félicitations ! Vous avez créé un modèle BQML et effectué une analyse basée sur LLM à l'aide d'une API Vertex AI sur votre ensemble de données movies en utilisant uniquement des requêtes SQL. Consultez la documentation produit sur le LLM Vertex AI pour en savoir plus sur les modèles disponibles.