Buat aplikasi perekomendasikan Pose Yoga kontekstual dengan Firestore, Vector Search, dan Gemini 2.0 (versi Java)!

1. Ringkasan

Di dunia aplikasi kesehatan dan kebugaran, memberikan pengalaman yang kaya dan menarik kepada pengguna adalah hal yang penting. Untuk aplikasi Yoga, hal ini berarti melampaui deskripsi teks sederhana tentang pose dan 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 Penelusuran Vektornya untuk pencocokan kontekstual, dan mengintegrasikan kecanggihan Gemini 2.0 Flash (Eksperimental) untuk menangani konten multimodal.

Mengapa Firestore?

Firestore, database dokumen NoSQL serverless Google Cloud, adalah pilihan yang sangat baik untuk membangun aplikasi yang skalabel dan dinamis. Berikut alasan mengapa fitur ini cocok untuk aplikasi Yoga kami:

  • Skalabilitas dan Performa: Firestore otomatis diskalakan untuk menangani jutaan pengguna dan set data besar, sehingga memastikan aplikasi Anda tetap responsif meskipun berkembang.
  • Pembaruan Real-time: Sinkronisasi real-time bawaan menjaga konsistensi data di semua klien yang terhubung, sehingga cocok untuk fitur seperti kelas live atau latihan kolaboratif.
  • Model Data yang Fleksibel: Struktur berbasis dokumen Firestore memungkinkan Anda menyimpan berbagai jenis data, termasuk teks, gambar, dan bahkan embedding, sehingga ideal untuk merepresentasikan informasi pose Yoga yang kompleks.
  • Kueri yang Canggih: Firestore mendukung kueri kompleks, termasuk kesetaraan, ketidaksamaan, dan kini, 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 Kualitas Penelusuran dengan Ekstensi Penelusuran Vektor Firestore

Penelusuran berbasis kata kunci tradisional dapat membatasi saat menangani konsep yang kompleks seperti pose Yoga. Pengguna dapat menelusuri pose yang "membuka pinggul" atau "meningkatkan keseimbangan" tanpa mengetahui nama pose tertentu. Di sinilah Penelusuran Vektor berperan.

Dengan Penelusuran Vektor dengan Firestore, Anda dapat:

  • Membuat Embedding: Mengubah deskripsi teks, dan pada masa mendatang mungkin juga gambar dan audio, menjadi representasi vektor numerik (embedding) yang menangkap makna semantiknya menggunakan model seperti yang tersedia di Vertex AI atau model kustom.
  • Menyimpan Embedding: Simpan embedding ini langsung di dokumen Firestore.
  • Melakukan Penelusuran Kemiripan: Kueri database Anda 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 dari Google. Meskipun masih dalam tahap 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, dengan membuat gambar yang secara visual merepresentasikan pose tersebut.
  • Pembuatan Audio (Ditiru): Demikian pula, kita dapat menggunakan layanan Text-to-Speech (TTS) untuk membuat petunjuk audio untuk setiap pose, yang memandu pengguna selama latihan.

Saya berencana mengusulkan integrasi untuk meningkatkan kualitas 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 agentic yang lebih baik: Gemini 2.0 memberikan peningkatan pada pemahaman multimodal, coding, mengikuti petunjuk yang kompleks, dan panggilan fungsi. Peningkatan ini bekerja sama untuk mendukung pengalaman agen yang lebih baik.

Untuk mengetahui detail selengkapnya, lihat halaman dokumentasi ini (tentang Gemini 1.5 Flash).

Untuk meningkatkan kredibilitas dan menyediakan referensi lebih lanjut, kita dapat mengintegrasikan Google Penelusuran untuk merujuk informasi yang diberikan oleh aplikasi kita. Artinya:

  • Penelusuran Kontekstual: Saat pengguna admin memasukkan detail pose, kita 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 bereputasi baik, dan menampilkannya dalam aplikasi.

Yang akan Anda build

Sebagai bagian dari lab ini, Anda akan:

  1. Buat koleksi Firestore dan muat dokumen Yoga
  2. Pelajari cara membuat aplikasi CRUD dengan Firestore
  3. Membuat deskripsi pose Yoga dengan Gemini 2.0 Flash
  4. Mengaktifkan Integrasi Firebase Vector Search dengan Firestore
  5. Membuat embedding dari deskripsi Yoga
  6. Melakukan penelusuran kemiripan untuk teks penelusuran pengguna

Persyaratan

  • Browser, seperti Chrome atau Firefox
  • Project Google Cloud yang mengaktifkan penagihan.

2. Sebelum memulai

Membuat project

  1. Di Konsol Google Cloud, di halaman pemilih project, pilih atau buat project Google Cloud.
  2. Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project .
  3. Anda akan menggunakan Cloud Shell, lingkungan command line yang berjalan di Google Cloud yang telah dilengkapi dengan bq. Klik Activate Cloud Shell di bagian atas konsol Google Cloud.

Gambar tombol Activate Cloud Shell

  1. Setelah terhubung ke Cloud Shell, Anda dapat memeriksa bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda menggunakan perintah berikut:
gcloud auth list
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda.
gcloud config list project
  1. Jika project Anda belum ditetapkan, gunakan perintah berikut untuk menetapkannya:
gcloud config set project <YOUR_PROJECT_ID>
  1. Aktifkan API yang diperlukan dengan mengikuti link ini hingga Anda dapat mengklik tombol "Aktifkan".

Jika ada API yang terlewat, Anda dapat mengaktifkannya selama proses penerapan.

Baca dokumentasi untuk mempelajari perintah gcloud dan penggunaannya.

3. Penyiapan database

Dokumentasi memiliki langkah-langkah yang lebih lengkap tentang cara menyiapkan instance Firestore. Pada tingkat yang tinggi, untuk memulai, saya akan mengikuti langkah-langkah berikut:

1 Buka Firestore Viewer dan dari layar Select a database service, pilih Firestore in Native mode

  1. Pilih lokasi untuk Firestore Anda (Pastikan untuk memilih us-central1 dan ikuti ini di mana pun Anda memilih region / lokasi di seluruh codelab ini)
  2. Klik Buat Database (jika ini adalah pertama kalinya, biarkan sebagai database "(default)")

Saat Anda membuat project Firestore, API di Pengelola Cloud API juga akan diaktifkan

  1. PENTING: Pilih versi TEST (bukan PRODUCTION) dari Aturan Keamanan agar data dapat diakses
  2. Setelah disiapkan, Anda akan melihat tampilan Database, Koleksi, dan Dokumen Firestore dalam mode Native seperti yang terlihat pada gambar di bawah:

f7136d53253c59a.png

  1. Jangan lakukan langkah ini dulu, tetapi untuk catatan - Anda dapat mengklik "Mulai Koleksi" dan membuat koleksi baru. Tetapkan ID Koleksi sebagai "poses". Klik tombol Simpan.

a26eb470aa9bfda9.png

Tips profesional untuk aplikasi produksi:

  1. Setelah menyelesaikan model data dan mengidentifikasi siapa yang harus 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
  2. Pastikan untuk mengedit, memantau, dan menguji aturan keamanan Anda sebelum men-deploy / meluncurkan project dari fase pengembangan karena sering kali menjadi penyebab tersembunyi mengapa aplikasi Anda berfungsi secara berbeda :)

Untuk demo ini, kita akan menggunakannya dalam mode TEST.

4. REST API Firestore

  1. REST API dapat berguna untuk kasus penggunaan berikut:a. Mengakses Firestore dari lingkungan resource yang terbatas tempat tidak bisa dijalankannya library klien secara menyeluruh. Mengotomatisasi administrasi database atau mengambil metadata database yang terperinci
  2. Cara termudah untuk menggunakan Firestore adalah dengan menggunakan salah satu library native client, namun ada beberapa situasi di mana kita sebaiknya memanggil REST API secara langsung
  3. Dalam cakupan blog ini, Anda akan melihat penggunaan dan demonstrasi Firestore REST API, bukan library klien native
  4. Untuk autentikasi, Firestore REST API menerima token ID Firebase Authentication atau token Google Identity OAuth 2.0. Untuk mengetahui informasi selengkapnya tentang topik Autentikasi dan Otorisasi, lihat dokumentasi.
  5. Semua endpoint REST API ada di bagian URL dasar https://firestore.googleapis.com/v1/.

Spring Boot dan Firestore API

Solusi dalam Spring Boot Framework ini 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 solusi CRUD Firestore sebagai bagian dari aplikasi Yoga poses, Anda dapat membuka link blog.

Untuk berfokus pada solusi saat ini dan mempelajari bagian CRUD saat bepergian, clone seluruh solusi yang berfokus 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:

  1. Setelah meng-clone repo ini, Anda hanya perlu melakukan beberapa perubahan terkait Project ID, API, dll. Tidak ada perubahan lain yang diperlukan untuk membuat aplikasi Anda berjalan. Setiap komponen aplikasi dijelaskan di bagian selanjutnya. Berikut daftar perubahannya:
  2. Di file src/main/java/com/example/demo/GenerateImageSample.java, ganti "<<YOUR_PROJECT_ID>>" dengan project ID Anda
  3. Di file src/main/java/com/example/demo/GenerateEmbeddings.java, ganti "<<YOUR_PROJECT_ID>>" dengan project ID Anda
  4. Di src/main/java/com/example/demo/PoseController.java, ganti semua instance "<<YOUR_PROJECT_ID>>" dan nama database, dalam kasus ini "(default)", dengan nilai yang sesuai dari konfigurasi Anda:
  5. 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.
  6. Jika Anda ingin melakukan pengujian 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 sedang berjalan dengan mengklik opsi "web preview" dari Cloud Shell Terminal. Kita belum siap melakukan pengujian dan mencoba aplikasi.

  1. Opsional: Jika ingin men-deploy aplikasi di Cloud Run, Anda harus mem-bootstrap aplikasi Java Cloud Run yang 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 repo GitHub saat ini tidak disiapkan secara default untuk konfigurasi deployment Cloud Run). Berikut adalah langkah-langkah yang harus diikuti dalam kasus tersebut (bukan meng-clone repo yang ada):
  2. 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)

d3f0de417094237d.png

  1. Pilih New application -> Cloud Run Application -> Java: Cloud Run dari daftar pilihan dan beri nama "firestore-poserecommender"

d5ef8b4ca8bf3f85.png

  1. Sekarang Anda akan melihat template stack lengkap untuk Aplikasi Cloud Run Java, yang telah dikonfigurasi sebelumnya dan siap digunakan
  2. Hapus class Pengontrol yang ada dan salin file berikut ke dalam folder masing-masing dalam struktur project:

firestore-poserecommender/src/main/java/com/example/demo/

  1. FirestoreSampleApplication.java
  2. GenerateEmbeddings.java
  3. GenerateImageSample.java
  4. Pose.java
  5. PoseController.java
  6. ServletInitializer.java
             firestore-poserecommender/src/main/resources/static/
    
  7. Index.html

firestore-poserecommender/src/main/resources/templates/

  1. contextsearch.html
  2. createpose.html
  3. errmessage.html
  4. pose.html
  5. ryoq.html
  6. searchpose.html
  7. showmessage.html

firestore-poserecommender/

  1. Dockerfile
  2. Anda harus 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 sebelumnya, 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 yang telah ditentukan sebelumnya yang telah kami buat untuk Anda dengan menjalankan langkah-langkah berikut:

  1. Buka Cloud Shell Terminal, pastikan project Google Cloud aktif Anda telah disetel dan pastikan Anda memiliki 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

  1. Setelah bucket dibuat, kita perlu menyalin ekspor database yang telah kita siapkan ke dalam bucket ini, sebelum kita dapat mengimpornya ke dalam 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, yaitu mengimpor data ke database Firebase (default) yang telah dibuat.

  1. 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 telusuri hingga Anda dapat memilih file "yoga_poses.overall_export_metadata":

f5c1d16df7d5a64a.png

  1. Klik Impor.

Impor akan memakan waktu beberapa detik dan setelah siap, Anda dapat memvalidasi database dan koleksi Firestore dengan membuka https://console.cloud.google.com/firestore/databases, memilih database default dan koleksi poses seperti yang ditunjukkan di bawah:

  1. Metode lainnya adalah Anda juga dapat membuat rekaman secara manual melalui aplikasi setelah men-deploy menggunakan tindakan "Buat Pose Baru".

6. Vector Search

Mengaktifkan Ekstensi Penelusuran Vektor Firestore

Gunakan ekstensi ini untuk menyematkan dan membuat kueri dokumen Firestore Anda secara otomatis dengan fitur penelusuran vektor baru. Anda akan diarahkan ke Firebase Extensions Hub.

Saat menginstal ekstensi Vector Search, Anda menentukan nama kolom dokumen dan koleksi. Menambahkan atau memperbarui dokumen dengan kolom ini akan memicu ekstensi ini untuk menghitung penyematan vektor untuk dokumen. Embedding vektor ini ditulis kembali ke dokumen yang sama, dan dokumen diindeks di penyimpanan vektor, siap dikueri.

Mari kita ikuti langkah-langkahnya:

Menginstal 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 konsol Firebase.

715426b97c732649.png

Jika project Anda tidak tercantum, lanjutkan dan tambahkan project di Firebase (pilih project Google Cloud yang sudah ada dari daftar).

Konfigurasi Ekstensi:

Tentukan koleksi ("poses"), kolom yang berisi teks yang akan disematkan ("posture"), dan parameter lain seperti dimensi penyematan.

Jika ada API yang perlu diaktifkan yang tercantum dalam langkah ini, halaman konfigurasi akan memungkinkan Anda melakukannya. Ikuti langkah-langkahnya dengan tepat.

Jika halaman tidak merespons setelah mengaktifkan API selama beberapa waktu, cukup muat ulang dan Anda akan dapat melihat API yang diaktifkan.

5ba59b45710c567b.png

Pada salah satu langkah berikut, Anda dapat menggunakan LLM pilihan Anda untuk membuat penyematan. Pilih "Vertex AI".

bb528a04ebb5f976.png

Beberapa setelan berikutnya terkait dengan koleksi dan kolom yang ingin Anda sematkan:

LLM: Vertex AI

Jalur koleksi: poses

Batas kueri default: 3

Ukuran jarak: Kosinus

Nama kolom input: postur

Nama kolom output: embedding

Nama kolom status: status

Sematkan dokumen yang ada: Ya

Memperbarui sematan yang ada: Ya

Lokasi Cloud Functions: us-central1

Aktifkan Peristiwa: Tidak dicentang

fb8cdf1163fac7cb.png

Setelah semuanya disiapkan, klik tombol Instal Ekstensi. Proses ini akan memerlukan waktu 3 - 5 menit.

Membuat 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 dalam konfigurasi ekstensi.

Pembuatan Indeks

Hal ini akan mewajibkan pembuatan Indeks pada kolom penyematan pada saat penggunaan penyematan dalam aplikasi.

Firestore otomatis membuat indeks untuk kueri dasar; namun, Anda dapat membiarkan Firestore membuat sintaksis indeks dengan menjalankan kueri yang tidak memiliki indeks, dan Firestore akan memberi Anda link ke indeks yang dibuat dalam pesan error di sisi aplikasi. Berikut adalah daftar langkah-langkah untuk membuat indeks vektor:

  1. Buka Terminal Cloud Shell
  2. 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 fungsi aplikasi.

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 embedding teks penelusuran pengguna dengan embedding dokumen di Firestore dan mengekstrak 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 dibuat 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 akan 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 awalnya, jadi saya telah meniru output gambar dan audio dengan Imagen dan TTS API. Bayangkan betapa hebatnya jika semua ini 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. Melakukan grounding dengan Google Penelusuran:

Jika Anda 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:

  • Mendasarkan model kami pada hasil penelusuran sebenarnya
  • Mengekstrak URL relevan yang dirujuk dalam penelusuran

8. Menjalankan Aplikasi Anda

Mari kita lihat semua kemampuan aplikasi Java Spring Boot yang baru dibuat dengan antarmuka web Thymeleaf sederhana:

  1. Operasi CRUD Firestore (Buat, Baca, Perbarui, Hapus)
  2. Penelusuran Kata Kunci
  3. Pembuatan Konteks berbasis AI Generatif
  4. Penelusuran Kontekstual (Vector Search)
  5. Output multimodal yang terkait dengan penelusuran
  6. Menjalankan Kueri Anda Sendiri (Kueri dalam format structuredQuery)

Contoh: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}

Semua fitur yang 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-deploy-nya, jalankan perintah berikut dari Terminal Cloud Shell:

mvn package

mvn spring-boot:run

Anda akan melihat hasilnya dan dapat mencoba fitur aplikasi Anda. Tonton video di bawah untuk melihat demo output:

Pemberi Rekomendasi Pose dengan Firestore, Vector Search, dan Gemini 2.0 Flash

Langkah Opsional:

Untuk men-deploy-nya di Cloud Run (dengan asumsi Anda telah mem-bootstrap aplikasi baru dengan Dockerfile dan menyalin file sesuai kebutuhan), jalankan perintah berikut dari Cloud Shell Terminal di 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 posting ini, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud, buka halaman Manage resources.
  2. Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. 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 keunggulan Firestore, Ekstensi Vector Search, 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 membuat konten multimedia.

Pendekatan ini tidak terbatas pada aplikasi Yoga. Seiring terus berkembangnya model AI seperti Gemini, peluang untuk menciptakan pengalaman pengguna yang lebih imersif dan personal hanya akan bertambah. Jangan lupa untuk terus mendapatkan info terbaru tentang perkembangan 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:

  1. Gunakan API Multimodal Live dengan membuat streaming audio dan visual secara real-time untuk kasus penggunaan.
  2. Aktifkan Mode Berpikir untuk menghasilkan pemikiran di balik respons untuk interaksi dengan data real-time guna membuat pengalaman lebih terasa nyata.

Silakan coba dan kirim permintaan pull :>D!!!