शून्य से एक RAG बनाना

मेरे पहले AI वर्ज़न ने मुझे बताया कि मैं हाइड्रोलिक एक्सकेवेटर बेचता हूँ। मैं एक्सकेवेटर नहीं बेचता। उसने पूरे आत्मविश्वास के साथ मुझे एक गलत कीमत और गलत विवरण दे दिया।

वही वह क्षण था जब मैंने केवल प्रॉम्प्ट्स पर भरोसा करना बंद कर दिया। मैंने एक नियम के साथ सिस्टम को फिर से बनाया: या तो यह कैटलॉग से उत्तर देगा, या फिर बिल्कुल भी उत्तर नहीं देगा।

यहाँ बताया गया है कि मैंने Postgres और Python का उपयोग करके एक विश्वसनीय RAG (Retrieval-Augmented Generation) सिस्टम कैसे बनाया।

डेटा की तैयारी अधिकांश ट्यूटोरियल कठिन हिस्से को छोड़ देते हैं: डेटा को साफ़ करना। मैंने अपनी प्रक्रिया को दो चरणों में विभाजित किया:

  • चरण 1: HTML फाइलों को डिस्क पर डाउनलोड करना। मैं प्रत्येक फ़ाइल के शीर्ष पर एक कमेंट के रूप में मेटाडेटा सहेजता हूँ। यह प्रक्रिया को idempotent बनाता है। यदि कोई फ़ाइल पहले से मौजूद है, तो मैं उसे छोड़ देता हूँ।
  • चरण 2: उन फाइलों को ऑफलाइन पार्स करना। यह HTML को एक साफ़ JSON कैटलॉग में बदल देता है।

पार्स करने के बाद मैं फ़ील्ड कवरेज की जाँच करता हूँ। यदि वजन या कीमत जैसा कोई फ़ील्ड खाली है, तो मुझे तुरंत पता चल जाता है। असली काम साफ़ डेटा के साथ ही होता है।

AI वाला हिस्सा मैं प्रत्येक उत्पाद को टेक्स्ट के एक ब्लॉक में बदल देता हूँ और bge-m3 मॉडल का उपयोग करके उसे एक वेक्टर में परिवर्तित कर देता हूँ। मैं इन वेक्टर्स को pgvector एक्सटेंशन का उपयोग करके Postgres में स्टोर करता हूँ।

उत्पादों को खोजने के लिए मैं हाइब्रिड सर्च अप्रोच का उपयोग करता हूँ:

  • सिमेंटिक सर्च (Semantic Search): आपके प्रश्न के अर्थ से मेल खाने वाले उत्पादों को खोजने के लिए वेक्टर्स का उपयोग करता है।
  • स्ट्रक्चर्ड फिल्टर्स (Structured Filters): मैं "Siemens motors under €2000" जैसी क्वेरी को JSON में बदलने के लिए LLM का उपयोग करता हूँ। इससे मुझे ब्रांड और कीमत के लिए सटीक फ़िल्टर के साथ SQL क्वेरी चलाने की अनुमति मिलती है।

एक ही SQL स्टेटमेंट फजी सर्च (fuzzy search) और हार्ड फिल्टर्स दोनों को संभालता है। इससे सब कुछ सिंक में रहता है।

गार्डरेल्स एक अच्छे RAG को पता होना चाहिए कि कब चुप रहना है। मैं हैलुसिनेशन (hallucinations) को रोकने के लिए दो लेयर्स का उपयोग करता हूँ:

  • सिमिलरिटी थ्रेशोल्ड (Similarity Threshold): प्रत्येक मैच को एक स्कोर मिलता है। यदि स्कोर निर्धारित सीमा से कम है, तो मैं परिणामों को हटा देता हूँ। यदि कोई परिणाम पास नहीं होता है, तो सिस्टम LLM को कॉल किए बिना ही "not found" कह देता है। यदि मॉडल डेटा देख ही नहीं पाता, तो वह हैलुसिनेशन नहीं कर सकता।
  • सख्त सिस्टम प्रॉम्प्ट (Strict System Prompt): मैं मॉडल को केवल दिए गए उत्पादों से उत्तर देने के लिए कहता हूँ। यदि उत्पाद अप्रासंगिक हैं, तो उसे मना करना होगा।

थ्रेशोल्ड गलत व्यवहार को असंभव बना देता है। प्रॉम्प्ट केवल अच्छे व्यवहार की मांग करता है। दोनों का उपयोग करें।

थ्रूपुट सारांश

  • सावधानी से इकट्ठा करें।
  • ईमानदारी से साफ़ करें।
  • सरलता से एम्बेड करें।
  • डिज़ाइन के आधार पर मना करें।

मना करना ही सिस्टम को भरोसेमंद बनाता है। भरोसा आर्किटेक्चर से आता है, मॉडल से अच्छा व्यवहार करने की प्रार्थना करने से नहीं।

स्रोत: https://dev.to/utku_catal/building-a-rag-from-scratch-collect-clean-embed-refuse-20ob

वैकल्पिक लर्निंग कम्युनिटी: https://t.me/GyaanSetuAi