संग्रह

Qdrant वेक्टर डेटाबेस में संग्रहों का अवधारणा MYSQL में तालिका संरचना के समान हो सकता है, जो समान प्रकार के वेक्टर डेटा को संयमित रूप से स्टोर करने के लिए प्रयोग किया जाता है। संग्रह में स्टोर किए गए प्रत्येक डेटा को Qdrant में बिंदु के रूप में संदर्भित किया जाता है। यहां, बिंदु गणितीय ज्यामितीय अंतरिक्ष अवधारणा के समान है, एक वेक्टर के प्रतिनिधित्व को (बस इसे डेटा का एक टुकड़ा समझ लें) दर्शाता है।

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

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

Qdrant निम्नलिखित प्रसिद्ध प्रकार का मैट्रिक का समर्थन करता है:

  • डॉट उत्पाद: Dot
  • साइन का समानता: Cosine
  • यूक्लिडियन दूरी: Euclid

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

मल्टी-टेनेंसी की स्थापना

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

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

संग्रह बनाना

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

आवश्यक विकल्पों के अतिरिक्त, निम्नलिखित संग्रह विकल्पों के लिए विशेष मूल्य भी निर्दिष्ट किए जा सकते हैं:

  • hnsw_config - सूची विवरण के लिए, सूची खण्ड में संदर्भित करें।
  • wal_config - लेख-से-पहले लॉगिंग से संबंधित विन्यास। वैसे अधिक विस्तृत जानकारी के लिए कृपया उसपर संदर्भित करें।
  • optimizers_config - अनुकंठक विवरण के लिए, अनुकंठक भाग में संदर्भित करें।
  • shard_number - यह परिभाषित करता है कि संग्रह में कितने शार्ड होने चाहिए। अधिक जानकारी के लिए, कृपया वितरित डिप्लॉयमेंट अनुभाग पर संदर्भित करें।
  • on_disk_payload - पेलोड डेटा स्टोर करने के लिए स्थान की परिभाषा करता है। यदि इसे true पर सेट किया जाता है, तो यह केवल पेलोड को डिस्क पर स्टोर करेगा। यह बड़े पेलोड के साथ काम करते समय रैम का उपयोग सीमित करने में बहुत उपयोगी हो सकता है।
  • quantization_config - विस्तृत जानकारी के लिए क्वॉटिज़ेशन पर संदर्भित करें।

वैकल्पिक संग्रह पैरामीटरों के लिए डीफ़ॉल्ट पैरामीटर कॉन्फ़िगरेशन फ़ाइल में परिभाषित होते हैं।

संग्रह और वेक्टर पैरामीटर के अधिक जानकारी के लिए, कृपया स्कीमा विवरण और कॉन्फ़िगरेशन फ़ाइल देखें।

उपलब्ध है v1.2.0 से

वेक्टर्स को बहुत तेज़ एक्सेस करने के लिए रैम में स्टोर किया जाता है। वेक्टर विन्यास में on_disk पैरामीटर सेट किया जा सकता है। यदि यह true पर सेट किया जाता है, तो सभी वेक्टर्स को डिस्क पर स्टोर किया जाएगा। यह बड़े मात्रा में डेटा आयात करने के लिए मेमोरी मैपिंग का इस्तेमाल करने की सुविधा प्रदान करेगा।

दूसरे संग्रह से संग्रह बनाना

v1.0.0 से उपलब्ध

किसी अन्य मौजूदा संग्रह से संग्रह और संरचित कर सकता है।

इसे एक ही डेटासेट की विभिन्न विन्यासों को त्वरित रूप से प्रयोग करने के लिए उपयोगी हो सकता है।

नए संग्रह में वेक्टर कॉन्फ़िगरेशन को सेट करते समय, सुनिश्चित करें कि वेक्टर्स मूल संग्रह के समान आयाम और दूरी कार्य का हैं।

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    },
    "init_from": {
       "collection": {from_collection_name}
    }
}

मल्टी-वेक्टर संग्रह

वर्जन v0.10.0 से उपलब्ध

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

PUT /collections/{collection_name}

{
    "vectors": {
        "image": {
            "size": 4,
            "distance": "Dot"
        },
        "text": {
            "size": 8,
            "distance": "Cosine"
        }
    }
}

कुछ विशेष स्थितियों के लिए, कोई वेक्टर स्टोरेज न होने वाला संग्रह भी बनाया जा सकता है।

वर्जन v1.1.1 से उपलब्ध

हर नामित वेक्टर के लिए, आप hnsw_config या quantization_config को वृत्त से हटकर संग्रह कॉन्फ़िगरेशन से भिन्न भागीदारी कर सकते हैं। इसका उपयोग वेक्टर स्तर पर खोज प्रदर्शन को बेहतर बनाने के लिए किया जा सकता है।

वर्जन v1.2.0 से उपलब्ध

वेक्टर्स को त्वरित उपयोग के लिए मेमोरी में स्टोर किया जाता है। प्रत्येक वेक्टर के लिए, on_disk को सदा के लिए सभी वेक्टर्स को डिस्क पर स्टोर करने के लिए true पर सेट किया जा सकता है। यह एक्सेप्ट अंशांकित बड़ी मात्रा में डेटा को इन्जेस्ट करने के लिए उपयुक्त होगा।

संग्रह मिटाना

DELETE /collections/{collection_name}

संग्रह पैरामीटर अपडेट

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

निम्नलिखित कमांड सेगमेंट के लिए इंडेक्सिंग सक्षम करता है जिसमें वेक्टर 10000 kB से अधिक होते हैं:

PATCH /collections/{collection_name}

{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}

निम्नलिखित पैरामीटर अपडेट किए जा सकते हैं:

  • optimizers_config - ऑप्टिमाइज़र्स के विस्तृत विवरण देखें।
  • hnsw_config - इंडेक्स के बारे में विस्तृत विवरण देखें।
  • quantization_config - क्वांटिज़ेशन के बारे में विस्तृत विवरण देखें।
  • vectors - विशिष्ट वेक्टरों के लिए कॉन्फ़िगरेशन, इनके संबंधित hnsw_config, quantization_config, और on_disk सेटिंग्स सहित।
  • params - अन्य संग्रह पैरामीटर, इनमें write_consistency_factor और on_disk_payload शामिल हैं।

पूर्ण API विस्तार स्थानांतरण के लिए स्कीमा परिभाषाएँ में उपलब्ध है। वर्जन v1.4.0 से उपलब्ध

Qdrant 1.4 संग्रह पैरामीटरों को रनटाइम पर अपडेट करने का समर्थन जोड़ता है। HNSW इंडेक्स, क्वांटिज़ेशन, और डिस्क कॉन्फ़िगरेशन को अब संग्रह फिर से निर्माण किए बिना बदला जा सकता है। सेगमेंट्स (इंडेक्स और क्वांटिज़ेशन डेटा के साथ) अपडेट किए गए पैरामीटर को मिलाने के लिए पृष्ठभूमि में स्वचालित रूप से पुनर्निर्माण करेंगे।

निम्नलिखित उदाहरण में, संग्रह पूरा और my_vector के लिए HNSW इंडेक्स और क्वांटिज़ेशन पैरामीटर अपडेट किए जाते हैं:

PATCH /collections/{collection_name}

{
    "vectors": {
        "my_vector": {
            "hnsw_config": {
                "m": 32,
                "ef_construct": 123
            },
            "quantization_config": {
                "product": {
                    "compression": "x32",
                    "always_ram": true
                }
            },
            "on_disk": true
        }
    },
    "hnsw_config": {
        "ef_construct": 123
    },
    "quantization_config": {
        "scalar": {
            "type": "int8",
            "quantile": 0.8,
            "always_ram": false
        }
    }
}

ध्यान दें: संग्रह पैरामीटरों को अपडेट करने के लिए, नामित वेक्टर्स वाले संग्रह में, रिक्त ("") नाम का प्रयोग किया जा सकता है।

इस एंडप्वाइंट को कॉल करने में ब्लॉक हो सकता है जोकि मौजूदा ऑप्टिमाइज़र को पूरा होने का इंतजार करेगा। हम इस सुविधा का उपयोग प्रोडक्शन डेटाबेस में सिफारिश नहीं करते हैं क्योंकि इंडेक्स पुनः निर्माण करने से भारी अधिकतम लगातार समय देरी हो सकती है।

संग्रह सूचना

Qdrant, मौजूदा संग्रह के लिए कॉन्फ़िगरेशन पैरामीटर तय करने की अनुमति देता है ताकि बिंदुओं का वितरण और इंडेक्सिंग स्थिति को बेहतर समझा जा सके।

GET /collections/{collection_name}

{
    "result": {
        "status": "हरा",
        "optimizer_status": "ठीक है",
        "vectors_count": 1068786,
        "indexed_vectors_count": 1024232,
        "points_count": 1068786,
        "segments_count": 31,
        "config": {
            "params": {
                "vectors": {
                    "size": 384,
                    "distance": "कोसाइन"
                },
                "shard_number": 1,
                "replication_factor": 1,
                "write_consistency_factor": 1,
                "on_disk_payload": झूठा
            },
            "hnsw_config": {
                "m": 16,
                "ef_construct": 100,
                "full_scan_threshold": 10000,
                "max_indexing_threads": 0
            },
            "optimizer_config": {
                "deleted_threshold": 0.2,
                "vacuum_min_vector_number": 1000,
                "default_segment_number": 0,
                "max_segment_size": null,
                "memmap_threshold": null,
                "indexing_threshold": 20000,
                "flush_interval_sec": 5,
                "max_optimization_threads": 1
            },
            "wal_config": {
                "wal_capacity_mb": 32,
                "wal_segments_ahead": 0
            }
        },
        "payload_schema": {}
    },
    "status": "ठीक है",
    "time": 0.00010143
}

अगर वेक्टर संग्रह में डाले गए हैं, तो status फ़ील्ड "अनुकूलन" के दौरान "पीला" हो सकता है, और सभी बिंदु सफलतापूर्वक प्रसंस्कृत कर दिए जाने पर "हरा" में तब्दील हो जाएगा।

निम्नलिखित रंग स्थिति संरचना में पाई जा सकती है:

  • ? हरा: संग्रह तैयार है
  • ? पीला: संग्रह अनुकूलन का सामना कर रहा है
  • ? लाल: इंजन ने एक पुनर्प्राप्त त्रुटि को अनुभव किया है

कुछ अन्य आकर्षित गुणों में शामिल हैं:

  • points_count - संग्रह में भंडारित वस्तुओं (वेक्टर और उनके पेलोड) की कुल संख्या
  • vectors_count - संग्रह में वेक्टरों की कुल संख्या। यदि प्रत्येक वस्तु में कई वेक्टर होते हैं, तो यह points_count से बराबर नहीं हो सकता है।
  • indexed_vectors_count - HNSW इंडेक्स में भंडारित वेक्टरों की कुल संख्या। Qdrant सभी वेक्टरों को इंडेक्स में नहीं भंडारित करता है, केवल उन वेक्टरों को भंडारित करता है जो दिए गए कॉन्फ़िगरेशन के आधार पर इंडेक्स सेगमेंट बना सकते हैं।

HNSW में वेक्टरों का इंडेक्सिंग

कुछ मामलों में, आपको यह जानकारी प्राप्त हो सकती है कि indexed_vectors_count की मान vectors_count से कम है। यह अभिप्रायशील व्यवहार है जो इंडेक्सर की कॉन्फ़िगरेशन पर निर्भर करता है। अगर गैर-इंडेक्स वेक्टरों का आकार indexing_threshold (किलोबाइट में) से अधिक होता है, तो एक नया इंडेक्स सेगमेंट बना दिया जाएगा। अगर आपका संग्रह बहुत छोटा है या वेक्टर आयाम कम है, तो HNSW सेगमेंट नहीं बने हो सकते हैं, और indexed_vectors_count को शून्य हो सकता है।

आप संग्रह पैरामीटर में indexing_threshold की मान को कम करके मौजूदा संग्रह में एक नया इंडेक्स सेगमेंट बना सकते हैं।

संग्रह उपनाम

उत्पादन वातावरण में, हो सकता है कि वेक्टरों के विभिन्न संस्करणों पर स्विच करने की आवश्यकता हो। इन मामलों में, सेवा बंद करके नए वेक्टर्स का उपयोग करके संग्रह को नये से निर्मित करना संभव नहीं हो सकता। एक उपनाम एक मौजूदा संग्रह के लिए एक अतिरिक्त नाम होता है। संपूर्ण ढंग से पूछताछ को संग्रह नाम की बजाय इस उपनाम का उपयोग किया जा सकता है।

इसलिए, एक दूसरा संग्रह पृष्ठ योजना में बनाया जा सकता है, और फिर उपनाम को पुराने संग्रह से नए संग्रह में स्विच किया जा सकता है। क्योंकि उपनाम परिवर्तन अणुमानित होते हैं, इसके दौरान स्विचिंग प्रक्रिया के दौरान समकालिक अनुरोध प्रभावित नहीं होते हैं।

उपनाम बनाएं

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "example_collection"
            }
        }
    ]
}

उपनाम हटाएँ

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        }
    ]
}

संग्रह स्विच

एकाधिक उपनाम क्रियाएँ परमाणुरूपीय रूप से क्रियान्वत की जा सकती हैं। उदाहरण के लिए, निम्नलिखित कमांड का उपयोग करके आप मौलिक संग्रह को स्विच कर सकते हैं:

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        },
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "new_collection"
            }
        }
    ]
}

सूची संग्रह उपनाम

GET /collections/{collection_name}/aliases

सभी उपनामों की सूची

GET /aliases

सभी संग्रहों की सूची

GET /collections