Des données vers une IA générative avec Spanner et l'API Vertex AI Imagen

1. Introduction

Dans cet atelier de programmation, vous allez créer un générateur de poses basé sur l'IA avec Java, Spring Boot, la base de données Cloud Spanner et l'API Vertex AI Imagen. L'utilisateur saisit une requête et l'application génère une pose basée sur celle-ci. Nous utiliserons également les données de la base de données Spanner exposée en tant qu'API REST. C'est une manière ludique et éducative de démontrer les fonctionnalités de l'IA générative avec Spring Boot sur Google Cloud.

Voici la liste des services utilisés:

  1. Cloud Spanner
  2. API Vertex AI Imagen
  3. Cloud Run

Schéma général du flux

60192bcbff4c39de.png

Ce que vous allez faire

Vous allez créer

  • Une application Java Spring Boot pour l'API Data as a Service de Spanner
  • Application Java Spring Boot pour le cas d'utilisation de génération d'images à l'aide d'Imagen
  • Une interface utilisateur interactive pour la saisie et la réponse de requête

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 Cloud Spanner, API Vertex AI, API Cloud Run, API Cloud Functions) 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. Pour commencer, accédez à la page Cloud Spanner contenant votre projet Google Cloud actif.

3. Préparer des données avec Spanner

Avant de créer l'application, nous allons terminer la configuration de la base de données en créant une instance, une base de données et une table Cloud Spanner. Consultez ce blog pour en savoir plus sur les fonctionnalités de Cloud Spanner, le LDD, le LMD, etc. Vous pouvez suivre les étapes ci-dessous pour créer les objets de base de données requis pour ce projet:

  1. Créez une instance en cliquant sur CRÉER UNE INSTANCE sur la page des instances.
  2. Saisissez les détails indiqués dans l'image ci-dessous, puis cliquez sur CRÉER:

f869fcbb922027a5.png

  1. Une fois l'instance créée, accédez à la page de présentation de l'instance, puis cliquez sur CRÉER UNE BASE DE DONNÉES.
  2. Indiquez "first-spanner-db" comme nom de la base de données. puis saisissez le LDD suivant dans la section MODÈLES LDD, puis cliquez sur ENVOYER:
CREATE TABLE Yoga_Poses(
  Pose_Id   INT64 NOT NULL,
  Name  STRING(1024),
  Breath STRING(1024),
  Description STRING(1024)
) PRIMARY KEY(Pose_Id);

La base de données et la table doivent être créées à la fin de la dernière étape. Nous allons maintenant insérer quelques lignes dans la table Yoga_Poses pour pouvoir créer notre application Spring Boot.

  1. Cliquez sur Spanner Studio dans le volet "Base de données" à gauche et ouvrez un nouvel onglet de l'éditeur de requête, comme illustré ci-dessous:

c86774e8fd32eca0.png

  1. Exécutez les requêtes INSERT suivantes:
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(1, 'STAND', 'INHALE AND EXHALE', 
'STAND WITH YOUR FEET HIP WIDTH APART AND ARMS RESTING BY THE SIDES');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(2, 'PLANK', 'INHALE OR EXHALE', 
'PLANT YOUR TOES AND PALMS ON THE MAT WITH BODY PARALLEL TO THE GROUND');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(3, 'SIT', 'INHALE AND EXHALE', 
'SIT ON THE FLOOR LEGS CROSSED');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(4, 'BEND', 'EXHALE', 
'FOLD FORWARD AS YOU STAND, HANDS REACHING TO THE FLOOR');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(5, 'PUSH UP', 'EXHALE', 
'PLANK WITH ELBOWS ON MAT');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(6, 'SEATED FORWARD BEND', 'EXHALE', 
'FOLD FORWARD AS YOU SIT, HANDS TRYING TO REACH THE FEET');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(7, 'LUNGE', 'EXHALE', 
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK LEG STRAIGHT');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(8, 'COURTESY LUNGE', 'INHALE', 
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK KNEE TOUCHING THE FLOOR');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(9, 'BANK BEND', 'INHALE', 
'STAND WITH ARMS UP AND BODY BENT BACKWARDS, ARCHING YOUR SPINE, LOOKING AT THE SKY');

INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(10, 'BICEP ACTION', 'INHALE AND EXHALE', 
'CURL, PRESS AND WORK YOUR BICEPS');

L'instance, la base de données, la table et les données Spanner sont désormais créées, et prêtes pour l'application.

4. Créer une API REST avec Spring Boot et Spanner pour les données de pose

Pour vous familiariser avec Spring Boot et la console Google Cloud, consultez cet article de blog.

  1. Amorcer l'application Spring Boot Pour amorcer cette application à partir de zéro, suivez ce blog. Pour cloner à partir du dépôt et passer à l'action, il vous suffit d'exécuter la commande ci-dessous dans le terminal Cloud Shell:
git clone https://github.com/AbiramiSukumaran/spanner-springb

Le projet Spanner-springb devrait être créé dans votre machine Cloud Shell. Pour comprendre les composants de l'application, consultez le blog.

  1. Créons et exécutons l'application. Pour ce faire, exécutez les commandes suivantes à partir du terminal Cloud Shell:
cd spanner-springb

./mvnw package

./mvnw spring-boot:run
  1. Déployez l'application dans Cloud Run afin qu'elle soit disponible pour l'application de génération de poses. Pour ce faire, exécutez la commande suivante à partir du terminal Cloud Shell:
gcloud run deploy –source .

Transmettez les paramètres requis et assurez-vous que votre application est déployée. L'URL de service générée doit pouvoir répertorier les données créées dans Spanner.

5. Amorcer une application de génération de postures avec Spring Boot, Spanner et Imagen

À ce stade, nous avons terminé la partie supérieure du diagramme de flux, c'est-à-dire la mise à disposition des données Spanner en tant que service (API REST). Créons maintenant une application cliente qui appelle les données Spanner, appelle l'API IMAGEN avec une invite et renvoie la chaîne encodée en base64 sous forme d'image à l'interface utilisateur.

  1. À ce stade, vous connaissez déjà la structure du projet Spring Boot et son importance. Vous pouvez donc passer rapidement au clonage du dépôt sur votre machine Cloud Shell en exécutant la commande ci-dessous dans le terminal Cloud Shell:
git clone https://github.com/AbiramiSukumaran/genai-posegen

Le projet genai-posegen doit avoir été créé sur votre machine Cloud Shell. La structure de projet clonée s'affiche comme suit dans l'éditeur Cloud Shell:

b19a94f895f74c62.png

La classe Java PromptController contient l'appel du service de base de données, l'implémentation de la logique métier et l'appel de l'API d'IA générative d'Imagen. Cette classe interagit avec les modèles Thymeleaf qui procèdent à l'intégration des données dans l'interface utilisateur. Cette classe comporte trois méthodes de service : 1) pour obtenir l'entrée de requête, 2) pour traiter la requête et appeler l'API Imagen, et 3) pour traiter la réponse imagen.

Prompt et Yoga sont les classes POJO contenant les champs, les getters et les setters permettant d'interagir respectivement avec l'API Imagen et l'API du serveur de données Spanner.

Les fichiers HTML Index et getImage du dossier "templates" contiennent les modèles d'interface utilisateur. Ils comportent des dépendances de scripts JS et CSS dans leurs dossiers respectifs.

Intégration de l'API Imagen de Vertex AI Pour le cas d'utilisation de la génération d'images, nous utilisons l'API Imagen de Vertex AI au format suivant:

https://<<region>>- aiplatform.googleapis.com/v1/projects/<<your-project-id>>/locations/<<region>>/publishers/google/models/imagegeneration:predict

Pour en savoir plus sur les fonctionnalités d'Imagen, cliquez ici. Il renvoie la réponse au format de chaîne encodée en base64. Pour la convertir en image, nous avons utilisé la méthode JavaScript setattribute (dans le fichier getImage.js ) sur l'objet image comme suit dans le fichier getImage.HTML:

poseImage.setAttribute('src', "data:image/jpg;base64," + baseStr64);

Autorisation L'API Imagen nécessite que l'authentification par jeton de support soit activée pour que vous puissiez y accéder. Dans notre cas, j'ai utilisé l'approche JSON des identifiants par défaut de l'application. Pour ce faire, exécutez la commande ci-dessous à partir du terminal Cloud Shell et suivez les instructions ci-dessous:

gcloud auth application-default login

Saisissez "Y" pour s'authentifier auprès de votre compte. Autorisez l'accès et copiez le code d'autorisation qui s'affiche dans le pop-up. Une fois cette opération effectuée, vous obtiendrez les identifiants par défaut de l'application dans le fichier JSON enregistré à un emplacement semblable à celui-ci: /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json.

Téléchargez le fichier ou copiez le contenu du fichier JSON en exécutant la commande cat (cat /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json) et utilisez-la dans l'application via la méthode callImagen() de la classe PromptController.java. Pour en savoir plus sur l'authentification, cliquez ici.

Interface utilisateur Nous avons utilisé Thymeleaf comme moteur de création de modèles pour analyser et afficher les données dans les fichiers de modèle de l'interface, et pour ajouter un design élégant à l'interface utilisateur. Il est semblable à HTML, mais accepte davantage d'attributs pour fonctionner avec les données affichées. Le fichier index.html contient les éléments de conception de la page de destination. Il permet à l'utilisateur de sélectionner le sujet et d'ajouter une requête de remplacement pour générer l'image souhaitée.

6. Migration Build and Deploy

Maintenant que vous avez cloné le code et remplacé les valeurs des espaces réservés correspondant à votre projet, à votre région et à vos identifiants d'authentification, passons à la compilation et au déploiement de l'application. Accédez au dossier du projet dans le terminal Cloud Shell à l'aide de la commande suivante:

cd genai-posegen

./mvnw package

./mvnw spring-boot:run

Déployer l'application dans Cloud Run afin qu'elle soit disponible dans le cloud Pour ce faire, exécutez la commande suivante à partir du terminal Cloud Shell dans le dossier du projet:

gcloud run deploy –source .

Transmettez les paramètres requis et assurez-vous que votre application est déployée.

7. Démo

Une fois l'application déployée, l'URL du service doit s'afficher dans le terminal. Cliquez sur le lien et découvrez votre application de génération d'images de poses s'exécutant sur Google Cloud sans serveur.

92bdb22109b2f756.gif

8. Effectuer un nettoyage

Pour éviter que les ressources utilisées dans cet article soient facturées sur votre compte Google Cloud, procédez comme suit:

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.
  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur "Supprimer".
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur "Arrêter" pour supprimer le projet.
  4. Si vous ne souhaitez pas supprimer le projet, supprimez l'instance Spanner. Pour cela, accédez à l'instance que vous venez de créer pour ce projet, puis cliquez sur le bouton SUPPRIMER L'INSTANCE en haut à droite de la page de présentation de l'instance.
  5. Vous pouvez également accéder à la page "Services Cloud Run", sélectionner les services créés dans ce projet, puis cliquer sur le bouton "Supprimer" pour les supprimer.

9. Félicitations

Dans ce blog, nous avons pu intégrer l'application Spring Boot complète qui stocke et gère les données dans Cloud Spanner afin de générer des postures à l'aide de l'API Imagen de Google Cloud Vertex AI dans une application cliente interactive déployée dans Cloud Run. Dans la section du diagramme d'architecture de ce blog, vous voyez le composant Cloud Functions (Java) que nous n'avons jamais eu à faire. N'attendez plus si vous souhaitez contribuer. Vous pouvez implémenter deux fonctions Cloud Java pour exécuter les deux méthodes disponibles dans le fichier getimage.html: enregistrer la pose dans la base de données et importer les méthodes d'image. Consultez la documentation Imagen sur Vertex AI pour en savoir plus sur le modèle.