आधुनिक एप्लिकेशन अक्सर खोज समाधानों को शामिल करते हैं ताकि उपयोगकर्ताओं को मांग पर मौजूदा सामग्री को तुरंत एक्सेस करने में सक्षम बनाया जा सके। किसी अन्य कार्यक्षमता की कल्पना करना मुश्किल है जो इस जानकारी को कुशलतापूर्वक पुनर्प्राप्त कर सके, अधिकांश अनुप्रयोगों में खोज को एक आवश्यक विशेषता बना सके।
साथ ही, भले ही क्वेरी और खोज की आवश्यकता बहुत आम हो, अलग-अलग एप्लिकेशन बहुत अलग तरीके अपनाते हैं।
ज्यादातर मामलों में, कंपनियां सीधे ओएलटीपी डेटाबेस से पूछताछ करके खोज के एक बहुत ही बुनियादी स्तर पर बनी रहती हैं। अनुरोध इस तरह दिख सकते हैं: SELECT id, title FROM, entities WHERE, description LIKE '%bow%
हालांकि, अधिक बार, वे जटिल, बहु-स्तरीय टेबल जॉइन संरचनाओं में दर्शाए जाते हैं जिन्हें पढ़ना असंभव, धीमा और आदिम है। वे संदर्भ को समझने में असमर्थ हैं, कई अनुकूलन की आवश्यकता है, और ठीक से लागू करने के लिए बहुत चुनौतीपूर्ण हैं।
जबकि भौतिक विचारों, क्वेरी कैशिंग और अन्य तकनीकों के माध्यम से क्वेरी निष्पादन समय में सुधार करना संभव है, अतिरिक्त जटिलता के परिणामस्वरूप प्राथमिक अपडेट और लगातार खोज परिणामों के बीच काफी अंतराल होता है।
आदिम DB-आधारित खोज समाधानों के अधिक कुशल विकल्प ओपन-सोर्स सर्च इंजन जैसे Apache Lucene, Apache Solr, Elasticsearch, Sphinx, MeiliSearch, Typesense, आदि का गठन कर सकते हैं।
जटिल प्रश्नों से निपटने और फिल्टर के साथ काम करने में ये तुलनात्मक रूप से तेज़ और बेहतर होते हैं। लेकिन एक बार जब इन सर्च इंजनों की तुलना Google सर्च या डकडकगो जैसे समकक्षों से की जाती है, तो यह स्पष्ट हो जाता है कि ओपन-सोर्स समाधान उचित खोज संदर्भ और क्वेरी तौर-तरीकों के निर्माण में विफल होते हैं - यदि उपयोगकर्ता एक अस्पष्ट खोज अनुरोध प्रदान करता है तो वे क्वेरी को समझने में असमर्थ होते हैं।
कल्पना कीजिए कि आप बस याद नहीं कर सकते कि खट्टे स्वाद वाले पीले खट्टे फल को क्या कहा जाता है! लेकिन आप इस रहस्यमय फल को कैसे उगाएं, इस पर एक लेख के लिए ऐप खोजना चाहते हैं। आप उस खोज के बारे में कैसे जाते हैं?
आपका प्रश्न हो सकता है, "घर के अंदर पीला खट्टा साइट्रस कैसे उगाएं"। उपर्युक्त ओपन-सोर्स सर्च इंजनों में से कोई भी इस क्वेरी के लिए प्रासंगिक परिणाम वापस करने के लिए काफी संघर्ष कर सकता है, भले ही डेटाबेस में "नींबू" उगाने के बारे में लेख हों।
ऐसा इसलिए है क्योंकि क्वेरी से अर्थ निकालना एक प्राकृतिक भाषा कार्य है और एआई घटकों के बिना इसे हल करने की संभावना नहीं है। GPT-3 इस कार्य में अच्छा है।
ओपनएआई ऑफर करता है
दस्तावेज़ टेक्स्ट का एक वेक्टर प्रतिनिधि में रूपांतरण पृष्ठभूमि में हो सकता है, जबकि खोज क्वेरी का वैश्वीकरण रनटाइम के दौरान होना चाहिए। कई GPT-3 मॉडल परिवार हैं जो OpenAI प्रदान करता है:
text-search-ada-doc-001: 1024 text-search-babbage-doc-001: 2048 text-search-curie-doc-001: 4096 text-search-davinci-doc-001: 12288
उच्च वेक्टर आयाम अधिक एम्बेडेड जानकारी की ओर ले जाते हैं और इस प्रकार उच्च लागत और धीमी खोज भी करते हैं।
दस्तावेज़ आमतौर पर लंबे होते हैं और प्रश्न आमतौर पर छोटे और अधूरे होते हैं। इसलिए, सामग्री के घनत्व और आकार को देखते हुए किसी भी दस्तावेज़ का वैश्वीकरण किसी भी क्वेरी के वैश्वीकरण से महत्वपूर्ण रूप से भिन्न होता है। OpenAI यह जानता है, और इसलिए वे दो युग्मित मॉडल पेश करते हैं, -doc
और -query
:
text-search-ada-query-001: 1024 text-search-babbage-query-001: 2048 text-search-curie-queryc-001: 4096 text-search-davinci-query-001: 12288
यह ध्यान रखना महत्वपूर्ण है कि क्वेरी और दस्तावेज़ दोनों को एक ही मॉडल परिवार का उपयोग करना चाहिए और आउटपुट वेक्टर की समान लंबाई होनी चाहिए।
उदाहरणों के माध्यम से इस खोज समाधान की शक्ति को देखना और समझना सबसे आसान हो सकता है। इस उदाहरण के लिए, आइए हम पर आरेखित करें
डेटासेट में बहुत सारे कॉलम होते हैं, लेकिन हमारी वैश्वीकरण प्रक्रिया केवल शीर्षक और ओवरव्यू कॉलम के आसपास ही बनाई जाएगी।
Title: Harry Potter and the Half-Blood Prince Overview: As Harry begins his sixth year at Hogwarts, he discovers an old book marked as 'Property of the Half-Blood Prince', and begins to learn more about Lord Voldemort's dark past.
आइए डेटासेट को रेडी-टू-इंडेक्सिंग टेक्स्ट में मैप करें:
datafile_path = "./tmdb_5000_movies.csv" df = pd.read_csv(datafile_path) def combined_info(row): columns = ['title', 'overview'] columns_to_join = [f"{column.capitalize()}: {row[column]}" for column in columns] return '\n'.join(columns_to_join) df['combined_info'] = df.apply(lambda row: combined_info(row), axis=1)
एम्बेडिंग प्रक्रिया सीधी है:
def get_embedding(text, model="text-search-babbage-doc-001"): text = text.replace("\n", " ") return openai.Embedding.create(input = [text], model=model)['data'][0]['embedding'] get_embedding(df['combined_info'][0])
कोड का यह ब्लॉक एक सूची को आउटपुट करता है जिसका आकार मॉडल के साथ काम कर रहे पैरामीटर के बराबर है, जो text-search-babbage-doc-001
मामले में 2048 है।
एक समान एम्बेडिंग प्रक्रिया उन सभी दस्तावेज़ों पर लागू की जानी चाहिए जिन पर हम खोज करना चाहते हैं:
df['combined_info_search'] = df['combined_info'].apply(lambda x: get_embedding(x, model='text-search-babbage-doc-001')) df.to_csv('./tmdb_5000_movies_search.csv', index=False)
combined_info_search
कॉलम में संयुक्त_टेक्स्ट का सदिश प्रतिनिधित्व होगा।
और, आश्चर्यजनक रूप से, यह पहले से ही है! अंत में, हम एक नमूना खोज क्वेरी करने के लिए तैयार हैं:
from openai.embeddings_utils import get_embedding, cosine_similarity def search_movies(df, query, n=3, pprint=True): embedding = get_embedding( query, engine="text-search-babbage-query-001" ) df["similarities"] = df.combined_info_search.apply(lambda x: cosine_similarity(x, embedding)) res = ( df.sort_values("similarities", ascending=False) .head(n) .combined_info ) if pprint: for r in res: print(r[:200]) print() return res res = search_movies(df, "movie about the wizardry school", n=3)
Title: Harry Potter and the Philosopher's StoneOverview: Harry Potter has lived under the stairs at his aunt and uncle's house his whole life. But on his 11th birthday, he learns he's a powerful wizard — with a place waiting for him at the Hogwarts School of Witchcraft and Wizardry. As he learns to harness his newfound powers with the help of the school's kindly headmaster, Harry uncovers the truth about his parents' deaths — and about the villain who's to blame. Title: Harry Potter and the Goblet of FireOverview: Harry starts his fourth year at Hogwarts, competes in the treacherous Triwizard Tournament and faces the evil Lord Voldemort. Ron and Hermione help Harry manage the pressure — but Voldemort lurks, awaiting his chance to destroy Harry and all that he stands for. Title: Harry Potter and the Prisoner of AzkabanOverview: Harry, Ron and Hermione return to Hogwarts for another magic-filled year. Harry comes face to face with danger yet again, this time in the form of an escaped convict, Sirius Black — and turns to sympathetic Professor Lupin for help.
' हैरी पॉटर एंड द फिलोसोफ़र्स स्टोन ' के अवलोकन में 'जादूगर' और 'स्कूल' शब्द शामिल हैं और खोज आउटपुट में सबसे पहले आता है। दूसरे परिणाम में अब 'स्कूल' शब्द नहीं है, लेकिन अभी भी 'जादूगर', 'ट्राइविजार्ड' के करीब शब्द हैं। तीसरे परिणाम में केवल 'जादूगरनी' का पर्याय है - जादू।
बेशक, इस डेटाबेस के भीतर कई अन्य फिल्में हैं जो स्कूलों या जादूगरों (या दोनों) को दिखाती हैं, लेकिन उपरोक्त केवल वही थे जो हमें लौटाए गए थे। यह स्पष्ट प्रमाण है कि खोज समाधान कार्य करता है और वास्तव में हमारी क्वेरी के संदर्भ को समझता है।
हमने बैबेज मॉडल का उपयोग केवल 2048 मापदंडों के साथ किया। Davinci के छह गुना अधिक (12,288) पैरामीटर हैं और इस प्रकार, अत्यधिक जटिल प्रश्नों के संबंध में काफी बेहतर प्रदर्शन कर सकते हैं।
खोज समाधान कभी-कभी कुछ प्रश्नों के लिए प्रासंगिक परिणाम उत्पन्न करने में विफल हो सकता है। उदाहरण के लिए, क्वेरी 'स्कूल में जादूगरों के बारे में फिल्में' उत्पन्न करती है:
Title: Harry Potter and the Philosopher's StoneOverview: Harry Potter has lived under the stairs at his aunt and uncle's house his whole life. But on his 11th birthday, he learns he's a powerful wizard — with a place waiting for him at the Hogwarts School of Witchcraft and Wizardry. As he learns to harness his newfound powers with the help of the school's kindly headmaster, Harry uncovers the truth about his parents' deaths — and about the villain who's to blame. Title: Dumb and Dumberer: When Harry Met LloydOverview: This wacky prequel to the 1994 blockbuster goes back to the lame-brained Harry and Lloyd's days as classmates at a Rhode Island high school, where the unprincipled principal puts the pair in remedial courses as part of a scheme to fleece the school. Title: Harry Potter and the Prisoner of AzkabanOverview: Harry, Ron and Hermione return to Hogwarts for another magic-filled year. Harry comes face to face with danger yet again, this time in the form of an escaped convict, Sirius Black — and turns to sympathetic Professor Lupin for help.
'डंब एंड डम्बरर: व्हेन हैरी मेट लॉयड' यहां क्या कर रहा है, आप सोच सकते हैं? शुक्र है, इस मुद्दे को अधिक पैरामीटर वाले पैरामीटर पर पुन: उत्पन्न नहीं किया गया था।
खोज आउटपुट में प्रासंगिकता के आधार पर अवरोही क्रम में क्रमबद्ध दस्तावेज़ शामिल होने चाहिए। इसे प्राप्त करने के लिए, हमें वर्तमान क्वेरी और प्रत्येक दस्तावेज़ के बीच की दूरी के बारे में पता होना चाहिए। लंबाई जितनी कम होगी, आउटपुट उतना ही अधिक प्रासंगिक होगा। फिर, परिभाषित अधिकतम पहुंच के बाद, हमें शेष दस्तावेजों की प्रासंगिकता पर विचार करना बंद कर देना चाहिए।
उपरोक्त उदाहरण में, हमने प्रयोग किया
दूरी गणना एल्गोरिदम एक क्वेरी और एक एकल संख्या वाले दस्तावेज़ के बीच इस समानता (अंतर) का प्रतिनिधित्व करते हैं। हालाँकि, हम पर भरोसा नहीं कर सकते
यदि आप चाहें, तो आप परिणामी रिपॉजिटरी को यहां देख सकते हैं:
वैकल्पिक रूप से, आप इसके साथ यहां Google Colab में खेल सकते हैं।
हमने दस्तावेज़ों को छाँटने के लिए क्रूर बल दृष्टिकोण का उपयोग किया। आइए निर्धारित करें:
● n: प्रशिक्षण डेटासेट में अंकों की संख्या
● डी: डेटा आयाम
क्रूर बल समाधान के लिए खोज समय जटिलता O(n * d * n * log(n)) है। पैरामीटर डी मॉडल पर निर्भर करता है (बैबेज के मामले में, यह 2048 के बराबर है) जबकि हमारे पास सॉर्टिंग चरण के कारण O(nlog(n)) ब्लॉक है।
इस स्तर पर खुद को याद दिलाना महत्वपूर्ण है कि छोटे मॉडल तेज और सस्ते होते हैं। उदाहरण के लिए, खोज मामले की समानता गणना चरण में, एडीए मॉडल दो गुना तेज है, जबकि डेविंसी मॉडल छह गुना धीमा है।
क्वेरी और 2048 आयामों के 4803 दस्तावेजों के बीच कोसाइन समानता की गणना ने मेरे एम1 प्रो पर 1260 एमएस लिया। वर्तमान कार्यान्वयन में, गणना करने के लिए आवश्यक समय दस्तावेजों की कुल संख्या के लिए रैखिक रूप से बढ़ेगा। इसके साथ ही, यह दृष्टिकोण अभिकलन समानांतरकरण का समर्थन करता है।
खोज समाधानों में, प्रश्नों को यथाशीघ्र पूरा किया जाना चाहिए। और यह कीमत आमतौर पर प्रशिक्षण और प्री-कैशिंग समय के पक्ष में भुगतान की जाती है। हम केडी ट्री, आर-ट्री या बॉल ट्री जैसी डेटा संरचनाओं का उपयोग कर सकते हैं। से लेख पर विचार करें
केडी पेड़, गेंद के पेड़, और आर-पेड़ डेटा संरचनाओं का निर्माण करते हैं जिनका उपयोग एन-आयामी अंतरिक्ष में अंक के लिए कुशलतापूर्वक खोज करने के लिए किया जाता है, जैसे कि हमारे अर्थ वैक्टर।
केडी और बॉल ट्री ट्री-आधारित डेटा संरचनाएं हैं जो एक उप-क्षेत्र का प्रतिनिधित्व करने वाले पेड़ में प्रत्येक नोड के साथ अंतरिक्ष को क्षेत्रों में विभाजित करने के लिए एक पुनरावृत्त, बाइनरी विभाजन योजना का उपयोग करती हैं। केडी पेड़ एक विशिष्ट सीमा के भीतर बिंदुओं की खोज करने या निकटतम पड़ोसी को किसी दिए गए बिंदु पर खोजने में विशेष रूप से कुशल होते हैं।
इसी तरह, आर-ट्रीज़ का उपयोग एन-डायमेंशनल स्पेस में पॉइंट्स को स्टोर करने के लिए भी किया जाता है, हालाँकि, वे किसी विशिष्ट क्षेत्र के भीतर पॉइंट्स खोजने या किसी दिए गए पॉइंट की एक निश्चित दूरी के भीतर सभी पॉइंट्स खोजने में अधिक कुशल होते हैं। महत्वपूर्ण रूप से, आर-ट्री केडी ट्री और बॉल ट्री के लिए एक अलग विभाजन योजना का उपयोग करते हैं; वे अंतरिक्ष को बाइनरी विभाजन के बजाय 'आयत' में विभाजित करते हैं।
ट्री कार्यान्वयन इस लेख के दायरे से बाहर हैं, और अलग-अलग कार्यान्वयन से अलग-अलग खोज आउटपुट प्राप्त होंगे।
शायद, वर्तमान खोज समाधान का सबसे महत्वपूर्ण नुकसान यह है कि हमें क्वेरी एम्बेडिंग वेक्टर को पुनः प्राप्त करने के लिए बाहरी OpenAI API को कॉल करना होगा। कोई फर्क नहीं पड़ता कि हमारा एल्गोरिथ्म कितनी जल्दी निकटतम पड़ोसियों को खोजने में सक्षम है, एक क्रमिक अवरोधन कदम की आवश्यकता होगी।
Text-search-babbage-query-001 Number of dimensions: 2048 Number of queries: 100 Average duration: 225ms Median duration: 207ms Max duration: 1301ms Min duration: 176ms
Text-search-ada-query-002 Number of dimensions: 1536 Number of queries: 100 Average duration: 264ms Median duration: 250ms Max duration: 859ms Min duration: 215ms
Text-search-davinci-query-001 Number of dimensions: 12288 Number of queries: 100 Average duration: 379ms Median duration: 364ms Max duration: 1161ms Min duration: 271ms
यदि हम माध्यिका को संदर्भ बिंदु के रूप में लेते हैं, तो हम देख सकते हैं कि ada-002 +28% धीमा है और davinci-001 +76% धीमा है।
का संदर्भ देते हुए
साथ ही, OpenAI के साथ प्रशिक्षण लागत अपेक्षाकृत अधिक है।
वैकल्पिक रूप से, आप प्रयास करने पर विचार कर सकते हैं
Elasticsearch 8.0 कुशल अनुमानित निकटतम पड़ोसी खोज (एएनएन) का समर्थन करता है जिसका उपयोग किसी रैखिक केएनएन की तुलना में तेज़ी से हमारी समस्या परिमाण को हल करने के लिए किया जा सकता है। Elasticsearch 8.0 समानता के आधार पर वैक्टर को ग्राफ़ में व्यवस्थित करने के लिए पदानुक्रमित नेविगेशनल स्मॉल वर्ल्ड ग्राफ़ (HNSW) नामक ANN एल्गोरिथम का उपयोग करता है। 10 मिलियन एम्बेडेड वैक्टर के डेटासेट पर परीक्षण किया गया, हमने एकल गणना-केंद्रित मशीन पर एएनएन के साथ प्रति सेकंड 200 प्रश्नों का प्रभावशाली प्रदर्शन हासिल किया, जबकि केएनएन का उपयोग करते हुए प्रति सेकंड केवल 2 प्रश्न। दोनों एलेस्टिक्स खोज द्वारा प्रदान किए गए थे।
इलास्टिकसर्च के अनुसार
जैसा कि आपने उम्मीद से देखा होगा, GPT-3 एंबेडिंग अपनी इंडेक्सिंग जटिलता, लागत, साथ ही खोज ऑपरेशन की उच्च कम्प्यूटेशनल जटिलता, यहां तक कि अनुमानों के कारण किसी भी और सभी खोज समस्याओं के लिए सही समाधान नहीं है। फिर भी, GPT-3 एंबेडिंग उन लोगों के लिए एक उत्कृष्ट पसंद बनी हुई है जो कम पूछताछ और मामूली अनुक्रमण आवश्यकताओं के साथ खोज समाधान के लिए एक शक्तिशाली रीढ़ की तलाश कर रहे हैं।
इसके अलावा, यह भी जोड़ने योग्य है कि माइक्रोसॉफ्ट ने हाल ही में घोषणा की थी कि बिंग सर्च इंजन अब जीपीटी 3.5 के नए उन्नत संस्करण का उपयोग करता है, जिसे 'प्रोमेथियस' कहा जाता है और शुरुआत में खोज के लिए विकसित किया गया था। घोषणा के अनुसार, नया प्रोमेथियस भाषा मॉडल बिंग को प्रासंगिकता बढ़ाने, स्निपेट्स को अधिक सटीक रूप से एनोटेट करने, ताज़ा परिणाम प्रदान करने, जियोलोकेशन को समझने और सुरक्षा में सुधार करने की अनुमति देता है। यह खोज समाधानों के लिए ऑटोरेग्रेसिव भाषा मॉडल का उपयोग करने की नई संभावनाओं को खोल सकता है, जिस पर हम निश्चित रूप से आगे बढ़ते रहेंगे।
संदर्भ: