Générer du texte à l'aide d'un modèle Gemini et de la fonction ML.GENERATE_TEXT

Ce tutoriel explique comment créer un modèle distant basé sur le modèle gemini-2.0-flash et comment utiliser ce modèle avec la fonction ML.GENERATE_TEXT pour extraire des mots clés et effectuer une analyse des sentiments sur les avis de films à partir de la table publique bigquery-public-data.imdb.reviews.

Rôles requis

Pour exécuter ce tutoriel, vous devez disposer des rôles IAM (Identity and Access Management) suivants :

  • Créer et utiliser des ensembles de données, des connexions et des modèles BigQuery : administrateur BigQuery (roles/bigquery.admin).
  • Accordez des autorisations au compte de service de la connexion : Administrateur IAM du projet (roles/resourcemanager.projectIamAdmin).

Ces rôles prédéfinis contiennent les autorisations requises pour effectuer les tâches décrites dans ce document. Pour afficher les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

  • Créez un ensemble de données : bigquery.datasets.create
  • Créer, déléguer et utiliser une connexion : bigquery.connections.*
  • Définissez la connexion par défaut : bigquery.config.*
  • Définissez les autorisations du compte de service : resourcemanager.projects.getIamPolicy et resourcemanager.projects.setIamPolicy.
  • Créez un modèle et exécutez l'inférence :
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.

Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Pour en savoir plus sur les tarifs de BigQuery, consultez la page Tarifs de BigQuery dans la documentation BigQuery.

Pour en savoir plus sur les tarifs de Vertex AI, consultez la page Tarifs de Vertex AI.

Avant de commencer

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

Créer un ensemble de données

Créez un ensemble de données BigQuery pour stocker votre modèle de ML.

Console

  1. Dans la console Google Cloud , accédez à la page BigQuery.

    Accéder à la page "BigQuery"

  2. Dans le volet Explorateur, cliquez sur le nom de votre projet.

  3. Cliquez sur Afficher les actions > Créer un ensemble de données.

    Option de menu "Créer un ensemble de données".

  4. Sur la page Créer un ensemble de données, procédez comme suit :

    • Dans le champ ID de l'ensemble de données, saisissez bqml_tutorial.

    • Pour Type d'emplacement, sélectionnez Multirégional, puis sélectionnez US (plusieurs régions aux États-Unis).

    • Conservez les autres paramètres par défaut, puis cliquez sur Créer un ensemble de données.

bq

Pour créer un ensemble de données, exécutez la commande bq mk en spécifiant l'option --location. Pour obtenir la liste complète des paramètres possibles, consultez la documentation de référence sur la commande bq mk --dataset.

  1. Créez un ensemble de données nommé bqml_tutorial avec l'emplacement des données défini sur US et une description de BigQuery ML tutorial dataset :

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    Au lieu d'utiliser l'option --dataset, la commande utilise le raccourci -d. Si vous omettez -d et --dataset, la commande crée un ensemble de données par défaut.

  2. Vérifiez que l'ensemble de données a été créé :

    bq ls

API

Appelez la méthode datasets.insert avec une ressource d'ensemble de données définie.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

BigQuery DataFrames

Avant d'essayer cet exemple, suivez les instructions de configuration pour BigQuery DataFrames du guide de démarrage rapide de BigQuery DataFrames. Pour en savoir plus, consultez la documentation de référence sur BigQuery DataFrames.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer les ADC pour un environnement de développement local.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Créer le modèle distant

Créez un modèle distant représentant un modèle Vertex AI hébergé :

  1. Dans la console Google Cloud , accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction suivante :

CREATE OR REPLACE MODEL `bqml_tutorial.gemini_model`
  REMOTE WITH CONNECTION DEFAULT
  OPTIONS (ENDPOINT = 'gemini-2.0-flash');

L'exécution de la requête prend plusieurs secondes, après quoi le modèle gemini_model apparaît dans l'ensemble de données bqml_tutorial dans le volet Explorateur. Étant donné que la requête utilise une instruction CREATE MODEL pour créer un modèle, il n'y a aucun résultat de requête.

Effectuer une extraction de mots clés

Effectuez une extraction de mots clés sur des avis de films IMDB à l'aide du modèle distant et de la fonction ML.GENERATE_TEXT :

  1. Dans la console Google Cloud , accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante pour effectuer l'extraction de mots clés sur cinq avis de films :

    SELECT
      ml_generate_text_result['candidates'][0]['content'] AS generated_text,
      * EXCEPT (ml_generate_text_result)
    FROM
      ML.GENERATE_TEXT(
        MODEL `bqml_tutorial.gemini_model`,
        (
          SELECT
            CONCAT('Extract the key words from the text below: ', review) AS prompt,
            *
          FROM
            `bigquery-public-data.imdb.reviews`
          LIMIT 5
        ),
        STRUCT(
          0.2 AS temperature,
          100 AS max_output_tokens));

    Le résultat ressemble à ce qui suit, les colonnes non générées étant omises pour plus de clarté :

    +----------------------------------------+-------------------------+----------------------------+-----+
    | generated_text                         | ml_generate_text_status | prompt                     | ... |
    +----------------------------------------+-------------------------+----------------------------+-----+
    | {"parts":[{"text":"## Key words:\n\n*  |                         | Extract the key words from |     |
    | **Negative sentiment:** \"terribly     |                         | the text below: I had to   |     |
    | bad acting\", \"dumb story\", \"not    |                         | see this on the British    |     |
    | even a kid would enjoy this\",         |                         | Airways plane. It was      |     |
    | \"something to switch off\"\n*         |                         | terribly bad acting and    |     |
    | **Context:** \"British Airways plane\" |                         | a dumb story. Not even     |     |
    | \n* **Genre:** \"movie\" (implied)...  |                         | a kid would enjoy this...  |     |
    +----------------------------------------+-------------------------+----------------------------+-----+
    | {"parts":[{"text":"## Key words:\n\n*  |                         | Extract the key words from |     |
    | **Movie:** The Real Howard Spitz\n*    |                         | the text below: This is    |     |
    | **Genre:** Family movie\n*             |                         | a family movie that was    |     |
    | **Broadcast:** ITV station, 1.00 am\n* |                         | broadcast on my local      |     |
    | **Director:** Vadim Jean\n*            |                         | ITV station at 1.00 am a   |     |
    | **Main character:** Howard Spitz,      |                         | couple of nights ago.      |     |
    | a children's author who hates...       |                         | This might be a strange... |     |
    +----------------------------------------+-------------------------+----------------------------+-----+
    

    Les résultats incluent les colonnes suivantes :

    • generated_text : texte généré.
    • ml_generate_text_status : état de réponse d'API pour la ligne correspondante. Si l'opération a abouti, cette valeur est vide.
    • prompt : requête utilisée pour l'analyse des sentiments.
    • Toutes les colonnes de la table bigquery-public-data.imdb.reviews.
  3. Facultatif : Au lieu d'analyser manuellement le fichier JSON renvoyé par la fonction comme vous l'avez fait à l'étape précédente, utilisez l'argument flatten_json_output pour renvoyer le texte généré et les attributs de sécurité dans des colonnes distinctes.

    Dans l'éditeur de requête, exécutez l'instruction suivante :

    SELECT
      *
    FROM
      ML.GENERATE_TEXT(
        MODEL `bqml_tutorial.gemini_model`,
        (
          SELECT
            CONCAT('Extract the key words from the text below: ', review) AS prompt,
            *
          FROM
            `bigquery-public-data.imdb.reviews`
          LIMIT 5
        ),
        STRUCT(
          0.2 AS temperature,
          100 AS max_output_tokens,
          TRUE AS flatten_json_output));

    Le résultat ressemble à ce qui suit, les colonnes non générées étant omises pour plus de clarté :

    +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
    | ml_generate_text_llm_result            | ml_generate_text_rai_result                  | ml_generate_text_status | prompt                     | ... |
    +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
    | ## Keywords:                           |                                              |                         | Extract the key words from |     |
    |                                        |                                              |                         | the text below: I had to   |     |
    | * **Negative sentiment:**              |                                              |                         | see this on the British    |     |
    | "terribly bad acting", "dumb           |                                              |                         | Airways plane. It was      |     |
    | story", "not even a kid would          |                                              |                         | terribly bad acting and    |     |
    | enjoy this", "switch off"              |                                              |                         | a dumb story. Not even     |     |
    | * **Context:** "British                |                                              |                         | a kid would enjoy this...  |     |
    +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
    | ## Key words:                          |                                              |                         | Extract the key words from |     |
    |                                        |                                              |                         | the text below: This is    |     |
    | * **Movie:** The Real Howard Spitz     |                                              |                         | a family movie that was    |     |
    | * **Genre:** Family movie              |                                              |                         | broadcast on my local      |     |
    | * **Broadcast:** ITV, 1.00             |                                              |                         | ITV station at 1.00 am a   |     |
    | am                                     |                                              |                         | couple of nights ago.      |     |
    | - ...                                  |                                              |                         | This might be a strange... |     |
    +----------------------------------------+----------------------------------------------+-------------------------+----------------------------+-----+
    

    Les résultats incluent les colonnes suivantes :

    • ml_generate_text_llm_result : texte généré.
    • ml_generate_text_rai_result : attributs de sécurité et informations indiquant si le contenu est bloqué en raison de l'une des catégories bloquantes. Pour en savoir plus sur les attributs de sécurité, consultez Configurer des filtres de sécurité.
    • ml_generate_text_status : état de réponse d'API pour la ligne correspondante. Si l'opération a abouti, cette valeur est vide.
    • prompt : requête utilisée pour l'extraction de mots clés.
    • Toutes les colonnes de la table bigquery-public-data.imdb.reviews.

Effectuer une analyse des sentiments

Effectuez une analyse des sentiments sur des avis de films IMDB à l'aide du modèle distant et de la fonction ML.GENERATE_TEXT :

  1. Dans la console Google Cloud , accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, exécutez l'instruction suivante pour effectuer une analyse des sentiments sur cinq avis de films :

    SELECT
      ml_generate_text_result['candidates'][0]['content'] AS generated_text,
      * EXCEPT (ml_generate_text_result)
    FROM
      ML.GENERATE_TEXT(
        MODEL `bqml_tutorial.gemini_model`,
        (
          SELECT
            CONCAT(
              'perform sentiment analysis on the following text, return one the following categories: positive, negative: ',
              review) AS prompt,
            *
          FROM
            `bigquery-public-data.imdb.reviews`
          LIMIT 5
        ),
        STRUCT(
          0.2 AS temperature,
          100 AS max_output_tokens));

    Le résultat ressemble à ce qui suit, les colonnes non générées étant omises pour plus de clarté :

    +--------------------------------------------+-------------------------+----------------------------+-----+
    | generated_text                             | ml_generate_text_status | prompt                     | ... |
    +--------------------------------------------+-------------------------+----------------------------+-----+
    | {"parts":[{"text":"## Sentiment Analysis:  |                         | perform sentiment analysis |     |
    | Negative \n\nThis text expresses a         |                         | on the following text,     |     |
    | strongly negative sentiment towards the    |                         | return one the following   |     |
    | movie. Here's why:\n\n* **Negative         |                         | negative: I  had to see    |     |
    | like \"terribly,\" \"dumb,\" and           |                         | this on the British        |     |
    | \"not even\" to describe the acting...     |                         | Airways plane. It was...   |     |
    +--------------------------------------------+-------------------------+----------------------------+-----+
    | {"parts":[{"text":"## Sentiment Analysis:  |                         | perform sentiment analysis |     |
    | Negative \n\nThis review expresses a       |                         | on the following text,     |     |
    | predominantly negative sentiment towards   |                         | return one the following   |     |
    | the movie \"The Real Howard Spitz.\"       |                         | categories: positive,      |     |
    | Here's why:\n\n* **Criticism of the film's |                         | negative: This is a family |     |
    | premise:** The reviewer finds it strange   |                         | movie that was broadcast   |     |
    | that a film about a children's author...   |                         | on my local ITV station... |     |
    +--------------------------------------------+-------------------------+----------------------------+-----+
    

    Les résultats incluent les mêmes colonnes que celles décrites dans la section Effectuer une extraction de mots clés.

Effectuer un nettoyage

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.