1. Übersicht
In der Welt der Wellness- und Fitness-Apps ist es wichtig, Nutzern ein umfassendes und ansprechendes Erlebnis zu bieten. Für eine Yoga-App bedeutet das, dass sie über einfache Textbeschreibungen von Posen hinausgehen und umfassende Informationen, Multimedia-Inhalte und intelligente Suchfunktionen bieten muss. In diesem Blogbeitrag erfahren Sie, wie Sie mit Firestore von Google Cloud eine robuste Datenbank mit Yoga-Haltungen erstellen, die Erweiterung für die Vektorsuche für den kontextbezogenen Abgleich nutzen und die Leistungsfähigkeit von Gemini 2.0 Flash (experimentell) für die Arbeit mit multimodalen Inhalten einbinden.
Warum Firestore?
Firestore, die serverlose NoSQL-Dokumentdatenbank von Google Cloud, ist eine ausgezeichnete Wahl für die Entwicklung skalierbarer und dynamischer Anwendungen. Deshalb ist sie ideal für unsere Yoga App:
- Skalierbarkeit und Leistung:Firestore wird automatisch skaliert, um Millionen von Nutzern und riesige Datasets zu verarbeiten. So bleibt Ihre App auch bei steigender Nutzung reaktionsschnell.
- Echtzeit-Updates: Die integrierte Echtzeit-Synchronisierung sorgt dafür, dass die Daten auf allen verbundenen Clients konsistent sind. Das ist ideal für Funktionen wie Live-Kurse oder gemeinsames Üben.
- Flexibles Datenmodell:Mit der dokumentbasierten Struktur von Firestore können Sie verschiedene Datentypen speichern, darunter Text, Bilder und sogar Einbettungen. Das macht Firestore ideal für die Darstellung komplexer Informationen zu Yogaposen.
- Leistungsstarke Abfragen:Firestore unterstützt komplexe Abfragen, einschließlich Gleichheits- und Ungleichheitsabfragen sowie Vektorsuchen nach Ähnlichkeit mit der neuen Erweiterung.
- Offlinesupport:Firestore speichert Daten lokal im Cache, sodass Ihre App auch dann funktioniert, wenn Nutzer offline sind.
Suche mit der Firestore Vector Search Extension optimieren
Die herkömmliche stichwortbasierte Suche kann bei komplexen Konzepten wie Yoga-Posen an ihre Grenzen stoßen. Ein Nutzer sucht möglicherweise nach einer Yoga-Pose, die „die Hüften öffnet“ oder „das Gleichgewicht verbessert“, ohne den genauen Namen der Pose zu kennen. Hier kommt die Vektorsuche ins Spiel.
Mit der Vektorsuche mit Firestore haben Sie folgende Möglichkeiten:
- Einbettungen generieren:Textbeschreibungen und in Zukunft möglicherweise auch Bilder und Audio in numerische Vektordarstellungen (Einbettungen) umwandeln, die ihre semantische Bedeutung erfassen. Dazu werden Modelle wie die in Vertex AI verfügbaren oder benutzerdefinierte Modelle verwendet.
- Einbettungen speichern:Speichern Sie diese Einbettungen direkt in Firestore-Dokumenten.
- Ähnlichkeitssuchen durchführen:Sie können Ihre Datenbank abfragen, um Dokumente zu finden, die einem bestimmten Abfragevektor semantisch ähnlich sind. So können Sie kontextbezogene Übereinstimmungen erzielen.
Gemini 2.0 Flash (Experimental) einbinden
Gemini 2.0 Flash ist das innovative multimodale KI-Modell von Google. Die Funktion befindet sich zwar noch in der Entwicklungsphase, bietet aber spannende Möglichkeiten, unsere Yoga App zu erweitern:
- Textgenerierung: Mit Gemini 2.0 Flash können Sie detaillierte Beschreibungen von Yoga-Posen generieren, einschließlich Vorteilen, Modifikationen und Kontraindikationen.
- Bildgenerierung (nachgeahmt): Die direkte Bildgenerierung mit Gemini ist noch nicht öffentlich verfügbar. Ich habe sie jedoch mit Imagen von Google simuliert und Bilder generiert, die die Posen visuell darstellen.
- Audioerstellung (nachgeahmt): Ähnlich können wir einen Text-to-Speech-Dienst (TTS) verwenden, um Audioanweisungen für jede Pose zu erstellen, die Nutzer durch das Training führen.
Ich stelle mir vor, die Integration vorzuschlagen, um die App mit den folgenden Funktionen des Modells zu verbessern:
- Multimodal Live API: Mit dieser neuen API können Sie Anwendungen für das Streaming von Vision und Audio in Echtzeit mit Tool-Nutzung erstellen.
- Geschwindigkeit und Leistung: Gemini 2.0 Flash hat eine deutlich verbesserte TTFT (Time to First Token) im Vergleich zu Gemini 1.5 Flash.
- Verbesserte Agent-Funktionen: Gemini 2.0 bietet Verbesserungen beim multimodalen Verstehen, Programmieren, Befolgen komplexer Anweisungen und Funktionsaufrufen. Diese Verbesserungen tragen gemeinsam zu besseren Agenten-Erlebnissen bei.
Weitere Informationen finden Sie auf dieser Dokumentationsseite zu Gemini 1.5 Flash.
Fundierung mit der Google Suche
Um die Glaubwürdigkeit zu erhöhen und weitere Ressourcen bereitzustellen, können wir die Google Suche einbinden, um die von unserer App bereitgestellten Informationen zu untermauern. Das bedeutet:
- Kontextbezogene Suche:Wenn ein Administrator die Details für eine Pose eingibt, können wir den Namen der Pose für eine Google-Suche verwenden.
- URL-Extraktion:Aus den Suchergebnissen können wir relevante URLs wie Artikel, Videos oder seriöse Yoga-Websites extrahieren und in der App anzeigen.
Aufgaben
In diesem Lab haben Sie folgende Aufgaben:
- Firestore-Sammlung erstellen und Yoga-Dokumente laden
- CRUD-Anwendungen mit Firestore erstellen
- Beschreibung von Yoga-Haltungen mit Gemini 2.0 Flash generieren
- Firebase Vector Search mit Firestore-Integration aktivieren
- Einbettungen aus der Yoga-Beschreibung generieren
- Ähnlichkeitssuche für Nutzer-Suchtext durchführen
Voraussetzungen
2. Hinweis
Projekt erstellen
- Wählen Sie in der Google Cloud Console auf der Seite zur Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
- Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist .
- Sie verwenden Cloud Shell, eine Befehlszeilenumgebung, die in Google Cloud ausgeführt wird und in der bq vorinstalliert ist. Klicken Sie oben in der Google Cloud Console auf „Cloud Shell aktivieren“.

- Sobald die Verbindung mit der Cloud Shell hergestellt ist, prüfen Sie mit dem folgenden Befehl, ob Sie bereits authentifiziert sind und für das Projekt schon Ihre Projekt-ID eingestellt ist:
gcloud auth list
- Führen Sie den folgenden Befehl in Cloud Shell aus, um zu bestätigen, dass der gcloud-Befehl Ihr Projekt kennt.
gcloud config list project
- Wenn Ihr Projekt nicht festgelegt ist, verwenden Sie den folgenden Befehl, um es festzulegen:
gcloud config set project <YOUR_PROJECT_ID>
- Aktivieren Sie die erforderlichen APIs über diesen Link, bis Sie auf die Schaltfläche „Aktivieren“ klicken können.
Wenn eine API fehlt, können Sie sie jederzeit während der Implementierung aktivieren.
Informationen zu gcloud-Befehlen und deren Verwendung finden Sie in der Dokumentation.
3. Datenbank einrichten
Die Dokumentation enthält vollständigere Schritte zum Einrichten einer Firestore-Instanz. Auf übergeordneter Ebene gehe ich so vor:
1. Rufen Sie den Firestore Viewer auf und wählen Sie auf dem Bildschirm „Datenbankdienst auswählen“ die Option „Firestore im nativen Modus“ aus.
- Wählen Sie einen Standort für Firestore aus. Achten Sie darauf, dass Sie us-central1 auswählen und diese Region / diesen Standort im gesamten Codelab verwenden.
- Klicken Sie auf „Datenbank erstellen“ (wenn dies das erste Mal ist, lassen Sie die Standarddatenbank „(default)“ ausgewählt).
Wenn Sie ein Firestore-Projekt erstellen, wird auch die API im Cloud API Manager aktiviert.
- WICHTIG: Wählen Sie die TEST-Version (nicht die PRODUCTION-Version) der Sicherheitsregeln aus, damit auf die Daten zugegriffen werden kann.
- Nach der Einrichtung sollten Sie die Firestore-Datenbank-, ‑Sammlungs- und ‑Dokumentansicht im nativen Modus sehen, wie im Bild unten dargestellt:

- Führen Sie diesen Schritt noch nicht aus. Sie könnten aber auf „Sammlung starten“ klicken und eine neue Sammlung erstellen. Legen Sie „poses“ als Sammlungs-ID fest. Klicken Sie auf die Schaltfläche Speichern.

Pro-Tipps für die Produktionsanwendung:
- Sobald Sie Ihr Datenmodell fertiggestellt und festgelegt haben, wer auf die verschiedenen Arten von Dokumenten zugreifen darf, können Sie Sicherheitsregeln über die Firebase-Oberfläche erstellen, bearbeiten und überwachen. Über diesen Link können Sie auf Sicherheitsregeln zugreifen: https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
- Bearbeiten, überwachen und testen Sie Ihre Sicherheitsregeln, bevor Sie das Projekt aus der Entwicklungsphase bereitstellen / einführen, da sie oft der stille Übeltäter dafür sind, dass Ihre App anders funktioniert :)
In dieser Demo verwenden wir sie im TEST-Modus.
4. Firestore REST API
- Die REST API kann für die folgenden Anwendungsfälle hilfreich sein: Zugriff auf Firestore über eine ressourcenbeschränkte Umgebung, in der eine vollständige Clientbibliothek nicht ausgeführt werden kann. Datenbankadministration automatisieren oder detaillierte Datenbankmetadaten abrufen
- Die einfachste Möglichkeit, Firestore zu verwenden, ist die Nutzung einer der nativen Clientbibliotheken. Es gibt jedoch Situationen, in denen es sinnvoll ist, die REST API direkt aufzurufen.
- In diesem Blog werden die Firestore REST APIs und nicht die nativen Clientbibliotheken verwendet und demonstriert.
- Für die Authentifizierung akzeptiert die Firestore REST API entweder ein Firebase Authentication-ID-Token oder ein Google Identity OAuth 2.0-Token. Weitere Informationen zur Authentifizierung und Autorisierung finden Sie in der Dokumentation.
- Alle REST API-Endpunkte sind unter der Basis-URL https://firestore.googleapis.com/v1/ vorhanden.
Spring Boot und Firestore API
Diese Lösung im Spring Boot Framework soll eine Clientanwendung demonstrieren, die Firestore-APIs verwendet, um Yoga-Posen und Atemdetails zu erfassen und zu ändern.
Eine detaillierte Schritt-für-Schritt-Anleitung für den Firestore-CRUD-Lösungsteil der Yoga-Posen-App finden Sie in diesem Blogbeitrag.
Wenn Sie sich auf die aktuelle Lösung konzentrieren und den CRUD-Teil unterwegs lernen möchten, klonen Sie die gesamte Lösung, die sich auf diesen Blog konzentriert, aus dem Repository unten in Ihr Cloud Shell-Terminal und erhalten Sie eine Kopie des Quellcodes.
git clone https://github.com/AbiramiSukumaran/firestore-poserecommender
Hinweise:
- Nachdem Sie dieses Repository geklont haben, müssen Sie nur noch einige Änderungen an Ihrer Projekt-ID, Ihren APIs usw. vornehmen. Es sind keine weiteren Änderungen erforderlich, damit Ihre Anwendung ausgeführt werden kann. Die einzelnen Komponenten der Anwendung werden in den folgenden Abschnitten erläutert. Hier finden Sie eine Liste der Änderungen:
- Ersetzen Sie in der Datei
src/main/java/com/example/demo/GenerateImageSample.java"<<YOUR_PROJECT_ID>>" durch Ihre Projekt-ID. - Ersetzen Sie in der Datei
src/main/java/com/example/demo/GenerateEmbeddings.java"<<YOUR_PROJECT_ID>>" durch Ihre Projekt-ID. - Ersetzen Sie in
src/main/java/com/example/demo/PoseController.javaalle Instanzen von<<YOUR_PROJECT_ID>>"und den Datenbanknamen,in diesem Fall"(default)",durch entsprechende Werte aus Ihrer Konfiguration: - Ersetzen Sie in
src/main/java/com/example/demo/PoseController.javadie „[YOUR_API_KEY]“ durch Ihren API-Schlüssel für Gemini 2.0 Flash. Sie können ihn in AI Studio abrufen. - Wenn Sie lokal testen möchten, führen Sie die folgenden Befehle im Cloud Shell-Terminal aus dem Projektordner aus:
mvn package
mvn spring-boot:run
Derzeit können Sie sich die ausgeführte Anwendung ansehen, indem Sie im Cloud Shell-Terminal auf die Option „Webvorschau“ klicken. Wir sind noch nicht bereit, Tests durchzuführen und die Anwendung auszuprobieren.
- Optional:Wenn Sie die App in Cloud Run bereitstellen möchten, müssen Sie eine neue Java Cloud Run-Anwendung von Grund auf im Cloud Shell Editor erstellen und die Quell- und Vorlagendateien aus dem Repository in den entsprechenden Ordnern in Ihrem neuen Projekt hinzufügen. Das aktuelle GitHub-Repositoryprojekt ist nicht standardmäßig für die Cloud Run-Bereitstellungskonfiguration eingerichtet. In diesem Fall müssen Sie die folgenden Schritte ausführen (anstatt das vorhandene Repository zu klonen):
- Rufen Sie den Cloud Shell-Editor auf (achten Sie darauf, dass der Editor und nicht das Terminal geöffnet ist) und klicken Sie in der Statusleiste auf der linken Seite auf das Symbol für den Google Cloud-Projektnamen (der ausgeblendete Bereich im Screenshot unten).

- Wählen Sie aus der Liste der Optionen „Neue Anwendung“ -> „Cloud Run-Anwendung“ -> „Java: Cloud Run“ aus und geben Sie ihr den Namen „firestore-poserecommender“.

- Sie sollten jetzt eine Vorlage für den vollständigen Stack für die Java Cloud Run-Anwendung sehen, die vorkonfiguriert und einsatzbereit ist.
- Entfernen Sie die vorhandene Controller-Klasse und kopieren Sie die folgenden Dateien in die entsprechenden Ordner in der Projektstruktur:
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
- Sie müssen die Änderungen in den entsprechenden Dateien vornehmen, um die Projekt-ID und den API-Schlüssel durch Ihre jeweiligen Werte zu ersetzen. (siehe oben, Schritte 1a, 1b, 1c und 1d).
5. Datenaufnahme
Die Daten für die Anwendung sind in der Datei „data.json“ verfügbar: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json.
Wenn Sie mit einigen vordefinierten Daten beginnen möchten, können Sie den JSON-Code kopieren und alle Vorkommen von „<<YOUR_PROJECT_ID>>“ durch Ihren Wert ersetzen.
- Firestore Studio aufrufen
- Achten Sie darauf, dass Sie eine Sammlung mit dem Namen „poses“ erstellt haben.
- Fügen Sie Dokumente aus der oben genannten Repo-Datei manuell einzeln hinzu.
Alternativ können Sie Daten auf einmal aus dem vordefinierten Set importieren, das wir für Sie erstellt haben. Führen Sie dazu die folgenden Schritte aus:
- Rufen Sie das Cloud Shell-Terminal auf und prüfen Sie, ob Ihr aktives Google Cloud-Projekt festgelegt ist und Sie autorisiert sind. Erstellen Sie mit dem unten angegebenen gsutil-Befehl einen Bucket in Ihrem Projekt. Ersetzen Sie die Variable <PROJECT_ID> im folgenden Befehl durch Ihre Google Cloud-Projekt-ID:
gsutil mb -l us gs://<PROJECT_ID>-yoga-poses-bucket
- Nachdem der Bucket erstellt wurde, müssen wir den vorbereiteten Datenbankexport in diesen Bucket kopieren, bevor wir ihn in die Firebase-Datenbank importieren können. Verwenden Sie den folgenden Befehl:
gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs://<PROJECT_ID>-yoga-poses-bucket
Nachdem wir die zu importierenden Daten haben, können wir mit dem letzten Schritt fortfahren: dem Import der Daten in die von uns erstellte Firebase-Datenbank (default).
- Rufen Sie jetzt die Firestore-Konsole auf und klicken Sie im Navigationsmenü links auf Import/Export.
Wählen Sie „Importieren“ aus und wählen Sie den Cloud Storage-Pfad aus, den Sie gerade erstellt haben. Navigieren Sie dann, bis Sie die Datei „yoga_poses.overall_export_metadata“ auswählen können:

- Klicken Sie auf "Importieren".
Der Import dauert einige Sekunden. Danach können Sie Ihre Firestore-Datenbank und die Sammlung unter https://console.cloud.google.com/firestore/databases validieren. Wählen Sie dazu die default-Datenbank und die Sammlung poses aus, wie unten dargestellt:
- Sie können die Datensätze auch manuell über die Anwendung erstellen, nachdem Sie die Aktion „Create a New Pose“ (Neue Pose erstellen) bereitgestellt haben.
6. Vektorsuche
Firestore Vector Search Extension aktivieren
Mit dieser Extension können Sie Ihre Firestore-Dokumente automatisch einbetten und mit der neuen Vektorsuchfunktion abfragen. Dadurch gelangen Sie zum Firebase Extensions Hub.
Wenn Sie die Vector Search-Erweiterung installieren, geben Sie eine Sammlung und einen Dokumentfeldnamen an. Wenn Sie ein Dokument mit diesem Feld hinzufügen oder aktualisieren, berechnet diese Erweiterung eine Vektoreinbettung für das Dokument. Diese Vektoreinbettung wird in dasselbe Dokument zurückgeschrieben und das Dokument wird im Vektorspeicher indexiert, sodass es abgefragt werden kann.
Sehen wir uns die einzelnen Schritte an:
Erweiterung installieren:
Installieren Sie die Erweiterung „Vector Search with Firestore“ über den Firebase Extensions Marketplace, indem Sie auf „In Firebase Console installieren“ klicken.
WICHTIG:
Wenn Sie zum ersten Mal auf diese Seite mit Erweiterungen zugreifen, müssen Sie dasselbe Projekt auswählen, an dem Sie in der Google Cloud Console arbeiten und das in der Firebase Console aufgeführt ist.

Wenn Ihr Projekt nicht aufgeführt ist, fügen Sie es in Firebase hinzu (wählen Sie Ihr vorhandenes Google Cloud-Projekt aus der Liste aus).
Erweiterung konfigurieren:
Geben Sie die Sammlung („poses“), das Feld mit dem einzubettenden Text („posture“) und andere Parameter wie die Einbettungsdimensionen an.
Wenn in diesem Schritt APIs aufgeführt sind, die aktiviert werden müssen, können Sie dies auf der Konfigurationsseite tun. Folgen Sie dazu der Anleitung.
Wenn die Seite nach dem Aktivieren von APIs längere Zeit nicht reagiert, aktualisieren Sie sie einfach. Die APIs sollten dann aktiviert sein.

In einem der folgenden Schritte können Sie das LLM Ihrer Wahl zum Generieren der Einbettungen verwenden. Wählen Sie „Vertex AI“ aus.

Die nächsten Einstellungen beziehen sich auf Ihre Sammlung und das Feld, das Sie einbetten möchten:
LLM: Vertex AI
Sammlungspfad: Posen
Standardlimit für Anfragen: 3
Distanzmessung: Kosinus
Eingabefeldname: Status
Name des Ausgabefelds: „embedding“
Name des Statusfelds: status
Vorhandene Dokumente einbetten: Ja
Vorhandene Einbettungen aktualisieren: Ja
Cloud Functions-Standort: us-central1
„Enable Events“ (Ereignisse aktivieren): nicht aktiviert

Wenn alles eingerichtet ist, klicken Sie auf die Schaltfläche „Erweiterung installieren“. Das dauert 3–5 Minuten.
Einbettungen generieren:
Wenn Sie der Sammlung „poses“ Dokumente hinzufügen oder darin Dokumente aktualisieren, generiert die Erweiterung automatisch Einbettungen mit einem vortrainierten Modell oder einem Modell Ihrer Wahl über einen API-Endpunkt. In diesem Fall haben wir Vertex AI in der Erweiterungskonfiguration ausgewählt.
Index erstellen
Dadurch wird die Erstellung eines Index für das Einbettungsfeld zum Zeitpunkt der Verwendung der Einbettung in der Anwendung erzwungen.
Firestore erstellt automatisch Indexe für grundlegende Abfragen. Sie können aber auch Indexsyntax von Firestore generieren lassen, indem Sie Abfragen ohne Index ausführen. In der Fehlermeldung auf der Anwendungsseite wird dann ein Link zum generierten Index angezeigt. So erstellen Sie einen Vektorindex:
- Cloud Shell-Terminal aufrufen
- Führen Sie dazu diesen Befehl aus:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"
Nachdem ein Vektorindex erstellt wurde, können Sie mit Ihren Vektoreinbettungen eine Suche nach dem nächsten Nachbarn durchführen.
Wichtiger Hinweis:
Ab diesem Zeitpunkt müssen Sie keine Änderungen mehr an der Quelle vornehmen. Folgen Sie einfach den Anweisungen, um zu verstehen, was die Anwendung tut.
Vektorsuche ausführen
Sehen wir uns an, wie Ihre neu entwickelte Anwendung die Vektorsuche nutzt. Sobald die Einbettungen gespeichert sind, können Sie mit der Klasse „VectorQuery“ des Firestore Java SDK die Vektorsuche durchführen und Ergebnisse für den nächsten Nachbarn abrufen:
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();
In diesem Snippet wird die Einbettung des Suchtexts des Nutzers mit den Einbettungen der Dokumente in Firestore verglichen und die kontextuell ähnlichste Einbettung extrahiert.
7. Gemini 2.0 Flash
Gemini 2.0 Flash (zur Beschreibungserstellung) einbinden
Sehen wir uns an, wie Ihre neu entwickelte Anwendung die Gemini 2.0 Flash-Integration für die Beschreibungserstellung handhabt.
Angenommen, ein Administrator oder Yoga-Lehrer möchte die Details der Posen mithilfe von Gemini 2.0 Flash eingeben und dann eine Suche durchführen, um die besten Übereinstimmungen zu sehen. Dabei werden die Details der übereinstimmenden Posen zusammen mit multimodalen Objekten extrahiert, die die Ergebnisse unterstützen.
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. Nachahmen von Bild- und Audiogenerierung
Gemini 2.0 Flash Experimental kann multimodale Ergebnisse generieren. Ich habe mich jedoch noch nicht für den Early Access registriert. Daher habe ich die Bild- und Audioausgabe mit den Imagen- und TTS-APIs simuliert. Stellen Sie sich vor, wie toll es ist, wenn all das mit einem einzigen API-Aufruf an Gemini 2.0 Flash generiert wird.
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. Fundierung mit der Google Suche:
Wenn Sie den Gemini-Aufrufcode in Schritt 6 prüfen, sehen Sie das folgende Code-Snippet, mit dem die Google Suche für die LLM-Antwort aktiviert wird:
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
So können wir:
- Modell mit tatsächlichen Suchergebnissen fundieren
- Relevante URLs extrahieren, auf die in der Suche verwiesen wird
8. Anwendung ausführen
Sehen wir uns alle Funktionen Ihrer neu erstellten Java Spring Boot-Anwendung mit einer einfachen Thymeleaf-Weboberfläche an:
- Firestore-CRUD-Vorgänge (Erstellen, Lesen, Aktualisieren, Löschen)
- Suche mit Suchbegriffen
- Kontextgenerierung auf Basis generativer KI
- Kontextsuche (Vektorsuche)
- Multimodale Ausgabe in Bezug auf die Suche
- Eigene Abfrage ausführen (Abfragen im structuredQuery-Format)
Beispiel: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}
Alle bisher besprochenen Funktionen sind Teil der Anwendung, die Sie gerade aus dem Repository erstellt haben: https://github.com/AbiramiSukumaran/firestore-poserecommender
Führen Sie die folgenden Befehle im Cloud Shell-Terminal aus, um die Funktion zu erstellen, auszuführen und bereitzustellen:
mvn package
mvn spring-boot:run
Sie sollten das Ergebnis sehen und die Funktionen Ihrer Anwendung ausprobieren können. Im folgenden Video sehen Sie eine Demo der Ausgabe:
App zur Empfehlung von Yoga-Haltungen mit Firestore, der Vektorsuche und Gemini 2.0 Flash
Optionaler Schritt:
Wenn Sie die Anwendung in Cloud Run bereitstellen möchten (vorausgesetzt, Sie haben eine brandneue Anwendung mit Dockerfile eingerichtet und die Dateien nach Bedarf kopiert), führen Sie den folgenden Befehl im Cloud Shell-Terminal aus Ihrem Projektverzeichnis aus:
gcloud run deploy --source .
Geben Sie den Anwendungsnamen und den Regionscode an (wählen Sie den für us-central1 aus) und wählen Sie bei Aufforderung „Y“ für nicht authentifizierte Aufrufe aus. Nach erfolgreicher Bereitstellung sollte der Endpunkt Ihrer Anwendung im Terminal angezeigt werden.
9. Bereinigen
So vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:
- Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.
10. Glückwunsch
Glückwunsch! Sie haben Firestore erfolgreich verwendet, um eine robuste und intelligente Anwendung zur Verwaltung von Yogaposen zu erstellen. Durch die Kombination von Firestore, der Vector Search Extension und den Funktionen von Gemini 2.0 Flash (mit simulierter Bild- und Audioerstellung) haben wir eine wirklich ansprechende und informative Yoga-App erstellt, mit der CRUD-Vorgänge implementiert, schlüsselwortbasierte Suche, kontextbezogene Vektorsuche und generierte Multimedia-Inhalte durchgeführt werden können.
Dieser Ansatz ist nicht auf Yoga-Apps beschränkt. Da sich KI-Modelle wie Gemini ständig weiterentwickeln, werden die Möglichkeiten, noch intensivere und personalisierte Nutzererlebnisse zu schaffen, immer größer. Achten Sie darauf, sich über die neuesten Entwicklungen und die Dokumentation von Google Cloud und Firebase auf dem Laufenden zu halten, um das volle Potenzial dieser Technologien zu nutzen.
Wenn ich diese App erweitern würde, würde ich versuchen, zwei Dinge mit Gemini 2.0 Flash zu erreichen:
- Nutzen Sie die Multimodal Live API, um für den Anwendungsfall Vision- und Audiostreaming in Echtzeit zu erstellen.
- Aktivieren Sie den Denkmodus, um die Gedanken hinter den Antworten für die Interaktion mit Echtzeitdaten zu generieren und die Erfahrung lebensechter zu gestalten.
Probiere es einfach aus und sende einen Pull-Request :>D!!!