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

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

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

Firestore क्यों इस्तेमाल करें?

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

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

Firestore वेक्टर सर्च एक्सटेंशन की मदद से, खोज के नतीजों को बेहतर बनाना

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

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

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

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

Gemini 2.0 Flash, Google का सबसे बेहतरीन मल्टीमोडल एआई मॉडल है. फ़िलहाल, यह सुविधा एक्सपेरिमेंट के तौर पर उपलब्ध है. हालांकि, इससे हमारे योग ऐप्लिकेशन को बेहतर बनाने के लिए कई दिलचस्प संभावनाएं मिलती हैं:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

gcloud कमांड के बजाय, कंसोल में जाकर हर प्रॉडक्ट को खोजें या इस लिंक का इस्तेमाल करें.

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

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

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

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

1 Firestore व्यूअर पर जाएं और 'डेटाबेस सेवा चुनें' स्क्रीन पर, नेटिव मोड में Firestore चुनें

  1. अपने Firestore के लिए कोई जगह चुनना
  2. 'डेटाबेस बनाएं' पर क्लिक करें (अगर पहली बार डेटाबेस बनाया जा रहा है, तो इसे "(डिफ़ॉल्ट)" डेटाबेस के तौर पर छोड़ दें)

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

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

f7136d53253c59a.png

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

a26eb470aa9bfda9.png

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

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

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

4. Firestore REST API

  1. REST API, इन इस्तेमाल के उदाहरणों के लिए मददगार हो सकता है:a. संसाधनों की कमी वाले ऐसे एनवायरमेंट से Firestore को ऐक्सेस करना जहां पूरी क्लाइंट लाइब्रेरी को चलाना मुमकिन नहीं है. डेटाबेस एडमिनिस्ट्रेशन को ऑटोमेट करना या डेटाबेस का ज़्यादा जानकारी वाला मेटाडेटा वापस लाना
  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 के सीआरयूडी (बनाना, पढ़ना, बदलना, मिटाना) समाधान के हिस्से के बारे में सिलसिलेवार जानकारी पाने के लिए, ब्लॉग लिंक पर जाएं.

मौजूदा समाधान पर फ़ोकस करने और सीआरयूडी का इस्तेमाल करने का तरीका जानने के लिए, अपने 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 में, Gemini 2.0 Flash के लिए "[YOUR_API_KEY]" को अपने एपीआई पासकोड से बदलें. यह पासकोड, 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 रिपो प्रोजेक्ट, Cloud Run डिप्लॉयमेंट कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट रूप से सेट अप नहीं होता. ऐसे में, मौजूदा रिपॉज़िटरी को क्लोन करने के बजाय, यह तरीका अपनाएं:
  2. Cloud Shell Editor पर जाएं (पक्का करें कि टर्मिनल के बजाय Editor खुला हो), स्टेटस बार की बाईं ओर मौजूद Google Cloud प्रोजेक्ट के नाम वाले आइकॉन पर क्लिक करें (यह नीचे दिए गए स्क्रीनशॉट में ब्लॉक किया गया हिस्सा है)

d3f0de417094237d.png

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

5. डेटा डालना

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

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

  • Firestore Studio पर जाएं
  • पक्का करें कि आपने "पोज़" नाम का कलेक्शन बनाया हो
  • ऊपर बताई गई 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. आयात करें क्लिक करें.

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

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

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

Firestore वेक्टर सर्च एक्सटेंशन चालू करना

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

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

आइए, इस प्रोसेस के बारे में जानते हैं:

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

Firebase एक्सटेंशन मार्केटप्लेस से "Firestore की मदद से वेक्टर सर्च" एक्सटेंशन इंस्टॉल करें. इसके लिए, "Firebase कंसोल में इंस्टॉल करें" पर क्लिक करें.

अहम जानकारी:

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

715426b97c732649.png

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

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

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

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

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

5ba59b45710c567b.png

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

bb528a04ebb5f976.png

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

एलएलएम: Vertex AI

कलेक्शन पाथ: पोज़

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

दूरी का हिसाब लगाने का तरीका: कोसाइन

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

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

स्टेटस फ़ील्ड का नाम: status

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

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

Cloud Functions की जगह: us-central1

इवेंट चालू करें: सही का निशान नहीं लगाया गया

fb8cdf1163fac7cb.png

यह सब सेट अप करने के बाद, 'एक्सटेंशन इंस्टॉल करें' बटन पर क्लिक करें. इसमें तीन से पांच मिनट लगेंगे.

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

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

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

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

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 को कॉल करने वाला कोड देखा है, तो आपको LLM के जवाब के लिए Google Search ग्राउंडिंग को चालू करने के लिए, यह कोड स्निपेट दिखेगा:

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

इससे यह पक्का होता है कि:

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

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

आइए, Thymeleaf वेब इंटरफ़ेस की मदद से, अपने नए 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, वेक्टर सर्च, और Gemini 2.0 फ़्लैश की मदद से पोज़ के सुझाव देने वाली सुविधा

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

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

gcloud run deploy --source .

ऐप्लिकेशन का नाम, क्षेत्र कोड (us-central1 के लिए कोई कोड चुनें) डालें. साथ ही, पुष्टि किए बिना अनुरोध करने के लिए "Y" चुनें. डिप्लॉयमेंट पूरा होने के बाद, आपको टर्मिनल में अपने ऐप्लिकेशन का एंडपॉइंट दिखेगा.

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

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

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

10. बधाई हो

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

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

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

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

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