मैंने इसे समझने के लिए Python में स्क्रैच से RAG बनाया

मैंने छह महीने तक प्रोडक्शन में LangChain का उपयोग किया। मैं यह नहीं समझा सका कि यह कैसे काम करता था। मुझे नहीं पता था कि मैंने विशिष्ट मेट्रिक्स क्यों चुने या टेक्स्ट वेक्टर कैसे बने। लाइब्रेरी ने इसके पीछे के लॉजिक को छिपा दिया था।

इसे ठीक करने के लिए, मैंने फ्रेमवर्क को हटा दिया। मैंने 500 लाइनों के सादे Python का उपयोग करके स्क्रैच से एक RAG पाइपलाइन लिखी।

मैन्युअल रूप से इस स्टैक को बनाने से मैंने जो सीखा, वह यहाँ है।

ब्लैक बॉक्स के साथ समस्या जब आप हाई-लेवल लाइब्रेरीज़ का उपयोग करते हैं, तो आप नियंत्रण खो देते हैं। मैंने मॉडल्स को तथ्यों की कल्पना (hallucinate) करते या गलत साइटेशन देते हुए देखा। मैं यह नहीं बता सका कि त्रुटि chunker में थी, embedding model में थी, या prompt में थी।

जब आप इसे खुद बनाते हैं, तो हर लेयर का निरीक्षण किया जा सकता है। आप LLM को भेजे गए सटीक chunks को प्रिंट कर सकते हैं। आप देख सकते हैं कि वाक्य ठीक कहाँ से टूट रहा है।

RAG की पांच परतें RAG कोई एक एल्गोरिदम नहीं है। यह एक साथ जुड़ी हुई पांच अलग-अलग प्रक्रियाएं हैं:

  • Chunking: टेक्स्ट को कैसे विभाजित किया जाए, यह तय करना।
  • Embedding: टेक्स्ट को गणित (math) में बदलना।
  • Retrieval: सही हिस्सों को खोजना।
  • Prompt Construction: मॉडल को बताना कि उसे कैसे व्यवहार करना है।
  • Generation: अंतिम उत्तर प्राप्त करना।

निर्माण से मिले सबक

  1. Chunking सबसे महत्वपूर्ण कदम है अधिकांश ट्यूटोरियल इसे छोड़ देते हैं। यदि आप overlap का उपयोग नहीं करते हैं, तो आप सीमाओं (boundaries) पर संदर्भ (context) खो देते हैं। मैंने character-level overlap के साथ एक sliding window का उपयोग किया। यह सुनिश्चित करता है कि मॉडल दो chunks के बीच के संबंध को देख सके।

  2. Distance metrics मायने रखते हैं मैंने खराब सर्च परिणामों को डीबग करने में घंटों बिताए। समस्या डेटा में नहीं थी। समस्या metric में थी। ChromaDB डिफ़ॉल्ट रूप से L2 distance का उपयोग करता है। semantic search के लिए, आपको Cosine similarity की आवश्यकता होती है। कोड की एक लाइन ने सब कुछ बदल दिया।

  3. Prompts को बाधाओं (constraints) की आवश्यकता होती है एक LLM एक 'completer' है, 'oracle' नहीं। यदि आप कोई अस्पष्ट प्रश्न पूछते हैं, तो यह उत्तर बना लेगा। मैंने एक सख्त refusal template का उपयोग करना सीखा। मैंने मॉडल से कहा: "यदि context में उत्तर नहीं है, तो कहें कि आप नहीं जानते।" इससे hallucinations 40% से घटकर 5% रह गए।

  4. अपनी requests को batch में भेजें प्रति chunk एक HTTP request भेजना धीमा है। उन्हें batches में भेजना बहुत तेज़ है। यह स्थानीय मॉडल को काम को pipeline करने की अनुमति देता है।

  5. नीचे से ऊपर की ओर टेस्ट करें टेस्ट अंत में न लिखें। पहले अपने chunker का परीक्षण करें। फिर अपने embedder का परीक्षण करें। फिर अपने store का परीक्षण करें। यदि आप अंत में टेस्ट करते हैं, तो आप लॉजिक के बजाय बग्स का परीक्षण कर रहे होते हैं।

यदि आपको लगता है कि आप अपने AI stack को वास्तव में नहीं समझते हैं, तो इसे खुद बनाएं। कोड लक्ष्य नहीं है। सोचना (thinking) लक्ष्य है।

Source: https://dev.to/avinash_zala_1c6f5e7c4af9/i-built-rag-from-scratch-in-python-to-understand-it-heres-what-i-learned-33kf

Optional learning community: https://t.me/GyaanSetuAi