Bookshelf Analytics: utiliser Gemini pour créer des applications SQL avec BigQuery et l'IA générative

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 vais vous aider à créer une telle application avec BigQuery, Gemini et Cloud Functions, 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 1.0 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.

Nous allons diviser l'implémentation en trois ateliers de programmation:

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

Atelier de programmation 2:Utiliser Gemini pour créer des applications SQL avec BigQuery et l'IA générative.

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

2. Utiliser Gemini pour créer des applications SQL avec BigQuery et l'IA générative

Ce que vous allez faire

Vous allez créer un

  • Modèle distant dans BigQuery qui appelle le point de terminaison text-bison-32k de Vertex AI pour identifier le genre (ou le thème) du livre à partir d'une liste de mots clés séparés par "" dans la table.
  • Fonction distante dans BigQuery qui appellera à distance la fonction Cloud d'IA générative déployée.
  • Utilisez le modèle et la fonction distants pour résumer le thème et le texte d'un livre à l'aide de requêtes SQL, puis écrivez les résultats dans une nouvelle table du jeu de données "bibliothèque".
  • 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 connaî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 pour Google Cloud et les API nécessaires

Activer Gemini

  1. Accédez à la Marketplace Gemini pour Google Cloud 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.

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

Comment activer les API BigQuery et Vertex AI à l'aide de la commande gcloud ?

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

19c3fd78530794d9.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
  • aiplatform.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.

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éez un ensemble de données BigQuery nommé "bookshelf".

Nous voulons créer un ensemble de données sous le projet pour stocker tous les objets de base de données et d'analyse créés dans cet atelier. Demandons à Gemini comment créer un ensemble de données BigQuery. Votre discussion Gemini doit déjà être ouverte dans un autre onglet de votre navigateur depuis l'étape d'activation des API. Si ce n'est pas le cas, vous pouvez le faire dès maintenant. Accédez à la console Google Cloud à l'adresse https://console.cloud.google.com. L'icône Gemini devrait s'afficher juste à côté de la barre de recherche en haut. Cliquez dessus pour ouvrir le chat.

26e1491322855614.png

Saisissez la requête comme indiqué ci-dessous.

Voici ma requête:

How to create a BigQuery dataset?

Voici la réponse:

f7a989cc9a01009.png

Suivez les étapes décrites dans la réponse pour créer un ensemble de données nommé "bookshelf" dans votre projet actif.

Pour créer un ensemble de données BigQuery, procédez comme suit:

  1. Accédez à la page "BigQuery" de la console Google Cloud.
  2. Dans le panneau "Explorer", cliquez sur l'ID de votre projet.
  3. Cliquez sur "Créer un ensemble de données" (l'option devrait figurer dans les options affichées lorsque vous cliquez sur les trois points à côté de l'ID de votre projet).
  4. Nommez l'ensemble de données "bookshelf".
  5. Définissez l'emplacement sur "États-Unis(multirégional)".
  6. Pour les étapes 3, 4, 5 et 6 de la réponse, laissez les options par défaut.
  7. Cliquez sur "CRÉER UN ENSEMBLE DE DONNÉES".

Votre ensemble de données est créé et apparaît dans le panneau "Explorer". L'ensemble de données "étagère" se présente comme suit:

7. Créer un modèle distant pour appeler le LLM Vertex AI (text-bison-32k)

Nous devons ensuite créer dans BigQuery un modèle qui appelle le modèle Vertex AI "text-bison-32k". Le modèle vous aidera à identifier un thème commun, le contexte du livre, à partir de la liste des mots clés de chaque livre de l'ensemble de données.

Posons cette question à Gemini. Pour ce faire, accédez à l'onglet dans lequel la console de chat Gemini est ouverte et saisissez la requête ci-dessous:

Comment allez-vous connecter BigQuery et Vertex AI pour appeler le point de terminaison LLM (text-bison-32k) dans BigQuery ?

La réponse se présente comme suit :

41904e30ce92b436.png

La réponse inclut des informations précises, telles que les étapes à suivre pour utiliser l'instruction CREATE MODEL, la connexion BigQuery et la définition du point de terminaison. L'instruction de requête est exacte pour moi, mais cela ne signifie pas que vous recevrez exactement la même sortie. Étant donné qu'il s'agit d'un grand modèle de langage, vous pouvez obtenir des réponses de différents formats, volumes et profondeurs. Si vous ne voyez pas toutes les informations que j'ai reçues, n'hésitez pas à poser des questions complémentaires dans le chat. Par exemple: donnez plus de détails sur la création de la ressource de connexion, expliquez pourquoi l'attribut de connexion est manquant ou indiquez comment connecter BigQuery à Vertex AI, etc.

Voici un exemple d'invite de suivi (utilisez-la uniquement si vous avez besoin d'un suivi. Si la première réponse que vous avez reçue est suffisante, poursuivez avec celle-ci):

What about the connection? How will I connect from BigQuery to Vertex AI?

Voici la réponse :

2ed9b3ed96b11bc9.png

Suivez les étapes de la réponse pour créer une connexion BigQuery:

  1. Accédez à la console BigQuery.
  2. Dans le volet "Explorateur BigQuery", cliquez sur le bouton "+ AJOUTER", puis sur "Connexions à des sources de données externes".
  3. À ce stade, vous serez invité à activer l'API BigQuery Connection. Cliquez sur ENABLE API (ACTIVER L'API) :

ded96126495ffe9.png

  1. Cliquez sur "Connexions à des sources de données externes". La diapositive "Source de données externe" s'affiche, comme ci-dessous. Dans la liste des sources externes, sélectionnez la source "Vertex AI".

434cdbbb3a9436f2.png

  1. Saisissez un ID de connexion (il peut s'agir de l'ID de votre choix, mais pour l'instant, définissez-le sur bq-vx) et la région (multirégion "États-Unis").
  2. Cliquez sur "Créer une connexion".

d3a2aeebc3ecdfae.png

  1. Après avoir créé la connexion, cliquez sur "Accéder à la connexion".
  2. Sur la page d'informations de connexion, copiez l'ID du compte de service, car nous l'utiliserons dans les étapes suivantes.
  3. Maintenant que la connexion est créée, attribuons des autorisations à cet ID de compte de service que nous avons copié pour pouvoir utiliser Vertex AI.
  4. Sur la page Google Cloud Console, ouvrez Google Cloud IAM ou accédez au lien.
  5. Cliquez sur Accorder l'accès dans la section Afficher par compte principal.

5317eed5da0bb8c5.png

  1. Dans la boîte de dialogue "Accorder l'accès", saisissez l'ID du compte de service que nous avons noté précédemment dans la zone de texte "Nouveaux principes".
  2. Définissez le rôle sur "Utilisateur Vertex AI".

f213db33d220aa5f.png

La connexion requise est créée. L'autorisation nécessaire est accordée au compte principal (compte de service de la connexion) pour qu'il puisse utiliser Vertex AI à partir de BigQuery.

Exécutez l'instruction LDD(langage de définition de données) suivante, qui représente la création d'un objet de base de données, dans ce cas, MODEL dans l'éditeur de requête BigQuery.

CREATE OR REPLACE MODEL bookshelf.llm_model
  REMOTE WITH CONNECTION `us.bq-vx`
  OPTIONS (ENDPOINT = 'text-bison-32k');

Vous pouvez essayer une autre méthode que l'étape ci-dessus. Demandez à Gemini de suggérer une requête pour créer le modèle d'appel du modèle "text-bison-32k".

Remarque:Si vous avez attribué un autre nom à votre connexion, remplacez us.bq-vx par ce nom dans l'instruction DDL précédente. Cette requête crée le modèle distant dans l'ensemble de données "bibliothèque" que nous avons créé précédemment.

8. Créer une fonction distante qui appelle la fonction Cloud Java

Nous allons maintenant créer une fonction distante dans BigQuery à l'aide de la fonction Cloud Java que nous avons créée dans l'atelier de programmation 1 de cette série pour implémenter le modèle Gemini. Cette fonction distante servira à résumer le contenu du livre.

Remarque:Si vous n'avez pas suivi cet atelier de programmation ou si vous n'avez pas déployé cette fonction Cloud, vous pouvez ignorer cette étape et passer à la suivante (Récapituler le thème des livres à l'aide du modèle distant).

Accédez à la console BigQuery et collez l'instruction LDD suivante dans l'éditeur de requête (vous pouvez créer un nouvel onglet de l'éditeur de requête en cliquant sur le bouton +).

a54c0b0014666cac.png

Vous trouverez ci-dessous le LDD que vous pouvez copier. N'oubliez pas de remplacer le point de terminaison par le point de terminaison de la fonction Cloud déployé (créé à partir de l'atelier de programmation 1). Si vous ne disposez pas d'un point de terminaison, vous pouvez remplacer les caractères masqués dans le DDL ci-dessous par "abis-345004" à des fins de démonstration.

CREATE OR REPLACE FUNCTION
  `bookshelf.GEMINI_REMOTE_CALL` (context STRING) RETURNS STRING
  REMOTE WITH CONNECTION `us.bq-vx`
  OPTIONS (
    endpoint = 'https://us-central1-****-******.cloudfunctions.net/remote-gemini-call'  );

Accédez à la console BigQuery sur Google Cloud Platform et ouvrez un nouvel onglet de l'éditeur de requêtes. Dans l'éditeur de requête BigQuery, collez l'instruction LDD ci-dessus. La réponse suivante s'affiche après l'exécution de la requête:

a023d5691acf6f.png

Maintenant que le modèle et la fonction sont créés, testons ces deux objets BigQuery en les exécutant dans une requête SELECT.

9. Synthétiser des thèmes à l'aide du modèle distant

Utilisons le modèle distant que nous avons créé "bookshelf.llm_model" pour générer un mot clé consolidé pour le livre à partir de la liste de thèmes donnée:

SELECT * FROM ML.GENERATE_TEXT(MODEL `bookshelf.llm_model`,
(
SELECT
     CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` LIMIT 1
));

Étape facultative: Le résultat du champ de résultats généré par le LLM est imbriqué. Ajoutons des paramètres LLM et l'attribut "flatten_json_output" à la requête. L'utilisation de l'attribut "flatten_json_output" permet de supprimer la structure imbriquée du champ de résultats généré par le LLM.

SELECT * FROM ML.GENERATE_TEXT ( MODEL `bookshelf.llm_model`, (
 SELECT CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt FROM `gdelt-bq.internetarchivebooks.1920` limit 1),
    STRUCT( 0.2 AS temperature, 100 AS max_output_tokens, TRUE AS flatten_json_output));

Exécutez maintenant la requête SELECT dans l'éditeur BigQuery et vérifiez le résultat. Nous avons limité le résultat de la requête à 1 pour les tests. Le résultat s'affiche comme suit:

9b0d33eca61a73d2.png

10. Résumer le texte intégral de livres à l'aide de la fonction distante

Nous allons maintenant essayer de résumer le livre en exécutant la fonction Cloud étagère.GEMINI_REMOTE_CALL que nous avons créée précédemment.

Remarque:Si vous avez ignoré la création de la FUNCTION à distance (sujet précédent de cet atelier de programmation), n'oubliez pas d'ignorer l'appel de la fonction bookshelf.GEMINI_REMOTE_CALL dans la requête SELECT.

Utilisez la requête SELECT qui appelle la fonction distante (GEMINI_REMOTE_CALL) que nous avons créée précédemment. L'appel de cette fonction, GEMINI_REMOTE_CALL, inclut une requête demandant un résumé du texte du livre:

select BookMeta_Title, `bookshelf.GEMINI_REMOTE_CALL` (
  CONCAT('This is about a book. The title of the book is this: ', BookMeta_Title,  ' . The theme of the book is as follows: ', Themes, 'The following text contains an excerpt from the book. Summarize it in less than 5 lines to create the gist. If you do not have a summary, use the title and themes to make up a short summary. DO NOT RETURN EMPTY RESPONSE. ', SUBSTR(BookMeta_FullText, 5000, 10000))) Summary 
  from `gdelt-bq.internetarchivebooks.1920` where Themes like '%EDUCATION%' limit 1;

Notez que nous avons utilisé une sous-chaîne du texte complet du livre pour générer le résumé.

Le résultat de la requête se présente comme suit:

658bb0a9c9cf0938.png

11. Stocker les données des livres dans une table

Maintenant que nous avons testé les appels de LLM (modèle et fonction distants) à partir de BigQuery uniquement à l'aide de requêtes SQL, créons une table BigQuery pour stocker les données de la "bibliothèque" avec des insights sur les thèmes, dans le même ensemble de données que le modèle et la fonction distants.

Nous pourrions inclure à la fois l'appel du modèle LLM et l'appel de fonction à distance à cette étape. Toutefois, comme nous avons marqué l'appel de fonction à distance (qui appelle la fonction Cloud) comme une étape facultative, nous n'utiliserons que les insights du modèle distant.

Voici la requête que nous allons utiliser:

SELECT
  BookMeta_Title, Themes, ml_generate_text_llm_result Context 
   FROM
  ML.GENERATE_TEXT (
    MODEL `bookshelf.llm_model`,
    (
 SELECT
      BookMeta_Title,
      Themes,BookMeta_FullText,
      CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens,
      TRUE AS flatten_json_output));

Lorsque vous exécutez la requête dans l'éditeur BigQuery, le résultat est le suivant:

2c6e08e75a680867.png

Demandons à présent à Gemini de créer une table nommée "bookshelf.books" à partir de la requête ci-dessus. Accédez à la console de chat Gemini dans la console Google Cloud, puis saisissez la requête suivante.

Voici la requête que nous allons utiliser:

Create a BigQuery table named bookshelf.books from this SELECT query: 
SELECT
  BookMeta_Title, Themes, ml_generate_text_llm_result Context 
   FROM
  ML.GENERATE_TEXT (
    MODEL `bookshelf.llm_model`,
    (
 SELECT
      BookMeta_Title,
      Themes,BookMeta_FullText,
      CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
    FROM `gdelt-bq.internetarchivebooks.1920` limit 5),
    STRUCT(
      0.2 AS temperature,
      100 AS max_output_tokens,
      TRUE AS flatten_json_output));

La réponse dans le chat Gemini est la suivante:

df6595a4b14f7b9.png

Voici la requête au cas où vous souhaiteriez la copier directement à partir d'ici:

CREATE TABLE bookshelf.books (
  BookMeta_Title STRING,
  Themes STRING,
  ml_generate_text_llm_result STRING
) AS (
  SELECT
    BookMeta_Title,
    Themes,
    ml_generate_text_llm_result Context
  FROM
    ML.GENERATE_TEXT (
      MODEL `bookshelf.llm_model`,
      (
        SELECT
          BookMeta_Title,
          Themes,
          BookMeta_FullText,
          CONCAT('Read all the words in the following text separated by ";" and come up with one single (most relating) theme that is applicable : ', Themes, '. Take the title of the book from the following value', BookMeta_Title, '. Return a meaningful and concise theme with one or two words, not more than that. If a theme is not possible, return a context from its title. But DO NOT return empty or null. ') AS prompt
        FROM `gdelt-bq.internetarchivebooks.1920`
        LIMIT 5
      ),
      STRUCT(
        0.2 AS temperature,
        100 AS max_output_tokens,
        TRUE AS flatten_json_output
      )
    )
);

Après avoir exécuté la requête dans l'éditeur BigQuery, le résultat est le suivant:

2d1ce716f844b7ad.png

Et voilà ! Interrogez maintenant le tableau et explorez les données pour obtenir plus d'insights.

12. Félicitations

Félicitations ! Nous avons effectué les opérations suivantes et avons également utilisé Gemini dans certaines étapes du processus:

  • Vous avez créé un modèle distant dans BigQuery qui appelle le point de terminaison Vertex AI "text-bison-32k" pour identifier le genre (ou le thème) du livre à partir d'une liste de mots clés séparés par "" dans la table.
  • Vous avez créé une fonction distante dans BigQuery qui appellera cette fonction Cloud d'IA générative déployée à distance. Cette fonction utilisera l'invite comme entrée et renverra une chaîne qui résume le livre en cinq lignes.
  • Vous avez utilisé le modèle et la fonction distants pour résumer le thème et le texte d'un livre à l'aide de requêtes SQL, puis pour écrire les résultats dans une nouvelle table du jeu de données "bibliothèque".
  • À titre de suivi, essayez d'utiliser Gemini pour obtenir le code SQL permettant de supprimer les objets créés dans BigQuery. Cela couvrira l'étape de nettoyage.