मुख्य सामग्री पर जाएँ

MongoDB में वेक्टर सर्च में महारत: उदाहरणों सहित मार्गदर्शिका

स्मार्ट ऐप बनाने के लिए MongoDB की Vector Search सेट अप और उपयोग करना सीखें। यह व्यावहारिक गाइड वेक्टर इंडेक्सिंग, क्वेरी के सर्वोत्तम तरीकों, और वास्तविक दुनिया के उदाहरणों को कवर करती है।
· 7 मि॰ पढ़ें

AI के साथ खोजें

वेक्टर इंडेक्सिंग आधुनिक एप्लिकेशन बनाने के लिए एक शक्तिशाली टूल बन गई है। यह आपको उच्च-आयामी डेटा, जिसे अक्सर समानता खोज (similarity searches) कहा जाता है, पर तेज़ और कुशल खोज करने देता है, जो वेक्टर एम्बेडिंग के रूप में जाना जाता है। यह क्षमता अब MongoDB में सहज रूप से एकीकृत है, जिससे डेवलपर्स सीधे अपने डेटाबेस के भीतर उन्नत फीचर्स बना सकते हैं।

यह लेख MongoDB में वेक्टर इंडेक्सिंग को सेट अप करने और उपयोग करने की एक व्यावहारिक मार्गदर्शिका है। हम चरण-दर-चरण प्रक्रिया से गुजरेंगे—पहला इंडेक्स बनाने से लेकर जटिल क्वेरी चलाने तक। आप सर्वोत्तम प्रथाएँ भी सीखेंगे और एक वास्तविक उदाहरण के रूप में ई-कॉमर्स स्टोर के लिए उत्पाद अनुशंसा प्रणाली (recommendation system) बनाना एक्सप्लोर करेंगे।

Vector Indexing क्या है?

मूल रूप से, वेक्टर इंडेक्सिंग वेक्टर एम्बेडिंग को इस तरह व्यवस्थित करने की तकनीक है जिससे समानता खोज तेज़ हो सके। पारंपरिक इंडेक्स जहाँ स्केलर मानों (जैसे संख्या या स्ट्रिंग) पर काम करते हैं, वहीं वेक्टर इंडेक्स बहु-आयामी स्पेस में "पड़ोसी" वेक्टर खोजने के लिए अनुकूलित होता है।

वेक्टर एम्बेडिंग टेक्स्ट, इमेज, और ऑडियो जैसे जटिल डेटा का संख्यात्मक निरूपण हैं। उदाहरण के लिए, किसी उत्पाद के विवरण को एक वेक्टर में बदला जा सकता है, जहाँ मिलते-जुलते उत्पादों के वेक्टर स्पेस में एक-दूसरे के अधिक क़रीब होते हैं। यह निकटता निम्न शक्तिशाली अनुप्रयोग सक्षम करती है:

  • सामांतिक खोज: क्वेरी के अर्थ के आधार पर उत्पाद ढूँढना, केवल कीवर्ड मैच तक सीमित नहीं।
  • अनुशंसा प्रणालियाँ: उपयोगकर्ता की पसंद के आधार पर उत्पाद या सामग्री सुझाना।
  • इमेज रिकग्निशन: बड़े डेटाबेस से समान इमेज की पहचान करना।

MongoDB में वेक्टर इंडेक्सिंग सेट अप करना

शुरू करने के लिए, आपको एक MongoDB Atlas क्लस्टर चाहिए। वेक्टर सर्च एक क्लाउड-नेटिव फीचर है। आप इस फीचर को MongoDB Atlas पर या मुफ्त Community edition पर आज़मा सकते हैं। इस लेख में हम MongoDB Atlas का उपयोग करेंगे।

चरण 1: MongoDB Atlas क्लस्टर बनाएँ 

MongoDB Atlas में नया क्लस्टर बनाएँ। परीक्षण के लिए मुफ्त M0 टियर पर्याप्त है।

चरण 2: एक कलेक्शन बनाएँ और डेटा जोड़ें 

सबसे पहले, MongoDB Shell (mongosh) या अपने पसंदीदा ड्राइवर से क्लस्टर से कनेक्ट करें। फिर products नाम का नया कलेक्शन बनाएँ और वेक्टर फ़ील्ड वाले डॉक्यूमेंट डालें। प्रत्येक डॉक्यूमेंट एक उत्पाद को दर्शाए और उसमें एक embedding फ़ील्ड शामिल हो, जिसमें उस उत्पाद का वेक्टर निरूपण होगा।

यहाँ तीन अलग-अलग उत्पाद डॉक्यूमेंट के साथ एक अधिक पूर्ण उदाहरण है, जिनमें डेमो हेतु यादृच्छिक वेक्टर दिए गए हैं ताकि डेटा कैसा दिख सकता है, यह समझ आए। वास्तविक परिदृश्य में, आप इन्हें किसी AI मॉडल द्वारा बनाए गए एम्बेडिंग से बदलेंगे।

db.products.insertMany([
  {
    "name": "Wireless Noise-Canceling Headphones",
    "category": "Electronics",
    "description": "Premium over-ear headphones with active noise cancellation and a 30-hour battery life.",
    "price": 249.99,
    "embedding": [0.012, 0.054, 0.089, -0.031, 0.067, 0.021, -0.045, 0.098, 0.011, -0.076, 0.033, -0.015, -0.087, 0.059, 0.009, 0.042]
  },
  {
    "name": "Smart Coffee Maker",
    "category": "Home Goods",
    "description": "Programmable coffee machine that can be controlled from your smartphone. Brews up to 12 cups.",
    "price": 129.99,
    "embedding": [0.056, 0.023, 0.011, 0.078, -0.029, 0.041, 0.087, -0.019, 0.065, 0.002, -0.093, 0.018, 0.057, -0.041, 0.022, 0.064]
  },
  {
    "name": "Ultra-light Backpack",
    "category": "Travel",
    "description": "Durable and lightweight backpack with multiple compartments, perfect for hiking or daily commutes.",
    "price": 79.99,
    "embedding": [-0.072, 0.034, 0.019, 0.068, -0.055, 0.081, 0.004, -0.025, 0.039, 0.016, -0.044, 0.062, 0.008, 0.071, -0.013, 0.053]
  }
]);

प्रत्येक डॉक्यूमेंट में name, category, description और price के साथ-साथ महत्वपूर्ण embedding फ़ील्ड शामिल है। embedding एक निश्चित आकार की संख्याओं की ऐरे है जो उत्पाद के विवरण के सामांतिक अर्थ को दर्शाती है। इस ऐरे का आकार या आयाम (dimensionality) उस मॉडल पर निर्भर करता है जिससे एम्बेडिंग बनाई गई है। इस उदाहरण में आयाम 128 है।

यही वह डेटा है जिस पर हम अपना वेक्टर इंडेक्स बनाएँगे ताकि सामांतिक खोज और उत्पाद अनुशंसाएँ सक्षम हो सकें।

चरण 3: एक वेक्टर इंडेक्स बनाएँ

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

db.products.createSearchIndex({
  "name": "vector_index",
  "definition": {
    "mappings": {
      "dynamic": true,
      "fields": [
        {
          "type": "vector",
          "path": "embedding",
          "numDimensions": 128, 
          "similarity": "cosine"
        }
      ]
    },
  }
});

कॉन्फ़िगरेशन समझना

इंडेक्स कॉन्फ़िगरेशन definition ऑब्जेक्ट के fields एरे के भीतर परिभाषित होती है। यही संरचना MongoDB Atlas को आपके वेक्टर को हाई-स्पीड रिट्रीवल के लिए संगठित करने का ब्लूप्रिंट देती है।

वेक्टर इंडेक्सिंग के मुख्य पैरामीटर ये हैं:

  • path: यह आपके डॉक्यूमेंट में उस फ़ील्ड का सटीक नाम बताता है जिसमें वेक्टर ऐरे है—इस उदाहरण में "embedding"।
  • numDimensions: यह सबसे महत्वपूर्ण पैरामीटर है। यह आपके एम्बेडिंग मॉडल द्वारा उत्पन्न वेक्टर ऐरे में तत्वों की संख्या से सटीक मेल खाना चाहिए (जैसे 128, 768, 1536)।
  • similarity: यह सर्च के दौरान दो वेक्टरों के बीच "निकटता" नापने के लिए प्रयुक्त गणितीय मीट्रिक को परिभाषित करता है।
    • cosine आमतौर पर सामांतिक खोज के लिए अनुशंसित है, क्योंकि यह वेक्टरों के बीच के कोण को मापता है और सामांतिक दिशा पर फ़ोकस करता है।
    • अन्य विकल्पों में euclidean (सीधी रेखा दूरी) और dotProduct शामिल हैं।

वैकल्पिक परफॉर्मेंस पैरामीटर

एडवांस्ड परफॉर्मेंस ट्यूनिंग के लिए, MongoDB Atlas स्टोरेज और मेमोरी को ऑप्टिमाइज़ करने हेतु वैकल्पिक पैरामीटर निर्दिष्ट करने देता है:

  • quantization: यह पैरामीटर वेक्टर को कंप्रेस करने के लिए उपयोग होता है, जिससे इंडेक्स का आकार और मेमोरी फ़ुटप्रिंट काफ़ी घटता है।
    • scalar या binary निर्दिष्ट करके वेक्टर को क्वांटाइज़ किया जा सकता है—हल्की सी रिकॉल हानि के बदले स्टोरेज और स्पीड में बड़े लाभ के लिए।

वेक्टर सर्च क्वेरी चलाना

इंडेक्स बन जाने के बाद, आप $vectorSearch एग्रीगेशन स्टेज का उपयोग समानता क्वेरी करने के लिए कर सकते हैं।

आइए एक क्वेरी वेक्टर के सबसे समान उत्पाद ढूँढें। यह क्वेरी आमतौर पर उपयोगकर्ता के सर्च इनपुट से जनरेट होती है।

// A sample query vector, generated from a user's search for "wireless audio device"
const queryVector = [0.11, 0.22, 0.33, ...];

db.products.aggregate([
  {
    "$vectorSearch": {
      "queryVector": queryVector,
      "path": "embedding",
      "numCandidates": 100, // Number of documents to scan
      "limit": 5 // Number of results to return
    }
  },
  {
    "$project": {
      "name": 1,
      "description": 1,
      "_id": 0
    }
  }
]);
  • queryVector: वह वेक्टर जिसे आप खोज रहे हैं।
  • path: वह फ़ील्ड का नाम जिसमें वेक्टर एम्बेडिंग हैं।
  • numCandidates: इंडेक्स में स्कैन किए जाने वाले उम्मीदवार डॉक्यूमेंट की संख्या। संख्या बढ़ाने से सटीकता बढ़ती है पर लेटेंसी भी बढ़ती है।
  • limit: लौटाए जाने वाले शीर्ष परिणामों की संख्या।

$project स्टेज वैकल्पिक है, पर आउटपुट को आकार देने और परिणाम से वेक्टर डेटा हटाने में उपयोगी है।

वेक्टर इंडेक्सिंग के सर्वोत्तम अभ्यास

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

उचित समानता मीट्रिक चुनना

मीट्रिक का चुनाव बुनियादी है क्योंकि यह परिभाषित करता है कि दो वेक्टर कितने "समान" हैं। अधिक जानकारी के लिए आप MongoDB docs देखें और फ़ील्ड्स के बारे में जानें।

  • cosine: टेक्स्ट सहित सामांतिक समानता के लिए सर्वश्रेष्ठ। यह वेक्टरों के बीच कोण मापता है और उनकी लंबाई को अनदेखा करता है—जब वेक्टर लंबाई अर्थपूर्ण न हो।
  • euclidean: दो वेक्टरों के बीच सीधी दूरी मापता है। तब उपयोग करें जब वेक्टर का परिमाण (लंबाई) अर्थपूर्ण हो—जैसे कुछ डेटा प्रकारों में बड़ा मान किसी मज़बूत फ़ीचर को दर्शाता है।
  • dotProduct: दो वेक्टरों का डॉट प्रोडक्ट निकालता है। यह मीट्रिक अक्सर अनुशंसा प्रणालियों में प्रयुक्त होता है। जब वेक्टर एम्बेडिंग को लंबाई 1 पर नार्मलाइज़ किया जाता है, तो डॉट प्रोडक्ट व्यवहार में cosine समानता के समकक्ष होता है।

एम्बेडिंग आयाम प्रबंधन

dimensions पैरामीटर अहम है और आपके एम्बेडिंग मॉडल के आउटपुट से सटीक मेल खाना चाहिए। एक आम गलती है कि मॉडल के आउटपुट से भिन्न संख्या चुन ली जाती है। अधिक आयाम वाला मॉडल अधिक विवरण कैप्चर कर सकता है, पर इंडेक्स बड़ा होगा और क्वेरी संभवतः धीमी होंगी। हमेशा अपने मॉडल के दस्तावेज़ देखें और आयाम की पुष्टि करें (जैसे OpenAI का text-embedding-ada-002 1536 आयाम देता है)।

इंडेक्स ट्यूनिंग

numCandidates और numLists पैरामीटर गति और सटीकता का संतुलन बनाने के लिए अहम हैं। एक अच्छा प्रारंभिक नियम यह है कि numCandidates कम रखें और सटीकता संतोषजनक स्तर तक पहुँचने तक धीरे-धीरे बढ़ाएँ। आप ivf इंडेक्स के लिए अलग-अलग numLists के साथ भी प्रयोग कर सकते हैं ताकि अपने डेटासेट के लिए मीठा बिंदु (sweet spot) मिल सके।

उदाहरण उपयोग: एक सरल अनुशंसा प्रणाली बनाना

इन अवधारणाओं को एक व्यावहारिक उदाहरण पर लागू करें: एक ई-कॉमर्स उत्पाद अनुशंसा प्रणाली।

चरण 1: एम्बेडिंग सहित उत्पाद डेटा स्टोर करें

पहले हम उत्पाद का नाम, श्रेणी, और प्रत्येक के लिए एक वेक्टर एम्बेडिंग स्टोर करेंगे। एम्बेडिंग उत्पाद के विवरण या फीचर्स से जनरेट की जा सकती है।

db.products.insertMany([
  {
    "name": "Smart Speaker",
    "category": "Electronics",
    "embedding": [0.8, 0.9, 0.1, ...]
  },
  {
    "name": "Wireless Earbuds",
    "category": "Electronics",
    "embedding": [0.7, 0.8, 0.2, ...]
  },
  {
    "name": "Leather Wallet",
    "category": "Fashion",
    "embedding": [0.1, 0.2, 0.9, ...]
  }
]);

चरण 2: embedding पर वेक्टर इंडेक्स बनाएँ

db.products.createSearchIndex({
  "name": "vector_index",
  "definition": {
    "mappings": {
      "fields": [
        {
          "type": "vector",
          "path": "embedding", // The field containing the vectors
          "numDimensions": 128, // The correct field name is 'numDimensions'
          "similarity": "cosine" // The correct field name is 'similarity'
          // Index algorithm (like HNSW) is managed automatically by Atlas
        }
      ]
    }
  }
});

चरण 3: समान उत्पादों के लिए क्वेरी करें

अब, Smart Speaker से मिलते-जुलते उत्पाद ढूँढें। हम Smart Speaker की एम्बेडिंग को क्वेरी वेक्टर के रूप में उपयोग करेंगे।

const smartSpeakerEmbedding = [0.8, 0.9, 0.1, ...];

db.products.aggregate([
  {
    "$vectorSearch": {
      "queryVector": smartSpeakerEmbedding,
      "path": "embedding",
      "numCandidates": 50,
      "limit": 3
    }
  },
  {
    "$project": {
      "name": 1,
      "category": 1,
      "_id": 0
    }
  }
]);

यह क्वेरी उन शीर्ष तीन उत्पादों को लौटाएगी जिनकी वेक्टर एम्बेडिंग Smart Speaker की एम्बेडिंग के सबसे क़रीब हैं—व्यावहारिक रूप से Wireless Earbuds जैसे समान आइटम की अनुशंसा करती हुई।

निष्कर्ष

MongoDB की वेक्टर सर्च क्षमताएँ बुद्धिमान और व्यक्तिगत एप्लिकेशन बनाने की नई संभावनाएँ खोलती हैं। डेटाबेस में सीधे वेक्टर इंडेक्सिंग को एकीकृत करके, MongoDB आर्किटेक्चर को सरल बनाता है, जिससे डेटा प्रबंधन और तेज़ समानता खोज करना आसान हो जाता है।

वेक्टर सर्च की शक्ति के साथ, आप साधारण कीवर्ड मैच से आगे बढ़कर ऐसे फीचर्स बना सकते हैं जो आपके डेटा के संदर्भ और अर्थ को समझते हैं। हम आपको MongoDB Atlas फ्री टियर के साथ प्रयोग शुरू करने और यह देखने के लिए प्रोत्साहित करते हैं कि वेक्टर इंडेक्सिंग आपके एप्लिकेशन को कैसे बेहतर बना सकती है।

FAQs

वेक्टर एम्बेडिंग क्या है और वेक्टर सर्च के लिए यह क्यों आवश्यक है?

वेक्टर एम्बेडिंग टेक्स्ट या इमेज जैसे डेटा का संख्यात्मक निरूपण है। वेक्टर सर्च के लिए यह ज़रूरी है क्योंकि यह डेटाबेस को आइटमों के बीच सामांतिक समानता को उनके वेक्टरों के बीच दूरी गिनकर मापने देता है—सिर्फ़ कीवर्ड मैच से आगे जाकर।

क्या Vector Search के लिए किसी विशेष MongoDB संस्करण की आवश्यकता है?

हाँ। वेक्टर सर्च MongoDB Atlas की एक इन्टीग्रेटेड सुविधा है, जो MongoDB का क्लाउड-होस्टेड संस्करण है। यह कम्युनिटी या ऑन-प्रिमाइस एडिशन में उपलब्ध नहीं है।

क्या मुझे वेक्टर एम्बेडिंग स्वयं जनरेट करनी होंगी?

हाँ, आपको अपने डेटा के लिए वेक्टर एम्बेडिंग स्वयं जनरेट करनी होंगी, तभी आप उन्हें MongoDB में स्टोर कर पाएँगे और वेक्टर इंडेक्स बना पाएँगे। MongoDB आपके लिए ये एम्बेडिंग जनरेट नहीं करता। आमतौर पर आप किसी थर्ड-पार्टी सेवा या OpenAI, Hugging Face या Google AI जैसे प्लेटफ़ॉर्म के प्री-ट्रेंड मॉडल का उपयोग करेंगे, जो आपके टेक्स्ट, इमेज या अन्य डेटा को संख्यात्मक वेक्टर में बदलते हैं।

क्या मैं वेक्टर सर्च को अन्य MongoDB क्वेरी के साथ जोड़ सकता/सकती हूँ?

हाँ। वेक्टर सर्च एक एग्रीगेशन स्टेज ($vectorSearch) है, यानी आप इसे बड़े MongoDB एग्रीगेशन पाइपलाइन के भीतर उपयोग कर सकते हैं। इससे आप वेक्टर सर्च को $match, $project, $limit और $lookup जैसे अन्य शक्तिशाली स्टेज के साथ जोड़कर एक ही ऑपरेशन में फ़िल्टरिंग, सॉर्टिंग और डेटा एनरिचमेंट जैसी परिष्कृत क्वेरी बना सकते हैं। इसे हाइब्रिड सर्च कहा जाता है और वास्तविक दुनिया के एप्लिकेशन बनाने के लिए यह अनिवार्य है।

IVF और HNSW इंडेक्स प्रकारों में क्या अंतर है?

IVF और HNSW दोनों लगभग निकटतम पड़ोसी (ANN) खोज के लिए प्रयुक्त एल्गोरिद्म हैं। मुख्य अंतर इस बात में है कि वे डेटा को कैसे संरचित करते हैं।

Karen Zhang

लेखक

Karen Zhang

कैरन एक डेटा इंजीनियर हैं जिन्हें स्केलेबल डेटा प्लेटफ़ॉर्म बनाने का जुनून है। उन्हें Terraform के साथ इंफ्रास्ट्रक्चर ऑटोमेशन का अनुभव है और वे ब्लॉग पोस्ट और ट्यूटोरियल में अपनी सीख साझा करने के लिए उत्साहित हैं। कैरन एक कम्युनिटी बिल्डर हैं और डेटा पेशेवरों के बीच मजबूत संबंध विकसित करने के लिए समर्पित हैं।

विषय