Firestore, Vector Search, और Gemini 2.0 (Java वर्शन) की मदद से, योग के आसनों के सुझाव देने वाला ऐप्लिकेशन बनाएं!

1. खास जानकारी

सेहत और फ़िटनेस से जुड़े ऐप्लिकेशन की दुनिया में, उपयोगकर्ताओं को शानदार और दिलचस्प अनुभव देना बहुत ज़रूरी है. किसी योगा ऐप्लिकेशन के लिए इसका मतलब है कि पोज़ के बारे में सिर्फ़ टेक्स्ट में जानकारी न दी जाए. इसके बजाय, पूरी जानकारी दी जाए, मल्टीमीडिया कॉन्टेंट उपलब्ध कराया जाए, और स्मार्ट तरीके से खोज करने की सुविधाएं दी जाएं. इस ब्लॉग में, हम Google Cloud के Firestore का इस्तेमाल करके, योग की मुद्रा से जुड़ा एक मज़बूत डेटाबेस बनाने का तरीका जानेंगे. साथ ही, हम कॉन्टेक्स्ट के हिसाब से मैच करने के लिए, इसके Vector Search Extension का फ़ायदा उठाने और मल्टीमॉडल कॉन्टेंट के साथ काम करने के लिए, Gemini 2.0 Flash (Experimental) की सुविधाओं को इंटिग्रेट करने का तरीका जानेंगे.

Firestore क्यों चुनें?

Firestore, Google Cloud का सर्वरलेस NoSQL दस्तावेज़ डेटाबेस है. यह डाइनैमिक और ज़रूरत के हिसाब से बढ़ाए जा सकने वाले ऐप्लिकेशन बनाने के लिए एक बेहतरीन विकल्प है. यहां बताया गया है कि यह हमारे Yoga ऐप्लिकेशन के लिए क्यों एक बेहतरीन विकल्प है:

  • स्केलेबिलिटी और परफ़ॉर्मेंस: Firestore, लाखों उपयोगकर्ताओं और बड़े डेटासेट को मैनेज करने के लिए अपने-आप स्केल हो जाता है. इससे यह पक्का होता है कि आपका ऐप्लिकेशन, बढ़ने के बावजूद रिस्पॉन्सिव बना रहे.
  • रीयल-टाइम में अपडेट: इसमें रीयल-टाइम में सिंक करने की सुविधा पहले से मौजूद होती है. इससे कनेक्ट किए गए सभी क्लाइंट के लिए डेटा एक जैसा रहता है. इसलिए, यह लाइव क्लास या साथ मिलकर प्रैक्टिस करने जैसी सुविधाओं के लिए सबसे सही है.
  • लचीला डेटा मॉडल: Firestore के दस्तावेज़ पर आधारित स्ट्रक्चर की मदद से, अलग-अलग तरह के डेटा टाइप सेव किए जा सकते हैं. जैसे, टेक्स्ट, इमेज, और एम्बेडिंग. इसलिए, यह योग की मुश्किल पोज़ के बारे में जानकारी दिखाने के लिए सबसे सही है.
  • बेहतर क्वेरी: Firestore, जटिल क्वेरी के साथ काम करता है. जैसे, समानता, असमानता. अब नए एक्सटेंशन के साथ, वेक्टर के आधार पर मिलती-जुलती चीज़ें खोजने की सुविधा भी उपलब्ध है.
  • ऑफ़लाइन सहायता: Firestore, डेटा को स्थानीय तौर पर कैश मेमोरी में सेव करता है. इससे उपयोगकर्ता के ऑफ़लाइन होने पर भी आपका ऐप्लिकेशन काम करता है.

Firestore Vector Search Extension की मदद से, Search को बेहतर बनाना

योगा पोज़ जैसे मुश्किल कॉन्सेप्ट के लिए, कीवर्ड के आधार पर खोज करने की सुविधा सीमित हो सकती है. कोई व्यक्ति किसी खास पोज़ का नाम जाने बिना, "कूल्हों को खोलने" या "संतुलन को बेहतर बनाने" वाले पोज़ को खोज सकता है. ऐसे में, वेक्टर सर्च की सुविधा काम आती है.

Firestore में वेक्टर सर्च की सुविधा का इस्तेमाल करके, ये काम किए जा सकते हैं:

  • एम्बेडिंग जनरेट करना: टेक्स्ट के ब्यौरे को संख्यात्मक वेक्टर प्रज़ेंटेशन (एम्बेडिंग) में बदलना. आने वाले समय में, इमेज और ऑडियो को भी बदला जा सकेगा. इससे, Vertex AI में उपलब्ध मॉडल या कस्टम मॉडल का इस्तेमाल करके, उनके सिमैंटिक मतलब को कैप्चर किया जा सकेगा.
  • स्टोर की गई एम्बेडिंग: इन एम्बेडिंग को सीधे Firestore दस्तावेज़ों में सेव करें.
  • मिलते-जुलते दस्तावेज़ों को खोजें: अपने डेटाबेस में क्वेरी करके, ऐसे दस्तावेज़ खोजें जो किसी क्वेरी वेक्टर से मिलते-जुलते हों. इससे कॉन्टेक्स्ट के हिसाब से मिलते-जुलते दस्तावेज़ों को खोजने में मदद मिलती है.

Gemini 2.0 Flash (एक्सपेरिमेंट के तौर पर उपलब्ध) को इंटिग्रेट करना

Gemini 2.0 Flash, Google का सबसे नया और बेहतरीन मल्टीमॉडल एआई मॉडल है. हालांकि, इस पर अब भी एक्सपेरिमेंट किया जा रहा है, लेकिन इससे हमारे Yoga ऐप्लिकेशन को बेहतर बनाने के लिए कई शानदार विकल्प मिलते हैं:

  • टेक्स्ट जनरेट करना: Gemini 2.0 Flash का इस्तेमाल करके, योगा पोज़ के बारे में पूरी जानकारी जनरेट करें. इसमें योगा पोज़ के फ़ायदे, बदलाव, और नुकसान शामिल हैं.
  • इमेज जनरेट करना (नकल करके): Gemini की मदद से सीधे तौर पर इमेज जनरेट करने की सुविधा अभी सार्वजनिक तौर पर उपलब्ध नहीं है. इसलिए, मैंने Google के Imagen का इस्तेमाल करके इस सुविधा को सिम्युलेट किया है. इससे, पोज़ को विज़ुअल तौर पर दिखाने वाली इमेज जनरेट की जा सकती हैं.
  • ऑडियो जनरेट करना (नकल करना): इसी तरह, हम लिखाई को बोली में बदलने (टीटीएस) की सेवा का इस्तेमाल करके, हर पोज़ के लिए ऑडियो निर्देश बना सकते हैं. इससे उपयोगकर्ताओं को योग करने में मदद मिलेगी.

हमारा मानना है कि ऐप्लिकेशन को बेहतर बनाने के लिए, इस मॉडल को इंटिग्रेट किया जा सकता है. इससे ऐप्लिकेशन में ये सुविधाएं इस्तेमाल की जा सकेंगी:

  • Multimodal Live API: इस नए एपीआई की मदद से, टूल का इस्तेमाल करके विज़न और ऑडियो स्ट्रीमिंग वाले ऐप्लिकेशन रीयल-टाइम में बनाए जा सकते हैं.
  • स्पीड और परफ़ॉर्मेंस: Gemini 2.0 Flash, Gemini 1.5 Flash की तुलना में काफ़ी तेज़ी से जवाब देता है.
  • एजेंटिक अनुभवों में सुधार: Gemini 2.0, मल्टीमॉडल को समझने, कोडिंग करने, मुश्किल निर्देशों का पालन करने, और फ़ंक्शन कॉल करने की सुविधा को बेहतर बनाता है. ये सुधार, एजेंट के तौर पर काम करने वाले एआई को बेहतर अनुभव देने के लिए एक साथ काम करते हैं.

ज़्यादा जानकारी के लिए, Gemini 1.5 Flash के बारे में यह दस्तावेज़ पेज देखें.

भरोसेमंद जानकारी देने और ज़्यादा संसाधन उपलब्ध कराने के लिए, हम Google Search को अपने ऐप्लिकेशन में इंटिग्रेट कर सकते हैं. इसका मतलब है कि:

  • संदर्भ के हिसाब से खोज करना: जब कोई एडमिन उपयोगकर्ता किसी पोज़ की जानकारी डालता है, तो हम पोज़ के नाम का इस्तेमाल करके Google पर खोज कर सकते हैं.
  • यूआरएल निकालना: हम खोज के नतीजों से काम के यूआरएल निकाल सकते हैं. जैसे, लेख, वीडियो या भरोसेमंद योग वेबसाइटें. इसके बाद, हम उन्हें ऐप्लिकेशन में दिखा सकते हैं.

आपको क्या बनाना है

इस लैब में, आपको ये काम करने होंगे:

  1. Firestore कलेक्शन बनाना और उसमें योग से जुड़े दस्तावेज़ लोड करना
  2. Firestore की मदद से CRUD ऐप्लिकेशन बनाने का तरीका जानें
  3. Gemini 2.0 Flash की मदद से, योगा पोज़ के बारे में जानकारी जनरेट करना
  4. Firestore इंटिग्रेशन के साथ Firebase Vector Search की सुविधा चालू करना
  5. योग के ब्यौरे से एम्बेडिंग जनरेट करना
  6. उपयोगकर्ता के खोज टेक्स्ट के लिए मिलती-जुलती खोज करना

ज़रूरी शर्तें

  • कोई ब्राउज़र, जैसे कि Chrome या Firefox
  • बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट.

2. शुरू करने से पहले

प्रोजेक्ट बनाना

  1. Google Cloud Console में, प्रोजेक्ट चुनने वाले पेज पर, Google Cloud प्रोजेक्ट चुनें या बनाएं.
  2. पक्का करें कि आपके Cloud प्रोजेक्ट के लिए बिलिंग चालू हो. किसी प्रोजेक्ट के लिए बिलिंग चालू है या नहीं, यह देखने का तरीका जानें .
  3. आपको Cloud Shell का इस्तेमाल करना होगा. यह Google Cloud में चलने वाला कमांड-लाइन एनवायरमेंट है. इसमें bq पहले से लोड होता है. Google Cloud Console में सबसे ऊपर मौजूद, Cloud Shell चालू करें पर क्लिक करें.

Cloud Shell बटन की इमेज चालू करें

  1. Cloud Shell से कनेक्ट होने के बाद, यह देखने के लिए कि आपकी पुष्टि हो चुकी है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर सेट किया गया है, इस कमांड का इस्तेमाल करें:
gcloud auth list
  1. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं.
gcloud config list project
  1. अगर आपका प्रोजेक्ट सेट नहीं है, तो इसे सेट करने के लिए इस निर्देश का इस्तेमाल करें:
gcloud config set project <YOUR_PROJECT_ID>
  1. जब तक "चालू करें" बटन पर क्लिक नहीं किया जा सकता, तब तक इस लिंक पर जाकर, ज़रूरी एपीआई चालू करें.

अगर कोई एपीआई छूट जाता है, तो उसे लागू करने के दौरान कभी भी चालू किया जा सकता है.

gcloud कमांड और उनके इस्तेमाल के बारे में जानने के लिए, दस्तावेज़ देखें.

3. डेटाबेस सेटअप करना

दस्तावेज़ में, Firestore इंस्टेंस को सेट अप करने के तरीके के बारे में ज़्यादा जानकारी वाले चरण दिए गए हैं. शुरू करने के लिए, यह तरीका अपनाएं:

1 Firestore Viewer पर जाएं. इसके बाद, डेटाबेस सेवा चुनें स्क्रीन पर जाकर, नेटिव मोड में Firestore चुनें

  1. Firestore के लिए कोई जगह चुनें. पक्का करें कि आपने us-central1 चुना हो. साथ ही, इस कोडलैब में जहां भी आपको क्षेत्र / जगह चुननी हो वहां इसका इस्तेमाल करें
  2. डेटाबेस बनाएं पर क्लिक करें. अगर यह पहली बार है, तो इसे "(default)" डेटाबेस के तौर पर छोड़ दें

Firestore प्रोजेक्ट बनाने पर, Cloud API Manager में एपीआई भी चालू हो जाता है

  1. अहम जानकारी: सुरक्षा नियमों का TEST वर्शन चुनें, न कि PRODUCTION वर्शन. इससे डेटा ऐक्सेस किया जा सकेगा
  2. सेट अप हो जाने के बाद, आपको नेटिव मोड में Firestore डेटाबेस, कलेक्शन, और दस्तावेज़ का व्यू दिखेगा. यह व्यू, यहां दी गई इमेज में दिखाया गया है:

f7136d53253c59a.png

  1. अभी यह चरण पूरा न करें, लेकिन जानकारी के लिए बता दें कि "कलेक्शन शुरू करें" पर क्लिक करके, नया कलेक्शन बनाया जा सकता है. कलेक्शन आईडी को "poses" के तौर पर सेट करें. सेव करें बटन पर क्लिक करें.

a26eb470aa9bfda9.png

प्रोडक्शन ऐप्लिकेशन के लिए पेशेवर सलाह:

  1. डेटा मॉडल को फ़ाइनल करने और यह तय करने के बाद कि किस व्यक्ति के पास किस तरह के दस्तावेज़ों का ऐक्सेस होना चाहिए, Firebase इंटरफ़ेस से सुरक्षा के नियम बनाए, उनमें बदलाव किए, और उन्हें मॉनिटर किया जा सकता है. इस लिंक से सुरक्षा नियमों को ऐक्सेस किया जा सकता है: https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
  2. प्रोजेक्ट को डेवलपमेंट फ़ेज़ से डिप्लॉय / रोल आउट करने से पहले, सुरक्षा नियमों में बदलाव करना, उनकी निगरानी करना, और उनकी जांच करना न भूलें. ऐसा इसलिए, क्योंकि अक्सर सुरक्षा नियमों की वजह से ही आपका ऐप्लिकेशन अलग तरीके से काम करता है :)

इस डेमो के लिए, हम इसे TEST मोड में इस्तेमाल करेंगे.

4. Firestore REST API

  1. REST API, इन मामलों में मददगार हो सकता है:a. ऐसे एनवायरमेंट से Firestore को ऐक्सेस करना जहां संसाधनों की कमी है और पूरी क्लाइंट लाइब्रेरी को चलाना मुमकिन नहीं हैb. डेटाबेस एडमिनिस्ट्रेशन को ऑटोमेट करना या डेटाबेस के मेटाडेटा की ज़्यादा जानकारी पाना
  2. Firestore का इस्तेमाल करने का सबसे आसान तरीका, नेटिव क्लाइंट लाइब्रेरी में से किसी एक का इस्तेमाल करना है. हालांकि, कुछ स्थितियों में REST API को सीधे तौर पर कॉल करना फ़ायदेमंद होता है
  3. इस ब्लॉग में, आपको Firestore REST API के इस्तेमाल और प्रदर्शन के बारे में जानकारी मिलेगी. इसमें नेटिव क्लाइंट लाइब्रेरी के बारे में जानकारी नहीं दी जाएगी
  4. पुष्टि करने के लिए, Firestore REST API, Firebase Authentication आईडी टोकन या Google Identity OAuth 2.0 टोकन स्वीकार करता है. पुष्टि और अनुमति के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
  5. सभी REST API एंडपॉइंट, इस बेस यूआरएल के तहत मौजूद हैं: https://firestore.googleapis.com/v1/.

Spring Boot और Firestore API

Spring Boot फ़्रेमवर्क में यह समाधान, क्लाइंट ऐप्लिकेशन को दिखाने के लिए है. यह ऐप्लिकेशन, Firestore API का इस्तेमाल करके योग की मुद्रा और सांस लेने से जुड़ी जानकारी इकट्ठा करता है और उसमें बदलाव करता है. साथ ही, यह उपयोगकर्ताओं को इंटरैक्टिव अनुभव देता है.

योगा पोज़ ऐप्लिकेशन में Firestore CRUD के समाधान के बारे में सिलसिलेवार तरीके से ज़्यादा जानकारी पाने के लिए, ब्लॉग लिंक पर जाएं.

मौजूदा समाधान पर फ़ोकस करने और चलते-फिरते CRUD के बारे में जानने के लिए, इस ब्लॉग पर फ़ोकस करने वाले पूरे समाधान को नीचे दी गई रिपॉज़िटरी से क्लोन करें. इसके लिए, Cloud Shell टर्मिनल का इस्तेमाल करें. साथ ही, कोडबेस की एक कॉपी पाएं.

git clone https://github.com/AbiramiSukumaran/firestore-poserecommender

कृपया ध्यान दें:

  1. इस रेपो को क्लोन करने के बाद, आपको सिर्फ़ अपने प्रोजेक्ट आईडी, एपीआई वगैरह में कुछ बदलाव करने होंगे. अपने ऐप्लिकेशन को चालू करने के लिए, किसी अन्य बदलाव की ज़रूरत नहीं है. आने वाले सेक्शन में, ऐप्लिकेशन के हर कॉम्पोनेंट के बारे में बताया गया है. बदलावों की सूची यहां दी गई है:
  2. src/main/java/com/example/demo/GenerateImageSample.java फ़ाइल में, "<<YOUR_PROJECT_ID>>" की जगह अपना प्रोजेक्ट आईडी डालें
  3. src/main/java/com/example/demo/GenerateEmbeddings.java फ़ाइल में, "<<YOUR_PROJECT_ID>>" की जगह अपना प्रोजेक्ट आईडी डालें
  4. src/main/java/com/example/demo/PoseController.java में, "<<YOUR_PROJECT_ID>>" और डेटाबेस का नाम, इस मामले में "(default)"," के सभी इंस्टेंस को अपने कॉन्फ़िगरेशन से मिली सही वैल्यू से बदलें:
  5. src/main/java/com/example/demo/PoseController.java में, "[YOUR_API_KEY]" को Gemini 2.0 Flash के लिए अपने एपीआई पासकोड से बदलें. यह आपको AI Studio से मिल सकता है.
  6. अगर आपको स्थानीय तौर पर जांच करनी है, तो Cloud Shell टर्मिनल में प्रोजेक्ट फ़ोल्डर से ये निर्देश चलाएं:
mvn package

mvn spring-boot:run

फ़िलहाल, Cloud Shell टर्मिनल में "वेब प्रीव्यू" विकल्प पर क्लिक करके, अपने ऐप्लिकेशन को चालू किया जा सकता है. हम अभी टेस्ट करने और ऐप्लिकेशन को आज़माने के लिए तैयार नहीं हैं.

  1. ज़रूरी नहीं: अगर आपको Cloud Run में ऐप्लिकेशन डिप्लॉय करना है, तो आपको Cloud Shell Editor से, Java Cloud Run का बिलकुल नया ऐप्लिकेशन बूटस्ट्रैप करना होगा. साथ ही, repo से src फ़ाइलें और टेंप्लेट फ़ाइलें, अपने नए प्रोजेक्ट में संबंधित फ़ोल्डर में जोड़नी होंगी. ऐसा इसलिए, क्योंकि मौजूदा github repo प्रोजेक्ट, Cloud Run डिप्लॉयमेंट कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट रूप से सेट अप नहीं होता है. ऐसे में, मौजूदा रेपो को क्लोन करने के बजाय, यह तरीका अपनाएं:
  2. Cloud Shell Editor पर जाएं. पक्का करें कि एडिटर खुला हो, न कि टर्मिनल. इसके बाद, स्टेटस बार के बाईं ओर मौजूद Google Cloud प्रोजेक्ट के नाम वाले आइकॉन पर क्लिक करें. यह आइकॉन, नीचे दिए गए स्क्रीनशॉट में धुंधला किया गया है

d3f0de417094237d.png

  1. विकल्पों की सूची से, New application -> Cloud Run Application -> Java: Cloud Run चुनें. इसके बाद, इसे "firestore-poserecommender" नाम दें

d5ef8b4ca8bf3f85.png

  1. अब आपको Java Cloud Run ऐप्लिकेशन के लिए, पूरा स्टैक टेंप्लेट दिखेगा. यह पहले से कॉन्फ़िगर किया गया है और इस्तेमाल के लिए तैयार है
  2. मौजूदा Controller क्लास को हटाएं और इन फ़ाइलों को प्रोजेक्ट स्ट्रक्चर में मौजूद उनके फ़ोल्डर में कॉपी करें:

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. PROJECT ID और API KEY को अपनी वैल्यू से बदलने के लिए, आपको उनसे जुड़ी फ़ाइलों में बदलाव करने होंगे. (ऊपर दिए गए चरण 1 a,b, c और d).

5. डेटा डालना

ऐप्लिकेशन का डेटा, इस फ़ाइल data.json में उपलब्ध है: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json

अगर आपको पहले से तय किए गए कुछ डेटा से शुरुआत करनी है, तो json को कॉपी करें और "<<YOUR_PROJECT_ID>>" की सभी वैल्यू को अपनी वैल्यू से बदलें

  • Firestore Studio पर जाएं
  • पक्का करें कि आपने "poses" नाम का कलेक्शन बनाया हो
  • ऊपर बताई गई repo फ़ाइल से, एक बार में एक-एक करके दस्तावेज़ मैन्युअल तरीके से जोड़ें

इसके अलावा, हम आपके लिए पहले से तय किए गए सेट से, एक ही बार में डेटा इंपोर्ट किया जा सकता है. इसके लिए, यह तरीका अपनाएं:

  1. Cloud Shell टर्मिनल पर जाएं. पक्का करें कि आपका ऐक्टिव Google Cloud प्रोजेक्ट सेट हो और आपके पास अनुमति हो. नीचे दिए गए gsutil निर्देश का इस्तेमाल करके, अपने प्रोजेक्ट में एक बकेट बनाएं. नीचे दिए गए कमांड में, <PROJECT_ID> वैरिएबल की जगह Google Cloud का प्रोजेक्ट आईडी डालें:

gsutil mb -l us gs://<PROJECT_ID>-yoga-poses-bucket

  1. बकेट बन जाने के बाद, हमें डेटाबेस के उस एक्सपोर्ट को इस बकेट में कॉपी करना होगा जिसे हमने तैयार किया है. ऐसा करने के बाद ही, हम इसे Firebase डेटाबेस में इंपोर्ट कर पाएंगे. नीचे दिए गए निर्देश का इस्तेमाल करें:

gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs://<PROJECT_ID>-yoga-poses-bucket

अब हमारे पास इंपोर्ट करने के लिए डेटा है. इसलिए, हम बनाए गए Firebase डेटाबेस (डिफ़ॉल्ट) में डेटा इंपोर्ट करने के आखिरी चरण पर जा सकते हैं.

  1. अब Firestore कंसोल पर जाएं और बाईं ओर मौजूद नेविगेशन मेन्यू में जाकर, इंपोर्ट/एक्सपोर्ट करें पर क्लिक करें.

इंपोर्ट करें को चुनें. इसके बाद, उस क्लाउड स्टोरेज का पाथ चुनें जिसे आपने अभी बनाया है. इसके बाद, तब तक नेविगेट करें, जब तक आपको "yoga_poses.overall_export_metadata" फ़ाइल चुनने का विकल्प न मिल जाए:

f5c1d16df7d5a64a.png

  1. आयात करें क्लिक करें.

इंपोर्ट होने में कुछ सेकंड लगेंगे. इंपोर्ट होने के बाद, अपने Firestore डेटाबेस और कलेक्शन की पुष्टि की जा सकती है. इसके लिए, https://console.cloud.google.com/firestore/databases पर जाएं. इसके बाद, नीचे दिखाए गए तरीके से डिफ़ॉल्ट डेटाबेस और poses कलेक्शन चुनें:

  1. एक और तरीका यह है कि "नई पोज़ बनाएं" कार्रवाई का इस्तेमाल करके, ऐप्लिकेशन को डिप्लॉय करने के बाद, रिकॉर्ड को मैन्युअल तरीके से भी बनाया जा सकता है.

6. वेक्टर सर्च

Firestore Vector Search Extension चालू करना

इस एक्सटेंशन का इस्तेमाल करके, Firestore के दस्तावेज़ों को अपने-आप एम्बेड करें और वेक्टर सर्च की नई सुविधा के साथ क्वेरी करें! इससे आपको Firebase Extensions Hub पर ले जाया जाएगा.

वेक्टर सर्च एक्सटेंशन इंस्टॉल करते समय, आपको कलेक्शन और दस्तावेज़ के फ़ील्ड का नाम बताना होता है. इस फ़ील्ड के साथ कोई दस्तावेज़ जोड़ने या अपडेट करने पर, यह एक्सटेंशन चालू हो जाता है. इससे दस्तावेज़ के लिए वेक्टर एम्बेडिंग का हिसाब लगाया जाता है. इस वेक्टर एम्बेडिंग को उसी दस्तावेज़ में वापस लिखा जाता है. साथ ही, दस्तावेज़ को वेक्टर स्टोर में इंडेक्स किया जाता है, ताकि इसके ख़िलाफ़ क्वेरी की जा सके.

आइए, इन चरणों को पूरा करते हैं:

एक्सटेंशन इंस्टॉल करना:

Firebase Extensions Marketplace से "Vector Search with Firestore" एक्सटेंशन इंस्टॉल करें. इसके लिए, "Firebase कंसोल में इंस्टॉल करें" पर क्लिक करें.

अहम जानकारी:

इस एक्सटेंशन पेज पर पहली बार जाते समय, आपको वही प्रोजेक्ट चुनना होगा जिस पर Google Cloud Console में काम किया जा रहा है. यह प्रोजेक्ट, Firebase कंसोल में दिखना चाहिए.

715426b97c732649.png

अगर आपका प्रोजेक्ट सूची में नहीं है, तो Firebase में प्रोजेक्ट जोड़ें. इसके लिए, सूची में से अपना मौजूदा Google Cloud प्रोजेक्ट चुनें.

एक्सटेंशन कॉन्फ़िगर करना:

कलेक्शन ("poses"), एम्बेड करने के लिए टेक्स्ट वाला फ़ील्ड ("posture"), और एम्बेडिंग डाइमेंशन जैसे अन्य पैरामीटर तय करें.

अगर इस चरण में ऐसे एपीआई दिए गए हैं जिन्हें चालू करना है, तो कॉन्फ़िगरेशन पेज पर जाकर उन्हें चालू किया जा सकता है. इसके लिए, दिए गए निर्देशों का पालन करें.

अगर एपीआई चालू करने के बाद भी पेज पर कोई बदलाव नहीं दिखता है, तो पेज को रीफ़्रेश करें. इसके बाद, आपको चालू किए गए एपीआई दिखने लगेंगे.

5ba59b45710c567b.png

नीचे दिए गए चरणों में से किसी एक में, आपको एम्बेडिंग जनरेट करने के लिए, अपनी पसंद के एलएलएम का इस्तेमाल करने की अनुमति मिलती है. "Vertex AI" चुनें.

bb528a04ebb5f976.png

यहां दी गई कुछ सेटिंग, आपके कलेक्शन और उस फ़ील्ड से जुड़ी हैं जिसे आपको एम्बेड करना है:

एलएलएम: Vertex AI

कलेक्शन पाथ: poses

क्वेरी की डिफ़ॉल्ट सीमा: 3

दूरी का मेज़रमेंट: कोसाइन

इनपुट फ़ील्ड का नाम: पोस्चर

आउटपुट फ़ील्ड का नाम: एम्बेडिंग

स्थिति फ़ील्ड का नाम: status

मौजूदा दस्तावेज़ों को एम्बेड करें: हां

मौजूदा एम्बेडिंग अपडेट करें: हां

Cloud Functions की जगह: us-central1

Enable Events: Not checked

fb8cdf1163fac7cb.png

यह सब सेट अप हो जाने के बाद, 'एक्सटेंशन इंस्टॉल करें' बटन पर क्लिक करें. इसमें 3 से 5 मिनट लगेंगे.

एम्बेडिंग जनरेट करना:

"poses" कलेक्शन में दस्तावेज़ जोड़ने या अपडेट करने पर, एक्सटेंशन पहले से ट्रेन किए गए मॉडल या एपीआई एंडपॉइंट के ज़रिए आपकी पसंद के मॉडल का इस्तेमाल करके, अपने-आप एम्बेडिंग जनरेट करेगा. इस मामले में, हमने एक्सटेंशन कॉन्फ़िगरेशन में Vertex AI को चुना है.

इंडेक्स बनाना

इससे, ऐप्लिकेशन में एम्बेडिंग का इस्तेमाल करते समय, एम्बेडिंग फ़ील्ड पर इंडेक्स बनाना ज़रूरी हो जाएगा.

Firestore, बुनियादी क्वेरी के लिए अपने-आप इंडेक्स बनाता है. हालांकि, आपके पास Firestore को इंडेक्स सिंटैक्स जनरेट करने की अनुमति देने का विकल्प होता है. इसके लिए, आपको ऐसी क्वेरी चलानी होंगी जिनमें इंडेक्स नहीं है. इसके बाद, Firestore आपको ऐप्लिकेशन साइड पर मौजूद गड़बड़ी के मैसेज में, जनरेट किए गए इंडेक्स का लिंक देगा. वेक्टर इंडेक्स बनाने का तरीका यहां दिया गया है:

  1. Cloud Shell टर्मिनल पर जाएं
  2. यह कमांड चलाएं:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"

इसके बारे में ज़्यादा जानने के लिए, यहां क्लिक करें.

वेक्टर इंडेक्स बनाने के बाद, वेक्टर एम्बेडिंग का इस्तेमाल करके, सबसे मिलते-जुलते आइटम खोजे जा सकते हैं.

अहम जानकारी:

इसके बाद, आपको सोर्स में कोई बदलाव करने की ज़रूरत नहीं है. यह समझने के लिए कि ऐप्लिकेशन क्या कर रहा है, बस निर्देशों का पालन करें.

आइए, देखते हैं कि आपका नया ऐप्लिकेशन, वेक्टर सर्च की सुविधा का इस्तेमाल कैसे करता है. एम्बेडिंग सेव हो जाने के बाद, वेक्टर सर्च करने और सबसे मिलते-जुलते नतीजे पाने के लिए, Firestore Java SDK की VectorQuery क्लास का इस्तेमाल किया जा सकता है:

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();

यह स्निपेट, उपयोगकर्ता के खोज टेक्स्ट की एम्बेडिंग की तुलना, Firestore में मौजूद दस्तावेज़ों की एम्बेडिंग से करता है. साथ ही, कॉन्टेक्स्ट के हिसाब से सबसे मिलते-जुलते दस्तावेज़ को निकालता है.

7. Gemini 2.0 Flash

ब्यौरा जनरेट करने के लिए, Gemini 2.0 Flash को इंटिग्रेट किया गया है

आइए, देखते हैं कि आपका नया ऐप्लिकेशन, ब्यौरा जनरेट करने के लिए Gemini 2.0 Flash को कैसे इंटिग्रेट करता है.

अब मान लें कि कोई एडमिन उपयोगकर्ता / योग इंस्ट्रक्टर, Gemini 2.0 Flash की मदद से पोज़ की जानकारी डालना चाहता है. इसके बाद, वह सबसे मिलते-जुलते पोज़ खोजने के लिए, खोज करना चाहता है. इससे, मिलती-जुलती पोज़ की जानकारी के साथ-साथ मल्टीमॉडल ऑब्जेक्ट भी निकाले जाते हैं. ये ऑब्जेक्ट, नतीजों को बेहतर बनाने में मदद करते हैं.

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. इमेज और ऑडियो जनरेट करने की सुविधा की नकल करना

Gemini 2.0 Flash Experimental, टेक्स्ट, इमेज, ऑडियो वग़ैरह को प्रोसेस करने वाले मोडल के आउटपुट जनरेट कर सकता है. हालांकि, मैंने अभी तक इसके शुरुआती ऐक्सेस के लिए साइन अप नहीं किया है. इसलिए, मैंने इमेज और ऑडियो आउटपुट को क्रमशः Imagen और टीटीएस एपीआई की मदद से जनरेट किया है. ज़रा सोचिए, 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. Google Search की मदद से, ज़्यादा जानकारी पाएं:

अगर आपने छठे चरण में Gemini को चालू करने का कोड देखा है, तो आपको एलएलएम के जवाब के लिए Google Search grounding को चालू करने वाला यह कोड स्निपेट दिखेगा:

 /**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);

इससे हमें यह पक्का करने में मदद मिलती है कि:

  • हमारे मॉडल को खोज के असली नतीजों के आधार पर जवाब देने के लिए तैयार किया गया है
  • खोज के नतीजों में शामिल किए गए काम के यूआरएल निकालना

8. अपना ऐप्लिकेशन चलाना

आइए, थाइमलीफ़ वेब इंटरफ़ेस के साथ बनाए गए Java Spring Boot ऐप्लिकेशन की सभी सुविधाओं पर एक नज़र डालें:

  1. Firestore में CRUD ऑपरेशन (बनाना, पढ़ना, अपडेट करना, मिटाना)
  2. कीवर्ड से खोजें
  3. जनरेटिव एआई पर आधारित कॉन्टेक्स्ट बनाना
  4. कॉन्टेक्स्ट के हिसाब से खोज (वेक्टर सर्च)
  5. खोज से जुड़े मल्टीमॉडल आउटपुट
  6. अपनी क्वेरी चलाना (structuredQuery फ़ॉर्मैट में क्वेरी)

उदाहरण: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}

अब तक बताई गई ये सभी सुविधाएं, उस ऐप्लिकेशन का हिस्सा हैं जिसे आपने अभी-अभी इस रेपो से बनाया है: https://github.com/AbiramiSukumaran/firestore-poserecommender

इसे बनाने, चलाने, और डिप्लॉय करने के लिए, Cloud Shell टर्मिनल में ये कमांड चलाएं:

mvn package

mvn spring-boot:run

आपको नतीजे दिखेंगे और ऐप्लिकेशन की सुविधाओं का इस्तेमाल किया जा सकेगा. आउटपुट का डेमो देखने के लिए, यहां दिया गया वीडियो देखें:

Firestore, Vector Search, और Gemini 2.0 Flash की मदद से, पोज़ के सुझाव देने वाला ऐप्लिकेशन

वैकल्पिक चरण:

इसे Cloud Run पर डिप्लॉय करने के लिए (मान लें कि आपने Dockerfile की मदद से एक नया ऐप्लिकेशन बूटस्ट्रैप किया है और ज़रूरत के मुताबिक फ़ाइलें कॉपी की हैं), अपनी प्रोजेक्ट डायरेक्ट्री में Cloud Shell टर्मिनल से यह निर्देश चलाएं:

gcloud run deploy --source .

ऐप्लिकेशन का नाम और क्षेत्र का कोड डालें. us-central1 के लिए कोड चुनें. इसके बाद, पुष्टि किए बिना इनवॉकेशन "Y" चुनें. डप्लॉयमेंट पूरा होने के बाद, आपको टर्मिनल में ऐप्लिकेशन एंडपॉइंट मिल जाएगा.

9. व्यवस्थित करें

इस पोस्ट में इस्तेमाल की गई संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, यह तरीका अपनाएं:

  1. Google Cloud Console में, संसाधन मैनेज करें पेज पर जाएं.
  2. प्रोजेक्ट की सूची में, वह प्रोजेक्ट चुनें जिसे आपको मिटाना है. इसके बाद, मिटाएं पर क्लिक करें.
  3. डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए बंद करें पर क्लिक करें.

10. बधाई हो

बधाई हो! आपने योग की मुद्राएं मैनेज करने वाला एक मज़बूत और स्मार्ट ऐप्लिकेशन बनाने के लिए, Firestore का इस्तेमाल किया है. हमने Firestore, Vector Search Extension, और Gemini 2.0 Flash की सुविधाओं को मिलाकर एक ऐसा योगा ऐप्लिकेशन बनाया है जो लोगों की दिलचस्पी बढ़ाता है और उन्हें जानकारी देता है. इसमें CRUD ऑपरेशन लागू किए जा सकते हैं. साथ ही, कीवर्ड के आधार पर खोज की जा सकती है, कॉन्टेक्स्ट के हिसाब से वेक्टर सर्च की जा सकती है, और मल्टीमीडिया कॉन्टेंट जनरेट किया जा सकता है. इसमें इमेज और ऑडियो जनरेट करने की सुविधा भी शामिल है.

यह तरीका सिर्फ़ योग ऐप्लिकेशन के लिए नहीं है. Gemini जैसे एआई मॉडल लगातार बेहतर होते जा रहे हैं. इसलिए, आने वाले समय में उपयोगकर्ताओं को ज़्यादा बेहतर और उनकी दिलचस्पी के हिसाब से अनुभव देने के लिए, नए-नए तरीके उपलब्ध होंगे. इन टेक्नोलॉजी का पूरा फ़ायदा पाने के लिए, Google Cloud और Firebase के नए बदलावों और दस्तावेज़ों के बारे में अप-टू-डेट रहें.

अगर मुझे इस ऐप्लिकेशन को और बेहतर बनाना हो, तो मैं Gemini 2.0 Flash की मदद से ये दो काम करूँगा:

  1. इस्तेमाल के उदाहरण के लिए, रीयल-टाइम विज़न और ऑडियो स्ट्रीमिंग बनाकर, मल्टीमॉडल लाइव एपीआई का इस्तेमाल करें.
  2. सोचने का मोड चालू करें. इससे, रीयल-टाइम डेटा के साथ इंटरैक्ट करने पर, जवाबों के पीछे की सोच जनरेट होती है. इससे आपको ज़्यादा नैचुरल अनुभव मिलता है.

इसे आज़माएं और पुल का अनुरोध भेजें :>D!!!