1. Ringkasan
Di dunia aplikasi kesehatan dan kebugaran, memberikan pengalaman yang kaya dan menarik kepada pengguna adalah kuncinya. Untuk aplikasi Yoga, hal ini berarti tidak hanya memberikan deskripsi teks sederhana tentang pose, tetapi juga menawarkan informasi komprehensif, konten multimedia, dan kemampuan penelusuran cerdas. Dalam blog ini, kita akan mempelajari cara membuat database pose Yoga yang andal menggunakan Firestore Google Cloud, memanfaatkan Ekstensi Vector Search untuk pencocokan kontekstual, dan mengintegrasikan kecanggihan Flash Gemini 2.0 (Eksperimental) untuk menangani konten multi-modal.
Mengapa Firestore?
Firestore, database dokumen NoSQL serverless Google Cloud, adalah pilihan yang sangat baik untuk membuat aplikasi yang skalabel dan dinamis. Berikut alasan mengapa ini sangat cocok untuk aplikasi Yoga:
- Skalabilitas dan Performa: Firestore otomatis diskalakan untuk menangani jutaan pengguna dan set data besar, sehingga memastikan aplikasi Anda tetap responsif meskipun terus berkembang.
- Pembaruan Real-time: Sinkronisasi real-time bawaan membuat data tetap konsisten di semua klien yang terhubung, sehingga sangat cocok untuk fitur seperti kelas live atau latihan kolaboratif.
- Model Data Fleksibel: Struktur berbasis dokumen Firestore memungkinkan Anda menyimpan berbagai jenis data, termasuk teks, gambar, dan bahkan penyematan, sehingga ideal untuk merepresentasikan informasi pose Yoga yang kompleks.
- Kueri yang Efisien: Firestore mendukung kueri kompleks, termasuk kesetaraan, ketidaksetaraan, dan sekarang, dengan ekstensi baru, penelusuran kemiripan vektor.
- Dukungan Offline: Firestore menyimpan data ke dalam cache secara lokal, sehingga aplikasi Anda dapat berfungsi meskipun pengguna sedang offline.
Meningkatkan Penelusuran dengan Ekstensi Penelusuran Vektor Firestore
Penelusuran berbasis kata kunci tradisional dapat membatasi saat menangani konsep yang kompleks seperti postur Yoga. Pengguna mungkin menelusuri pose yang "membuka pinggul" atau "meningkatkan keseimbangan" tanpa mengetahui nama pose tertentu. Di sinilah Penelusuran Vektor berperan.
Penelusuran Vektor dengan Firestore memungkinkan Anda:
- Buat Embedding: Mengubah deskripsi teks, dan pada masa mendatang berpotensi gambar dan audio, menjadi representasi vektor numerik (embedding) yang menangkap makna semantiknya menggunakan model seperti yang tersedia di Vertex AI atau model kustom.
- Simpan Embedding: Simpan embedding ini langsung di dokumen Firestore.
- Melakukan Penelusuran Kemiripan: Buat kueri database untuk menemukan dokumen yang secara semantik mirip dengan vektor kueri tertentu, sehingga memungkinkan pencocokan kontekstual.
Mengintegrasikan Gemini 2.0 Flash (Eksperimental)
Gemini 2.0 Flash adalah model AI multimodal canggih Google. Meskipun masih bersifat eksperimental, fitur ini menawarkan kemungkinan menarik untuk memperkaya aplikasi Yoga kami:
- Pembuatan Teks: Gunakan Gemini 2.0 Flash untuk membuat deskripsi mendetail tentang pose Yoga, termasuk manfaat, modifikasi, dan kontraindikasi.
- Pembuatan Gambar (Ditiru): Meskipun pembuatan gambar langsung dengan Gemini belum tersedia secara publik, saya telah menyimulasikannya menggunakan Imagen Google, yang menghasilkan gambar yang secara visual mewakili pose.
- Pembuatan Audio (Ditiru): Demikian pula, kita dapat menggunakan layanan Text-to-Speech (TTS) untuk membuat petunjuk audio untuk setiap pose, yang memandu pengguna melalui latihan.
Secara potensial, saya membayangkan mengusulkan integrasi untuk meningkatkan aplikasi agar dapat menggunakan fitur model berikut:
- Multimodal Live API: API baru ini membantu Anda membuat aplikasi streaming audio dan visual secara real-time dengan penggunaan alat.
- Kecepatan dan performa: Gemini 2.0 Flash memiliki waktu untuk token pertama (TTFT) yang jauh lebih baik dibandingkan Gemini 1.5 Flash.
- Pengalaman agen yang ditingkatkan: Gemini 2.0 memberikan peningkatan pada pemahaman multimodal, coding, mengikuti petunjuk yang kompleks, dan pemanggilan fungsi. Peningkatan ini bekerja sama untuk mendukung pengalaman agen yang lebih baik.
Untuk mengetahui detail selengkapnya, lihat halaman%20dokumentasi ini%20di%20Flash%20Gemini%201.5).
Perujukan dengan Google Penelusuran
Untuk meningkatkan kredibilitas dan memberikan referensi lebih lanjut, kita dapat mengintegrasikan Google Penelusuran untuk memperkuat informasi yang diberikan oleh aplikasi kita. Artinya:
- Penelusuran Kontekstual: Saat pengguna admin memasukkan detail untuk pose, kami dapat menggunakan nama pose untuk melakukan Google Penelusuran.
- Ekstraksi URL: Dari hasil penelusuran, kami dapat mengekstrak URL yang relevan, seperti artikel, video, atau situs Yoga yang kredibel, dan menampilkannya dalam aplikasi.
Yang akan Anda build
Sebagai bagian dari lab ini, Anda akan:
- Membuat koleksi Firestore dan memuat dokumen Yoga
- Pelajari cara membuat aplikasi CRUD dengan Firestore
- Membuat deskripsi pose Yoga dengan Gemini 2.0 Flash
- Mengaktifkan Firebase Vector Search dengan Integrasi Firestore
- Membuat embedding dari deskripsi Yoga
- Melakukan penelusuran kemiripan untuk teks penelusuran pengguna
Persyaratan
2. Sebelum memulai
Membuat project
- Di Konsol Google Cloud, di halaman pemilih project, pilih atau buat project Google Cloud.
- Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project .
- Anda akan menggunakan Cloud Shell, lingkungan command line yang berjalan di Google Cloud yang telah dilengkapi dengan bq. Klik Aktifkan Cloud Shell di bagian atas konsol Google Cloud.
- Setelah terhubung ke Cloud Shell, Anda akan memeriksa bahwa Anda sudah diautentikasi dan project ditetapkan ke project ID Anda menggunakan perintah berikut:
gcloud auth list
- Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda.
gcloud config list project
- Jika project Anda belum ditetapkan, gunakan perintah berikut untuk menetapkannya:
gcloud config set project <YOUR_PROJECT_ID>
- Mengaktifkan API yang diperlukan.
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
Alternatif untuk perintah gcloud adalah melalui konsol dengan menelusuri setiap produk atau menggunakan link ini.
Jika ada API yang terlewat, Anda dapat mengaktifkannya kapan saja selama proses penerapan.
Baca dokumentasi untuk mempelajari perintah gcloud dan penggunaannya.
3. Penyiapan database
Dokumentasi ini memiliki langkah yang lebih lengkap tentang cara menyiapkan instance Firestore. Pada tingkat tinggi, untuk memulai, saya akan mengikuti langkah-langkah berikut:
1 Buka Firestore Viewer dan dari layar Select a database service, pilih Firestore dalam mode Native
- Memilih lokasi untuk Firestore
- Klik Buat Database (jika ini adalah pertama kalinya, biarkan sebagai database "(default)")
Saat Anda membuat project Firestore, API di Pengelola Cloud API juga akan aktif
- PENTING: Pilih versi Aturan Keamanan UJI (bukan PRODUKSI) agar data dapat diakses
- Setelah disiapkan, Anda akan melihat tampilan Database, Koleksi, dan Dokumen Firestore dalam mode Native seperti yang terlihat pada gambar di bawah:
- Jangan lakukan langkah ini dulu, tetapi sebagai catatan, Anda dapat mengklik "Mulai Koleksi" dan membuat koleksi baru. Tetapkan ID Koleksi sebagai "pose". Klik tombol Simpan.
Tips pro untuk aplikasi produksi:
- Setelah menyelesaikan model data dan mengidentifikasi siapa yang seharusnya dapat mengakses berbagai jenis dokumen, Anda dapat membuat, mengedit, dan memantau Aturan Keamanan dari antarmuka Firebase. Anda dapat mengakses Aturan Keamanan dari link ini: https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
- Pastikan untuk mengedit, memantau, dan menguji aturan keamanan Anda sebelum men-deploy / meluncurkan project dari fase pengembangan karena sering kali aturan keamanan menjadi penyebab utama aplikasi Anda berfungsi secara berbeda :)
Untuk demo ini, kita akan menggunakannya dalam mode UJI.
4. REST API Firestore
- REST API berguna untuk kasus penggunaan berikut:a. Mengakses Firestore dari lingkungan resource yang terbatas tempat tidak bisa dijalankannya library klien secara menyeluruh. Mengotomatiskan administrasi database atau mengambil metadata database yang terperinci
- Cara termudah untuk menggunakan Firestore adalah dengan menggunakan salah satu library klien native, namun ada beberapa situasi di mana kita sebaiknya memanggil REST API secara langsung
- Dalam cakupan blog ini, Anda akan melihat penggunaan dan demonstrasi Firestore REST API, bukan library klien native
- Untuk autentikasi, Firestore REST API menerima token ID Firebase Authentication atau token Google Identity OAuth 2.0. Untuk informasi selengkapnya tentang topik Autentikasi dan Otorisasi, lihat dokumentasi.
- Semua endpoint REST API ada di bagian URL dasar https://firestore.googleapis.com/v1/.
Spring Boot dan Firestore API
Solusi ini di Framework Spring Boot adalah untuk mendemonstrasikan aplikasi klien yang menggunakan Firestore API untuk mengumpulkan dan mengubah detail postur dan napas Yoga dengan pengalaman interaktif pengguna.
Untuk penjelasan langkah demi langkah yang mendetail tentang bagian solusi CRUD Firestore dari aplikasi postur Yoga, Anda dapat membuka link blog.
Untuk berfokus pada solusi saat ini dan mempelajari bagian CRUD kapan saja, clone seluruh solusi yang difokuskan pada blog ini dari repositori di bawah dari Terminal Cloud Shell Anda dan dapatkan salinan codebase.
git clone https://github.com/AbiramiSukumaran/firestore-poserecommender
Perhatikan:
- Setelah meng-clone repo ini, Anda hanya perlu melakukan beberapa perubahan pada Project ID, API, dll. Tidak ada perubahan lain yang diperlukan untuk menyiapkan dan menjalankan aplikasi Anda. Setiap komponen aplikasi dijelaskan di bagian mendatang. Berikut adalah daftar perubahannya:
- Di file
src/main/java/com/example/demo/GenerateImageSample.java
, ganti "<<YOUR_PROJECT_ID>>" dengan project ID Anda - Di file
src/main/java/com/example/demo/GenerateEmbeddings.java
, ganti "<<YOUR_PROJECT_ID>>" dengan project ID Anda - Di
src/main/java/com/example/demo/PoseController.java
, ganti semua instance "<<YOUR_PROJECT_ID>>"
dan nama database,
dalam hal ini"(default)",
dengan nilai yang sesuai dari konfigurasi Anda: - Di
src/main/java/com/example/demo/PoseController.java
, ganti "[YOUR_API_KEY]
" dengan KUNCI API Anda untuk Gemini 2.0 Flash. Anda bisa mendapatkannya dari AI Studio. - Jika Anda ingin menguji secara lokal, jalankan perintah berikut dari folder project di Terminal Cloud Shell:
mvn package
mvn spring-boot:run
Saat ini, Anda dapat melihat aplikasi yang berjalan dengan mengklik opsi "web preview" dari Terminal Cloud Shell. Kita belum siap untuk melakukan pengujian dan mencoba aplikasi.
- Opsional: Jika ingin men-deploy aplikasi di Cloud Run, Anda harus mem-bootstrap aplikasi Java Cloud Run baru dari awal dari Cloud Shell Editor, dan menambahkan file src dan file template dari repo ke project baru Anda di folder masing-masing (karena project repositori github saat ini tidak disiapkan secara default untuk konfigurasi deployment Cloud Run). Berikut adalah langkah-langkah yang harus diikuti, dalam hal ini (bukan meng-clone repo yang ada):
- Buka Cloud Shell Editor (Pastikan Editor terbuka, bukan terminal), klik ikon nama Project Google Cloud di sisi kiri status bar (bagian yang diblokir dalam screenshot di bawah)
- Pilih Aplikasi baru -> Aplikasi Cloud Run -> Java: Cloud Run dari daftar pilihan dan beri nama "firestore-poserecommender"
- Sekarang Anda akan melihat template stack lengkap untuk Aplikasi Cloud Run Java, yang telah dikonfigurasi sebelumnya dan siap digunakan
- Hapus class Controller yang ada dan salin file berikut ke folder masing-masing dalam struktur project:
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
- Anda perlu melakukan perubahan pada file yang sesuai untuk mengganti PROJECT ID dan API KEY dengan nilai masing-masing. (langkah 1 a, b, c, dan d di atas).
5. Penyerapan Data
Data untuk aplikasi tersedia dalam file data.json ini: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json
Jika ingin memulai dengan beberapa data yang telah ditentukan, Anda dapat menyalin JSON dan mengganti semua kemunculan "<<YOUR_PROJECT_ID>>" dengan nilai Anda
- Buka Firestore Studio
- Pastikan Anda telah membuat koleksi bernama "poses"
- Tambahkan dokumen dari file repo yang disebutkan di atas secara manual satu per satu
Atau, Anda dapat mengimpor data sekaligus dari set standar yang telah kami buat untuk Anda dengan menjalankan langkah-langkah berikut:
- Buka Terminal Cloud Shell dan pastikan project Google Cloud aktif Anda telah ditetapkan dan pastikan Anda diberi otorisasi. Buat bucket di project Anda dengan perintah gsutil yang diberikan di bawah. Ganti variabel <PROJECT_ID> dalam perintah di bawah dengan Project ID Google Cloud Anda:
gsutil mb -l us gs://<PROJECT_ID>-yoga-poses-bucket
- Setelah bucket dibuat, kita perlu menyalin ekspor database yang telah kita siapkan ke bucket ini, sebelum dapat mengimpornya ke database Firebase. Gunakan perintah yang diberikan di bawah:
gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs://<PROJECT_ID>-yoga-poses-bucket
Setelah memiliki data yang akan diimpor, kita dapat melanjutkan ke langkah terakhir untuk mengimpor data ke database Firebase (default) yang telah kita buat.
- Buka konsol Firestore sekarang dan klik Import/Export dari menu navigasi di sebelah kiri.
Pilih Impor, lalu pilih jalur Cloud Storage yang baru saja Anda buat dan jelajahi hingga Anda dapat memilih file "yoga_poses.overall_export_metadata":
- Klik Impor.
Pengimporan akan memerlukan waktu beberapa detik dan setelah siap, Anda dapat memvalidasi database Firestore dan koleksi dengan membuka https://console.cloud.google.com/firestore/databases, memilih database default dan koleksi poses seperti yang ditunjukkan di bawah:
- Metode lainnya adalah Anda juga dapat membuat data secara manual melalui aplikasi setelah men-deploy menggunakan tindakan "Buat Pose Baru".
6. Vector Search
Mengaktifkan Ekstensi Penelusuran Vektor Firestore
Gunakan ekstensi ini untuk secara otomatis menyematkan dan membuat kueri dokumen Firestore dengan fitur penelusuran vektor baru. Tindakan ini akan mengarahkan Anda ke Firebase Extensions Hub.
Saat menginstal ekstensi Penelusuran Vektor, Anda menentukan koleksi dan nama kolom dokumen. Menambahkan atau memperbarui dokumen dengan kolom ini akan memicu ekstensi ini untuk menghitung penyematan vektor untuk dokumen. Penyematan vektor ini ditulis kembali ke dokumen yang sama, dan dokumen diindeks di penyimpanan vektor, siap dikueri.
Mari kita pelajari langkah-langkahnya:
Instal Ekstensi:
Instal ekstensi "Vector Search with Firestore" dari Firebase Extensions Marketplace dengan mengklik "Install in Firebase Console".
PENTING:
Saat pertama kali membuka halaman ekstensi ini, Anda harus memilih project yang sama dengan yang sedang Anda kerjakan di konsol Google Cloud yang tercantum di Firebase console.
Jika project Anda tidak tercantum, lanjutkan dan tambahkan project di Firebase (pilih project Google Cloud yang ada dari daftar).
Mengonfigurasi Ekstensi:
Tentukan koleksi ("poses"), kolom yang berisi teks yang akan disematkan ("posture"), dan parameter lainnya seperti dimensi penyematan.
Jika ada API yang perlu diaktifkan yang tercantum dalam langkah ini, halaman konfigurasi akan memungkinkan Anda melakukannya. Ikuti langkah-langkahnya dengan benar.
Jika halaman tidak merespons setelah mengaktifkan API selama beberapa saat, cukup muat ulang dan Anda akan dapat melihat API yang diaktifkan.
Pada salah satu langkah berikut, Anda dapat menggunakan LLM pilihan Anda untuk membuat penyematan. Pilih "Vertex AI".
Beberapa setelan berikutnya terkait dengan koleksi dan kolom yang ingin disematkan:
LLM: Vertex AI
Jalur koleksi: pose
Batas kueri default: 3
Pengukuran jarak: Kosinus
Nama kolom input: postur
Nama kolom output: penyematan
Nama kolom status: status
Menyematkan dokumen yang ada: Ya
Memperbarui penyematan yang ada: Ya
Lokasi Cloud Functions: us-central1
Enable Events: Tidak dicentang
Setelah semua ini disiapkan, klik tombol Instal Ekstensi. Proses ini memerlukan waktu 3 - 5 menit.
Buat Embedding:
Saat Anda menambahkan atau memperbarui dokumen dalam koleksi "poses", ekstensi akan otomatis membuat penyematan menggunakan model terlatih atau model pilihan Anda melalui endpoint API. Dalam hal ini, kita telah memilih Vertex AI di konfigurasi ekstensi.
Pembuatan Indeks
Tindakan ini akan mewajibkan pembuatan Indeks di kolom penyematan pada saat penggunaan penyematan di aplikasi.
Firestore otomatis membuat indeks untuk kueri dasar; namun, Anda dapat mengizinkan Firestore membuat sintaksis indeks dengan menjalankan kueri yang tidak memiliki indeks, dan Firestore akan memberikan link ke indeks yang dibuat dalam pesan error di sisi aplikasi. Berikut adalah daftar langkah-langkah untuk membuat indeks vektor:
- Buka Terminal Cloud Shell
- Jalankan perintah berikut:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"
Baca selengkapnya di sini.
Setelah indeks vektor dibuat, Anda dapat melakukan penelusuran tetangga terdekat dengan embedding vektor.
Catatan Penting:
Mulai saat ini, Anda tidak perlu melakukan perubahan apa pun pada sumber. Cukup ikuti untuk memahami apa yang dilakukan aplikasi.
Melakukan Vector Search
Mari kita lihat cara aplikasi yang baru Anda buat mendekati Vector Search. Setelah embedding disimpan, Anda dapat menggunakan class VectorQuery dari Firestore Java SDK untuk melakukan Vector Search dan mendapatkan hasil tetangga terdekat:
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();
Cuplikan ini membandingkan penyematan teks penelusuran pengguna dengan penyematan dokumen di Firestore dan mengekstrak dokumen yang paling dekat secara kontekstual.
7. Gemini 2.0 Flash
Mengintegrasikan Gemini 2.0 Flash (untuk pembuatan deskripsi)
Mari kita lihat cara aplikasi yang baru Anda buat menangani integrasi Gemini 2.0 Flash untuk pembuatan deskripsi.
Sekarang, misalkan pengguna admin / instruktur Yoga ingin memasukkan detail pose dengan bantuan Gemini 2.0 Flash, lalu melakukan penelusuran untuk melihat kecocokan terdekat. Hal ini menghasilkan ekstraksi detail pose yang cocok beserta objek multimodal yang mendukung hasilnya.
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. Meniru Pembuatan Gambar dan Audio
Gemini 2.0 Flash Experimental mampu menghasilkan hasil multimodal, tetapi saya belum mendaftar untuk akses awal sehingga saya telah meniru output gambar dan audio dengan Imagen dan TTS API. Bayangkan betapa hebatnya mendapatkan semua ini yang dihasilkan dengan satu panggilan API ke 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. Perujukan dengan Google Penelusuran:
Jika memeriksa kode pemanggilan Gemini di langkah 6, Anda akan melihat cuplikan kode berikut untuk mengaktifkan perujukan Google Penelusuran untuk respons LLM:
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
Hal ini untuk memastikan bahwa kami:
- Mendasari model kami pada hasil penelusuran yang sebenarnya
- Mengekstrak URL relevan yang dirujuk dalam penelusuran
8. Menjalankan Aplikasi
Mari kita lihat semua kemampuan aplikasi Java Spring Boot yang baru Anda buat dengan antarmuka web Thymeleaf sederhana:
- Operasi CRUD Firestore (Create, Read, Update, Delete)
- Penelusuran Kata Kunci
- Pembuatan Konteks Berbasis AI Generatif
- Penelusuran Kontekstual (Vector Search)
- Output multimodal yang terkait dengan penelusuran
- Menjalankan Kueri Sendiri (Kueri dalam format structuredQuery)
{"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}
Semua fitur yang telah dibahas sejauh ini adalah bagian dari aplikasi yang baru saja Anda buat dari repo: https://github.com/AbiramiSukumaran/firestore-poserecommender
Untuk mem-build, menjalankan, dan men-deploynya, jalankan perintah berikut dari Terminal Cloud Shell:
mvn package
mvn spring-boot:run
Anda akan melihat hasilnya dan dapat mencoba fitur aplikasi. Tonton video di bawah untuk melihat demo output:
Pose Recommender dengan Firestore, Vector Search, dan Gemini 2.0 Flash
Langkah Opsional:
Untuk men-deploynya di Cloud Run (dengan asumsi bahwa Anda telah mem-bootstrap aplikasi baru dengan Dockerfile dan menyalin file sesuai kebutuhan), jalankan perintah berikut dari Terminal Cloud Shell dari dalam direktori project Anda:
gcloud run deploy --source .
Berikan nama aplikasi, kode region (pilih kode untuk us-central1), dan pilih pemanggilan yang tidak diautentikasi "Y" seperti yang diminta. Anda akan menerima endpoint aplikasi di terminal setelah deployment berhasil.
9. Pembersihan
Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam postingan ini, ikuti langkah-langkah berikut:
- Di konsol Google Cloud, buka halaman Manage resources.
- Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
10. Selamat
Selamat! Anda telah berhasil menggunakan Firestore untuk membuat aplikasi pengelolaan postur Yoga yang andal dan cerdas. Dengan menggabungkan kecanggihan Firestore, Ekstensi Penelusuran Vektor, dan kemampuan Gemini 2.0 Flash (dengan simulasi pembuatan gambar dan audio), kami telah membuat aplikasi Yoga yang benar-benar menarik dan informatif untuk menerapkan operasi CRUD, melakukan penelusuran berbasis kata kunci, penelusuran vektor kontekstual, dan konten multimedia yang dihasilkan.
Pendekatan ini tidak terbatas pada aplikasi Yoga. Seiring model AI seperti Gemini terus berkembang, kemungkinan untuk menciptakan pengalaman pengguna yang lebih imersif dan dipersonalisasi akan semakin besar. Jangan lupa untuk terus mendapatkan info terbaru tentang pengembangan dan dokumentasi terbaru dari Google Cloud dan Firebase untuk memanfaatkan potensi penuh teknologi ini.
Jika saya ingin memperluas aplikasi ini, saya akan mencoba melakukan dua hal dengan Gemini 2.0 Flash:
- Gunakan Multimodal Live API dengan membuat streaming audio dan visual secara real-time untuk kasus penggunaan.
- Gunakan Mode Pemikiran untuk menghasilkan pemikiran di balik respons untuk interaksi dengan data real-time agar pengalamannya lebih nyata.
Jangan ragu untuk mencobanya dan mengirimkan permintaan pull :>D!!!