Firebase एक्सटेंशन की मदद से, अपने मोबाइल ऐप्लिकेशन में Firestore वेक्टर सर्च जोड़ें

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

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

Cloud Firestore कंसोल में कुछ दस्तावेज़ दिख रहे हैं. ये दस्तावेज़, दाईं ओर मौजूद iOS ऐप्लिकेशन में भी दिख रहे हैं.

आपको क्या सीखने को मिलेगा

  • वेक्टर एंबेडिंग का हिसाब लगाने के लिए, Firestore एक्सटेंशन के साथ वेक्टर सर्च को इंस्टॉल करने का तरीका.
  • Swift ऐप्लिकेशन से Firebase Cloud Functions को कॉल करने का तरीका.
  • साइन-इन किए हुए उपयोगकर्ता के आधार पर डेटा को पहले से फ़िल्टर करने का तरीका.

आपको इन चीज़ों की ज़रूरत होगी

  • Xcode 15.3
  • कोड लैब का सैंपल कोड. इसे कोडलैब के अगले चरण में डाउनलोड किया जाएगा.

2. Firebase प्रोजेक्ट बनाना और उसे सेट अप करना

Firebase Vector Search एक्सटेंशन का इस्तेमाल करने के लिए, आपके पास Firebase प्रोजेक्ट होना चाहिए. इस कोडलैब के इस हिस्से में, आपको एक नया Firebase प्रोजेक्ट बनाना होगा. साथ ही, Cloud Firestore और Firebase Authentication जैसी ज़रूरी सेवाओं को चालू करना होगा.

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

  1. अपने Google खाते का इस्तेमाल करके, Firebase कंसोल में साइन इन करें.
  2. नया प्रोजेक्ट बनाने के लिए, बटन पर क्लिक करें. इसके बाद, प्रोजेक्ट का नाम डालें. उदाहरण के लिए, Firestore Vector Search Codelab.
  3. जारी रखें पर क्लिक करें.
  4. अगर आपसे कहा जाए, तो Firebase की शर्तें पढ़ें और स्वीकार करें. इसके बाद, जारी रखें पर क्लिक करें.
  5. (ज़रूरी नहीं) Firebase कंसोल में एआई की मदद पाने की सुविधा चालू करें. इसे "Firebase में Gemini" कहा जाता है.
  6. इस कोडलैब के लिए, आपको Google Analytics की ज़रूरत नहीं है. इसलिए, Google Analytics के विकल्प को टॉगल करके बंद करें.
  7. प्रोजेक्ट बनाएं पर क्लिक करें. इसके बाद, प्रोजेक्ट के प्रोविज़न होने का इंतज़ार करें. इसके बाद, जारी रखें पर क्लिक करें.

Firebase प्रोजेक्ट के बारे में ज़्यादा जानने के लिए, Firebase प्रोजेक्ट के बारे में जानकारी लेख पढ़ें.

Firebase का प्राइसिंग प्लान अपग्रेड करना

Firebase एक्सटेंशन और उनसे जुड़ी क्लाउड सेवाओं का इस्तेमाल करने के लिए, आपका Firebase प्रोजेक्ट इस्तेमाल के हिसाब से शुल्क चुकाने वाले (ब्लेज़) प्लान पर होना चाहिए. इसका मतलब है कि यह Cloud Billing खाते से लिंक होना चाहिए.

  • Cloud Billing खाते के लिए, पेमेंट का कोई तरीका जोड़ना ज़रूरी है. जैसे, क्रेडिट कार्ड.
  • अगर आपने हाल ही में Firebase और Google Cloud का इस्तेमाल शुरू किया है, तो देखें कि क्या आपको 300 डॉलर का क्रेडिट और मुफ़्त में आज़माने के लिए Cloud Billing खाता मिल सकता है.
  • अगर आपको यह कोडलैब किसी इवेंट के हिस्से के तौर पर करना है, तो इवेंट के आयोजक से पूछें कि क्या Cloud क्रेडिट उपलब्ध हैं.

अपने प्रोजेक्ट को ब्लेज़ प्लान में अपग्रेड करने के लिए, यह तरीका अपनाएं:

  1. Firebase कंसोल में जाकर, अपने प्लान को अपग्रेड करें को चुनें.
  2. Blaze प्लान चुनें. किसी Cloud Billing खाते को अपने प्रोजेक्ट से लिंक करने के लिए, स्क्रीन पर दिए गए निर्देशों का पालन करें.
    अगर आपको इस अपग्रेड के दौरान Cloud Billing खाता बनाना पड़ा है, तो अपग्रेड पूरा करने के लिए, आपको Firebase कंसोल में अपग्रेड करने की प्रोसेस पर वापस जाना पड़ सकता है.

कंसोल में Firebase के प्रॉडक्ट चालू करना और उन्हें सेट अप करना

आपके बनाए जा रहे ऐप्लिकेशन में, Apple ऐप्लिकेशन के लिए उपलब्ध कई Firebase प्रॉडक्ट इस्तेमाल किए जाते हैं:

  • Firebase से पुष्टि करने की सुविधा का इस्तेमाल करके, उपयोगकर्ताओं को आसानी से अपने ऐप्लिकेशन में साइन इन करने की अनुमति दें.
  • क्लाउड पर स्ट्रक्चर्ड डेटा सेव करने के लिए Cloud Firestore का इस्तेमाल करें. साथ ही, डेटा में बदलाव होने पर तुरंत सूचना पाएं.
  • अपने डेटाबेस को सुरक्षित रखने के लिए, Firebase के सुरक्षा नियम.

इनमें से कुछ प्रॉडक्ट के लिए, खास कॉन्फ़िगरेशन की ज़रूरत होती है. इसके अलावा, कुछ को Firebase कंसोल का इस्तेमाल करके चालू करना पड़ता है.

Firebase Authentication के लिए, पहचान ज़ाहिर किए बिना पुष्टि करने की सुविधा चालू करना

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

  1. Firebase कंसोल के बाईं ओर मौजूद पैनल में, Build > Authentication पर क्लिक करें. इसके बाद, शुरू करें पर क्लिक करें.Firebase Authentication की सुविधा चालू करना
  2. अब आप पुष्टि करने वाले डैशबोर्ड में हैं. यहां आपको साइन अप करने वाले उपयोगकर्ता दिखेंगे. साथ ही, साइन-इन करने की सुविधा देने वाली कंपनियों को कॉन्फ़िगर करने और सेटिंग मैनेज करने का विकल्प मिलेगा.
  3. साइन-इन करने का तरीका टैब चुनें. सीधे इस टैब पर जाने के लिए, यहां क्लिक करें.
  4. प्रोवाइडर के विकल्पों में जाकर, नाम छिपाकर पर क्लिक करें. इसके बाद, स्विच को टॉगल करके चालू करें पर सेट करें. इसके बाद, सेव करें पर क्लिक करें.

Cloud Firestore सेट अप करना

यह Swift ऐप्लिकेशन, नोट सेव करने के लिए Cloud Firestore का इस्तेमाल करता है.

अपने Firebase प्रोजेक्ट में Cloud Firestore सेट अप करने का तरीका यहां बताया गया है:

  1. Firebase कंसोल के बाईं ओर मौजूद पैनल में, बनाएं को बड़ा करें. इसके बाद, Firestore डेटाबेस को चुनें.
  2. डेटाबेस बनाएं पर क्लिक करें.
  3. डेटाबेस आईडी को (default) पर सेट रहने दें.
  4. अपने डेटाबेस के लिए कोई जगह चुनें. इसके बाद, आगे बढ़ें पर क्लिक करें.
    किसी असली ऐप्लिकेशन के लिए, आपको ऐसी जगह चुननी चाहिए जो आपके उपयोगकर्ताओं के आस-पास हो.
  5. टेस्ट मोड में शुरू करें पर क्लिक करें. सुरक्षा नियमों के बारे में डिसक्लेमर पढ़ें.
    इस कोडलैब में बाद में, अपने डेटा को सुरक्षित करने के लिए सुरक्षा नियम जोड़े जाएंगे. अपने डेटाबेस के लिए सुरक्षा के नियम जोड़े बिना, सार्वजनिक तौर पर किसी ऐप्लिकेशन को डिस्ट्रिब्यूट या उपलब्ध न करें.
  6. बनाएं पर क्लिक करें.

Firebase के लिए Cloud Storage सेट अप करना

यह वेब ऐप्लिकेशन, Cloud Storage for Firebase का इस्तेमाल करके फ़ोटो को सेव, अपलोड, और शेयर करता है.

अपने Firebase प्रोजेक्ट में, Cloud Storage for Firebase को सेट अप करने का तरीका यहां बताया गया है:

  1. Firebase कंसोल के बाएं पैनल में, Build को बड़ा करें. इसके बाद, Storage को चुनें.
  2. शुरू करें पर क्लिक करें.
  3. अपने डिफ़ॉल्ट स्टोरेज बकेट के लिए कोई जगह चुनें.
    US-WEST1, US-CENTRAL1, और US-EAST1 में मौजूद बकेट, Google Cloud Storage के लिए "हमेशा के लिए मुफ़्त" टियर का फ़ायदा ले सकते हैं. अन्य सभी जगहों पर मौजूद बकेट के लिए, Google Cloud Storage की कीमत और इस्तेमाल से जुड़े नियम लागू होते हैं.
  4. टेस्ट मोड में शुरू करें पर क्लिक करें. सुरक्षा नियमों के बारे में डिसक्लेमर पढ़ें.
    इस कोडलैब में बाद में, अपने डेटा को सुरक्षित रखने के लिए सुरक्षा नियम जोड़े जाएंगे. अपने स्टोरेज बकेट के लिए सुरक्षा के नियम जोड़े बिना, सार्वजनिक तौर पर किसी ऐप्लिकेशन को डिस्ट्रिब्यूट या उपलब्ध न करें.
  5. बनाएं पर क्लिक करें.

3. मोबाइल ऐप्लिकेशन कनेक्ट करना

इस कोडलैब के इस सेक्शन में, आपको नोट लेने वाले एक सामान्य ऐप्लिकेशन का सोर्स कोड डाउनलोड करना होगा. साथ ही, उसे उस Firebase प्रोजेक्ट से कनेक्ट करना होगा जिसे आपने अभी बनाया है.

सैंपल ऐप्लिकेशन डाउनलोड करना

  1. https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios पर जाएं और रिपॉज़िटरी को अपनी लोकल मशीन पर क्लोन करें
  2. Xcode में Notes.xcodeproj प्रोजेक्ट खोलें

ऐप्लिकेशन को अपने Firebase प्रोजेक्ट से कनेक्ट करना

आपके ऐप्लिकेशन को Firebase की सेवाओं का ऐक्सेस मिल सके, इसके लिए आपको Firebase कंसोल में ऐप्लिकेशन सेट अप करना होगा. एक ही Firebase प्रोजेक्ट से कई क्लाइंट ऐप्लिकेशन कनेक्ट किए जा सकते हैं. उदाहरण के लिए, अगर आपने कोई Android या वेब ऐप्लिकेशन बनाया है, तो आपको उन्हें एक ही Firebase प्रोजेक्ट से कनेक्ट करना चाहिए.

Firebase प्रोजेक्ट के बारे में ज़्यादा जानने के लिए, Firebase प्रोजेक्ट के बारे में जानकारी लेख पढ़ें.

  1. Firebase कंसोल में, अपने Firebase प्रोजेक्ट के खास जानकारी वाले पेज पर जाएं.Firebase कंसोल का खास जानकारी देने वाला पेज
  2. अपना iOS ऐप्लिकेशन जोड़ने के लिए, iOS+ आइकॉन पर क्लिक करें.
  3. अपने Apple ऐप्लिकेशन में Firebase जोड़ें स्क्रीन में, Xcode प्रोजेक्ट से बंडल आईडी (com.google.firebase.codelab.Notes) डालें.
  4. अगर आपको पसंद है, तो ऐप्लिकेशन का कोई दूसरा नाम (iOS के लिए नोट) डालें.
  5. अगले चरण पर जाने के लिए, 'ऐप्लिकेशन रजिस्टर करें' पर क्लिक करें.
  6. GoogleServices-Info.plist फ़ाइल डाउनलोड करें.
  7. GoogleServices-Info.plist को अपने Xcode प्रोजेक्ट के Notes फ़ोल्डर में खींचें और छोड़ें. इसके लिए, इसे Assets.xcassets फ़ाइल के नीचे छोड़ें.plist फ़ाइल को Xcode में खींचकर छोड़ना
  8. ज़रूरत पड़ने पर आइटम कॉपी करें को चुनें. पक्का करें कि टारगेट में जोड़ें में नोट टारगेट चुना गया हो. इसके बाद, पूरा करें पर क्लिक करें.फ़ाइलें जोड़ने के लिए, “ज़रूरत होने पर कॉपी करें” विकल्प को चुनना
  9. Firebase कंसोल में, अब सेटअप करने की बाकी प्रोसेस पूरी करने के लिए क्लिक करें: इस सेक्शन की शुरुआत में डाउनलोड किए गए सैंपल में, Firebase Apple SDK टूल पहले से ही इंस्टॉल है और उसे चालू करने के लिए सेटअप किया गया है. कंसोल पर जाएं पर क्लिक करके, यह प्रोसेस पूरी की जा सकती है.

ऐप्लिकेशन चलाएं

अब ऐप्लिकेशन को आज़माने का समय आ गया है!

  1. Xcode पर वापस जाएं और iOS सिम्युलेटर पर ऐप्लिकेशन चलाएं. रन डेस्टिनेशन ड्रॉप-डाउन में, सबसे पहले iOS सिम्युलेटर में से कोई एक चुनें.'रन डेस्टिनेशन' ड्रॉप-डाउन में iOS सिम्युलेटर को चुनना
  2. इसके बाद, चलाएं बटन पर क्लिक करें या ⌘ + R दबाएं
  3. जब ऐप्लिकेशन सिम्युलेटर पर लॉन्च हो जाए, तब कुछ नोट जोड़ें.
  4. Firebase कंसोल में, Firestore डेटा ब्राउज़र पर जाएं, ताकि ऐप्लिकेशन में नए नोट जोड़ते समय आपको नए दस्तावेज़ दिख सकें.Cloud Firestore कंसोल में कुछ दस्तावेज़ दिख रहे हैं. साथ ही, iOS सिम्युलेटर में भी वही दस्तावेज़ दिख रहे हैं

4. Firestore के साथ Vector Search एक्सटेंशन इंस्टॉल करना

इस कोडलैब के इस हिस्से में, आपको Firestore के साथ Vector Search एक्सटेंशन इंस्टॉल करना होगा. साथ ही, इसे नोट लेने वाले ऐप्लिकेशन की ज़रूरतों के हिसाब से कॉन्फ़िगर करना होगा.

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

  1. Firestore सेक्शन में जाकर, एक्सटेंशन टैब पर क्लिक करें.Firestore कंसोल में Firebase एक्सटेंशन टैब चुनना
  2. एक्सटेंशन हब एक्सप्लोर करें पर क्लिक करें.Firestore कंसोल में Firebase एक्सटेंशन टैब
  3. "वेक्टर" टाइप करें.
  4. "Firestore एक्सटेंशन के साथ वेक्टर सर्च" पर क्लिक करें.Firebase एक्सटेंशन हब का लैंडिंग पेज इससे आपको एक्सटेंशन के बारे में ज़्यादा जानकारी वाले पेज पर ले जाया जाएगा. यहां आपको एक्सटेंशन के बारे में ज़्यादा जानकारी मिलेगी. जैसे, यह कैसे काम करता है, इसके लिए Firebase की किन सेवाओं की ज़रूरत होती है, और इसे कैसे कॉन्फ़िगर किया जा सकता है.
  5. Firebase कंसोल में इंस्टॉल करें पर क्लिक करें.Vector Search with Firestore एक्सटेंशन के लिए, 'इंस्टॉल करें' बटन
  6. आपको अपने सभी प्रोजेक्ट की सूची दिखेगी.
  7. इस कोडलैब के पहले चरण में बनाया गया प्रोजेक्ट चुनें.Firebase प्रोजेक्ट चुनने की स्क्रीन

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

  1. चालू किए गए एपीआई और बनाए गए संसाधनों की समीक्षा करें.चालू किए गए एपीआई की समीक्षा करना
  2. ज़रूरी सेवाएं चालू करें.ज़रूरी सेवाएं चालू करना
  3. सभी सेवाएं चालू होने के बाद, आगे बढ़ें पर क्लिक करें.सभी सेवाएं चालू करने के बाद, 'आगे बढ़ें' पर क्लिक करें
  4. इस एक्सटेंशन को दिए गए ऐक्सेस की समीक्षा करें.
  5. एक्सटेंशन कॉन्फ़िगर करें:
    • Vertex AI को एलएलएम के तौर पर चुनें
    • संग्रह का पाथ: notes
    • क्वेरी की डिफ़ॉल्ट सीमा: 3
    • इनपुट फ़ील्ड का नाम: text
    • आउटपुट फ़ील्ड का नाम: embedding
    • स्टेटस फ़ील्ड का नाम:* *status*
    • मौजूदा दस्तावेज़ एम्बेड करें: हां
    • मौजूदा दस्तावेज़ अपडेट करें: हां
    • Cloud Function की जगह: us-central1
  6. इंस्टॉल करने की प्रोसेस पूरी करने के लिए, एक्सटेंशन इंस्टॉल करें पर क्लिक करें.

इसमें कुछ मिनट लग सकते हैं. जब तक इंस्टॉलेशन पूरा नहीं हो जाता, तब तक ट्यूटोरियल के अगले सेक्शन पर जाएं और वेक्टर एंबेडिंग के बारे में कुछ बुनियादी जानकारी पढ़ें.

5. बैकग्राउंड

जब तक इंस्टॉलेशन पूरा नहीं हो जाता, तब तक यहां Firestore एक्सटेंशन के साथ Vector Search के काम करने के तरीके के बारे में कुछ जानकारी दी गई है.

वेक्टर, एम्बेडिंग, और वेक्टर डेटाबेस क्या होते हैं?

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

वेक्टर सर्च कैसे काम करती है?

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

दो वेक्टर के बीच समानता का पता लगाने के लिए, दूरी की अलग-अलग मेट्रिक का इस्तेमाल किया जा सकता है. दूरी की सबसे आम मेट्रिक, कोसाइन सिमिलैरिटी है. यह दो वेक्टर के बीच के कोण को मापती है.

6. Firestore एक्सटेंशन के साथ वेक्टर सर्च आज़माएं

इस कोडलैब में पहले डाउनलोड किए गए iOS ऐप्लिकेशन में, Firestore एक्सटेंशन के साथ वेक्टर सर्च का इस्तेमाल करने से पहले, Firebase कंसोल में एक्सटेंशन को आज़माया जा सकता है.

दस्तावेज़ पढ़ें

Firebase एक्सटेंशन में, उनके काम करने के तरीके से जुड़ा दस्तावेज़ शामिल होता है.

  1. एक्सटेंशन इंस्टॉल होने के बाद, शुरू करें बटन पर क्लिक करें. Firebase कंसोल में Firebase एक्सटेंशन की खास जानकारी वाला पेज
  2. "यह एक्सटेंशन कैसे काम करता है" टैब देखें. इसमें यह जानकारी दी गई है:
    • notes कलेक्शन में दस्तावेज़ जोड़कर, उनके लिए एम्बेडिंग कैसे जनरेट करें,
    • ext-firestore-vector-search-queryCallable कॉल करने लायक फ़ंक्शन को कॉल करके इंडेक्स को क्वेरी करने का तरीका,
    • या _firestore-vector-search/index/queries कलेक्शन में क्वेरी दस्तावेज़ जोड़कर इंडेक्स को क्वेरी करने का तरीका जानें.
    • इसमें कस्टम एम्बेडिंग फ़ंक्शन सेट अप करने का तरीका भी बताया गया है. यह तब काम आता है, जब एक्सटेंशन के साथ काम करने वाले एलएलएम में से कोई भी आपकी ज़रूरतों को पूरा नहीं करता है और आपको एम्बेडिंग का हिसाब लगाने के लिए किसी दूसरे एलएलएम का इस्तेमाल करना है. Firestore एक्सटेंशन के साथ वेक्टर सर्च के लिए दस्तावेज़
  3. अपने Firestore इंस्टेंस पर जाने के लिए, Cloud Firestore डैशबोर्ड लिंक पर क्लिक करें
  4. _firestore-vector-search/index दस्तावेज़ पर जाएं. इससे पता चलना चाहिए कि एक्सटेंशन ने उन सभी नोट दस्तावेज़ों के लिए एम्बेडिंग की प्रोसेस पूरी कर ली है जिन्हें आपने इस कोडलैब के पिछले चरण में बनाया था.Firestore कंसोल में इंडेक्स कॉन्फ़िगरेशन
  5. इसकी पुष्टि करने के लिए, नोट के किसी दस्तावेज़ को खोलें. आपको embedding टाइप का embedding नाम वाला एक और फ़ील्ड दिखेगा. साथ ही, आपको status फ़ील्ड भी दिखेगा.Firestore कंसोल में वेक्टर एम्बेडिंग फ़ील्डvector<768>

कोई सैंपल दस्तावेज़ बनाना

एक्सटेंशन को काम करते हुए देखने के लिए, Firebase कंसोल में एक नया दस्तावेज़ बनाया जा सकता है.

  1. Firestore डेटा ब्राउज़र में ही, notes कलेक्शन पर जाएं. इसके बाद, बीच वाले कॉलम में मौजूद + दस्तावेज़ जोड़ें पर क्लिक करें.नया दस्तावेज़ जोड़ना
  2. नया यूनीक दस्तावेज़ आईडी जनरेट करने के लिए, ऑटो-आईडी पर क्लिक करें.
  3. स्ट्रिंग टाइप का text नाम का फ़ील्ड जोड़ें. इसके बाद, value फ़ील्ड में कुछ टेक्स्ट चिपकाएं. यह ज़रूरी है कि यह लॉरेम इप्सम या कोई अन्य रैंडम टेक्स्ट न हो. उदाहरण के लिए, कोई समाचार लेख चुनें.टेक्स्ट फ़ील्ड जोड़ना
  4. सेव करें पर क्लिक करें.
    • ध्यान दें कि एक्सटेंशन, स्टेटस फ़ील्ड जोड़ता है, ताकि यह पता चल सके कि डेटा प्रोसेस किया जा रहा है.
    • कुछ समय बाद, आपको embedding नाम का एक नया फ़ील्ड दिखेगा. इसकी वैल्यू vector<768> होगी.
    नए दस्तावेज़ के लिए, वेक्टर एम्बेडिंग के स्टेटस का अपडेट

क्वेरी चलाना

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

  1. Firebase कंसोल के Firestore सेक्शन में, _firestore-vector-search/index दस्तावेज़ पर जाएं
  2. + कलेक्शन शुरू करेंनया सब-कलेक्शन जोड़ना पर क्लिक करें
  3. queries नाम का नया सब-कलेक्शन बनाएं
  4. एक नया दस्तावेज़ बनाएं और query फ़ील्ड को ऐसे टेक्स्ट पर सेट करें जो आपके किसी दस्तावेज़ में मौजूद हो. यह सुविधा, सिमैंटिक क्वेरी के लिए सबसे अच्छी तरह से काम करती है. जैसे, "मैं Swift की मदद से Firestore दस्तावेज़ों को कैसे मैप करूं". हालांकि, इसके लिए ज़रूरी है कि आपने जो नोट जोड़े हैं उनमें से कम से कम एक में इस विषय के बारे में जानकारी दी गई हो.क्वेरी फ़ील्ड जोड़ना
  5. आपको स्थितिकोई गड़बड़ी हुई में गड़बड़ी दिख सकती है
  6. ऐसा इंडेक्स मौजूद न होने की वजह से होता है. अगर इंडेक्स कॉन्फ़िगरेशन मौजूद नहीं है, तो उसे सेट अप करने के लिए, इस लिंक पर जाकर अपने प्रोजेक्ट के लिए Google Cloud Console पर जाएं. इसके बाद, सूची से अपना प्रोजेक्ट चुनेंसही प्रोजेक्ट चुनना
  7. अब आपको Cloud Log Explorer में, गड़बड़ी का यह मैसेज दिखेगा: "FAILED_PRECONDITION: Missing vector index configuration. कृपया इस gcloud कमांड का इस्तेमाल करके, ज़रूरी इंडेक्स बनाएं: ..."लॉग एक्सप्लोरर में गड़बड़ी का मैसेज
  8. गड़बड़ी के मैसेज में gcloud कमांड भी शामिल होती है. आपको इस कमांड को चलाकर, इंडेक्स को कॉन्फ़िगर करना होगा.
  9. अपनी कमांड लाइन से यह कमांड चलाएं. अगर आपकी मशीन पर gcloud CLI इंस्टॉल नहीं है, तो इसे इंस्टॉल करने के लिए यहां दिए गए निर्देशों का पालन करें.
    gcloud alpha firestore indexes composite create --project=INSERT-YOUR=PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
    
    इंडेक्स बनाने में कुछ मिनट लगते हैं. Firebase कंसोल के Firestore सेक्शन में मौजूद इंडेक्स टैब में जाकर, प्रोग्रेस देखी जा सकती है.नए इंडेक्स का स्टेटस
  10. इंडेक्स सेट अप हो जाने के बाद, एक नया क्वेरी दस्तावेज़ बनाया जा सकता है.
  11. अब आपको नतीजों वाले फ़ील्डसिमेंटिक क्वेरी करने का नतीजा में, मिलते-जुलते दस्तावेज़ों के आईडी की सूची दिखेगी
  12. इनमें से किसी एक आईडी को कॉपी करें और notes कलेक्शन पर वापस जाएं.
  13. आपने जिस दस्तावेज़ का आईडी कॉपी किया है उसे खोजने के लिए, ⌘+F का इस्तेमाल करें. यह दस्तावेज़, आपकी क्वेरी से सबसे ज़्यादा मेल खाता है.दस्तावेज़ों की सूची में दस्तावेज़ आईडी ढूंढना

7. सिमैंटिक सर्च लागू करना

अब समय आ गया है कि अपने मोबाइल ऐप्लिकेशन को, Firestore के साथ Vector Search एक्सटेंशन से कनेक्ट किया जाए. साथ ही, सिमैंटिक सर्च की सुविधा लागू की जाए. इससे आपके उपयोगकर्ता, सामान्य भाषा में क्वेरी करके अपने नोट खोज पाएंगे.

क्वेरी करने के लिए, कॉल किए जा सकने वाले फ़ंक्शन को कनेक्ट करना

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

  1. Xcode पर वापस जाएं और पक्का करें कि आप उस प्रोजेक्ट में हों जिसे आपने इस कोडलैब के पिछले चरण में क्लोन किया था.
  2. NotesRepository.swift फ़ाइल खोलें.
  3. private lazy var vectorSearchQueryCallable: Callable = functions.httpsCallable("") वाली लाइन ढूंढें

कॉल किए जा सकने वाले Cloud फ़ंक्शन को शुरू करने के लिए, आपको उस फ़ंक्शन का नाम देना होगा जिसे कॉल करना है.

  1. अपने प्रोजेक्ट के लिए Firebase कंसोल पर जाएं. इसके बाद, Build सेक्शन में जाकर, Functions मेन्यू आइटम खोलें.
  2. आपको उन फ़ंक्शन की सूची दिखेगी जिन्हें एक्सटेंशन ने इंस्टॉल किया है.
  3. ext-firestore-vector-search-queryCallable नाम वाले फ़ील्ड को खोजें और उसका नाम कॉपी करें.
  4. नाम को अपने कोड में चिपकाएं. अब यह ऐसा दिखना चाहिए
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

क्वेरी फ़ंक्शन को कॉल करना

  1. performQuery वाला तरीका ढूंढना
  2. कॉल किए जा सकने वाले फ़ंक्शन को कॉल करें
    let result = try await vectorSearchQueryCallable(searchTerm)
    

यह एक रिमोट कॉल है. इसलिए, यह कनेक्ट नहीं हो सकता.

  1. गड़बड़ियों को पकड़ने और उन्हें Xcode के कंसोल में लॉग करने के लिए, गड़बड़ी को हैंडल करने की कुछ बुनियादी सुविधाएं जोड़ें.
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let result = try await vectorSearchQueryCallable(searchTerm)
        return [result]
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

यूज़र इंटरफ़ेस (यूआई) को कनेक्ट करना

उपयोगकर्ताओं को अपने नोट खोजने की सुविधा देने के लिए, आपको नोट की सूची वाली स्क्रीन में एक खोज बार जोड़ना होगा. जब उपयोगकर्ता कोई खोज क्वेरी टाइप करता है, तो आपको पिछले चरण में लागू किया गया performQuery तरीका इस्तेमाल करना होगा. SwiftUI की ओर से उपलब्ध कराए गए searchable और task व्यू मॉडिफ़ायर की मदद से, इसके लिए कोड की सिर्फ़ कुछ लाइनों की ज़रूरत होती है.

  1. सबसे पहले, खोलेंNotesListScreen.swift
  2. सूची वाले व्यू में खोज बॉक्स जोड़ने के लिए, .navigationTitle("Notes") लाइन के ठीक ऊपर .searchable(text: $searchTerm, prompt: "Search") व्यू मॉडिफ़ायर जोड़ें
  3. इसके बाद, खोज फ़ंक्शन को चालू करने के लिए, यहां दिया गया कोड जोड़ें:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

यह कोड स्निपेट, semanticSearch तरीके को एसिंक्रोनस तरीके से कॉल करता है. 800 मिलीसेकंड का टाइमआउट देकर, टास्क मॉडिफ़ायर को यह निर्देश दिया जाता है कि वह उपयोगकर्ता के इनपुट को 0.8 सेकंड तक डिबाउंस करे. इसका मतलब है कि जब उपयोगकर्ता 0.8 सेकंड से ज़्यादा समय तक टाइप करना बंद कर देगा, तब semanticSearch को सिर्फ़ एक बार कॉल किया जाएगा.

अब आपका कोड ऐसा दिखना चाहिए:

...
List(repository.notes) { note in
  NavigationLink(value: note) {
    NoteRowView(note: note)
  }
  .swipeActions {
    Button(role: .destructive, action: { deleteNote(note: note) }) {
      Label("Delete", systemImage: "trash")
    }
  }
}
.searchable(text: $searchTerm, prompt: "Search")
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}
.navigationTitle("Notes")
...

ऐप्लिकेशन चलाएं

  1. iOS सिम्युलेटर पर ऐप्लिकेशन लॉन्च करने के लिए, ⌘ + R दबाएं या 'चलाएं' बटन पर क्लिक करें
  2. आपको वे सभी नोट दिखेंगे जिन्हें आपने इस कोडलैब में पहले ऐप्लिकेशन में जोड़ा था. साथ ही, वे नोट भी दिखेंगे जिन्हें आपने Firebase कंसोल के ज़रिए जोड़ा था
  3. आपको नोट की सूची में सबसे ऊपर, खोज फ़ील्ड दिखेगा
  4. कोई ऐसा शब्द टाइप करें जो आपके जोड़े गए किसी दस्तावेज़ में मौजूद हो. यह सुविधा, सिमैंटिक क्वेरी के लिए सबसे अच्छी तरह से काम करती है. जैसे, "मैं Swift से एसिंक्रोनस Firebase API को कैसे कॉल करूं". हालांकि, इसके लिए ज़रूरी है कि आपने जो नोट जोड़े हैं उनमें से कम से कम एक में इस विषय के बारे में जानकारी हो.
  5. आपको शायद खोज के नतीजे दिखने चाहिए, लेकिन इसके बजाय, सूची का व्यू खाली है. साथ ही, Xcode कंसोल में यह गड़बड़ी का मैसेज दिखता है: "The function was called with an invalid argument"

नोट ऐप्लिकेशन, जिसमें नतीजों की सूची खाली है

इसका मतलब है कि आपने गलत फ़ॉर्मैट में डेटा भेजा है.

गड़बड़ी के मैसेज का विश्लेषण करना

  1. समस्या का पता लगाने के लिए, Firebase कंसोल पर जाएं
  2. फ़ंक्शन सेक्शन पर जाएं
  3. ext-firestore-vector-search-queryCallable फ़ंक्शन ढूंढें. इसके बाद, तीन वर्टिकल बिंदुओं पर क्लिक करके ओवरफ़्लो मेन्यू खोलें
  4. लॉग एक्सप्लोरर पर जाने के लिए, लॉग देखें को चुनें
  5. आपको गड़बड़ी का मैसेज दिखेगा
Unhandled error ZodError: [
  {
    "code": "invalid_type",
    "expected": "object",
    "received": "string",
    "path": [],
    "message": "Expected object, received string"
  }
]

इसका मतलब है कि आपने गलत फ़ॉर्मैट में डेटा भेजा है.

सही डेटा टाइप का इस्तेमाल करना

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

  1. Firebase कंसोल पर एक्सटेंशन सेक्शन पर जाएं
  2. मैनेज करें ->Firestore एक्सटेंशन की मदद से, वेक्टर सर्च को मैनेज करना पर क्लिक करें
  3. यह एक्सटेंशन कैसे काम करता है सेक्शन में, आपको इनपुट और आउटपुट पैरामीटर की खास जानकारी मिलेगी.इनपुट पैरामीटर और नतीजे की वैल्यू का दस्तावेज़
  4. Xcode पर वापस जाएं और NotesRepository.swift पर जाएं
  5. फ़ाइल की शुरुआत में यह कोड जोड़ें:
    private struct QueryRequest: Codable {
      var query: String
      var limit: Int?
      var prefilters: [QueryFilter]?
    }
    
    private struct QueryFilter: Codable {
      var field: String
      var `operator`: String
      var value: String
    
    }
    
    private struct QueryResponse: Codable {
      var ids: [String]
    }
    
    QueryRequest एक्सटेंशन के दस्तावेज़ के मुताबिक, इनपुट पैरामीटर के स्ट्रक्चर से मेल खाता है. इसमें एक नेस्ट किया गया prefilter एट्रिब्यूट भी शामिल है, जिसकी आपको बाद में ज़रूरत पड़ेगी.QueryResponse एक्सटेंशन के रिस्पॉन्स के स्ट्रक्चर से मेल खाता है.
  6. कॉल किए जा सकने वाले फ़ंक्शन का स्पेसिफ़िकेशन ढूंढना और इनपुट और आउटपुट टाइप अपडेट करना
    private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    
  7. performQuery में कॉल किए जा सकने वाले फ़ंक्शन को शुरू करने की सुविधा अपडेट करना
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let queryRequest = QueryRequest(query: searchTerm,
                                        limit: 2)
        let result = try await vectorSearchQueryCallable(queryRequest)
        print(result.ids)
        return result.ids
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

ऐप्लिकेशन को फिर से चलाएं

  1. ऐप्लिकेशन को फिर से चलाएं
  2. खोज क्वेरी में ऐसे शब्द टाइप करें जो आपके किसी नोट में शामिल हों
  3. अब आपको फ़िल्टर किए गए नोट की सूची दिखेगी

ऐप्लिकेशन का स्क्रीनशॉट, जिसमें उम्मीद के मुताबिक नतीजा दिख रहा हो

उपयोगकर्ता के डेटा को पहले से फ़िल्टर करना

खुशी से नाचने से पहले - ऐप्लिकेशन के मौजूदा वर्शन में एक समस्या है: नतीजों के सेट में सभी उपयोगकर्ताओं का डेटा शामिल है.

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

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

performQuery में, अपने कोड को इस तरह अपडेट करें:

  let prefilters: [QueryFilter] = if let uid = user?.uid {
    [QueryFilter(field: "userId", operator: "==", value: uid)]
  }
  else {
    []
  }

  let queryRequest = QueryRequest(query: searchTerm,
                                  limit: 2,
                                  prefilters: prefilters)

इससे लॉग-इन किए गए उपयोगकर्ता के आईडी के आधार पर, डेटा को पहले से फ़िल्टर किया जाएगा. जैसा कि आपको पता होगा, इसके लिए Firestore इंडेक्स को अपडेट करना ज़रूरी है.

embedding फ़ील्ड में userId और वेक्टर एम्बेडिंग, दोनों को शामिल करने वाला नया Firestore इंडेक्स तय करने के लिए, कमांड लाइन में यह कमांड चलाएं.

gcloud alpha firestore indexes composite create --project=INSERT-YOUR-PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=order=ASCENDING,field-path=userId --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding

इंडेक्स बनने के बाद, ऐप्लिकेशन को फिर से चलाएं और देखें कि यह उम्मीद के मुताबिक काम कर रहा है या नहीं

पहले से फ़िल्टर किया गया नतीजों का सेट

8. बधाई

इस कोडलैब को पूरा करने के लिए बधाई!

इस कोडलैब में, आपने ये सीखा:

  • सिमेंटिक सर्च की सुविधा चालू करके, Cloud Firestore डेटाबेस सेट अप करें.
  • डेटाबेस से इंटरैक्ट करने के लिए, एक आसान SwiftUI ऐप्लिकेशन बनाएं.
  • SwiftUI के searchable व्यू मॉडिफ़ायर और task मॉडिफ़ायर का इस्तेमाल करके, खोज बार लागू करें.
  • Firestore SDK के कॉल किए जा सकने वाले इंटरफ़ेस का इस्तेमाल करके, डेटाबेस पर सिमैंटिक सर्च करने के लिए, Cloud फ़ंक्शन को कॉल करें.

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

Firestore के नए वेक्टर फ़ील्ड और वेक्टर एम्बेडिंग का हिसाब लगाने के तरीके के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.