आपने अपने एप्लिकेशन, उत्पाद या व्यवसाय में वेक्टर खोज का उपयोग करने का निर्णय लिया है। आपने शोध किया है कि कैसे और क्यों एम्बेडिंग और वेक्टर खोज किसी समस्या को हल करने योग्य बनाते हैं या नई सुविधाएँ सक्षम कर सकते हैं। आपने अनुमानित निकटतम-पड़ोसी एल्गोरिदम और वेक्टर डेटाबेस के उभरते हुए क्षेत्र में अपने पैर डुबोए हैं।
वेक्टर सर्च एप्लीकेशन को उत्पादन में लाने के लगभग तुरंत बाद, आप बहुत कठिन और संभावित रूप से अप्रत्याशित कठिनाइयों का सामना करना शुरू कर देंगे। यह ब्लॉग आपको आपके भविष्य, आपके सामने आने वाली समस्याओं और उन सवालों के बारे में कुछ जानकारी देने का प्रयास करता है, जिनके बारे में आपको अभी तक पता नहीं है और जिन्हें आपको पूछने की आवश्यकता है।
वेक्टर खोज और उससे जुड़े सभी चतुर एल्गोरिदम, वेक्टर का लाभ उठाने की कोशिश करने वाले किसी भी सिस्टम की केंद्रीय बुद्धिमत्ता हैं। हालाँकि, इसे अधिकतम उपयोगी और उत्पादन के लिए तैयार करने के लिए सभी संबंधित बुनियादी ढाँचे बहुत बड़े हैं और उन्हें कम आंकना बहुत आसान है।
मैं इसे जितना संभव हो सके उतना मजबूती से कहना चाहता हूं: एक उत्पादन-तैयार वेक्टर डेटाबेस "वेक्टर" समस्याओं की तुलना में कई, कई अधिक "डेटाबेस" समस्याओं को हल करेगा। किसी भी तरह से वेक्टर खोज, अपने आप में, एक "आसान" समस्या नहीं है (और हम नीचे कई कठिन उप-समस्याओं को कवर करेंगे), लेकिन पारंपरिक डेटाबेस समस्याओं का पहाड़ जिसे एक वेक्टर डेटाबेस को हल करने की आवश्यकता है, निश्चित रूप से "कठिन हिस्सा" है।
डेटाबेस बहुत सारी वास्तविक और बहुत अच्छी तरह से अध्ययन की गई समस्याओं का समाधान करते हैं, जैसे परमाणुता और लेन-देन, संगति, प्रदर्शन और क्वेरी अनुकूलन, स्थायित्व, बैकअप, एक्सेस नियंत्रण, मल्टी-टेनेंसी, स्केलिंग और शार्डिंग और बहुत कुछ। वेक्टर डेटाबेस को किसी भी उत्पाद, व्यवसाय या उद्यम के लिए इन सभी आयामों में उत्तरों की आवश्यकता होगी।
घर पर बनाए गए “वेक्टर-सर्च इन्फ्रा” से बहुत सावधान रहें। अत्याधुनिक वेक्टर सर्च लाइब्रेरी डाउनलोड करना और एक दिलचस्प प्रोटोटाइप की ओर अपना रास्ता बनाना उतना मुश्किल नहीं है। हालाँकि, इस रास्ते पर आगे बढ़ना, गलती से अपने खुद के डेटाबेस को फिर से बनाने का रास्ता है। यह शायद एक ऐसा विकल्प है जिसे आप जानबूझकर चुनना चाहते हैं।
सबसे आधुनिक ANN वेक्टर खोज एल्गोरिदम की प्रकृति के कारण, वेक्टर इंडेक्स को क्रमिक रूप से अपडेट करना एक बड़ी चुनौती है। यह एक जानी-मानी "कठिन समस्या" है। यहाँ समस्या यह है कि इन इंडेक्स को तेज़ लुकअप के लिए सावधानीपूर्वक व्यवस्थित किया जाता है और नए वेक्टर के साथ उन्हें क्रमिक रूप से अपडेट करने का कोई भी प्रयास तेज़ लुकअप गुणों को तेज़ी से ख़राब कर देगा। इस प्रकार, वेक्टर को जोड़ने के साथ तेज़ लुकअप बनाए रखने के लिए, इन इंडेक्स को समय-समय पर स्क्रैच से फिर से बनाने की आवश्यकता होती है।
कोई भी एप्लिकेशन जो लगातार नए वेक्टर स्ट्रीम करने की उम्मीद करता है, जिसमें यह आवश्यकता होती है कि दोनों वेक्टर इंडेक्स में जल्दी दिखाई दें और क्वेरीज़ तेज़ रहें, उसे "वृद्धिशील इंडेक्सिंग" समस्या के लिए गंभीर समर्थन की आवश्यकता होगी। यह आपके लिए अपने डेटाबेस के बारे में समझने के लिए एक बहुत ही महत्वपूर्ण क्षेत्र है और कई कठिन सवाल पूछने के लिए एक अच्छी जगह है।
इस समस्या को हल करने में डेटाबेस की मदद करने के लिए कई संभावित दृष्टिकोण हैं। इन दृष्टिकोणों का उचित सर्वेक्षण इस आकार के कई ब्लॉग पोस्ट भर देगा। आपके डेटाबेस के दृष्टिकोण के कुछ तकनीकी विवरणों को समझना महत्वपूर्ण है क्योंकि इससे आपके एप्लिकेशन में अप्रत्याशित ट्रेडऑफ़ या परिणाम हो सकते हैं। उदाहरण के लिए, यदि कोई डेटाबेस कुछ आवृत्ति के साथ पूर्ण-पुनः अनुक्रमणिका करना चुनता है, तो यह उच्च CPU लोड का कारण बन सकता है और इसलिए समय-समय पर क्वेरी विलंबता को प्रभावित करता है।
आपको अपने अनुप्रयोगों की वृद्धिशील अनुक्रमण की आवश्यकता, तथा उस प्रणाली की क्षमताओं को समझना चाहिए जिस पर आप अपनी सेवा के लिए निर्भर हैं।
हर एप्लिकेशन को डेटा विलंबता के लिए अपनी ज़रूरत और सहनशीलता को समझना चाहिए। वेक्टर-आधारित इंडेक्स में, कम से कम अन्य डेटाबेस मानकों के अनुसार, अपेक्षाकृत उच्च इंडेक्सिंग लागत होती है। लागत और डेटा विलंबता के बीच एक महत्वपूर्ण समझौता है।
वेक्टर को 'बनाने' के कितने समय बाद आपको इसे अपने इंडेक्स में खोजने योग्य बनाना होगा? अगर यह जल्दी है, तो इन सिस्टम में वेक्टर विलंबता एक प्रमुख डिज़ाइन बिंदु है।
यही बात आपके सिस्टम के मेटाडेटा पर भी लागू होती है। एक सामान्य नियम के रूप में, मेटाडेटा में परिवर्तन करना काफी आम है (जैसे कि उपयोगकर्ता ऑनलाइन है या नहीं, यह बदलना), और इसलिए यह आमतौर पर बहुत महत्वपूर्ण है कि मेटाडेटा फ़िल्टर की गई क्वेरीज़ मेटाडेटा के अपडेट पर तेज़ी से प्रतिक्रिया करें। उपरोक्त उदाहरण लेते हुए, यह उपयोगी नहीं है यदि आपकी वेक्टर खोज किसी ऐसे व्यक्ति के लिए क्वेरी लौटाती है जो हाल ही में ऑफ़लाइन हो गया है!
यदि आपको सिस्टम में निरंतर वेक्टर्स को स्ट्रीम करने की आवश्यकता है, या उन वेक्टर्स के मेटाडेटा को निरंतर अपडेट करने की आवश्यकता है, तो आपको एक अलग अंतर्निहित डेटाबेस आर्किटेक्चर की आवश्यकता होगी, जो आपके उपयोग के मामले के लिए स्वीकार्य है, जैसे कि अगले दिन उपयोग के लिए हर शाम पूर्ण इंडेक्स का पुनर्निर्माण करना।
मैं इस बात को दृढ़ता से कहूंगा: मेरा मानना है कि लगभग सभी परिस्थितियों में, उत्पाद का अनुभव बेहतर होगा यदि अंतर्निहित वेक्टर खोज बुनियादी ढांचे को मेटाडेटा फ़िल्टरिंग (या हाइब्रिड खोज) द्वारा संवर्धित किया जा सके।
मुझे वे सभी रेस्तरां दिखाएं जो मुझे पसंद आ सकते हैं (वेक्टर खोज) जो 10 मील के भीतर स्थित हैं और कम से मध्यम मूल्य वाले हैं (मेटाडेटा फ़िल्टर)।
इस क्वेरी का दूसरा भाग एक पारंपरिक sql-जैसा WHERE
क्लॉज है, जो पहले भाग में एक वेक्टर खोज परिणाम के साथ प्रतिच्छेदित है। इन बड़े, अपेक्षाकृत स्थिर, अपेक्षाकृत मोनोलिथिक वेक्टर इंडेक्स की प्रकृति के कारण, संयुक्त वेक्टर + मेटाडेटा खोज को कुशलतापूर्वक करना बहुत मुश्किल है। यह एक और प्रसिद्ध "कठिन समस्या" है जिसे वेक्टर डेटाबेस को आपकी ओर से संबोधित करने की आवश्यकता है।
इस समस्या को हल करने के लिए डेटाबेस कई तकनीकी दृष्टिकोण अपना सकते हैं। आप "प्री-फ़िल्टर" कर सकते हैं, जिसका अर्थ है कि पहले फ़िल्टर लागू करना और फिर वेक्टर लुकअप करना। यह दृष्टिकोण प्री-बिल्ट वेक्टर इंडेक्स का प्रभावी ढंग से लाभ उठाने में सक्षम नहीं होने से ग्रस्त है। आप पूर्ण वेक्टर खोज करने के बाद परिणामों को "पोस्ट-फ़िल्टर" कर सकते हैं। यह तब तक बढ़िया काम करता है जब तक कि आपका फ़िल्टर बहुत चयनात्मक न हो, जिस स्थिति में, आप उन वेक्टर को खोजने में बहुत समय लगाते हैं जिन्हें आप बाद में बाहर कर देते हैं क्योंकि वे निर्दिष्ट मानदंडों को पूरा नहीं करते हैं। कभी-कभी, जैसा कि रॉकसेट में होता है, आप "सिंगल-स्टेज" फ़िल्टरिंग कर सकते हैं, जो मेटाडेटा फ़िल्टरिंग चरण को वेक्टर लुकअप चरण के साथ इस तरह से मर्ज करने का प्रयास करता है जो दोनों दुनिया के सर्वश्रेष्ठ को संरक्षित करता है।
यदि आप मानते हैं कि मेटाडेटा फ़िल्टरिंग आपके अनुप्रयोग के लिए महत्वपूर्ण होगी (और मैं ऊपर कह चुका हूँ कि यह लगभग हमेशा ही महत्वपूर्ण होगी), तो मेटाडेटा फ़िल्टरिंग ट्रेडऑफ़ और कार्यक्षमता ऐसी चीज़ बन जाएगी जिसकी आपको बहुत सावधानी से जांच करनी होगी।
अगर मैं सही हूँ, और मेटाडेटा फ़िल्टरिंग आपके द्वारा बनाए जा रहे एप्लिकेशन के लिए महत्वपूर्ण है, तो बधाई हो, आपके पास एक और समस्या है। आपको इस मेटाडेटा पर फ़िल्टर निर्दिष्ट करने का एक तरीका चाहिए। यह एक क्वेरी भाषा है।
डेटाबेस के दृष्टिकोण से, और चूंकि यह एक रॉकसेट ब्लॉग है, आप शायद यह अनुमान लगा सकते हैं कि मैं इस बारे में क्या कहना चाह रहा हूँ। SQL इस तरह के कथनों को व्यक्त करने का उद्योग मानक तरीका है। वेक्टर भाषा में "मेटाडेटा फ़िल्टर" पारंपरिक डेटाबेस के लिए बस " WHERE
क्लॉज़" है। इसका लाभ यह भी है कि इसे विभिन्न प्रणालियों के बीच पोर्ट करना अपेक्षाकृत आसान है।
इसके अलावा, ये फ़िल्टर क्वेरीज़ हैं, और क्वेरीज़ को ऑप्टिमाइज़ किया जा सकता है। क्वेरी ऑप्टिमाइज़र की परिष्कृतता आपके क्वेरीज़ के प्रदर्शन पर बहुत बड़ा प्रभाव डाल सकती है। उदाहरण के लिए, परिष्कृत ऑप्टिमाइज़र सबसे पहले मेटाडेटा फ़िल्टर में से सबसे चुनिंदा फ़िल्टर को लागू करने का प्रयास करेंगे क्योंकि इससे फ़िल्टरिंग के बाद के चरणों में काम कम हो जाएगा, जिसके परिणामस्वरूप प्रदर्शन में बड़ी जीत होगी।
यदि आप वेक्टर खोज और मेटाडेटा फिल्टर का उपयोग करके गैर-तुच्छ अनुप्रयोग लिखने की योजना बनाते हैं, तो क्वेरी-भाषा, एर्गोनॉमिक्स और कार्यान्वयन दोनों को समझना और उससे सहज होना महत्वपूर्ण है, जिसे आप उपयोग करने, लिखने और बनाए रखने के लिए साइन अप कर रहे हैं।
ठीक है, आप यहाँ तक पहुँच गए हैं। आपके पास एक वेक्टर डेटाबेस है जिसमें आपके लिए आवश्यक सभी सही डेटाबेस मूलभूत तत्व हैं, आपके उपयोग के मामले के लिए सही वृद्धिशील अनुक्रमण रणनीति है, आपकी मेटाडेटा फ़िल्टरिंग आवश्यकताओं के बारे में एक अच्छी कहानी है, और आपके द्वारा सहन की जा सकने वाली विलंबता के साथ इसकी अनुक्रमणिका को अद्यतित रखेगा। बहुत बढ़िया।
आपकी ML टीम (या शायद OpenAI) अपने एम्बेडिंग मॉडल का नया संस्करण लेकर आती है। आपके पास पुराने वेक्टर से भरा एक विशाल डेटाबेस है जिसे अब अपडेट करने की आवश्यकता है। अब क्या? आप इस बड़े बैच-ML जॉब को कहाँ चलाने जा रहे हैं? आप मध्यवर्ती परिणामों को कैसे संग्रहीत करने जा रहे हैं? आप नए संस्करण पर स्विच कैसे करने जा रहे हैं? आप इसे इस तरह से करने की योजना कैसे बनाते हैं कि इससे आपके उत्पादन कार्यभार पर कोई असर न पड़े?
वेक्टर सर्च एक तेजी से उभरता हुआ क्षेत्र है, और हम देख रहे हैं कि बहुत से उपयोगकर्ता एप्लिकेशन को उत्पादन में लाना शुरू कर रहे हैं। इस पोस्ट के लिए मेरा लक्ष्य आपको कुछ महत्वपूर्ण कठिन सवालों से लैस करना था जिन्हें आप अभी तक पूछना नहीं जानते होंगे। और आपको जल्द से जल्द उनके उत्तर मिलने से बहुत लाभ होगा।
इस पोस्ट में मैंने यह नहीं बताया कि रॉकसेट ने इन सभी समस्याओं को कैसे हल किया है और इसके लिए काम कर रहा है और क्यों हमारे कुछ समाधान क्रांतिकारी हैं और अत्याधुनिक प्रयासों की तुलना में बेहतर हैं। इसे कवर करने के लिए इस आकार के कई ब्लॉग पोस्ट की आवश्यकता होगी, जो कि, मुझे लगता है, हम ठीक यही करेंगे। अधिक जानकारी के लिए बने रहें।