1. खास जानकारी
इस कोडलैब में, आपको Firestore वेक्टर मिलती-जुलती खोज का इस्तेमाल करके, अपने ऐप्लिकेशन में खोज की बेहतर सुविधाएं जोड़ने का तरीका पता चलेगा. नोट लिखने वाले ऐप्लिकेशन के लिए, आपको Swift और SwiftUI में सिमैंटिक सर्च सुविधा लागू करनी होगी.
आपको क्या सीखने को मिलेगा
- वेक्टर एम्बेडिंग को कंप्यूट करने के लिए, Firestore एक्सटेंशन के साथ वेक्टर सर्च इंस्टॉल करने का तरीका.
- Swift ऐप्लिकेशन से Firebase Cloud Functions को कॉल करने का तरीका.
- साइन इन किए हुए उपयोगकर्ता के आधार पर, डेटा को पहले से फ़िल्टर करने का तरीका.
आपको किन चीज़ों की ज़रूरत होगी
- Xcode 15.3
- कोडलैब का सैंपल कोड. आपको इसे कोडलैब के अगले चरण में डाउनलोड करना होगा.
2. Firebase प्रोजेक्ट बनाना और उसे सेट अप करना
Firebase वेक्टर सर्च एक्सटेंशन का इस्तेमाल करने के लिए, आपके पास Firebase प्रोजेक्ट होना चाहिए. कोडलैब के इस हिस्से में, आपको एक नया Firebase प्रोजेक्ट बनाना होगा. साथ ही, Cloud Firestore और Firebase Authentication जैसी ज़रूरी सेवाओं को चालू करना होगा.
Firebase प्रोजेक्ट बनाना
- Firebase में साइन इन करें
- Firebase कंसोल में, प्रोजेक्ट जोड़ें पर क्लिक करें. इसके बाद, अपने प्रोजेक्ट का नाम Firestore वेक्टर सर्च लैब रखें
- प्रोजेक्ट बनाने के विकल्पों पर क्लिक करें. अगर कहा जाए, तो Firebase की शर्तें स्वीकार करें.
- Google Analytics की स्क्रीन पर, इस प्रोजेक्ट के लिए Google Analytics चालू करें बॉक्स से सही का निशान हटाएं. इसकी वजह यह है कि आपको इस ऐप्लिकेशन के लिए Analytics का इस्तेमाल नहीं करना है.
- आखिर में, प्रोजेक्ट बनाएं पर क्लिक करें.
Firebase प्रोजेक्ट के बारे में ज़्यादा जानने के लिए, Firebase प्रोजेक्ट के बारे में जानकारी लेख पढ़ें.
Firebase के प्लान की कीमत अपग्रेड करना
Firebase एक्सटेंशन और उनसे जुड़ी क्लाउड सेवाओं का इस्तेमाल करने के लिए, आपके Firebase प्रोजेक्ट को इस्तेमाल के हिसाब से पैसे चुकाएं (ब्लेज़) वाले प्राइसिंग प्लान पर आधारित होना चाहिए. इसका मतलब है कि आपका Firebase प्रोजेक्ट, किसी क्लाउड बिलिंग खाते से जुड़ा होना चाहिए.
- Cloud Billing खाते के लिए, क्रेडिट कार्ड जैसा पेमेंट का कोई तरीका होना ज़रूरी है.
- अगर आपने Firebase और Google Cloud का इस्तेमाल पहले कभी नहीं किया है, तो देखें कि क्या आपको 300 डॉलर का क्रेडिट और मुफ़्त में आज़माने के लिए Cloud Billing खाता मिल सकता है.
- अगर आपने किसी इवेंट के तहत यह कोडलैब किया है, तो इवेंट के आयोजक से पूछें कि क्या कोई Cloud क्रेडिट उपलब्ध है.
अपने प्रोजेक्ट को Blaze प्लान पर अपग्रेड करने के लिए, यह तरीका अपनाएं:
- Firebase कंसोल में, अपना प्लान अपग्रेड करें को चुनें.
- ब्लेज़ प्लान चुनें. अपने प्रोजेक्ट से क्लाउड बिलिंग खाता लिंक करने के लिए, स्क्रीन पर दिए गए निर्देशों का पालन करें.
अगर आपको इस अपग्रेड के तहत क्लाउड बिलिंग खाता बनाना पड़ा है, तो अपग्रेड पूरा करने के लिए, आपको Firebase Console में अपग्रेड फ़्लो पर वापस जाना पड़ सकता है.
कंसोल में Firebase प्रॉडक्ट चालू और सेट अप करना
आप जो ऐप्लिकेशन बना रहे हैं वह ऐसे कई Firebase प्रॉडक्ट का इस्तेमाल करता है जो Apple के ऐप्लिकेशन के लिए उपलब्ध हैं:
- Firebase से पुष्टि करने की सुविधा का इस्तेमाल करके, उपयोगकर्ता आपके ऐप्लिकेशन में आसानी से साइन इन कर सकते हैं.
- Cloud Firestore, ताकि क्लाउड पर स्ट्रक्चर्ड डेटा सेव किया जा सके और डेटा में बदलाव होने पर तुरंत सूचना मिल सके.
- आपके डेटाबेस को सुरक्षित रखने के लिए, Firebase के सुरक्षा नियम.
इनमें से कुछ प्रॉडक्ट के लिए, खास कॉन्फ़िगरेशन की ज़रूरत होती है या इन्हें Firebase कंसोल का इस्तेमाल करके चालू करना पड़ता है.
Firebase Authentication के लिए, पहचान छिपाकर पुष्टि करने की सुविधा चालू करना
यह ऐप्लिकेशन, पहचान छिपाकर पुष्टि करने की सुविधा का इस्तेमाल करता है. इससे उपयोगकर्ता, खाता बनाए बिना ही ऐप्लिकेशन का इस्तेमाल कर सकते हैं. इससे, उपयोगकर्ताओं को आसानी से शामिल किया जा सकता है. बिना पहचान ज़ाहिर किए पुष्टि करने की सुविधा और नाम वाले खाते में अपग्रेड करने के तरीके के बारे में ज़्यादा जानने के लिए, बिना पहचान ज़ाहिर किए पुष्टि करने के सबसे सही तरीके देखें.
- Firebase कंसोल के बाईं ओर मौजूद पैनल में, बिल्ड > पुष्टि पर क्लिक करें. इसके बाद, शुरू करें पर क्लिक करें.
- अब आप पुष्टि करने वाले डैशबोर्ड पर हैं. यहां आपको साइन अप किए गए उपयोगकर्ता दिखेंगे. साथ ही, साइन इन करने की सुविधा देने वाली कंपनियों को कॉन्फ़िगर किया जा सकता है और सेटिंग मैनेज की जा सकती हैं.
- साइन इन करने का तरीका टैब चुनें या सीधे टैब पर जाने के लिए, यहां क्लिक करें.
- सेवा देने वाले के विकल्पों में से पहचान छिपाकर पर क्लिक करें. इसके बाद, स्विच को चालू करें पर टॉगल करें. इसके बाद, सेव करें पर क्लिक करें.
Cloud Firestore सेट अप करना
यह Swift ऐप्लिकेशन, नोट सेव करने के लिए Cloud Firestore का इस्तेमाल करता है.
अपने Firebase प्रोजेक्ट में Cloud Firestore सेट अप करने का तरीका यहां बताया गया है:
- Firebase कंसोल के बाएं पैनल में, बिल्ड करें को बड़ा करें. इसके बाद, Firestore डेटाबेस चुनें.
- डेटाबेस बनाएं पर क्लिक करें.
- डेटाबेस आईडी को
(default)
पर सेट रहने दें. - अपने डेटाबेस के लिए कोई जगह चुनें, फिर आगे बढ़ें पर क्लिक करें.
असल ऐप्लिकेशन के लिए, आपको वह जगह चुननी है जो आपके उपयोगकर्ताओं के आस-पास हो. - टेस्ट मोड में शुरू करें पर क्लिक करें. सुरक्षा नियमों के बारे में डिसक्लेमर पढ़ें.
इस कोडलैब में आगे, आपको अपने डेटा को सुरक्षित रखने के लिए सुरक्षा नियम जोड़ने होंगे. अपने डेटाबेस के लिए सुरक्षा के नियम जोड़े बिना, किसी ऐप्लिकेशन को सार्वजनिक रूप से उपलब्ध न करें या उसे सार्वजनिक न करें. - बनाएं पर क्लिक करें.
Firebase के लिए Cloud Storage सेट अप करना
वेब ऐप्लिकेशन में फ़ोटो सेव, अपलोड, और शेयर करने के लिए, 'Firebase के लिए Cloud Storage' का इस्तेमाल किया जाता है.
अपने Firebase प्रोजेक्ट में, 'Firebase के लिए Cloud Storage' सेट अप करने का तरीका यहां बताया गया है:
- Firebase कंसोल के बाएं पैनल में, बिल्ड को बड़ा करें. इसके बाद, स्टोरेज चुनें.
- शुरू करें पर क्लिक करें.
- अपनी डिफ़ॉल्ट स्टोरेज बकेट के लिए कोई जगह चुनें.
US-WEST1
,US-CENTRAL1
, औरUS-EAST1
में मौजूद बकेट, Google Cloud Storage के लिए "हमेशा मुफ़्त" टीयर का फ़ायदा ले सकती हैं. अन्य सभी जगहों के बकेट, Google Cloud Storage के शुल्क और उसके इस्तेमाल के हिसाब से होते हैं. - टेस्ट मोड में चालू करें पर क्लिक करें. सुरक्षा के नियमों से जुड़ा डिसक्लेमर पढ़ें.
इस कोडलैब में, बाद में आपको अपने डेटा को सुरक्षित रखने के लिए सुरक्षा के नियम जोड़ने होंगे. अपनी स्टोरेज बकेट के लिए सुरक्षा नियम जोड़े बिना, न किसी ऐप्लिकेशन को सार्वजनिक तौर पर डिस्ट्रिब्यूट या एक्सपोज़ करें. - बनाएं पर क्लिक करें.
3. मोबाइल ऐप्लिकेशन को कनेक्ट करना
कोडलैब के इस सेक्शन में, नोट लिखने से जुड़े आसान ऐप्लिकेशन के लिए सोर्स कोड डाउनलोड किया जा सकता है. साथ ही, उसे अभी-अभी बनाए गए Firebase प्रोजेक्ट से कनेक्ट किया जा सकता है.
सैंपल ऐप्लिकेशन डाउनलोड करें
- https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios पर जाएं और अपनी लोकल मशीन पर रिपॉज़िटरी को क्लोन करें
- Xcode में Notes.xcodeproj प्रोजेक्ट खोलें
ऐप्लिकेशन को अपने Firebase प्रोजेक्ट से कनेक्ट करें
आपका ऐप्लिकेशन Firebase की सेवाओं को ऐक्सेस कर सके, इसके लिए आपको Firebase कंसोल में ऐप्लिकेशन को सेट अप करना होगा. एक ही Firebase प्रोजेक्ट से कई क्लाइंट ऐप्लिकेशन कनेक्ट किए जा सकते हैं. उदाहरण के लिए, अगर आपने कोई Android या वेब ऐप्लिकेशन बनाया है, तो आपको उन्हें एक ही Firebase प्रोजेक्ट से कनेक्ट करना चाहिए.
Firebase प्रोजेक्ट के बारे में ज़्यादा जानने के लिए, Firebase प्रोजेक्ट के बारे में जानकारी लेख पढ़ें.
- Firebase कंसोल में, अपने Firebase प्रोजेक्ट के खास जानकारी वाले पेज पर जाएं.
- iOS ऐप्लिकेशन जोड़ने के लिए, iOS+ आइकॉन पर क्लिक करें.
- अपने Apple ऐप्लिकेशन में Firebase जोड़ें स्क्रीन पर, Xcode प्रोजेक्ट (com.google.firebase.codelab.Notes) से बंडल आईडी डालें.
- अगर आप चाहें, तो ऐप्लिकेशन का कोई दूसरा नाम (Notes for iOS) डाला जा सकता है.
- अगले चरण पर जाने के लिए, ऐप्लिकेशन रजिस्टर करें पर क्लिक करें.
- GoogleServices-Info.plist फ़ाइल डाउनलोड करें.
- GoogleServices-Info.plist को अपने Xcode प्रोजेक्ट के Notes फ़ोल्डर में खींचें और छोड़ें. इसे Assets.xcassets फ़ाइल के नीचे छोड़ना एक अच्छा तरीका है.
- ज़रूरत पड़ने पर आइटम कॉपी करें को चुनें. पक्का करें कि टारगेट में जोड़ें में नोट टारगेट चुना गया हो. इसके बाद, हो गया पर क्लिक करें.
- अब Firebase कंसोल में, सेटअप की बाकी प्रोसेस पर क्लिक किया जा सकता है: इस सेक्शन की शुरुआत में डाउनलोड किए गए सैंपल में, Firebase Apple SDK टूल पहले से इंस्टॉल है और इसे शुरू करने का सेट अप पहले से मौजूद है. कंसोल पर जारी रखें पर क्लिक करके, प्रोसेस पूरी की जा सकती है.
ऐप्लिकेशन चलाना
अब ऐप्लिकेशन को आज़माने का समय आ गया है!
- Xcode में वापस जाकर, iOS सिम्युलेटर पर ऐप्लिकेशन चलाएं. रन डेस्टिनेशन ड्रॉप-डाउन में, सबसे पहले iOS सिम्युलेटर में से कोई एक चुनें.
- इसके बाद, चालू करें बटन पर क्लिक करें या ⌘ + R दबाएं
- सिम्युलेटर पर ऐप्लिकेशन लॉन्च होने के बाद, कुछ नोट जोड़ें.
- Firebase कंसोल में, Firestore डेटा ब्राउज़र पर जाएं. इससे, ऐप्लिकेशन में नए नोट जोड़ते समय, आपको नए दस्तावेज़ बनते हुए दिखेंगे.
4. Firestore एक्सटेंशन के साथ वेक्टर सर्च इंस्टॉल करें
कोडलैब के इस हिस्से में, आपको Firestore एक्सटेंशन के साथ वेक्टर सर्च इंस्टॉल करना होगा. साथ ही, इसे नोट लेने वाले उस ऐप्लिकेशन की ज़रूरतों के हिसाब से कॉन्फ़िगर करना होगा जिस पर काम किया जा रहा है.
एक्सटेंशन इंस्टॉल करना शुरू करना
- अब भी Firestore सेक्शन में, एक्सटेंशन टैब पर क्लिक करें.
- एक्सटेंशन हब पर क्लिक करें.
- "वेक्टर" टाइप करें.
- "Firestore एक्सटेंशन के साथ वेक्टर सर्च" पर क्लिक करें. इससे आपको एक्सटेंशन की जानकारी वाले पेज पर ले जाया जाएगा. यहां आपको एक्सटेंशन के बारे में ज़्यादा जानकारी मिलेगी. साथ ही, यह भी पता चलेगा कि यह कैसे काम करता है, इसके लिए Firebase की कौनसी सेवाओं की ज़रूरत होती है, और इसे कैसे कॉन्फ़िगर किया जा सकता है.
- Firebase कंसोल में इंस्टॉल करें पर क्लिक करें.
- आपको अपने सभी प्रोजेक्ट की सूची दी जाएगी.
- इस कोडलैब के पहले चरण में बनाया गया प्रोजेक्ट चुनें.
एक्सटेंशन कॉन्फ़िगर करें
- चालू किए गए एपीआई और बनाए गए संसाधनों की समीक्षा करें.
- ज़रूरी सेवाएं चालू करें.
- सभी सेवाएं चालू होने के बाद, आगे बढ़ें पर क्लिक करें.
- इस एक्सटेंशन को दिए गए ऐक्सेस की समीक्षा करें.
- एक्सटेंशन कॉन्फ़िगर करें:
- एलएलएम के तौर पर, Vertex AI को चुनें
- कलेक्शन का पाथ: notes
- क्वेरी की डिफ़ॉल्ट सीमा: 3
- इनपुट फ़ील्ड का नाम: text
- आउटपुट फ़ील्ड का नाम: एम्बेड करना
- स्टेटस फ़ील्ड का नाम:* *स्टेटस*
- मौजूदा दस्तावेज़ एम्बेड करें: हां
- मौजूदा दस्तावेज़ अपडेट करें: हां
- Cloud फ़ंक्शन की जगह की जानकारी: us-central1
- इंस्टॉलेशन पूरा करने के लिए, एक्सटेंशन इंस्टॉल करें पर क्लिक करें.
इसमें कुछ मिनट लग सकते हैं. इंस्टॉलेशन पूरा होने का इंतज़ार करते समय, ट्यूटोरियल के अगले सेक्शन पर जाएं और वेक्टर एम्बेडिंग के बारे में ज़्यादा जानें.
5. बैकग्राउंड
इंस्टॉलेशन पूरा होने का इंतज़ार करते समय, यहां Firestore एक्सटेंशन के साथ वेक्टर सर्च के काम करने के तरीके के बारे में कुछ जानकारी दी गई है.
वेक्टर, एम्बेडिंग, और वेक्टर डेटाबेस क्या हैं?
- वेक्टर, गणित के वे ऑब्जेक्ट होते हैं जो किसी संख्या के परिमाण और दिशा को दिखाते हैं. इनका इस्तेमाल, डेटा को इस तरह से दिखाने के लिए किया जा सकता है कि उसकी तुलना और खोज करना आसान हो जाए.
- एम्बेड ऐसे वेक्टर होते हैं जो किसी शब्द या वाक्यांश का मतलब बताते हैं. इन्हें बनाने के लिए, टेक्स्ट के बड़े कॉर्पस पर न्यूरल नेटवर्क को ट्रेनिंग दी जाती है. साथ ही, शब्दों के बीच के संबंधों को भी सीखा जाता है.
- वेक्टर डेटाबेस ऐसे डेटाबेस होते हैं जिन्हें वेक्टर डेटा को स्टोर करने और खोजने के लिए ऑप्टिमाइज़ किया जाता है. इनकी मदद से, नज़दीकी नेबर सर्च की सुविधा का बेहतर तरीके से इस्तेमाल किया जा सकता है. यह किसी क्वेरी वेक्टर से मिलते-जुलते वेक्टर ढूंढने की प्रोसेस है.
वेक्टर सर्च की सुविधा कैसे काम करती है?
वेक्टर सर्च की सुविधा, क्वेरी वेक्टर की तुलना डेटाबेस में मौजूद सभी वेक्टर से करती है. क्वेरी वेक्टर से सबसे ज़्यादा मिलते-जुलते वेक्टर, खोज के नतीजों के तौर पर दिखाए जाते हैं.
दो वैक्टर के बीच की समानता को, दूरी की अलग-अलग मेट्रिक का इस्तेमाल करके मेज़र किया जा सकता है. दूरी की सबसे सामान्य मेट्रिक, कोसाइन सिमिलैरिटी है. यह दो वेक्टर के बीच के कोण को मेज़र करती है.
6. Firestore एक्सटेंशन के साथ वेक्टर सर्च की सुविधा आज़माएं
इस कोडलैब में पहले डाउनलोड किए गए iOS ऐप्लिकेशन में, Firestore एक्सटेंशन के साथ वेक्टर सर्च का इस्तेमाल करने से पहले, Firebase कंसोल में एक्सटेंशन को आज़माया जा सकता है.
दस्तावेज़ पढ़ें
Firebase एक्सटेंशन में, उनके काम करने के तरीके के बारे में दस्तावेज़ शामिल होते हैं.
- एक्सटेंशन इंस्टॉल होने के बाद, शुरू करें बटन पर क्लिक करें.
- "यह एक्सटेंशन कैसे काम करता है" टैब देखें - इसमें बताया गया है कि:
- दस्तावेज़ों को
notes
कलेक्शन में जोड़कर, उनके लिए एम्बेडमेंट का हिसाब लगाने का तरीका, ext-firestore-vector-search-queryCallable
कॉल किए जा सकने वाले फ़ंक्शन को कॉल करके इंडेक्स को क्वेरी करने का तरीका,- या
_firestore-vector-search/index/queries
कलेक्शन में क्वेरी दस्तावेज़ जोड़कर, इंडेक्स से क्वेरी करने का तरीका. - इसमें कस्टम एम्बेडिंग फ़ंक्शन सेट अप करने का तरीका भी बताया गया है. यह तब काम आता है, जब एक्सटेंशन के साथ काम करने वाला कोई भी एलएलएम आपकी ज़रूरतों के मुताबिक न हो और आपको एम्बेडिंग का हिसाब लगाने के लिए किसी दूसरे एलएलएम का इस्तेमाल करना हो.
- दस्तावेज़ों को
- अपने Firestore इंस्टेंस पर जाने के लिए, Cloud Firestore डैशबोर्ड लिंक पर क्लिक करें
_firestore-vector-search/index
दस्तावेज़ पर जाएं. इससे पता चलेगा कि एक्सटेंशन ने उन सभी नोट दस्तावेज़ों के लिए एम्बेड करने की प्रोसेस पूरी कर ली है जिन्हें आपने इस कोडलैब के पिछले चरण में बनाया था.- इसकी पुष्टि करने के लिए, नोट वाला कोई दस्तावेज़ खोलें. आपको
vector<768>
टाइप काembedding
नाम का एक और फ़ील्ड दिखेगा. साथ ही, आपकोstatus
फ़ील्ड भी दिखेगा.
सैंपल दस्तावेज़ बनाना
एक्सटेंशन को काम करते देखने के लिए, आप Firebase कंसोल में एक नया दस्तावेज़ बना सकते हैं.
- Firestore डेटा ब्राउज़र में,
notes
कलेक्शन पर जाएं और बीच वाले कॉलम में, + दस्तावेज़ जोड़ें पर क्लिक करें. - दस्तावेज़ का नया यूनीक आईडी जनरेट करने के लिए, अपने-आप आईडी जनरेट करें पर क्लिक करें.
- स्ट्रिंग टाइप का
text
नाम वाला फ़ील्ड जोड़ें और वैल्यू फ़ील्ड में कुछ टेक्स्ट चिपकाएं. यह ज़रूरी है कि यह टेक्स्ट, कोई सामान्य टेक्स्ट या कोई दूसरा टेक्स्ट न हो. उदाहरण के लिए, कोई खबर चुनें. - सेव करें पर क्लिक करें.
- ध्यान दें कि डेटा प्रोसेस करने के दौरान, एक्सटेंशन स्टेटस फ़ील्ड कैसे जोड़ता है.
- कुछ ही देर बाद, आपको
vector<768>
मान वालाembedding
नया फ़ील्ड दिखेगा.
क्वेरी करना
Firestore एक्सटेंशन के साथ वेक्टर सर्च में एक छोटी सी सुविधा है. इसकी मदद से, किसी ऐप्लिकेशन को कनेक्ट किए बिना, दस्तावेज़ के इंडेक्स से क्वेरी की जा सकती है.
- Firebase कंसोल के Firestore सेक्शन में,
_firestore-vector-search/index
दस्तावेज़ पर जाएं - + कलेक्शन शुरू करें पर क्लिक करें
queries
नाम का नया सब-कलेक्शन बनाना- नया दस्तावेज़ बनाएं और
query
फ़ील्ड को अपने किसी दस्तावेज़ में मौजूद टेक्स्ट पर सेट करें. यह सुविधा, सेमेटिक क्वेरी के लिए सबसे अच्छा काम करती है. जैसे, "मैं Swift की मदद से Firestore दस्तावेज़ों को कैसे मैप करूं". हालांकि, इसके लिए ज़रूरी है कि आपने जो नोट जोड़े हैं उनमें से कम से कम एक में इस विषय के बारे में जानकारी देने वाला टेक्स्ट हो. - आपको स्टेटस में गड़बड़ी दिख सकती है
- ऐसा इंडेक्स मौजूद न होने की वजह से होता है. इंडेक्स कॉन्फ़िगरेशन सेट अप करने के लिए, इस लिंक पर जाकर अपने प्रोजेक्ट के लिए Google Cloud Console पर जाएं. इसके बाद, सूची से अपना प्रोजेक्ट चुनें
- अब आपको Cloud लॉग एक्सप्लोरर में, गड़बड़ी का एक मैसेज दिखेगा. इसमें, "FAILED_PRECONDITION: Missing vector index configuration" लिखा होगा. कृपया gcloud कमांड की मदद से ज़रूरी इंडेक्स बनाएं: ..."
- गड़बड़ी के मैसेज में एक
gcloud
कमांड भी होता है. आपको मौजूद न होने वाले इंडेक्स को कॉन्फ़िगर करने के लिए, यह कमांड चलाना होगा. - अपनी कमांड लाइन से यह कमांड चलाएं. अगर आपकी मशीन पर
gcloud
सीएलआई इंस्टॉल नहीं है, तो उसे इंस्टॉल करने के लिए यहां दिए गए निर्देशों का पालन करें. इंडेक्स बनने में कुछ मिनट लगते हैं. Firebase कंसोल के Firestore सेक्शन में, इंडेक्स टैब पर जाकर, प्रोग्रेस देखी जा सकती है.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
- इंडेक्स सेट अप होने के बाद, नया क्वेरी दस्तावेज़ बनाया जा सकता है.
- अब आपको नतीजों वाले फ़ील्ड में, खोज के लिए इस्तेमाल किए गए शब्द से मेल खाने वाले दस्तावेज़ आईडी की सूची दिखेगी
- उनमें से किसी एक आईडी को कॉपी करें और
notes
कलेक्शन पर वापस जाएं. - आपने जो दस्तावेज़ आईडी कॉपी किया है उसे खोजने के लिए ⌘+F का इस्तेमाल करें. यह दस्तावेज़ आपकी क्वेरी से सबसे ज़्यादा मेल खाता है.
7. सिमेंटिक सर्च लागू करना
अब अपने मोबाइल ऐप्लिकेशन को Firestore एक्सटेंशन की मदद से वेक्टर सर्च से कनेक्ट करने और सेमैनटिक सर्च की सुविधा लागू करने का समय आ गया है. इससे आपके उपयोगकर्ता, सामान्य भाषा की क्वेरी का इस्तेमाल करके अपने नोट खोज पाएंगे.
क्वेरी करने के लिए, कॉल किए जा सकने वाले फ़ंक्शन को कनेक्ट करना
Firestore एक्सटेंशन के साथ वेक्टर सर्च में एक Cloud फ़ंक्शन शामिल होता है. इस फ़ंक्शन को अपने मोबाइल ऐप्लिकेशन से कॉल करके, इस कोडलैब में पहले बनाए गए इंडेक्स को क्वेरी किया जा सकता है. इस चरण में, आप अपने मोबाइल ऐप्लिकेशन और कॉल किए जा सकने वाले इस फ़ंक्शन के बीच कनेक्शन बनाएंगे. Firebase के Swift SDK टूल में ऐसे एपीआई शामिल हैं जिनकी मदद से, रिमोट फ़ंक्शन को आसानी से कॉल किया जा सकता है.
- Xcode पर वापस जाएं और पक्का करें कि आप उस प्रोजेक्ट में हों जिसे आपने इस कोडलैब के पिछले चरण में क्लोन किया था.
NotesRepository.swift
फ़ाइल खोलें.private lazy var vectorSearchQueryCallable: Callable
वाली लाइन ढूंढें= functions.httpsCallable("")
कॉल किए जा सकने वाले Cloud फ़ंक्शन को कॉल करने के लिए, आपको उस फ़ंक्शन का नाम देना होगा जिसे कॉल करना है.
- अपने प्रोजेक्ट के लिए Firebase कंसोल पर जाएं और बिल्ड सेक्शन में फ़ंक्शन मेन्यू आइटम खोलें.
- आपको उन फ़ंक्शन की एक सूची दिखेगी जिन्हें एक्सटेंशन ने इंस्टॉल किया है.
ext-firestore-vector-search-queryCallable
नाम खोजें और उसका नाम कॉपी करें.- नाम को अपने कोड में चिपकाएं. अब यह दिखेगा
private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
क्वेरी फ़ंक्शन को कॉल करें
performQuery
वाला तरीका ढूंढना- कॉल किए जा सकने वाले फ़ंक्शन को कॉल करने के लिए,
let result = try await vectorSearchQueryCallable(searchTerm)
यह एक रिमोट कॉल है, इसलिए हो सकता है कि यह कॉल न हो पाए.
- गड़बड़ियों को पकड़ने और उन्हें 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
व्यू मॉडिफ़ायर की मदद से ऐसा किया जा सकता है. इसके लिए, कोड की सिर्फ़ कुछ लाइनों की ज़रूरत होती है.
- सबसे पहले,
NotesListScreen.swift
खोलें - सूची के व्यू में खोज बॉक्स जोड़ने के लिए, लाइन
.navigationTitle("Notes")
के ठीक ऊपर.searchable(text: $searchTerm, prompt: "Search")
व्यू मॉडिफ़ायर जोड़ें - इसके बाद, नीचे दिया गया कोड जोड़कर खोज फ़ंक्शन को चालू करें:
.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")
...
ऐप्लिकेशन चलाएं
- iOS सिम्युलेटर पर ऐप्लिकेशन लॉन्च करने के लिए, ⌘ + R दबाएं या 'चलाएं' बटन पर क्लिक करें
- आपको वही नोट दिखेंगे जिन्हें आपने इस कोडलैब के दौरान ऐप्लिकेशन में पहले जोड़ा था. साथ ही, वे नोट भी दिखेंगे जिन्हें आपने Firebase कंसोल के ज़रिए जोड़ा था
- आपको नोट सूची में सबसे ऊपर, खोज फ़ील्ड दिखेगा
- आपने जो दस्तावेज़ जोड़े हैं उनमें से किसी एक में मौजूद कोई शब्द टाइप करें. यह सुविधा, "मैं Swift से असाइनोक्रोनस Firebase API को कैसे कॉल करूं" जैसी सेमेटिक क्वेरी के लिए सबसे अच्छी तरह से काम करती है. हालांकि, इसके लिए ज़रूरी है कि आपने जो नोट जोड़े हैं उनमें से कम से कम एक में इस विषय के बारे में जानकारी देने वाला टेक्स्ट हो.
- आपको खोज का नतीजा दिखना चाहिए, लेकिन इसके बजाय, सूची का व्यू खाली है और Xcode कंसोल पर गड़बड़ी का यह मैसेज दिखता है: "फ़ंक्शन को अमान्य आर्ग्युमेंट के साथ कॉल किया गया था"
इसका मतलब है कि आपने डेटा को गलत फ़ॉर्मैट में भेजा है.
गड़बड़ी के मैसेज का विश्लेषण करें
- समस्या का पता लगाने के लिए, Firebase कंसोल पर जाएं
- फ़ंक्शन सेक्शन पर जाएं
ext-firestore-vector-search-queryCallable
फ़ंक्शन ढूंढें. इसके बाद, तीन वर्टिकल बिंदुओं पर क्लिक करके ओवरफ़्लो मेन्यू खोलें- लॉग एक्सप्लोरर पर जाने के लिए, लॉग देखें को चुनें
- आपको गड़बड़ी का एक मैसेज दिखेगा
Unhandled error ZodError: [
{
"code": "invalid_type",
"expected": "object",
"received": "string",
"path": [],
"message": "Expected object, received string"
}
]
इसका मतलब है कि आपने डेटा गलत फ़ॉर्मैट में भेजा है.
सही डेटा टाइप का इस्तेमाल करना
यह पता लगाने के लिए कि पैरामीटर को किस फ़ॉर्मैट में होना चाहिए, एक्सटेंशन के दस्तावेज़ देखें.
- Firebase कंसोल पर, एक्सटेंशन सेक्शन पर जाएं
- मैनेज करें -> पर क्लिक करें
- यह एक्सटेंशन कैसे काम करता है सेक्शन में, आपको इनपुट और आउटपुट पैरामीटर की जानकारी मिलेगी.
- Xcode पर वापस जाएं और
NotesRepository.swift
पर जाएं - फ़ाइल की शुरुआत में यह कोड जोड़ें:
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
, एक्सटेंशन के रिस्पॉन्स के स्ट्रक्चर से मेल खाता है. - कॉल किए जा सकने वाले फ़ंक्शन की जानकारी ढूंढें और इनपुट और आउटपुट टाइप अपडेट करें
private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
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 [] } }
ऐप्लिकेशन को फिर से चलाएं
- ऐप्लिकेशन को फिर से चलाएं
- वह खोज क्वेरी लिखें जिसमें आपके किसी नोट में शामिल शब्द हों
- अब आपको फ़िल्टर की गई नोट की सूची दिखेगी
उपयोगकर्ता के डेटा को पहले से फ़िल्टर करना
खुशी मनाने के लिए डांस करने से पहले, आपको यह जानना होगा कि ऐप्लिकेशन के मौजूदा वर्शन में एक समस्या है: नतीजे के सेट में सभी उपयोगकर्ताओं का डेटा शामिल होता है.
इसकी पुष्टि करने के लिए, ऐप्लिकेशन को किसी दूसरे सिम्युलेटर पर चलाएं और ज़्यादा दस्तावेज़ जोड़ें. नए दस्तावेज़ सिर्फ़ उस सिम्युलेटर में दिखेंगे. अगर आपने ऐप्लिकेशन को किसी दूसरे सिम्युलेटर पर फिर से चलाया, तो आपको सिर्फ़ वे दस्तावेज़ दिखेंगे जिन्हें आपने पहली बार बनाया था.
खोज करने पर, आपको पता चलेगा कि 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 टूल के Callable इंटरफ़ेस का इस्तेमाल करके, डेटाबेस पर सेमेटिक सर्च करने के लिए Cloud फ़ंक्शन को कॉल करें.
इस कोडलैब में मिली जानकारी की मदद से, अब ऐसे बेहतर ऐप्लिकेशन बनाए जा सकते हैं जो Cloud Firestore की सेमैनटिक सर्च की सुविधाओं का फ़ायदा उठाते हैं. इससे, उपयोगकर्ताओं को खोज का बेहतर और आसान अनुभव मिलता है.
Firestore के नए वेक्टर फ़ील्ड और वेक्टर एम्बेडमेंट का हिसाब लगाने के तरीके के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.