Annoy (Approximate Nearest Neighbors Oh Yeah) एक ओपन-सोर्स C++ लाइब्रेरी है जिसमें अनुमानित निकटतम पड़ोसी खोज के लिए Python बाइंडिंग हैं। इसे Erik Bernhardsson ने Spotify में काम करते हुए संगीत अनुशंसाओं को सशक्त बनाने के लिए बनाया था, जहाँ यह एम्बेडिंग वैक्टर के आधार पर समान ट्रैक या कलाकारों को ढूंढता है। Annoy बड़े पैमाने पर, केवल-पढ़ने के लिए डेटासेट के लिए डिज़ाइन किया गया है और अपनी सरलता, गति और मेमोरी दक्षता के लिए जाना जाता है, जो इसे Machine learning अनुप्रयोगों के लिए एक लोकप्रिय विकल्प बनाता है जिन्हें तेज़ समानता खोज की आवश्यकता होती है।
लाइब्रेरी यादृच्छिक प्रक्षेपण पेड़ों का एक वन बनाती है, जहाँ प्रत्येक पेड़ हाइपरप्लेन का उपयोग करके डेटा स्थान को विभाजित करता है। क्वेरी समय पर, Annoy कई पेड़ों को पार करके उम्मीदवार बिंदुओं को एकत्र करता है और फिर अनुमानित निकटतम पड़ोसियों को लौटाने के लिए उन्हें स्कोर करता है। यह दृष्टिकोण सटीकता की एक छोटी मात्रा को गति और स्केलेबिलिटी में महत्वपूर्ण लाभों के लिए व्यापार करता है, विशेष रूप से उच्च-आयामी वैक्टर के लिए। Annoy कई दूरी मेट्रिक्स का समर्थन करता है, जिसमें यूक्लिडियन दूरी, मैनहट्टन दूरी, कोसाइन समानता और डॉट उत्पाद शामिल हैं, और इसे C++, Python और बाइंडिंग के माध्यम से अन्य भाषाओं से उपयोग किया जा सकता है।
इतिहास और विकास
Annoy को पहली बार 2013 में Erik Bernhardsson द्वारा जारी किया गया था, जो उस समय Spotify में एक इंजीनियर थे। यह परियोजना लाखों ऑडियो ट्रैक्स को संभालने और वास्तविक समय की अनुशंसाएँ प्रदान करने की आवश्यकता से उत्पन्न हुई। Bernhardsson ने 2014 में लाइब्रेरी को ओपन-सोर्स किया, और यह जल्दी से Artificial intelligence समुदाय में लोकप्रिय हो गई। नाम "Annoy" "Approximate Nearest Neighbors Oh Yeah" के लिए एक चंचल संक्षिप्त नाम है। लाइब्रेरी को Bernhardsson और अन्य योगदानकर्ताओं द्वारा बनाए रखा गया है, जिसका नवीनतम स्थिर संस्करण 2023 में 1.17.3 है। यह GitHub पर होस्ट किया गया है और Apache 2.0 लाइसेंस के तहत उपलब्ध है।
तकनीकी दृष्टिकोण
Annoy का मुख्य एल्गोरिदम यादृच्छिक प्रक्षेपण पेड़ों पर आधारित है। निर्माण चरण के दौरान, लाइब्रेरी यादृच्छिक रूप से चुने गए हाइपरप्लेन के साथ माध्यिका पर डेटा को पुनरावर्ती रूप से विभाजित करके कई पेड़ बनाती है। प्रत्येक विभाजन वर्तमान उपसमुच्चय से दो यादृच्छिक रूप से चयनित बिंदुओं द्वारा निर्धारित किया जाता है, और हाइपरप्लेन उन्हें जोड़ने वाले रेखा खंड का लंबवत द्विभाजक होता है। यह प्रक्रिया तब तक जारी रहती है जब तक कि प्रत्येक पत्ती में अधिकतम निर्दिष्ट संख्या में बिंदु (डिफ़ॉल्ट 10) न हों। पेड़ों का परिणामी वन डिस्क पर संग्रहीत किया जाता है, जिससे मेमोरी-मैप्ड लोडिंग संभव होती है, जो कई प्रक्रियाओं को मेमोरी की नकल किए बिना एक ही इंडेक्स साझा करने की अनुमति देती है।
क्वेरी समय पर, Annoy प्रत्येक पेड़ को जड़ से पत्ती तक पार करता है, पत्ती में बिंदुओं को उम्मीदवारों के रूप में एकत्र करता है। फिर यह क्वेरी बिंदु से सभी उम्मीदवारों तक सटीक दूरी की गणना करता है और शीर्ष-k निकटतम पड़ोसियों को लौटाता है। खोजने के लिए पेड़ों की संख्या एक पैरामीटर है जो गति और सटीकता के बीच व्यापार-बंद को नियंत्रित करता है: अधिक पेड़ बेहतर रिकॉल देते हैं लेकिन धीमी क्वेरी देते हैं। Annoy एक "search_k" पैरामीटर का भी समर्थन करता है जो देखे गए नोड्स की संख्या को सीमित करता है, जो प्रदर्शन पर बेहतर नियंत्रण प्रदान करता है।
उपयोग और एकीकरण
Annoy व्यापक रूप से उत्पादन प्रणालियों में उपयोग किया जाता है, विशेष रूप से अनुशंसा इंजन और सूचना पुनर्प्राप्ति में। Spotify में, इसका उपयोग "Discover Weekly" प्लेलिस्ट सुविधा को सशक्त बनाने के लिए किया गया था, जो उपयोगकर्ता के सुनने के इतिहास के आधार पर नया संगीत अनुशंसित करता है। लाइब्रेरी का उपयोग विभिन्न Deep learning पाइपलाइनों में छवि पुनर्प्राप्ति, दस्तावेज़ समानता और Neural network एम्बेडिंग खोज जैसे कार्यों के लिए भी किया जाता है। इसकी सरलता और बाहरी निर्भरता की कमी इसे मौजूदा परियोजनाओं में एकीकृत करना आसान बनाती है। Annoy एक सीधा API प्रदान करता है: आप आइटम जोड़कर एक इंडेक्स बनाते हैं और फिर build(n_trees) कहते हैं, और क्वेरी के लिए आप get_nns_by_vector या get_nns_by_item का उपयोग करते हैं। लाइब्रेरी आइटम के वृद्धिशील जोड़ का भी समर्थन करती है, हालाँकि नए डेटा को शामिल करने के लिए इंडेक्स को फिर से बनाना होगा।
अन्य लाइब्रेरीज़ के साथ तुलना
Annoy कई अनुमानित निकटतम पड़ोसी लाइब्रेरीज़ में से एक है, जिनमें से प्रत्येक की अलग-अलग ताकतें हैं। FAISS (Facebook AI Research से) और HNSW (Hierarchical Navigable Small World graphs) जैसी लाइब्रेरीज़ की तुलना में, Annoy अक्सर उपयोग करने में सरल है और किसी प्रशिक्षण चरण की आवश्यकता नहीं होती है। हालाँकि, HNSW की तुलना में दी गई गति के लिए इसकी रिकॉल कम हो सकती है, जो ग्राफ-आधारित दृष्टिकोण का उपयोग करता है। FAISS GPU त्वरण और अधिक उन्नत इंडेक्सिंग संरचनाएँ प्रदान करता है, लेकिन यह भारी और अधिक जटिल है। Annoy की मेमोरी-मैप्ड फ़ाइलें इसे विशेष रूप से उन बड़े डेटासेट के लिए उपयुक्त बनाती हैं जो RAM से अधिक हैं, क्योंकि यह मांग पर इंडेक्स लोड कर सकता है। यह सुविधा अन्य लाइब्रेरीज़ में कम आम है, जिससे Annoy केवल-पढ़ने, बड़े पैमाने पर तैनाती के लिए एक पसंदीदा विकल्प बन जाता है।
प्रभाव और विरासत
Annoy का समानता खोज के क्षेत्र पर महत्वपूर्ण प्रभाव पड़ा है और कई शोध पत्रों में उद्धृत किया गया है। इसने अन्य परियोजनाओं को प्रेरित किया है और बेंचमार्किंग अध्ययनों में एक आधार रेखा के रूप में उपयोग किया गया है। लाइब्रेरी के डिज़ाइन ने Generative AI और Large language model अनुप्रयोगों में बाद के विकास को प्रभावित किया, जहाँ सिमेंटिक खोज और मेमोरी ऑगमेंटेशन जैसे कार्यों के लिए प्रासंगिक वैक्टर की कुशल पुनर्प्राप्ति महत्वपूर्ण है। Annoy Artificial intelligence पारिस्थितिकी तंत्र में एक प्रासंगिक उपकरण बना हुआ है, और इसका कोडबेस अनुमानित निकटतम पड़ोसी एल्गोरिदम के बारे में सीखने के लिए एक मूल्यवान संसाधन है।