Analyses des données d'étagères : utiliser Gemini pour concevoir une application Cloud Run Java capable de transférer les données BigQuery sur le Web

1. Introduction

Vous êtes passionné de lecture, mais ne savez plus où donner de la tête parmi tous les ouvrages disponibles ? Imaginez une appli optimisée par l'IA qui non seulement vous recommande le livre parfait, mais vous en propose également un résumé concis, selon le genre de votre choix, vous donnant ainsi un aperçu des grandes lignes de l'œuvre. Au cours de cet atelier de programmation, je vous aiderai à concevoir ce type d'application avec BigQuery, Vertex AI et Cloud Run, avec l'aide de Gemini.

Présentation du projet

Notre cas d'utilisation s'articule autour des quatre composants clés suivants :

  • Base de données de livres : le vaste ensemble de données public BigQuery composé de livres archivés sur Internet nous servira de catalogue complet de livres.
  • Moteur de synthèse d'IA : Google Cloud Functions, équipé du modèle de langage Gemini-Pro, générera des résumés pertinents adaptés aux requêtes des utilisateurs.
  • Intégration de BigQuery : la fonction distante de BigQuery appellera la fonction Cloud afin de fournir des thèmes et des résumés de livres à la demande.
  • Interface utilisateur : application Web hébergée sur Cloud Run. Elle proposera une application Web permettant aux utilisateurs d'afficher les résultats.

L'implémentation de ce projet est répartie sur trois ateliers de programmation. Cet atelier correspond à l'atelier de programmation 3 de la liste ci-dessous :

Atelier de programmation 1 : utiliser Gemini pour concevoir une fonction Cloud Java pour une application Gemini.

Atelier de programmation 2 : utiliser Gemini pour concevoir des applications d'IA générative en SQL uniquement avec BigQuery.

Atelier de programmation 3 : utiliser Gemini pour concevoir une application Web Spring Boot Java capable d'interagir avec BigQuery.

2. Utiliser Gemini pour concevoir une application Web Spring Boot avec BigQuery

Objectifs de l'atelier

  • Créer la table et l'ensemble de données BigQuery nécessaires.
  • Application Web Spring Boot Java interagissant avec BigQuery pour extraire les données des livres et les afficher sur le Web.
  • Cette application est déployée sur Cloud Run.
  • Vous implémenterez ces étapes avec l'aide de Gemini.

3. Conditions requises

Créer votre projet

Vous pouvez ignorer les étapes ci-dessous si vous avez déjà activé un compte de facturation et créé un projet à l'aide du lien mentionné à l'étape conditionnelle ci-dessus.

  1. Dans la console Google Cloud, sur la page du sélecteur de 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.

Activer Cloud Shell

  1. Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et fourni avec bq :

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

6757b2fb50ddcc2d.png

  1. Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est déjà défini avec votre ID de projet. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud reconnaît votre projet
gcloud config list project
  1. Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <YOUR_PROJECT_ID>

Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.

4. Activer Gemini et les API nécessaires

Activer Gemini

  1. Accédez à la Marketplace Gemini pour activer l'API. Vous pouvez également exécuter la commande suivante :

gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

  1. Accédez à la page Gemini, puis cliquez sur "Commencer à discuter".

Activer d'autres API nécessaires

Comment faire ? Et si on demandait à Gemini ? Mais avant cela, n'oubliez pas :

Remarque : Les LLM ont un comportement non déterministe. Ainsi, lorsque vous testez ces requêtes, il se peut que la réponse que vous recevez soit différente de celles qui figurent sur ma capture d'écran.

Accédez à la console de discussion Gemini en cliquant sur l'icône "Ouvrir Gemini" en haut à droite, à côté de la barre de recherche dans la console Google Cloud.

26e1491322855614.png

Saisissez cette question dans la section "Saisissez une requête ici" :

How do I enable the BigQuery and Cloud Run apis using gcloud command?

Vous recevez la réponse indiquée dans l'image suivante :

b97a8a9fa9143b3f.png

Copiez-la (vous pouvez utiliser l'icône Copier en haut de l'extrait de commande) et exécutez-la dans le terminal Cloud Shell pour activer les services respectifs :

  • bigquery.googleapis.com
  • run.googleapis.com

5. Explorer l'ensemble de données public BigQuery pour les données de livres

Commencez par vous familiariser avec l'ensemble de données public BigQuery contenant des informations sur de nombreux livres archivés sur Internet. Si vous ne parvenez pas à accéder à l'ensemble de données internetarchivebooks à partir de ce lien, n'hésitez pas à suivre les étapes ci-dessous pour explorer l'ensemble de données ou à consulter la documentation suivante :

Vous trouverez cet ensemble de données public dans le volet "Explorateur" de BigQuery. Il se trouve sur le côté gauche de la page d'accueil de la console BigQuery.

39e2ac03cc99cbac.png

Saisissez "gdelt-bq" ou "internetarchivebooks" dans la barre de recherche, puis cliquez sur RECHERCHER DANS TOUS LES PROJETS. Développez le résultat et ajoutez des livres archivés sur Internet à vos favoris, comme illustré dans l'image ci-dessous :

68dba68a79cddfc9.png.

Développez l'ensemble de données, cliquez sur gdelt-bq.internetarchivebooks, puis prévisualisez les données dans la table 1920. Cette table regroupe les livres archivés en 1920.

Pour examiner le schéma que nous utiliserons dans les sections suivantes, exécutez la requête suivante :

select * from  `gdelt-bq.internetarchivebooks.1920` limit 5;

Au cours de notre atelier de programmation, nous utiliserons les trois champs suivants :

  • BookMeta_Title (titre)
  • Thèmes (séparés par un point-virgule)
  • BookMeta_FullText (texte intégral du livre)

6. Créer le modèle Cloud Run Java de base avec Gemini

Ouvrez l'éditeur Cloud Shell en cliquant sur l'icône Ouvrir l'éditeur en haut à droite de votre terminal Cloud Shell (en général, je préfère ouvrir le terminal et l'éditeur dans des onglets séparés en parallèle afin de pouvoir rédiger du code dans l'un et compiler dans l'autre).

edd258384bc74f1f.png

Une fois l'éditeur ouvert, assurez-vous que le logo Gemini situé en bas à droite de la console de l'éditeur est actif et n'a pas été supprimé. Assurez-vous également que votre projet Google Cloud, situé en bas à gauche, pointe vers le projet actif actuel sur lequel vous souhaitez travailler. S'ils sont inactifs, cliquez dessus, activez-les, puis sélectionnez le projet Google Cloud vers lequel vous souhaitez qu'il pointe et activez-les.

Lorsque ces deux éléments sont actifs, cliquez sur le nom du projet en bas à gauche. La liste pop-up "Cloud Code" s'ouvre : parcourez-la jusqu'à voir apparaître "Nouvelle application".

db998cc557e83f40.png

Dans cette liste, sélectionnez "Application Cloud Run". Dans la liste qui s'affiche, sélectionnez Java :

c7748de85120507b.png

Dans la liste obtenue, remplacez le nom de projet helloworld par "bookshelf-web", puis cliquez sur OK.

7c58c764277c571f.png

Parfait ! Vous avez amorcé votre application Cloud Run Java simple avec Gemini et votre intervention s'est limitée à l'activation des configurations.

Votre projet devrait être structuré de la manière suivante :

e6be37bbee730bd1.png

Pour le moment, vous êtes prêt à déployer l'application, mais nous n'en sommes pas encore là. Nous devons encore inclure la fonctionnalité principale de l'application Web, qui consiste à extraire les données d'analyse de la base de données BigQuery et à les afficher sur le Web.

Pour ce faire, vous êtes libre d'ajouter d'autres requêtes et de développer votre code de manière incrémentielle avec Gemini, ou d'écrire la logique vous-même. Je vais combiner les deux.

7. Ajouter des dépendances pour utiliser BigQuery dans l'application Web

Maintenant que l'application est amorcée, nous pouvons en modifier la source et les propriétés. Commençons par ajouter des dépendances. Demandons conseil à Gemini.

Dans l'éditeur Cloud Code, assurez-vous que Gemini est actif dans la barre d'état en bas à droite et que le projet Google Cloud actif est sélectionné en bas à gauche.

Dans l'éditeur Cloud Code, accédez au fichier pom.xml, situé juste au-dessus de la balise </dependencies>, puis saisissez la requête suivante :

171d1c40ff8124e8.png

<!-- What maven dependency should I include to access BigQuery in the app-->

J'ai obtenu le résultat suivant, illustré dans l'image ci-dessous :

2df51efd655a3557.png

Collez la dépendance ici pour vous simplifier la tâche. Si, dans votre cas, la suggestion contient une balise de version, vous pouvez l'ignorer.

<dependency>
 <groupId>com.google.cloud</groupId>
 <artifactId>google-cloud-bigquery</artifactId>
</dependency>

8. Mettre à jour la source pour récupérer les données d'étagères sur le Web

Remplacez le code HelloWorldController.java par le code suivant :

package cloudcode.helloworld.web;
import java.util.UUID;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;
import com.google.cloud.bigquery.FieldValueList;


@RestController
public final class HelloWorldController {


  /**
   * Create an endpoint for the landing page
   * @return the BigQuery analytics results string to the web
   */


  @GetMapping("/")
  public String helloWorld() throws Exception {
    /* Connect to bigquery and write a select SQL to fetch Title, Theme and Summary fields from the table `bookshelf.bookshelf_theme` if you have executed the codelab 1 of this series, if not just directly use records from gdelt-bq.internetarchivebooks.1920 table */

 
String query = "SELECT  BookMeta_Title || ' (' || Themes || ') ' as summary  from gdelt-bq.internetarchivebooks.1920 limit 10 ";


    BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    QueryJobConfiguration queryConfig =
        QueryJobConfiguration.newBuilder(query)
            .setUseLegacySql(false)
            .build();
    // Create a job ID so that we can safely retry.
    JobId jobId = JobId.of(UUID.randomUUID().toString());
    Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
    // Wait for the query to complete.
    queryJob = queryJob.waitFor();
    // Check for errors
    if (queryJob == null) {
      throw new RuntimeException("Job no longer exists");
    } else if (queryJob.getStatus().getError() != null) {
      throw new RuntimeException(queryJob.getStatus().getError().toString());
    }
    // Get the results.
    TableResult result = queryJob.getQueryResults();
    String responseString = "";
    // Print all pages of the results.
    for (FieldValueList row : result.iterateAll()) {
      responseString += row.get("summary").getStringValue() + ".         \n";
      System.out.printf("%s\n", row.get("summary").getStringValue());
    }
    return responseString;
  }
}

Nous avons apporté les modifications suivantes aux fichiers sources :

  1. Dans HelloWorldController.java, @Controller a été remplacé par @RestController.
  2. Remplacement du contenu de la méthode helloWorld() afin d'inclure l'appel à BigQuery, exécution de la requête chargée d'extraire les données afin de présenter le titre et les thèmes du livre.
  3. Au lieu de renvoyer le modèle d'affichage de l'index au chargement, il est mis à jour pour renvoyer la réponse sous forme de chaîne sur le Web.

Remarque importante : N'oubliez pas de mettre à jour les éléments ci-dessous

  1. Mettez à jour le fichier HelloWorldControllerTests.Java pour mettre en commentaire l'appel mvc.perform(...) en cours.

Explication du code par Gemini

Nous vous avons fourni le code et avons décrit les modifications que nous avons apportées aux fichiers sources, mais vous auriez très bien pu utiliser Gemini pour obtenir des explications et/ou des commentaires sur le code si besoin. Voici quelques exemples d'actions à tester :

  1. Ouvrez le fichier HelloWorldController.java dans l'IDE, puis accédez au panneau Chat de l'IDE et saisissez la requête suivante : Explain this (Expliquer). Consultez l'explication détaillée fournie par Gemini. Vous pouvez l'utiliser à tout moment pour obtenir des explications sur le code.
  2. Vous pouvez mettre en surbrillance un extrait ou une ligne de code spécifique (par exemple, @GetMapping("/")), puis utiliser la requête suivante : Explain this (Expliquer). Vous obtiendrez une explication détaillée uniquement sur la ligne ou l'extrait de code sélectionnés.
  3. Vous pouvez même tester différentes requêtes portant sur le code. Par exemple, vous pouvez sélectionner la ligne de code ci-dessous

BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

et saisir la requête suivante : "What will see if the bigquery variable is null?" (Que se passe-t-il si la variable BigQuery est nulle ?) 4. Vous pouvez aussi demander à Gemini de vous aider à améliorer le code ou à le remanier. Par exemple, vous pouvez sélectionner l'intégralité du code pour la méthode helloWorld() et saisir la requête suivante : "How do I improve or refactor this code?" (Comment améliorer ou refactoriser ce code ?). Consultez les suggestions fournies par Gemini.

9. Compiler et déployer

Accédez au terminal Cloud Shell. Assurez-vous qu'il pointe vers l'ID de votre projet dans le terminal.

4b3392dd050340a3.png

Accédez au répertoire du projet à l'aide de la commande cd :

cd bookshelf-web

Exécutez les commandes ci-dessous une par une pour vous assurer que votre application s'exécute en local.

mvn package

mvn spring-boot:run

Cliquez ensuite sur le bouton "Aperçu sur le Web", puis sur l'option "Prévisualiser sur le port 8080", comme indiqué ci-dessous :

ea9464498b6bd9df.png

Assurez-vous que l'application s'exécute en local sur votre machine Cloud Shell.

Demandons à présent à Gemini comment déployer cette application Web sur Cloud Run. Accédez à la discussion Gemini en cliquant sur le bouton "Ouvrir Gemini" dans la console Google Cloud.

Voici ma requête :

What is the gcloud command to deploy my app to cloud run without having to containerize, only by giving the source file?

Voici la réponse :

6f21c2d59b6dc416.png

Remplaçons les espaces réservés au nom du service et à la région dans la commande gcloud, comme indiqué dans l'extrait ci-dessous :

gcloud run deploy bookshelf-web --source . --allow-unauthenticated --region $REGION

Exécutez cette commande à partir du terminal Cloud Shell. Quelques questions complémentaires devraient s'afficher. Sélectionnez les réponses adaptées. Vous devriez être en mesure de voir le déploiement en cours :

66f5d6e00c16a4db.png

L'opération ne prend que quelques minutes et l'application est déployée sur Google Cloud sans serveur. Cliquez sur l'application Cloud Run déployée et affichez le résultat sur le Web :

fd342d8f16e664ab.png

10. Félicitations

Félicitations ! Nous avons conçu, déployé et testé avec succès une application Web Cloud Run Java permettant d'analyser les données d'étagères à l'aide de Gemini. En guise de tâche complémentaire, demandez à Gemini comment supprimer le service Cloud Run déployé de la console Google Cloud et suivez les étapes qu'il propose pour nettoyer la ressource.