Retrieval और उत्तर की क्वालिटी को मापना
एक RAG सिस्टम सर्च करने में या उत्तर देने में फेल हो सकता है। दोनों को मापें: retrieval के लिए recall@k और MRR, और उत्तरों के लिए faithfulness और correctness, एक golden question set पर।
60 सेकंड में
Retrieval और उत्तर की क्वालिटी को मापना
एक RAG सिस्टम सर्च करने में या उत्तर देने में फेल हो सकता है। दोनों को मापें: retrieval के लिए recall@k और MRR, और उत्तरों के लिए faithfulness और correctness, एक golden question…
गोल्डन क्वेश्चन सेट (The golden question set)
| फ़ील्ड | उदाहरण |
|---|---|
| सवाल | "क्या मैं बची हुई कैज़ुअल लीव (casual leave) को आगे बढ़ा सकता हूँ?" |
| काम के chunk ids | hr-leave-v3#1 |
| रेफरेंस उत्तर | नहीं। बची हुई कैज़ुअल लीव को अगले साल के लिए आगे नहीं बढ़ाया जा सकता। |
| टैग्स | policy, English, simple |
- सपोर्ट टिकटों, सर्च लॉग्स या कर्मचारियों से असली सवाल इस्तेमाल करें, जिनमें से पर्सनल डेटा हटा दिया गया हो।
- अपनी हर वैरायटी को शामिल करें: भाषाएँ और लिपियाँ, छोटे और बड़े सवाल, कोड्स और नाम, फॉलो-अप सवाल, और उलझाने वाले सवाल।
- डॉक्यूमेंट्स में ऐसे सवाल भी शामिल करें जिनका कोई उत्तर न हो। इसका सही आउटपुट "not found" (नहीं मिला) होना चाहिए।
- इसका वर्ज़न बनाए रखें (versioned रखें), और इसके हिसाब से सिस्टम को इतना ज़्यादा ट्यून न करें कि यह एक निष्पक्ष टेस्ट ही न रहे। कई टीमें एक अलग हिस्सा बिना इस्तेमाल किए सुरक्षित (held-out) रखती हैं।
Retrieval मेट्रिक्स
| मेट्रिक | यह किस सवाल का जवाब देता है | इसे कैसे कैलकुलेट किया जाता है |
|---|---|---|
| Recall@k (hit rate) | क्या सही chunk टॉप k में बिल्कुल आया भी? | उन सवालों का हिस्सा जहाँ कम से कम एक काम का chunk टॉप k में मौजूद है |
| Recall@k (पूरा) | काम के कुल chunks में से कितने मिल पाए? | टॉप k में मौजूद काम के chunks ÷ कुल काम के chunks, सभी सवालों का औसत |
| MRR (mean reciprocal rank) | पहला सही chunk लिस्ट में कितना ऊपर था? | 1 ÷ (पहले सही chunk की रैंक) का औसत; अगर लिस्ट में कोई नहीं है तो 0 |
| Precision@k | टॉप k का कितना हिस्सा काम का था? | टॉप k में मौजूद काम के chunks ÷ k |
def hit_at_k(results, relevant, k):
return 1.0 if any(r in relevant for r in results[:k]) else 0.0
def recall_at_k(results, relevant, k):
return len(set(results[:k]) & set(relevant)) / len(relevant)
def reciprocal_rank(results, relevant):
for rank, r in enumerate(results, start=1):
if r in relevant:
return 1.0 / rank
return 0.0
# Made-up results from a search system, for three golden questions.
golden = [
{"q": "carry forward leave?", "relevant": ["hr#1"], "results": ["hr#0", "hr#1", "it#4"]},
{"q": "travel allowance per day", "relevant": ["tr#2", "tr#3"], "results": ["tr#2", "hr#0", "tr#9"]},
{"q": "wifi password reset", "relevant": ["it#7"], "results": ["it#4", "it#5", "hr#2"]},
]
k = 3
n = len(golden)
print("hit@3 ", sum(hit_at_k(g["results"], g["relevant"], k) for g in golden) / n)
print("recall@3", round(sum(recall_at_k(g["results"], g["relevant"], k) for g in golden) / n, 3))
print("MRR ", round(sum(reciprocal_rank(g["results"], g["relevant"]) for g in golden) / n, 3))उत्तर के मेट्रिक्स
- Faithfulness (groundedness): क्या हर दावा ढूंढे गए सोर्स (स्रोतों) पर आधारित है? कोई उत्तर faithful होने के बावजूद गलत हो सकता है, अगर वे सोर्स ही गलत या पुराने हों।
- Correctness: क्या उत्तर रेफरेंस उत्तर से मेल खाता है?
- Citation accuracy: क्या उद्धृत (cited) किया गया हर सोर्स सच में उस वाक्य का समर्थन करता है?
- सही "not found": जिन सवालों का कोई उत्तर नहीं था, क्या सिस्टम ने मनगढ़ंत उत्तर बनाने के बजाय यह कहा कि उत्तर नहीं मिला?
सावधानी के साथ LLM-as-a-judge
- 1
एक साफ़ रूब्रिक (rubric) लिखें
"1 से 10 तक रेटिंग दें" के मुकाबले सीधे और सटीक हाँ-या-ना वाले सवाल बेहतर काम करते हैं। - 2
जज को सबूत दें
सवाल, सोर्सेस और उत्तर, और जहाँ मौजूद हो वहाँ रेफरेंस उत्तर भी दें। - 3
इंसानों से जज की तुलना करें
इंसानों से भी कुछ सैम्पल लेबल करवाएँ, और दोनों की सहमति को मापें, उदाहरण के लिए Cohen's kappa के ज़रिए। - 4
इंसानों की निगरानी बनाए रखें
जहाँ असहमति हो उन्हें और हर रन से कुछ रैंडम सैम्पल को खुद चेक करें। - 5
जज का सेटअप तय रखें
रन के बीच जज के prompt और मॉडल को न बदलें, ताकि स्कोर्स की तुलना की जा सके।
और देखें और पढ़ें
लैब
एक 20-सवालों का golden set और एक स्क्रिप्ट जो किसी सर्च सिस्टम को hit@k, recall@k और MRR पर स्कोर करती है।
समस्या
पाठ में दिए गए मेट्रिक कोड (Python 3, standard library) का इस्तेमाल करें। डॉक्यूमेंट्स का एक छोटा सेट चुनें जिसे आप इस्तेमाल कर सकें, जैसे आपके अपने नोट्स या कोई पब्लिक FAQ पेज जिसके आप खुद chunks बनाएँ, या फिर hybrid search वाली लैब के डॉक्यूमेंट्स का दोबारा इस्तेमाल करें।
- काम के chunk ids और एक लाइन के रेफरेंस उत्तर के साथ 20 golden questions लिखें। इसमें कम से कम 3 बिना उत्तर वाले सवाल, 3 किसी भारतीय भाषा या रोमन लिपि वाले, और 2 कोड्स या नामों वाले सवाल शामिल करें।
- पिछली लैब से अपनी सर्च चलाएँ (या ईमानदारी से, खुद हाथों से रैंक तय करें) और हर सवाल के लिए टॉप 5 नतीजे रिकॉर्ड करें।
- कुल मिलाकर, और हर टैग के हिसाब से hit@5, recall@5 और MRR का हिसाब लगाएँ।
- सबसे खराब प्रदर्शन वाले तीन सवाल चुनें। हर एक के लिए बताएं कि नाकामी extraction, chunking, search या खुद सवाल में कहाँ हुई है।
- 5 लाइनों का एक ऐसा रूब्रिक लिखें जिसे कोई LLM जज faithfulness जाँचने के लिए इस्तेमाल कर सके।
आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1Recall@k और MRR में बिना उत्तर वाले सवालों को कैसे हैंडल किया जाना चाहिए, और क्यों?दिखाएं
उनमें कोई relevant chunks नहीं होते, इसलिए उनके लिए recall और reciprocal rank तय नहीं होते (recall में ज़ीरो से भाग हो जाएगा)। उन्हें retrieval metrics से बाहर ही रखें और answer level पर उन्हें अलग से मापें: क्या सिस्टम ने सही तरीके से "not found" कहा? उन्हें इसमें मिलाने से, उदाहरण के लिए उन्हें ज़ीरो मान लेने से, retrieval स्कोर बेवजह कम हो जाएँगे और वह असली व्यवहार छिप जाएगा जो आपके लिए मायने रखता है।
Q2एक नया re-ranker आपके 40 सवालों वाले golden set पर MRR को 0.61 से बढ़ाकर 0.64 कर देता है। क्या आपको इसे शिप करना चाहिए?दिखाएं
सिर्फ उस अकेले नंबर के दम पर नहीं। 40 सवालों पर, थोड़ा सा बदलाव सिर्फ कुछ सवालों के इधर-उधर होने से आ सकता है, जो कि महज़ noise हो सकता है। देखें कि कौन से सवाल बदले और क्यों, किसी भी ऐसे ग्रुप के per-tag स्कोर देखें जो पहले से खराब हुआ हो, latency और cost चेक करें, और अगर मुमकिन हो तो और ज़्यादा सवालों या किसी held-out set पर टेस्ट करें। अगर फायदा लगातार बना रहता है, कोई ज़रूरी ग्रुप खराब नहीं होता है, और अतिरिक्त latency स्वीकार्य है, तो इसे शिप करें।
अक्सर पूछे जाने वाले सवाल
मुझे कितने golden questions की ज़रूरत है?
यहाँ तक कि 30 से 50 अच्छे और अलग-अलग तरह के सवाल भी कई समस्याओं को पकड़ लेते हैं और कुछ न होने से कहीं बेहतर हैं। समय के साथ असली नाकामियों से इस सेट को बड़ा करते जाएँ। दो करीबी विकल्पों की सही से तुलना करने के लिए, आपको और ज़्यादा सवालों की ज़रूरत होगी, और आपको यह देखना चाहिए कि स्कोर्स में कितना उतार-चढ़ाव आ रहा है।
क्या मुझे पहले retrieval मापना चाहिए या उत्तर?
पहले retrieval। यह सस्ता है और ज़्यादा निष्पक्ष (objective) है, और अगर सही chunk ही नहीं मिला, तो उत्तर उस पर आधारित हो ही नहीं सकता। उसके बाद ही उत्तरों को मापें।
क्या कोई मॉडल मेरे golden questions लिख सकता है?
यह आपके डॉक्यूमेंट्स से सवाल ड्राफ्ट करने में मदद कर सकता है, लेकिन मॉडल द्वारा लिखे गए सवाल अक्सर डॉक्यूमेंट के टेक्स्ट से बहुत ज़्यादा मिलते-जुलते होते हैं और असली सवालों के मुकाबले आसान होते हैं। इसमें असली यूज़र्स के सवाल मिलाएँ और किसी इंसान से हर सवाल को रिव्यू करवाएँ।
क्या RAG के मूल्यांकन के लिए बने-बनाए टूल्स मौजूद हैं?
हाँ, कई ओपन-सोर्स लाइब्रेरीज़ इन मेट्रिक्स का हिसाब लगाती हैं और जज प्रॉम्प्ट्स चलाती हैं। वे समय बचा सकती हैं। यह समझें कि हर मेट्रिक असल में क्या मापता है, इंसानों के लेबल्स से उसकी जाँच करें, और याद रखें कि टूल्स और उनकी डिफ़ॉल्ट सेटिंग्स बदलती रहती हैं।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।