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

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

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

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

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

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

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

  • एक्सकोड 15.3
  • कोडलैब सैंपल कोड. इसे कोडलैब के बाद के चरण में डाउनलोड किया जा सकता है.

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

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

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

  1. Firebase में साइन इन करें
  2. Firebase कंसोल में, प्रोजेक्ट जोड़ें पर क्लिक करें, फिर अपने प्रोजेक्ट को नाम दें Firestore वेक्टर Search Labप्रोजेक्ट बनाएं, तीन में से पहला चरण: प्रोजेक्ट का नाम चुनना
  3. प्रोजेक्ट बनाने के विकल्पों में से क्लिक करें. अगर आपसे Firebase की शर्तें स्वीकार करने के लिए कहा जाए, तो उन्हें स्वीकार करें.
  4. Google Analytics स्क्रीन पर, इस प्रोजेक्ट के लिए Google Analytics चालू करें बॉक्स से सही का निशान हटाएं, क्योंकि आप इस ऐप्लिकेशन के लिए Analytics का इस्तेमाल नहीं करेंगे.
  5. आखिर में, प्रोजेक्ट बनाएं पर क्लिक करें.

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

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

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

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

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

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

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

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

Cloud Firestore सेट अप करें

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

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

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

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

ऐप्लिकेशन का नमूना डाउनलोड करें

  1. https://github.com/FirebaseExtended/codelab-firestore-viewersearch-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 प्रोजेक्ट के नोट फ़ोल्डर में खींचें और छोड़ें. ऐसा करने का सही तरीका इसे Assets.xcassets फ़ाइल के नीचे ले जाना है.plist फ़ाइल को Xcode में खींचें और छोड़ें
  8. ज़रूरी होने पर आइटम कॉपी करें चुनें. पक्का करें कि टारगेट में जोड़ें सेक्शन में नोट टारगेट चुना गया हो. इसके बाद, पूरा करें पर क्लिक करें.फ़ाइलें जोड़ने के लिए विकल्पों वाले डायलॉग बॉक्स में, “ज़रूरी होने पर कॉपी करें” विकल्प चुनें
  9. Firebase कंसोल में, अब सेटअप की बाकी प्रोसेस पर क्लिक करें: इस सेक्शन की शुरुआत में आपने जो सैंपल डाउनलोड किया था उसमें Firebase Apple SDK पहले से इंस्टॉल किया हुआ है. साथ ही, इसे शुरू करने की सुविधा भी सेट अप की गई है. कंसोल पर जाएं पर क्लिक करके, प्रोसेस पूरी की जा सकती है.

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

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

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

4. Firestore एक्सटेंशन के साथ वेक्टर खोज इंस्टॉल करें

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

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

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

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

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

  1. जारी रखने के लिए, प्रोजेक्ट अपग्रेड करें पर क्लिक करें. प्रोजेक्ट को Blaze प्लान पर अपग्रेड करना
  2. कोई मौजूदा बिलिंग खाता चुनें या नया खाता बनाएं. जारी रखें पर क्लिक करें.बिलिंग खाता चुनना
  3. बजट सेट करें (जैसे कि 1,000 रुपये), जारी रखें पर क्लिक करें. इसके बाद, खरीदारी करें पर क्लिक करें.बजट सेट अप करना
  4. चालू एपीआई और बनाए गए संसाधनों की समीक्षा करें.चालू एपीआई की समीक्षा करना
  5. ज़रूरी सेवाएं चालू करें.ज़रूरी सेवाएं चालू करना
  6. Cloud Storage चालू करते समय, सुरक्षा के नियमों के लिए टेस्ट मोड चुनें.
  7. पुष्टि करें कि Cloud Storage उसी जगह का इस्तेमाल करेगा जो आपके Cloud Firestore इंस्टेंस का इस्तेमाल करेगी.
  8. सभी सेवाएं चालू होने के बाद, आगे बढ़ें पर क्लिक करें.सभी सेवाएं चालू करने के बाद, 'आगे बढ़ें' पर क्लिक करें
  9. इस एक्सटेंशन को समीक्षा का ऐक्सेस दिया गया.
  10. एक्सटेंशन कॉन्फ़िगर करें:
    • एलएलएम के तौर पर, Vertex AI को चुनें
    • कलेक्शन पाथ: नोट
    • क्वेरी की डिफ़ॉल्ट सीमा: 3
    • इनपुट फ़ील्ड का नाम: टेक्स्ट
    • आउटपुट फ़ील्ड का नाम: एम्बेड करना
    • स्टेटस फ़ील्ड का नाम:* *स्टेटस*
    • मौजूदा दस्तावेज़ों को एम्बेड करें: हां
    • मौजूदा दस्तावेज़ों को अपडेट करें: हां
    • Cloud फ़ंक्शन की जगह की जानकारी: us-central1
  11. इंस्टॉल करने की प्रोसेस पूरी करने के लिए, एक्सटेंशन इंस्टॉल करें पर क्लिक करें.

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

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

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

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

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

वेक्टर खोज कैसे काम करता है?

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

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

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. इसकी पुष्टि करने के लिए, नोट का कोई एक दस्तावेज़ खोलें. इसके बाद, आपको vector<768> टाइप का embedding नाम का एक अतिरिक्त फ़ील्ड दिखेगा. साथ ही, status फ़ील्ड भी दिखेगा.Firestore कंसोल के अंदर वेक्टर एम्बेडिंग फ़ील्ड

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

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

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

क्वेरी करना

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

  1. Firebase कंसोल के Firestore सेक्शन में, _firestore-vector-search/index दस्तावेज़ पर जाएं
  2. + कलेक्शन शुरू करेंनया उप-संग्रह जोड़ना पर क्लिक करें
  3. queries नाम का नया सब-कलेक्शन बनाएं
  4. नया दस्तावेज़ बनाएं और query फ़ील्ड को उस टेक्स्ट पर सेट करें जो आपके किसी दस्तावेज़ में होता है. यह सुविधा सिमैंटिक क्वेरी के लिए सबसे सही है. जैसे, "मैं Swift के साथ Firestore दस्तावेज़ों को कैसे मैप कर सकता/सकती हूं" (बशर्ते आपने जोड़े गए कम से कम एक नोट में इस विषय पर चर्चा करने वाला टेक्स्ट शामिल हो).क्वेरी फ़ील्ड जोड़ना
  5. आपको स्थितिकोई त्रुटि आई में कोई गड़बड़ी दिख सकती है
  6. इंडेक्स न होने की वजह से ऐसा होता है. जो इंडेक्स कॉन्फ़िगरेशन मौजूद नहीं है उसे सेट अप करने के लिए, अपने प्रोजेक्ट के Google Cloud Console पर जाएं. इसके लिए, इस लिंक पर जाएं. इसके बाद, सूची से अपना प्रोजेक्ट चुनेंसही प्रोजेक्ट चुनना
  7. क्लाउड लॉग एक्सप्लोरर में, अब आपको गड़बड़ी का एक मैसेज दिखेगा. इसमें यह लिखा होगा: "FAILED_PRECondition: वेक्टर इंडेक्स कॉन्फ़िगरेशन मौजूद नहीं है. कृपया इस gcloud निर्देश के साथ ज़रूरी इंडेक्स बनाएं: ..."लॉग एक्सप्लोरर में गड़बड़ी का मैसेज
  8. गड़बड़ी के मैसेज में एक gcloud कमांड भी होता है, जिसे आपको उस इंडेक्स को कॉन्फ़िगर करने के लिए चलाना होगा जो मौजूद नहीं है.
  9. अपनी कमांड लाइन से, इस कमांड को चलाएं. अगर आपकी मशीन पर gcloud सीएलआई इंस्टॉल नहीं है, तो उसे इंस्टॉल करने के लिए यहां दिए गए निर्देशों का पालन करें.
    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 एक्सटेंशन के साथ वेक्टर सर्च से कनेक्ट करने का समय आ गया है. साथ ही, सिमैंटिक खोज की सुविधा लागू करने का समय आ गया है. इसकी मदद से, आपके उपयोगकर्ता आम भाषा में पूछी जाने वाली क्वेरी का इस्तेमाल करके, अपने नोट खोज पाएंगे.

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

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

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

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

  1. अपने प्रोजेक्ट के Firebase कंसोल पर जाएं और बिल्ड सेक्शन में फ़ंक्शन मेन्यू आइटम खोलें.
  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 सेकंड तक रोकने का निर्देश दिया है. इसका मतलब है कि semanticSearch को सिर्फ़ तब कॉल किया जाएगा, जब उपयोगकर्ता 0.8 सेकंड से ज़्यादा समय के लिए टाइपिंग को रोक देगा.

आपका कोड अब कुछ ऐसा दिखेगा:

...
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 कंसोल गड़बड़ी का मैसेज दिखाता है: "फ़ंक्शन को अमान्य आर्ग्युमेंट के साथ कॉल किया गया था"

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

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

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

  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 इंडेक्स को अपडेट करना ज़रूरी है.

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

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 के खोजने लायक व्यू मॉडिफ़ायर और टास्क मॉडिफ़ायर का इस्तेमाल करके, खोज बार लागू करें.
  • Firestore SDK के कॉल करने लायक इंटरफ़ेस का इस्तेमाल करके, डेटाबेस पर सिमैंटिक खोज करने के लिए क्लाउड फ़ंक्शन को कॉल करें.

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

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