45:57Chase AI
Log in to leave a comment
No posts yet
लोकल एनवायरनमेंट में RAG सिस्टम बनाते समय सबसे पहली बाधा VRAM क्षमता और लाइब्रेरीज़ के बीच वर्जन का टकराव है। 8-बिट क्वांटाइज़्ड मॉडल प्रति 1 बिलियन पैरामीटर पर लगभग 1GB VRAM की खपत करते हैं। विंडोज या मैक ओएस के अपने उपयोग को देखते हुए, कम से कम 20% खाली जगह छोड़ना आवश्यक है। यदि यह मार्जिन नहीं है, तो टोकन जनरेशन की गति गिरकर 2 टोकन प्रति सेकंड रह जाएगी, जो बहुत खराब प्रदर्शन है। विशेष रूप से lightrag-hku फ्रेमवर्क नए numpy 2.x वर्जन के साथ रनटाइम एरर देता है।
सबसे पहले टर्मिनल खोलें और pip install numpy==1.26.4 --force-reinstall टाइप करके वर्जन को फिक्स करें। इसके बाद nest_asyncio इंस्टॉल करें और कोड के सबसे ऊपर nest_asyncio.apply() लिखें। यदि आप ऐसा नहीं करते हैं, तो जुपिटर नोटबुक में एसिंक्रोनस लूप उलझ जाएगा और पूरी प्रक्रिया रुक जाएगी। यदि GPU मेमोरी 8GB से कम है, तो LightRAG को इनिशियलाइज़ करते समय embedding_batch_num को 10 से कम और llm_model_max_async को लगभग 4 तक कम रखें। केवल इस सेटिंग से आप सिस्टम के बिना कारण क्रैश होने वाली OOM (Out Of Memory) स्थिति को रोक सकते हैं और अपने शोध के कम से कम 2 घंटे बचा सकते हैं।
केवल टेक्स्ट को चंक्स (chunks) में स्टोर करने से जानकारी के बीच का संदर्भ कट जाता है। लेकिन यदि आप ऑब्सीडियन की विकिलिंक ([[link]]) संरचना को सही ढंग से पार्स करते हैं, तो आप एक बहुत अच्छा नॉलेज ग्राफ बना सकते हैं। मुख्य बात LLM द्वारा पढ़ने से पहले अनावश्यक मार्कडाउन प्रतीकों को हटाना है। केवल इन गंदे प्रतीकों को साफ करके आप टोकन की खपत को लगभग 30% तक कम कर सकते हैं।
नोट्स लिखते समय, टॉप YAML क्षेत्र में type, domain जैसे फ़ील्ड डालने की आदत डालें। इससे सर्च फ़िल्टरिंग की गति बदल जाएगी। पायथन के re मॉड्यूल में r"\[\[(.+?)\]\]" पैटर्न का उपयोग करके दस्तावेजों के बीच के लिंक निकालें और फिर उन्हें JSONL प्रारूप में रिलेशनशिप डेटासेट में बदलें। फ़ाइल का नाम भी महत्वपूर्ण है। '2024-04-14' जैसी तारीख के बजाय, विषय के मुख्य शीर्षक का उपयोग करें ताकि इंडेक्स किए गए नोड्स अपना काम सही ढंग से कर सकें। इस तरह से जुड़ा डेटा सरल खोज से परे जाकर अवधारणाओं के बीच तर्क (reasoning) करने की अनुमति देता है।
लोकल LLM चलाते समय सबसे बड़ी बर्बादी पहले से गणना की गई एम्बेडिंग को फिर से कैलकुलेट करने में समय बिताना है। पायथन का डिफ़ॉल्ट कैश प्रोग्राम बंद होने पर गायब हो जाता है। इसलिए, SQLite आधारित DiskCache का उपयोग करके एक भौतिक भंडारण बनाना चाहिए। यदि प्रश्नों के बीच कोसाइन सिमिलरिटी (cosine similarity) 0.95 से अधिक है, तो LLM को कॉल किए बिना सीधे कैश्ड प्रतिक्रिया देने के लिए डिज़ाइन करें। इस सिमेंटिक कैशिंग को लागू करने से रिस्पॉन्स टाइम 100ms के आसपास कम किया जा सकता है।
तरीका सरल है। pip install diskcache के साथ लाइब्रेरी प्राप्त करें और एम्बेडिंग टेक्स्ट और वेक्टर जोड़े को स्टोर करने के लिए एक क्लास बनाएं। इसमें समय-भारित एल्गोरिथ्म (time-weighting algorithm) मिलाना और भी बेहतर है।
तर्क यह है कि हाल ही में संशोधित नोट खोज परिणामों में सबसे ऊपर दिखाई दे। यदि आप एम्बेडिंग कैश के लिए TTL 1 घंटा और जनरेटेड रिस्पॉन्स कैश के लिए 2 घंटे सेट करते हैं, तो आप दोहराए जाने वाले प्रश्नों के लिए एक त्वरित प्रतिक्रिया प्रणाली तैयार कर सकते हैं।
नोट्स में शामिल आर्किटेक्चर आरेख या स्क्रीनशॉट टेक्स्ट की तुलना में बहुत अधिक जानकारी रखते हैं। इन्हें खोज से बाहर रखना घाटे का सौदा है। CLIP मॉडल का उपयोग करके, आप इमेज और टेक्स्ट को एक ही स्पेस में रख सकते हैं, जिससे आप केवल "डेटा फ्लो डायग्राम" टाइप करके संबंधित इमेज पा सकते हैं। यदि आपके पास हाई-एंड GPU नहीं है, तो CLIP-ViT-B-32 मॉडल को OpenVINO फॉर्मेट में बदलें और इसे CPU पर चलाएं।
मार्कडाउन फ़ाइल में इमेज पाथ मिलने पर, उसके आगे-पीछे के लगभग 200 वर्णों के टेक्स्ट को साथ में ग्रुप करें। फिर Phi-3.5-vision जैसे हल्के लोकल VLM के साथ स्वचालित रूप से इमेज कैप्शन निकालें। इस कैप्शन वेक्टर और इमेज फीचर वेक्टर को Qdrant जैसे लोकल वेक्टर DB में एक साथ स्टोर करें। इस प्रक्रिया के माध्यम से, वे जटिल चित्र भी खोज परिणामों में शामिल हो जाते हैं जिन्हें टेक्स्ट में समझाना मुश्किल होता है।
हर बार एक फ़ाइल संशोधित होने पर पूरे वॉल्ट (vault) को फिर से इंडेक्स करना समझदारी नहीं है। पायथन की watchdog लाइब्रेरी का उपयोग करके, आप उस क्षण का पता लगा सकते हैं जब फ़ाइल सहेजी जाती है और केवल बदले हुए हिस्से को अपडेट कर सकते हैं। हालांकि, यदि लिखने के दौरान इंडेक्सिंग लगातार चलती रहती है, तो CPU पर बहुत दबाव पड़ेगा, इसलिए डिबाउंसिंग (debouncing) प्रक्रिया अनिवार्य है।
स्क्रिप्ट लिखते समय, watchdog.observers के साथ फ़ोल्डर की निगरानी करें और यदि कोई संशोधन ईवेंट होता है, तो कार्य शुरू करने से पहले 5 सेकंड प्रतीक्षा करें। प्रत्येक फ़ाइल के SHA-256 हैश मान को अलग से स्टोर करें और तुलना करें कि क्या सामग्री वास्तव में बदली है। केवल बदली हुई हैश वाली फ़ाइलों का चयन करें, पुराने नोड्स को हटा दें और नए वेक्टर डालें। ऐसा करने से, एक रीयल-टाइम नॉलेज बेस पूरा हो जाता है जो आपके नोट सहेजते ही सर्च सिस्टम में रिफ्लेक्ट होता है। इसका मतलब है कि आपको मैन्युअल रूप से अपडेट बटन दबाने की आवश्यकता नहीं है।