1. Présentation
Dans le monde des applications de bien-être et de remise en forme, il est essentiel d'offrir aux utilisateurs une expérience riche et attrayante. Pour une application de yoga, cela signifie aller au-delà de simples descriptions textuelles des postures et proposer des informations complètes, des contenus multimédias et des fonctionnalités de recherche intelligente. Dans cet article de blog, nous allons découvrir comment créer une base de données robuste de postures de yoga à l'aide de Firestore de Google Cloud, exploiter son extension Vector Search pour la mise en correspondance contextuelle et intégrer la puissance de Gemini 2.0 Flash (version expérimentale) pour travailler avec du contenu multimodal.
Pourquoi choisir Firestore ?
Firestore, la base de données de documents NoSQL sans serveur de Google Cloud, est un excellent choix pour créer des applications évolutives et dynamiques. Voici pourquoi il est idéal pour notre application de yoga:
- Évolutivité et performances:Firestore s'adapte automatiquement pour gérer des millions d'utilisateurs et des ensembles de données volumineux, ce qui garantit que votre application reste réactive même à mesure qu'elle se développe.
- Mises à jour en temps réel: la synchronisation intégrée en temps réel garantit la cohérence des données entre tous les clients connectés. Elle est donc idéale pour des fonctionnalités telles que les cours en direct ou l'entraînement collaboratif.
- Modèle de données flexible:la structure basée sur des documents de Firestore vous permet de stocker différents types de données, y compris du texte, des images et même des représentations vectorielles continues, ce qui est idéal pour représenter des informations complexes sur les postures de yoga.
- Requêtes performantes:Firestore accepte les requêtes complexes, y compris l'égalité, l'inégalité et, désormais, avec la nouvelle extension, les recherches de similarité vectorielle.
- Compatibilité hors connexion:Firestore met en cache les données localement, ce qui permet à votre application de fonctionner même lorsque les utilisateurs sont hors connexion.
Améliorer la recherche avec l'extension de recherche vectorielle Firestore
La recherche traditionnelle basée sur les mots clés peut être limitée lorsque vous traitez des concepts complexes comme les postures de yoga. Un utilisateur peut rechercher une posture qui "ouvre les hanches" ou "améliore l'équilibre" sans connaître le nom spécifique de la posture. C'est là que la recherche vectorielle intervient.
Avec Vector Search dans Firestore, vous pouvez:
- Générer des embeddings:transformez les descriptions textuelles, et à terme potentiellement les images et l'audio, en représentations vectorielles continues (embeddings) numériques qui capturent leur signification sémantique à l'aide de modèles tels que ceux disponibles dans Vertex AI ou de modèles personnalisés.
- Stocker des représentations vectorielles continues:stockez ces représentations directement dans des documents Firestore.
- Effectuer des recherches de similarité:interrogez votre base de données pour trouver les documents sémantiquement similaires à un vecteur de requête donné, ce qui permet d'effectuer des correspondances contextuelles.
Intégrer Gemini 2.0 Flash (expérimental)
Gemini 2.0 Flash est le modèle d'IA multimodale de pointe de Google. Bien qu'il s'agisse d'une technologie expérimentale, elle offre des possibilités intéressantes pour enrichir notre application de yoga:
- Génération de texte: utilisez Gemini 2.0 Flash pour générer des descriptions détaillées des postures de yoga, y compris leurs avantages, leurs modifications et leurs contre-indications.
- Génération d'images (imitée): bien que la génération d'images directe avec Gemini ne soit pas encore disponible publiquement, j'ai simulé cette fonctionnalité à l'aide d'Imagen de Google, en générant des images qui représentent visuellement les poses.
- Génération audio (mimique): de même, nous pouvons utiliser un service de synthèse vocale pour créer des instructions audio pour chaque posture, guidant les utilisateurs tout au long de la pratique.
Je pense pouvoir proposer l'intégration pour améliorer l'application afin qu'elle utilise les fonctionnalités suivantes du modèle:
- API Multimodal Live: cette nouvelle API vous aide à créer des applications de streaming audio et vidéo en temps réel avec l'utilisation d'outils.
- Rapidité et performances: Gemini 2.0 Flash améliore considérablement le temps avant le premier jeton (TTFT) par rapport à Gemini 1.5 Flash.
- Amélioration des expériences d'agentivité: Gemini 2.0 améliore la compréhension multimodale, le codage, le suivi d'instructions complexes et l'appel de fonction. Ces améliorations fonctionnent ensemble pour offrir une meilleure expérience aux agents.
Pour en savoir plus, consultez la page de documentation sur Gemini 1.5 Flash.
Ancrage avec la recherche Google
Pour renforcer la crédibilité et fournir d'autres ressources, nous pouvons intégrer la recherche Google pour étayer les informations fournies par notre application. Cela signifie que:
- Recherche contextuelle:lorsqu'un utilisateur administrateur saisit les détails d'une pose, nous pouvons utiliser le nom de la pose pour effectuer une recherche Google.
- Extraction d'URL:à partir des résultats de recherche, nous pouvons extraire des URL pertinentes, telles que des articles, des vidéos ou des sites Web de yoga réputés, et les afficher dans l'application.
Ce que vous allez faire
Au cours de cet atelier, vous allez:
- Créer une collection Firestore et charger des documents sur le yoga
- Créer des applications CRUD avec Firestore
- Générer une description de posture de yoga avec Gemini 2.0 Flash
- Activer la recherche vectorielle Firebase avec intégration Firestore
- Générer des embeddings à partir de la description de Yoga
- Effectuer une recherche de similarité pour le texte de recherche de l'utilisateur
Conditions requises
2. Avant de commencer
Créer un projet
- 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 sur un projet .
- Vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google Cloud et fourni avec bq. Cliquez sur "Activer Cloud Shell" en haut de la console Google Cloud.
- Une fois connecté à Cloud Shell, vérifiez que vous êtes déjà authentifié et que le projet est défini avec votre ID de projet à l'aide de la commande suivante:
gcloud auth list
- Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet.
gcloud config list project
- Si votre projet n'est pas défini, utilisez la commande suivante pour le définir :
gcloud config set project <YOUR_PROJECT_ID>
- Activer les API requises.
gcloud services enable firestore.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com \
storage.googleapis.com \
secretmanager.googleapis.com \
texttospeech.googleapis.com
Vous pouvez également rechercher chaque produit dans la console ou utiliser ce lien.
Si une API est manquante, vous pouvez toujours l'activer au cours de l'implémentation.
Consultez la documentation pour connaître les commandes gcloud ainsi que leur utilisation.
3. Configuration de la base de données
La documentation fournit des étapes plus complètes pour configurer une instance Firestore. Pour commencer, je vais suivre ces étapes:
1 Accédez au Visionneuse Firestore et, dans l'écran "Sélectionner un service de base de données", choisissez Firestore en mode natif.
- Sélectionner un emplacement pour votre Firestore
- Cliquez sur "Créer une base de données" (si vous créez une base de données pour la première fois, laissez-la nommée "(default)").
Lorsque vous créez un projet Firestore, cela active également l'API dans Cloud API Manager.
- IMPORTANT: Choisissez la version TEST (et non PRODUCTION) des règles de sécurité pour que les données soient accessibles.
- Une fois la configuration terminée, la vue de la base de données, de la collection et du document Firestore en mode natif s'affiche, comme illustré ci-dessous:
- Ne faites pas encore cette étape, mais juste pour information, vous pouvez cliquer sur "Démarrer une collection" et en créer une. Définissez l'ID de collection sur "poses". Cliquez sur le bouton Enregistrer.
Conseils d'expert pour la production:
- Une fois que vous avez finalisé votre modèle de données et identifié les personnes autorisées à accéder à différents types de documents, vous pouvez créer, modifier et surveiller des règles de sécurité depuis l'interface Firebase. Vous pouvez accéder aux règles de sécurité à l'aide de ce lien: https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
- Veillez à modifier, à surveiller et à tester vos règles de sécurité avant de déployer / d'implémenter le projet à partir de la phase de développement, car elles sont souvent la cause silencieuse du fonctionnement différent de votre application.
Pour cette démonstration, nous l'utiliserons en mode TEST.
4. API REST Firestore
- L'API REST peut être utile dans les cas d'utilisation suivants:a. Accéder à Firestore à partir d'un environnement à ressources limitées où l'exécution d'une bibliothèque cliente complète n'est pas possible. Automatiser l'administration de la base de données ou récupérer des métadonnées de base de données détaillées
- Bien que la méthode la plus simple pour utiliser Firestore consiste à utiliser l'une des bibliothèques clientes natives, il est parfois utile d'appeler directement l'API REST.
- Dans ce blog, vous allez découvrir l'utilisation et la démonstration des API REST Firestore, et non des bibliothèques clientes natives.
- Pour l'authentification, l'API REST de Firestore accepte soit un jeton d'identification Firebase Authentication, soit un jeton Google Identity OAuth 2.0. Pour en savoir plus sur l'authentification et l'autorisation, consultez la documentation.
- Tous les points de terminaison de l'API REST existent sous l'URL de base https://firestore.googleapis.com/v1/.
Spring Boot et API Firestore
Cette solution dans le framework Spring Boot vise à présenter une application cliente qui utilise les API Firestore pour collecter et modifier les détails de la posture et de la respiration du yoga avec une expérience interactive pour l'utilisateur.
Pour une explication détaillée de la solution CRUD Firestore de l'application de poses de yoga, consultez ce lien vers le blog.
Pour vous concentrer sur la solution actuelle et apprendre la partie CRUD sur le pouce, clonez l'intégralité de la solution axée sur ce blog à partir du dépôt ci-dessous dans votre terminal Cloud Shell et obtenez une copie du code.
git clone https://github.com/AbiramiSukumaran/firestore-poserecommender
Remarques :
- Une fois ce dépôt cloné, il vous suffit d'apporter quelques modifications concernant votre ID de projet, vos API, etc. Aucune autre modification n'est requise pour que votre application soit opérationnelle. Chaque composant de l'application est expliqué dans les sections suivantes. Voici la liste des modifications:
- Dans le fichier
src/main/java/com/example/demo/GenerateImageSample.java
, remplacez "<<YOUR_PROJECT_ID>>" par votre ID de projet. - Dans le fichier
src/main/java/com/example/demo/GenerateEmbeddings.java
, remplacez "<<YOUR_PROJECT_ID>>" par votre ID de projet. - Dans
src/main/java/com/example/demo/PoseController.java
, remplacez toutes les instances de<<YOUR_PROJECT_ID>>"
et du nom de la base de données,
(dans ce cas,"(default)",
) par les valeurs appropriées de votre configuration: - Dans
src/main/java/com/example/demo/PoseController.java
, remplacez "[YOUR_API_KEY]
" par votre clé API pour Gemini 2.0 Flash. Vous pouvez l'obtenir dans AI Studio. - Si vous souhaitez effectuer des tests en local, exécutez les commandes suivantes à partir du dossier du projet dans le terminal Cloud Shell:
mvn package
mvn spring-boot:run
Pour le moment, vous pouvez afficher votre application en cours d'exécution en cliquant sur l'option "Aperçu Web" dans le terminal Cloud Shell. Nous ne sommes pas encore prêts à effectuer des tests et à essayer l'application.
- Facultatif:Si vous souhaitez déployer l'application dans Cloud Run, vous devrez démarrer une toute nouvelle application Java Cloud Run à partir de l'éditeur Cloud Shell, puis ajouter les fichiers src et les fichiers de modèle du repo à votre nouveau projet dans les dossiers respectifs (car le projet de dépôt GitHub actuel n'est pas configuré par défaut pour la configuration de déploiement Cloud Run). Dans ce cas, procédez comme suit (au lieu de cloner le dépôt existant):
- Accédez à l'éditeur Cloud Shell (assurez-vous que l'éditeur est ouvert et non le terminal), puis cliquez sur l'icône du nom du projet Google Cloud sur le côté gauche de la barre d'état (partie masquée dans la capture d'écran ci-dessous).
- Sélectionnez "Nouvelle application" -> "Application Cloud Run" -> "Java: Cloud Run" dans la liste des options, puis nommez l'application "firestore-poserecommender".
- Vous devriez maintenant voir un modèle de stack complète pour l'application Java Cloud Run, préconfiguré et prêt à l'emploi.
- Supprimez la classe Controller existante et copiez les fichiers suivants dans leurs dossiers respectifs dans la structure du projet:
firestore-poserecommender/src/main/java/com/example/demo/
- FirestoreSampleApplication.java
- GenerateEmbeddings.java
- GenerateImageSample.java
- Pose.java
- PoseController.java
- ServletInitializer.java
firestore-poserecommender/src/main/resources/static/
- Index.html
firestore-poserecommender/src/main/resources/templates/
- contextsearch.html
- createpose.html
- errmessage.html
- pose.html
- ryoq.html
- searchpose.html
- showmessage.html
firestore-poserecommender/
- Dockerfile
- Vous devez apporter les modifications dans les fichiers correspondants pour remplacer l'ID de projet et la clé d'API par vos valeurs respectives. (étapes 1 a,b, c et d ci-dessus).
5. Ingestion de données
Les données de l'application sont disponibles dans le fichier data.json: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json
Si vous souhaitez commencer avec des données prédéfinies, vous pouvez copier le fichier JSON et remplacer toutes les occurrences de "<<YOUR_PROJECT_ID>>" par votre valeur.
- Accédez à Firestore Studio.
- Assurez-vous d'avoir créé une collection intitulée "poses".
- Ajouter manuellement les documents du fichier de dépôt mentionné ci-dessus, un par un
Vous pouvez également importer des données en une seule fois à partir de l'ensemble prédéfini que nous avons créé pour vous en procédant comme suit:
- Accédez au terminal Cloud Shell et vérifiez que votre projet Google Cloud actif est défini et que vous êtes autorisé. Créez un bucket dans votre projet à l'aide de la commande gsutil ci-dessous. Remplacez la variable <PROJECT_ID> dans la commande ci-dessous par l'ID de votre projet Google Cloud:
gsutil mb -l us gs://<PROJECT_ID>-yoga-poses-bucket
- Maintenant que le bucket est créé, nous devons y copier l'exportation de la base de données que nous avons préparée avant de pouvoir l'importer dans la base de données Firebase. Utilisez la commande ci-dessous:
gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs://<PROJECT_ID>-yoga-poses-bucket
Maintenant que nous avons les données à importer, nous pouvons passer à l'étape finale, qui consiste à les importer dans la base de données Firebase (par défaut) que nous avons créée.
- Accédez à la console Firestore et cliquez sur Importations/Exportations dans le menu de navigation de gauche.
Sélectionnez "Importer", choisissez le chemin d'accès Cloud Storage que vous venez de créer, puis accédez au fichier "yoga_poses.overall_export_metadata":
- Cliquez sur "Importer".
L'importation prend quelques secondes. Une fois terminée, vous pouvez valider votre base de données Firestore et la collection en accédant à https://console.cloud.google.com/firestore/databases, en sélectionnant la base de données par défaut et la collection poses, comme indiqué ci-dessous:
- Vous pouvez également créer manuellement les enregistrements dans l'application une fois le déploiement effectué à l'aide de l'action "Créer une pose".
6. Recherche vectorielle
Activer l'extension Vector Search Firestore
Utilisez cette extension pour intégrer et interroger automatiquement vos documents Firestore avec la nouvelle fonctionnalité de recherche vectorielle. Vous serez alors redirigé vers Firebase Extensions Hub.
Lorsque vous installez l'extension Vector Search, vous devez spécifier une collection et un nom de champ de document. L'ajout ou la mise à jour d'un document avec ce champ déclenche cette extension pour calculer un vecteur d'encapsulation pour le document. Cet entraînement vectoriel est réécrit dans le même document, qui est indexé dans le magasin de vecteurs et prêt à être interrogé.
Voyons les étapes à suivre:
Installer l'extension:
Installez l'extension "Vector Search with Firestore" (Recherche vectorielle avec Firestore) depuis le Extensions Marketplace de Firebase en cliquant sur "Install in Firebase Console" (Installer dans la console Firebase).
IMPORTANT :
Lorsque vous accédez pour la première fois à cette page des extensions, vous devez sélectionner le même projet que celui sur lequel vous travaillez dans la console Google Cloud listé dans la console Firebase.
Si votre projet ne figure pas dans la liste, ajoutez-le dans Firebase (choisissez votre projet Google Cloud existant dans la liste).
Configurez l'extension:
Spécifiez la collection ("poses"), le champ contenant le texte à intégrer ("posture") et d'autres paramètres, comme les dimensions d'intégration.
Si des API doivent être activées à cette étape, la page de configuration vous permettra de le faire. Suivez les étapes correspondantes.
Si la page ne répond pas après avoir activé les API pendant un certain temps, actualisez-la. Vous devriez alors voir les API activées.
Dans l'une des étapes suivantes, vous pouvez utiliser le LLM de votre choix pour générer les représentations vectorielles continues. Sélectionnez "Vertex AI".
Les paramètres suivants concernent votre collection et le champ que vous souhaitez intégrer:
LLM: Vertex AI
Chemin d'accès à la collection: poses
Limite de requête par défaut: 3
Mesure de distance: cosinus
Nom du champ de saisie: posture
Nom du champ de sortie: embedding
Nom du champ d'état: status
Intégrer des documents existants: oui
Mettre à jour les embeddings existants: oui
Emplacement de Cloud Functions: us-central1
Enable Events (Activer les événements) : non cochée
Une fois tout cela configuré, cliquez sur le bouton "Install Extension" (Installer l'extension). Cette opération prendra trois à cinq minutes.
Générer des embeddings :
Lorsque vous ajoutez ou modifiez des documents dans la collection "poses", l'extension génère automatiquement des représentations vectorielles continues à l'aide d'un modèle pré-entraîné ou d'un modèle de votre choix via un point de terminaison d'API. Dans ce cas, nous avons choisi Vertex AI dans la configuration de l'extension.
Création d'index
Il oblige à créer un indice dans le champ d'intégration au moment de l'utilisation de l'intégration dans l'application.
Firestore crée automatiquement des index pour les requêtes de base. Toutefois, vous pouvez laisser Firestore générer une syntaxe d'index en exécutant des requêtes sans index. Il vous fournira alors un lien vers l'index généré dans le message d'erreur côté application. Voici la liste des étapes à suivre pour créer un index vectoriel:
- Accéder au terminal Cloud Shell
- Exécutez la commande suivante :
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"
Une fois un indice vectoriel créé, vous pouvez effectuer une recherche des voisins les plus proches avec vos embeddings vectoriels.
Remarque importante :
À partir de ce stade, vous n'avez plus besoin d'apporter de modifications à la source. Suivez simplement la procédure pour comprendre ce que fait l'application.
Effectuer une recherche vectorielle
Voyons comment votre nouvelle application aborde la recherche vectorielle. Une fois les embeddings stockés, vous pouvez utiliser la classe VectorQuery du SDK Java Firestore pour effectuer une recherche vectorielle et obtenir des résultats de voisin le plus proche:
CollectionReference coll = firestore.collection("poses");
VectorQuery vectorQuery = coll.findNearest(
"embedding",
userSearchTextEmbedding,
/* limit */ 3,
VectorQuery.DistanceMeasure.EUCLIDEAN,
VectorQueryOptions.newBuilder().setDistanceResultField("vector_distance")
.setDistanceThreshold(2.0)
.build());
ApiFuture<VectorQuerySnapshot> future = vectorQuery.get();
VectorQuerySnapshot vectorQuerySnapshot = future.get();
List<Pose> posesList = new ArrayList<Pose>();
// Get the ID of the closest document (assuming results are sorted by distance)
String closestDocumentId = vectorQuerySnapshot.getDocuments().get(0).getId();
Cet extrait compare l'embedding du texte de recherche de l'utilisateur avec les embeddings des documents dans Firestore, puis extrait celui qui est le plus proche du contexte.
7. Gemini 2.0 Flash
Intégrer Gemini 2.0 Flash (pour générer une description)
Voyons comment votre nouvelle application gère l'intégration de Gemini 2.0 Flash pour la génération de descriptions.
Imaginons qu'un utilisateur administrateur / un professeur de yoga souhaite saisir les détails des postures à l'aide de Gemini 2.0 Flash, puis effectuer une recherche pour afficher les correspondances les plus proches. Les détails des poses correspondantes sont ainsi extraits, ainsi que les objets multimodaux qui les accompagnent.
String apiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=[YOUR_API_KEY]";
Map<String, Object> requestBody = new HashMap<>();
List<Map<String, Object>> contents = new ArrayList<>();
List<Map<String, Object>> tools = new ArrayList<>();
Map<String, Object> content = new HashMap<>();
List<Map<String, Object>> parts = new ArrayList<>();
Map<String, Object> part = new HashMap<>();
part.put("text", prompt);
parts.add(part);
content.put("parts", parts);
contents.add(content);
requestBody.put("contents", contents);
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, String.class);
System.out.println("Generated response: " + response);
String responseBody = response.getBody();
JSONObject jsonObject = new JSONObject(responseBody);
JSONArray candidates = jsonObject.getJSONArray("candidates");
JSONObject candidate = candidates.getJSONObject(0);
JSONObject contentResponse = candidate.getJSONObject("content");
JSONArray partsResponse = contentResponse.getJSONArray("parts");
JSONObject partResponse = partsResponse.getJSONObject(0);
String generatedText = partResponse.getString("text");
System.out.println("Generated Text: " + generatedText);
a. Mimiquer la génération d'images et d'audio
Gemini 2.0 Flash Experimental est capable de générer des résultats multimodaux. Cependant, je ne me suis pas encore inscrit à l'accès anticipé. J'ai donc imité la sortie audio et visuelle avec les API Imagen et TTS, respectivement. Imaginez la facilité avec laquelle tout cela est généré avec un seul appel d'API à Gemini 2.0 Flash.
try (PredictionServiceClient predictionServiceClient =
PredictionServiceClient.create(predictionServiceSettings)) {
final EndpointName endpointName =
EndpointName.ofProjectLocationPublisherModelName(
projectId, location, "google", "imagen-3.0-generate-001");
Map<String, Object> instancesMap = new HashMap<>();
instancesMap.put("prompt", prompt);
Value instances = mapToValue(instancesMap);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("sampleCount", 1);
paramsMap.put("aspectRatio", "1:1");
paramsMap.put("safetyFilterLevel", "block_few");
paramsMap.put("personGeneration", "allow_adult");
Value parameters = mapToValue(paramsMap);
PredictResponse predictResponse =
predictionServiceClient.predict(
endpointName, Collections.singletonList(instances), parameters);
for (Value prediction : predictResponse.getPredictionsList()) {
Map<String, Value> fieldsMap = prediction.getStructValue().getFieldsMap();
if (fieldsMap.containsKey("bytesBase64Encoded")) {
bytesBase64Encoded = fieldsMap.get("bytesBase64Encoded").getStringValue();
}
}
return bytesBase64Encoded;
}
try {
// Create a Text-to-Speech client
try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
// Set the text input to be synthesized
SynthesisInput input = SynthesisInput.newBuilder().setText(postureString).build();
// Build the voice request, select the language code ("en-US") and the ssml
// voice gender
// ("neutral")
VoiceSelectionParams voice =
VoiceSelectionParams.newBuilder()
.setLanguageCode("en-US")
.setSsmlGender(SsmlVoiceGender.NEUTRAL)
.build();
// Select the type of audio file you want returned
AudioConfig audioConfig =
AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();
// Perform the text-to-speech request on the text input with the selected voice
// parameters and audio file type
SynthesizeSpeechResponse response =
textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);
// Get the audio contents from the response
ByteString audioContents = response.getAudioContent();
// Convert to Base64 string
String base64Audio = Base64.getEncoder().encodeToString(audioContents.toByteArray());
// Add the Base64 encoded audio to the Pose object
return base64Audio;
}
} catch (Exception e) {
e.printStackTrace(); // Handle exceptions appropriately. For a real app, log and provide user feedback.
return "Error in Audio Generation";
}
}
b. Ancrage avec la recherche Google:
Si vous vérifiez le code d'appel Gemini à l'étape 6, vous remarquerez l'extrait de code suivant pour activer l'ancrage de la recherche Google pour la réponse LLM:
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
Nous nous assurons ainsi que:
- Ancrer notre modèle aux résultats de recherche réels
- Extraire les URL pertinentes référencées dans la recherche
8. Exécuter votre application
Voyons toutes les fonctionnalités de votre nouvelle application Java Spring Boot avec une interface Web Thymeleaf simple:
- Opérations CRUD (créer, lire, mettre à jour, supprimer) dans Firestore
- Recherche par mots clés
- Création de contexte basée sur l'IA générative
- Recherche contextuelle (Vector Search)
- Sortie multimodale à associer à la recherche
- Exécuter votre propre requête (requêtes au format structuredQuery)
Exemple: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}
Toutes les fonctionnalités abordées jusqu'à présent font partie de l'application que vous venez de créer à partir du dépôt: https://github.com/AbiramiSukumaran/firestore-poserecommender
Pour la compiler, l'exécuter et la déployer, exécutez les commandes suivantes dans le terminal Cloud Shell:
mvn package
mvn spring-boot:run
Vous devriez voir le résultat et pouvoir tester les fonctionnalités de votre application. Regardez la vidéo ci-dessous pour voir une démonstration de la sortie:
Recommandation de pose avec Firestore, Vector Search et Gemini 2.0 Flash
Étape facultative:
Pour le déployer sur Cloud Run (en supposant que vous avez démarré une toute nouvelle application avec un fichier Dockerfile et que vous avez copié les fichiers si nécessaire), exécutez la commande suivante dans le terminal Cloud Shell à partir du répertoire de votre projet:
gcloud run deploy --source .
Indiquez le nom de l'application, le code de région (choisissez celui pour us-central1) et sélectionnez l'appel non authentifié "Y" lorsque vous y êtes invité. Une fois le déploiement terminé, vous devriez recevoir le point de terminaison de votre application dans le terminal.
9. 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:
- Dans la console Google Cloud, accédez à la page Gérer les ressources.
- Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
- Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.
10. Félicitations
Félicitations ! Vous avez utilisé Firestore pour créer une application de gestion des postures de yoga robuste et intelligente. En combinant la puissance de Firestore, l'extension de recherche vectorielle et les fonctionnalités de Gemini 2.0 Flash (avec la génération d'images et de contenus audio simulés), nous avons créé une application de yoga vraiment attrayante et informative pour implémenter les opérations CRUD, effectuer des recherches basées sur des mots clés, des recherches vectorielles contextuelles et générer du contenu multimédia.
Cette approche n'est pas limitée aux applications de yoga. À mesure que les modèles d'IA tels que Gemini continueront d'évoluer, les possibilités de créer des expériences utilisateur encore plus immersives et personnalisées ne feront qu'augmenter. N'oubliez pas de vous tenir informé des dernières nouveautés et de la documentation de Google Cloud et de Firebase pour exploiter tout le potentiel de ces technologies.
Si je devais développer cette application, j'essaierais de faire deux choses avec Gemini 2.0 Flash:
- Utilisez l'API Multimodal Live en créant un flux audio et visuel en temps réel pour le cas d'utilisation.
- Activez le mode Réflexion pour générer les pensées derrière les réponses de l'interaction avec des données en temps réel afin de rendre l'expérience plus réaliste.
N'hésitez pas à essayer et à envoyer une demande de tirage :>D!!!