1. Übersicht
Bei Wellness- und Fitness-Apps ist es wichtig, Nutzern eine umfassende und ansprechende Umgebung zu bieten. Bei einer Yoga-App bedeutet das, dass Sie nicht nur einfache Textbeschreibungen von Yoga-Posen anbieten, sondern auch umfassende Informationen, Multimediainhalte und intelligente Suchfunktionen. In diesem Blog erfahren Sie, wie Sie mit Firestore von Google Cloud eine robuste Datenbank mit Yoga-Posen erstellen, die Vector Search-Erweiterung für den kontextbezogenen Abgleich nutzen und die Vorteile von Gemini 2.0 Flash (experimentell) für die Arbeit mit multimodalen Inhalten einbinden.
Warum Firestore?
Firestore, die serverlose NoSQL-Dokumentendatenbank von Google Cloud, eignet sich hervorragend für die Entwicklung skalierbarer und dynamischer Anwendungen. Das sind die Gründe, warum er perfekt für unsere Yoga-App geeignet ist:
- Skalierbarkeit und Leistung:Firestore skaliert automatisch, um Millionen von Nutzern und riesige Datenmengen zu verarbeiten. So bleibt Ihre App auch bei steigender Nutzerzahl reaktionsschnell.
- Echtzeitaktualisierungen: Die integrierte Echtzeitsynchronisierung sorgt für konsistente Daten auf allen verbundenen Clients. Das ist ideal für Funktionen wie Livekurse oder das gemeinsame Üben.
- Flexibles Datenmodell:Mit der dokumentbasierten Struktur von Firestore können Sie verschiedene Datentypen speichern, darunter Text, Bilder und sogar Einbettungen. Das ist ideal für die Darstellung komplexer Informationen zu Yoga-Posen.
- Leistungsstarke Abfragen:Firestore unterstützt komplexe Abfragen, einschließlich Gleichheit, Ungleichheit und jetzt, mit der neuen Erweiterung, Suchen nach Vektorähnlichkeiten.
- Offlineunterstützung:Firestore speichert Daten lokal im Cache, sodass Ihre App auch dann funktioniert, wenn Nutzer offline sind.
Suche mit der Firestore Vector Search Extension verbessern
Die herkömmliche stichwortbasierte Suche kann bei komplexen Konzepten wie Yoga-Posen eingeschränkt sein. Ein Nutzer sucht möglicherweise nach einer Pose, die „die Hüften öffnet“ oder „das Gleichgewicht verbessert“, ohne den Namen der spezifischen Pose zu kennen. Hier kommt die Vektorsuche ins Spiel.
Mit der Vektorsuche in Firestore haben Sie folgende Möglichkeiten:
- Einbettungen generieren:Textbeschreibungen und in Zukunft möglicherweise auch Bilder und Audioinhalte in numerische Vektordarstellungen (Einbettungen) umwandeln, die ihre semantische Bedeutung mithilfe von Modellen wie denen in Vertex AI oder benutzerdefinierten Modellen erfassen.
- Embeddings speichern:Diese Embeddings werden direkt in Firestore-Dokumenten gespeichert.
- Ähnlichkeitssuche durchführen:Sie können Ihre Datenbank abfragen, um Dokumente zu finden, die semantisch einem bestimmten Abfragevektor ähneln. So wird die kontextbezogene Übereinstimmung ermöglicht.
Gemini 2.0 Flash (experimentell) einbinden
Gemini 2.0 Flash ist das innovative multimodale KI-Modell von Google. Diese Funktion befindet sich noch in der Testphase, bietet aber bereits spannende Möglichkeiten, unsere Yoga-App zu erweitern:
- Textgenerierung: Mit Gemini 2.0 Flash lassen sich detaillierte Beschreibungen von Yoga-Posen erstellen, einschließlich Vorteilen, Modifikationen und Kontraindikationen.
- Bilder erstellen (nachgestellt): Die direkte Bildgenerierung mit Gemini ist noch nicht öffentlich verfügbar. Ich habe sie mit Imagen von Google simuliert und Bilder erstellt, die die Posen visuell darstellen.
- Audiogenerierung (nachgesprochen): Ebenso können wir mit einem Text-to-Speech-Dienst (TTS) Audioanleitungen für jede Pose erstellen, die die Nutzer durch die Übungen führen.
Ich könnte vorschlagen, die App zu verbessern, indem die folgenden Funktionen des Modells verwendet werden:
- Multimodal Live API: Mit dieser neuen API können Sie Anwendungen für die Echtzeit-Bild- und Audio-Streaming-Technologie mithilfe von Tools erstellen.
- Geschwindigkeit und Leistung: Gemini 2.0 Flash hat eine deutlich verbesserte Time to First Token (TTFT) im Vergleich zu Gemini 1.5 Flash.
- Verbesserte Interaktion mit KI-Agenten: Gemini 2.0 bietet Verbesserungen beim multimodalen Verständnis, beim Programmieren, beim Befolgen komplexer Anweisungen und beim Aufrufen von Funktionen. Diese Verbesserungen tragen zusammen dazu bei, die Kundenbetreuung zu optimieren.
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 verwenden, um eine Google-Suche durchzuführen.
- 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 lernen Sie Folgendes:
- Firestore-Sammlung erstellen und Yoga-Dokumente laden
- CRUD-Anwendungen mit Firestore erstellen
- Beschreibungen für Yoga-Posen mit Gemini 2.0 Flash generieren
- Firebase Vector Search mit Firestore-Integration aktivieren
- Einbettungen aus Yogabeschreibungen generieren
- Ähnlichkeitssuche für Nutzersuchtext durchführen
Voraussetzungen
2. Hinweis
Projekt erstellen
- Wählen Sie in der Google Cloud Console auf der Seite der 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 bq bereits vorinstalliert hat. Klicken Sie oben in der Google Cloud Console auf „Cloud Shell aktivieren“.
- Nachdem Sie eine Verbindung zu Cloud Shell hergestellt haben, prüfen Sie mit dem folgenden Befehl, ob Sie bereits authentifiziert sind und das Projekt auf Ihre Projekt-ID festgelegt ist:
gcloud auth list
- Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob 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.
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
Alternativ können Sie in der Console nach den einzelnen Produkten suchen oder diesen Link verwenden.
Wenn eine API fehlt, können Sie sie jederzeit während der Implementierung aktivieren.
Weitere Informationen zu gcloud-Befehlen und deren Verwendung finden Sie in der Dokumentation.
3. Datenbank einrichten
In der Dokumentation finden Sie eine vollständige Anleitung zum Einrichten einer Firestore-Instanz. Im Groben gehe ich so vor:
1. Gehen Sie zum Firestore Viewer und wählen Sie auf dem Bildschirm „Datenbankdienst auswählen“ die Option „Firestore im nativen Modus“ aus.
- Speicherort für Firestore auswählen
- Klicken Sie auf „Datenbank erstellen“. Wenn Sie zum ersten Mal eine Datenbank erstellen, belassen Sie die Standardeinstellung „(default)“.
Wenn Sie ein Firestore-Projekt erstellen, wird auch die API im Cloud API Manager aktiviert.
- WICHTIG: Wählen Sie die TESTVERSION (nicht die PRODUKTIONSVERSION) der Sicherheitsregeln aus, damit auf die Daten zugegriffen werden kann.
- Nach der Einrichtung sollten Sie die Firestore-Datenbank, -Sammlung und -Dokumentansicht im nativen Modus sehen, wie im Bild unten dargestellt:
- Führen Sie diesen Schritt noch nicht aus. Zur Information: Sie können auf „Sammlung starten“ klicken und eine neue Sammlung erstellen. Legen Sie „poses“ als Sammlungs-ID fest. Klicken Sie auf die Schaltfläche Speichern.
Profitipps für die Produktionsanwendung:
- Sobald Sie Ihr Datenmodell fertiggestellt und festgelegt haben, wer auf verschiedene Arten von Dokumenten zugreifen darf, können Sie über die Firebase-Benutzeroberfläche Sicherheitsregeln erstellen, bearbeiten und überwachen. Sie können über diesen Link 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 oder einführen. Oft sind sie der Grund dafür, dass Ihre App anders funktioniert.
Für diese Demo verwenden wir den TEST-Modus.
4. Firestore REST API
- Die REST API kann für die folgenden Anwendungsfälle hilfreich sein:a. 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 der Anwendung von Firestore ist die Nutzung der nativen Clientbibliotheken. In manchen Situationen kann es aber sinnvoll sein, die REST API direkt aufzurufen.
- In diesem Blog werden die Verwendung und Demonstration von Firestore REST APIs und nicht nativer Clientbibliotheken gezeigt.
- 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 zu Authentifizierung und Autorisierung finden Sie in der Dokumentation.
- Alle REST API-Endpunkte sind unter der Basis-URL https://firestore.googleapis.com/v1/ verfügbar.
Spring Boot und Firestore API
Diese Lösung im Spring Boot Framework soll eine Clientanwendung demonstrieren, die mit Firestore APIs Yoga-Haltung und Atemdetails interaktiv erfasst und ändert.
Eine detaillierte Schritt-für-Schritt-Erläuterung der Firestore-CRUD-Lösung für die Yoga-Posen-App finden Sie in diesem Blogpost.
Wenn Sie sich auf die aktuelle Lösung konzentrieren und den CRUD-Teil unterwegs lernen möchten, können Sie die gesamte Lösung, die sich auf diesen Blog bezieht, aus dem unten stehenden Repository in Ihrem Cloud Shell-Terminal klonen und eine Kopie der Codebasis abrufen.
git clone https://github.com/AbiramiSukumaran/firestore-poserecommender
Hinweise:
- Nachdem Sie dieses Repository geklont haben, müssen Sie nur einige Änderungen an Ihrer Projekt-ID, Ihren APIs usw. vornehmen. Es sind keine weiteren Änderungen erforderlich, um Ihre Anwendung zum Laufen zu bringen. Die einzelnen Komponenten der Anwendung werden in den folgenden Abschnitten erläutert. Hier 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.java
alle Instanzen von<<YOUR_PROJECT_ID>>"
und den Datenbanknamen,
, in diesem Fall"(default)",
, durch die entsprechenden Werte aus Ihrer Konfiguration: - Ersetzen Sie in
src/main/java/com/example/demo/PoseController.java
das „[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 Ausführung Ihrer 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 Anwendung in Cloud Run bereitstellen möchten, müssen Sie im Cloud Shell-Editor eine brandneue Java Cloud Run-Anwendung von Grund auf neu erstellen und die Src- und Vorlagendateien aus dem repo Ihrem neuen Projekt in den entsprechenden Ordnern hinzufügen. Das aktuelle GitHub-Repository-Projekt ist nämlich nicht standardmäßig für die Cloud Run-Bereitstellungskonfiguration eingerichtet. Führen Sie in diesem Fall die folgenden Schritte aus, anstatt das vorhandene Repository zu klonen:
- Rufen Sie den Cloud Shell-Editor auf (der Editor muss geöffnet sein, nicht das Terminal) und klicken Sie links in der Statusleiste auf das Symbol für den Namen des Google Cloud-Projekts (der ausgegraute Bereich im Screenshot unten).
- Wählen Sie in der Liste „Neue Anwendung“ -> „Cloud Run-Anwendung“ -> „Java: Cloud Run“ aus und geben Sie den Namen „firestore-poserecommender“ ein.
- Jetzt sollte eine Full-Stack-Vorlage für die Java-Cloud Run-Anwendung angezeigt werden, die bereits konfiguriert 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 PROJEKT-ID und API-KEY durch die entsprechenden Werte zu ersetzen. (Schritte 1 a,b, c und d oben).
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 vordefinierten Daten beginnen möchten, können Sie die JSON-Datei kopieren und alle Vorkommen von „<<YOUR_PROJECT_ID>>“ durch Ihren Wert ersetzen.
- Rufen Sie Firestore Studio auf.
- Sie müssen eine Sammlung mit dem Namen „Posen“ erstellt haben.
- Dokumente aus der oben genannten Repository-Datei einzeln manuell hinzufügen
Alternativ können Sie die Daten in einem Durchlauf aus dem vordefinierten Datensatz importieren, den 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 ob Sie autorisiert sind. Erstellen Sie mit dem folgenden gsutil-Befehl einen Bucket in Ihrem Projekt. Ersetzen Sie im folgenden Befehl die Variable <PROJECT_ID> 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 Daten zum Importieren haben, können wir mit dem letzten Schritt fortfahren, bei dem die Daten in die von uns erstellte Firebase-Datenbank (default) importiert werden.
- Rufen Sie jetzt die Firestore Console auf und klicken Sie im Navigationsmenü links auf Importieren/Exportieren.
Wählen Sie „Importieren“ und den gerade erstellten Cloud Storage-Pfad aus. Rufen Sie die Datei „yoga_poses.overall_export_metadata“ auf:
- Klicken Sie auf "Importieren".
Der Import dauert einige Sekunden. Sobald er abgeschlossen ist, können Sie Ihre Firestore-Datenbank und die Sammlung validieren. Rufen Sie dazu https://console.cloud.google.com/firestore/databases auf und wählen Sie die Datenbank default und die Sammlung poses aus (siehe Abbildung unten):
- Alternativ können Sie die Einträge auch manuell über die Anwendung erstellen, nachdem Sie sie bereitgestellt haben. Verwenden Sie dazu die Aktion „Neue Pose erstellen“.
6. Vektorsuche
Firestore Vector Search Extension aktivieren
Mit dieser Erweiterung können Sie Ihre Firestore-Dokumente automatisch mit der neuen Vektorsuchfunktion einbetten und abfragen. Daraufhin gelangen Sie zum Firebase Extensions Hub.
Wenn Sie die Vector Search-Erweiterung installieren, geben Sie einen Sammlungs- und einen Dokumentfeldnamen an. Wenn Sie ein Dokument mit diesem Feld hinzufügen oder aktualisieren, wird mit dieser Erweiterung eine Vektor-Embedding für das Dokument berechnet. Diese Vektor-Embeddings werden in dasselbe Dokument zurückgeschrieben und das Dokument wird im Vektorspeicher indexiert, sodass es abgefragt werden kann.
So gehts:
Erweiterung installieren:
Installieren Sie die Erweiterung „Vector Search with Firestore“ über den Marketplace für Firebase-Erweiterungen. Klicken Sie dazu auf „In der Firebase Console installieren“.
WICHTIG:
Wenn Sie zum ersten Mal diese Seite mit Erweiterungen aufrufen, müssen Sie dasselbe Projekt auswählen, an dem Sie in der Google Cloud Console arbeiten, 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 dazu 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 eine Weile lang nicht reagiert, aktualisieren Sie sie einfach. Die APIs sollten dann aktiviert sein.
In einem der folgenden Schritte können Sie die 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: poses
Standardlimit für Suchanfragen: 3
Entfernungsmessung: Kosinus
Name des Eingabefelds: „posture“
Name des Ausgabefelds: embedding
Name des Statusfelds: status
Vorhandene Dokumente einbetten: Ja
Vorhandene Einbettungen aktualisieren: Ja
Cloud Functions-Speicherort: us-central1
Ereignisse aktivieren: nicht angeklickt
Klicken Sie nach der Einrichtung auf die Schaltfläche „Erweiterung installieren“. Das dauert 3 bis 5 Minuten.
Einbettungen generieren
Wenn Sie der Sammlung „Posen“ Dokumente hinzufügen oder aktualisieren, generiert die Erweiterung automatisch Einbettungen mit einem vortrainierten Modell oder einem Modell Ihrer Wahl über einen API-Endpunkt. In diesem Fall haben wir in der Erweiterungskonfiguration Vertex AI ausgewählt.
Indexerstellung
Es wird dann beim Einbetten in die Anwendung ein Index für das Feld „Embedding“ erstellt.
Firestore erstellt automatisch Indexe für einfache Abfragen. Sie können jedoch Firestore Indexsyntax generieren lassen, indem Sie Abfragen ausführen, die keinen Index haben. In der Fehlermeldung auf Anwendungsseite finden Sie dann einen Link zum generierten Index. 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"
Sobald ein Vektorindex erstellt wurde, können Sie mit Ihren Vektoreinbettungen eine Suche nach dem nächsten Nachbarn ausführen.
Wichtiger Hinweis:
Ab diesem Zeitpunkt müssen Sie keine Änderungen mehr an der Quelle vornehmen. Folgen Sie einfach der Anleitung, um zu verstehen, was die Anwendung tut.
Vektorsuche durchführen
Sehen wir uns an, wie die Vektorsuche in Ihrer neu erstellten Anwendung verwendet wird. Nachdem die Einbettungen gespeichert wurden, können Sie mit der VectorQuery-Klasse des Firestore Java SDK eine 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 am nächsten liegende Einbettung extrahiert.
7. Gemini 2.0 Flash
Gemini 2.0 Flash einbinden (für die Generierung von Beschreibungen)
Sehen wir uns an, wie Ihre neu erstellte Anwendung die Gemini 2.0 Flash-Integration für die Generierung von Beschreibungen verarbeitet.
Angenommen, ein Administrator oder Yogalehrer möchte die Details der Yoga-Posen mithilfe von Gemini 2.0 Flash eingeben und dann eine Suche durchführen, um die am besten passenden Ergebnisse zu sehen. Dadurch 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. Bild- und Audiogenerierung nachahmen
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 nachahmt. Stellen Sie sich vor, wie praktisch es ist, all das mit einem API-Aufruf an Gemini 2.0 Flash zu generieren.
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:
- Unser Modell auf tatsächliche Suchergebnisse stützen
- Relevante URLs extrahieren, auf die in der Suche verwiesen wird
8. Anwendung ausführen
Sehen wir uns die Funktionen Ihrer neu erstellten Java Spring Boot-Anwendung mit einer einfachen Thymeleaf-Weboberfläche an:
- Firestore-CRUD-Vorgänge (Erstellen, Lesen, Aktualisieren, Löschen)
- Keyword-Suche
- Kontexterstellung mithilfe generativer KI
- Kontextsuche (Vektorsuche)
- Multimodale Ausgabe, die sich auf die Suche bezieht
- Eigene Abfrage ausführen (Abfragen im Format „structuredQuery“)
Beispiel: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}
Alle bisher beschriebenen 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 das Programm 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:
Pose Recommender mit Firestore, Vector Search 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 gestartet und die Dateien nach Bedarf kopiert), führen Sie den folgenden Befehl im Cloud Shell-Terminal in Ihrem Projektverzeichnis aus:
gcloud run deploy --source .
Geben Sie den Namen der Anwendung und den Regionscode an (wählen Sie den Code für „us-central1“ aus) und wählen Sie „Ja“ für nicht authentifizierte Aufrufe aus. Sobald die Bereitstellung erfolgreich war, sollte der Anwendungsendpunkt im Terminal angezeigt werden.
9. Bereinigen
Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud-Konto die in diesem Beitrag verwendeten Ressourcen in Rechnung gestellt werden:
- Rufen Sie in der Google Cloud Console die Seite Ressourcen verwalten auf.
- 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 mit Firestore eine robuste und intelligente Anwendung zur Verwaltung von Yoga-Haltungen erstellt. Durch die Kombination der Leistungsfähigkeit von Firestore, der Vector Search Extension und der Funktionen von Gemini 2.0 Flash (mit simulierter Bild- und Audiogenerierung) haben wir eine wirklich ansprechende und informative Yoga-App entwickelt, mit der sich CRUD-Vorgänge implementieren, eine keywordbasierte Suche, eine kontextbezogene Vektorsuche und generierte Multimediainhalte ausführen lassen.
Dieser Ansatz ist nicht auf Yoga-Apps beschränkt. Mit der Weiterentwicklung von KI-Modellen wie Gemini werden die Möglichkeiten, noch immersivere und personalisiertere Nutzererfahrungen zu schaffen, immer größer. Bleiben Sie über die neuesten Entwicklungen und Dokumentationen von Google Cloud und Firebase auf dem Laufenden, um das volle Potenzial dieser Technologien zu nutzen.
Wenn ich diese App erweitern würde, würde ich mit Gemini 2.0 Flash zwei Dinge versuchen:
- Verwenden Sie die Multimodal Live API, um für den Anwendungsfall Echtzeit-Video- und Audiostreaming zu erstellen.
- Aktivieren Sie den Denkmodus, um die Gedanken hinter den Antworten für die Interaktion mit Echtzeitdaten zu generieren und die Simulation so realistischer zu gestalten.
Probiere es einfach aus und sende einen Pull-Request :>D!!!