वेक्टर समानता खोज का प्रदर्शन

इस विषय में यह बताया गया है कि कैसे Milvus का उपयोग इकाइयों को खोजने के लिए किया जाता है।

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

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

संग्रह लोड करना

Milvus के भीतर सभी खोज और पूछताछ क्रियाएँ मेमोरी में की जाती हैं। वेक्टर समानता खोज करने से पहले, संग्रह को मेमोरी में लोड करें।

from pymilvus import Collection
collection = Collection("book")      # मौजूदा संग्रह प्राप्त करें।
collection.load()

खोज पैरामीटर तैयार करना

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

search_params = {
    "metric_type": "L2",
    "offset": 5,
    "ignore_growing": False,
    "params": {"nprobe": 10}
}
पैरामीटर विवरण
metric_type खोज के दौरान वेक्टरों के बीच दूरी को मापने के लिए उपयोग किए जाने वाले विधि। यह इंडेक्स निर्माण प्रक्रिया के दौरान निर्दिष्ट की जाने वाली विधि के समान होना चाहिए। अधिक जानकारी के लिए समानता मापों का देखें।
offset खोज के दौरान छोड़ें जाने वाली इकाइयों की संख्या। इस मान और search विधि के limit की कुल यह मान से कम होनी चाहिए। उदाहरण के लिए, यदि आप पूछताछ करना चाहते हैं कि पूछताछ वेक्टर के निकटतम पड़ोसी (neighbors) का नौवां और दसवां नतीजा प्राप्त करना चाहते हैं, तो limit को 2 और offset को 8 पर से सेट करें।
ignore_growing क्या समानता खोज के दौरान बढ़ते हुए सेगमेंट्स को नजरअंदाज किया जाए। डिफ़ॉल्ट मूल्य False है, इसका अर्थ है कि खोज में बढ़ते हुए सेगमेंट्स शामिल हैं।
params निर्दिष्ट इंडेक्स प्रकार के लिए विशेष खोज पैरामीटर। अधिक जानकारी के लिए वेक्टर इंडेक्स देखें। संभावित विकल्प शामिल हैं: - nprobe खोजने के लिए क्लस्टरिंग इकाइयों की संख्या निर्दिष्ट करता है। यह पैरामीटर केवल तब उपलब्ध होता है जब index_type को IVF_FLAT, IVF_SQ8, या IVF_PQ पर सेट किया गया हो। मान का इंडेक्स निर्माण प्रक्रिया के दौरान निर्दिष्ट की गई nlist मान से कम होना चाहिए। - ef खोज क्षेत्र निर्दिष्ट करता है। यह पैरामीटर केवल तब उपलब्ध होता है जब index_type को HNSW पर सेट किया गया हो। मान को top_k और 32768 के बीच होना चाहिए। - radius सबसे कम समानता वाले वेक्टर के लिए कोण निर्दिष्ट करता है। - range_filter उस फ़िल्टर को निर्दिष्ट करता है जो वेक्टर फ़ील्ड मानों को फ़िल्टर करने के लिए उपयोग किया जाता है, जिनकी समानता पूछताछ वेक्टर के विशिष्ट सीमा के भीतर गिरती है।

वेक्टर खोज करना

Milvus का उपयोग वेक्टर खोज के लिए करें। किसी विशिष्ट विभाजन के भीतर खोज करने के लिए, विभाजनों की सूची निर्दिष्ट करें।

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

results = collection.search(
    data=[[0.1, 0.2]], 
    anns_field="book_intro", 
    param=search_params,
    limit=10,
    expr=None,
    output_fields=['title'],
    consistency_level="Strong"
)

results[0].ids

results[0].distances

hit = results[0][0]
hit.entity.get('title')
पैरामीटर विवरण
data खोज के लिए उपयोग किए जाने वाले वेक्टर।
anns_field खोज करने के लिए क्षेत्र का नाम।
param सूचीकरण पर विशिष्ट खोज मापदंड। अधिक जानकारी के लिए, वेक्टर सूचीकरण देखें।
limit लौटाने के लिए परिणामों की संख्या। इस मूल्य को param में offset के साथ, 16,384 से कम होना चाहिए।
expr गुणों को छानने के लिए बूलीयन अभिव्यक्ति। अधिक जानकारी के लिए, बूलीयन व्यक्ति नियम देखें।
output_fields (वैकल्पिक) वापसी करने वाले क्षेत्रों के नाम। वेक्टर क्षेत्रों का वर्तमान में समर्थन नहीं किया गया है।
consistency_level (वैकल्पिक) खोज के लिए सहगतता स्तर।

सबसे समान वेक्टरों के प्राथमिक कुंजी मानों और दूरियाँ जांचें।

results[0].ids
results[0].distances

जब खोज पूर्ण हो जाए, तो मिल्वस में लोड किए गए संग्रह को मेमोरी खपत को कम करने के लिए रिलीज़ करें।

collection.release()

सीमाएं

विशेषता अधिकतम सीमा
संग्रह नाम लंबाई 255 अक्षर
संग्रह में विभाजनों की संख्या 4,096
संग्रह में क्षेत्रों की संख्या 256
संग्रह में शार्डों की संख्या 256
वेक्टर आयाम 32,768
शीर्ष के 16,384
इनपुट वेक्टर 16,384

विविध खोज करना

विविध खोज मूल रूप से वेक्टर खोज के साथ विशेषता फ़िल्टरिंग है। किसी बूलियन अभिव्यक्ति को निर्दिष्ट करके खोजों को विशेष स्थितियों के तहत सीमित किया जा सकता है।

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

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

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

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}, "offset": 0},
  "limit": 10,
  "expr": "word_count <= 11000",
}
res = collection.search(**search_param)

वापसी परिणामों की जांच करें।

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- कुल हिट: {len(hits)}, हिट आईडी: {hits.ids} ")
print(f"- शीर्ष1 हिट आईडी: {hits[0].id}, दूरी: {hits[0].distance}, स्कोर: {hits[0].score} ")

सीमा खोज करना

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

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

निम्नलिखित उदाहरण में, नियमित वेक्टर खोज पर आधारित सीमा खोज कैसे करें, इसका दिखावा किया गया है।

संग्रह लोड करना

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

from pymilvus import Collection
collection = Collection("book")      # मौजूदा संग्रह प्राप्त करें
collection.load()

वेक्टर फ़िल्टरिंग रेंज कॉन्फ़िगर करना

मिलवस में रेगुलर वेक्टर खोज के मुकाबले, रेंज खोज को विशेष खोज रेंज के भीतर चाहे आनुवादित करना होता है। इसके लिए radius और range_filter नामक दो नए पैरामीटर विशिष्ट खोज रेंज के भीतर वांछित खोज परिणाम प्राप्त करने के लिए नियंत्रित करते हैं।

radius ने शब्दों में सटीकता से इस बात का पता लगाने के लिए निर्धारित करता है कि क्या वेक्टर्स समान माने जाएं। एक वैकल्पिक range_filter को radius के साथ जोड़ा जा सकता है जो विशिष्ट रेंज के भीतर प्रश्न वेक्टर की तुलना में वेक्टर फ़ील्ड मानों को फ़िल्टर करने के लिए प्रयोग किया जा सकता है। radius और range_filter दोनों पैरामीटर FLOAT डेटा प्रकार होते हैं। इन दोनों पैरामीटरों को सेट करके खोज की सटीकता और कुशलता को प्रभावी रूप से संतुलित किया जा सकता है।

सामान्यत: समानता वेक्टर फ़ील्ड मान और प्रश्न वेक्टर के बीच की दूरी द्वारा मापी जाती है। विभिन्न दूरी मेट्रिक का चयन radius और range_filter के कॉन्फ़िगरेशन पर प्रभाव डालेगा।

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

search_params = {
    "metric_type": "L2",
    "params": {
        "radius": 10.0,
        "range_filter" : 5.0
    }
}

IP दूरी के मामले में, स्थिति अलग है। IP दूरी के साथ, अधिक दूरी अधिक समानता का संकेत देती है। इसलिए, L2 दूरी के विपरीत, IP दूरी में radius और range_filter के मान उल्टे होते हैं। अन्य शब्दों में, IP दूरी के आधार पर कुछ सबसे समान वेक्टर्स को फ़िल्टर करना चाहते हैं, तो प्रभावी range_filter मान radius से अधिक होना चाहिए, और परिणामी वेक्टर्स की दूरी radius से अधिक लेकिन range_filter से कम या बराबर होनी चाहिए।

search_params = {
    "metric_type": "IP",
    "params": {
        "radius": 0.8,
        "range_filter" : 1.0
    }
}

रेंज खोज का प्रदर्शन

दूरी मापन प्रकार के आधार पर radius और range_filter को निर्धारित करके आप परिणाम वेक्टर्स की रेंज को परत किया जा सकता है।

L2 दूरी परिणामों के भीतर 5.0 और 10.0 के बीच समानता पर रेंज खोज करें:

search_param = {
  "data": [[0.1, 0.2]], # प्रश्न वेक्टर
  "anns_field": "book_intro", # खोज के लिए फ़ील्ड
  "param": { "metric_type": "L2", "params": { "nprobe": 10, "radius": 10.0, "range_filter" : 5.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # वापस लौटाई जाने वाली फ़ील्डें
}

res = collection.search(**search_param)

IP दूरी परिणामों के भीतर 1.0 और 0.8 के बीच समानता पर रेंज खोज करें:

search_param = {
  "data": [[0.1, 0.2]], # प्रश्न वेक्टर
  "anns_field": "book_intro", # खोज के लिए फ़ील्ड
  "param": {"metric_type": "IP", "params": { "nprobe": 10, "radius": 0.8, "range_filter" : 1.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # वापस लौटाई जाने वाली फ़ील्डें
}

res = collection.search(**search_param)

सारांश

मिलवस में, रेंज खोज विशिष्ट दूरी रेंज के भीतर समान वेक्टर परिणाम वापस कर सकती है। इस सुविधा को खोज पैरामीटर में radius और range_filter की निर्देशित करके सक्रिय किया जाता है। निम्नलिखित तालिका इन दोनों पैरामीटरों के कॉन्फ़िगरेशन को विभिन्न दूरी मापन प्रकारों के लिए संक्षेपित करता है।

दूरी मापन प्रकार कॉन्फ़िगरेशन
L2 और अन्य दूरियां range_filter <= दूरी < radius
IP और कोसाइन दूरियां radius < दूरी <= range_filter