पाठ 19 / 27

Retrieval Metrics: Recall@k और MRR

Score करें कि सही chunks मिलते हैं और कितने ऊपर rank होते हैं।

पहले golden set बनाएँ

50 से 200 असली सवालों का golden set बनाएँ, हर एक के साथ वे chunk(s) या दस्तावेज़ जिनमें उत्तर है। फिर Recall@k (शीर्ष k में मिले प्रासंगिक chunks का अंश), Precision@k, MRR (mean reciprocal rank: पहले प्रासंगिक परिणाम की rank से 1 भाग देने का औसत) और श्रेणीबद्ध प्रासंगिकता के लिए nDCG निकालें। RAG के लिए Recall@k मुख्य संख्या है, क्योंकि generator वह प्रमाण उपयोग नहीं कर सकता जो उसे मिला ही नहीं। Chunking, embeddings, filters या rerankers के हर बदलाव के बाद set दोबारा चलाएँ।

हर चरण को मापें

Retrieval और generation अलग तरह से विफल होते हैं, इसलिए अलग से score करें।

तीन दृश्य: retrieval, उत्तर, विफलताएँ।
चित्र 6.1 — Retrieval, उत्तर और विफलताएँ।

Recall@k और MRR, चलाकर

मैंने यह सादा-Python (सिर्फ़ standard library) उदाहरण चलाया। तीन सवालों में सही chunk किसी में भी पहला नहीं (recall@1 = 0), प्रासंगिक chunks के आधे शीर्ष 3 में मिले (recall@3 = 0.5), और MRR 0.278 है।

def recall_at_k(retrieved, relevant, k):
    return len(set(retrieved[:k]) & set(relevant)) / len(relevant)

def mrr(retrieved, relevant):
    for i, d in enumerate(retrieved, start=1):
        if d in relevant:
            return 1 / i
    return 0.0

cases = [
    (["d3", "d1", "d9"], ["d1"]),
    (["d2", "d4", "d5"], ["d5", "d7"]),
    (["d8", "d6", "d0"], ["d1"]),
]
for k in (1, 3):
    r = sum(recall_at_k(ret, rel, k) for ret, rel in cases) / len(cases)
    print("recall@%d" % k, round(r, 3))
print("MRR", round(sum(mrr(ret, rel) for ret, rel in cases) / len(cases), 3))

Output:

recall@1 0.0
recall@3 0.5
MRR 0.278

त्वरित जाँच: RAG के लिए Recall@k इतना अहम क्यों है?

  • यह उत्तरों से असंबंधित है
  • यह font गुणवत्ता मापता है
  • यह LLM को बदलता है
  • Generator वह प्रमाण उपयोग नहीं कर सकता जो retrieve ही नहीं हुआ
Answer

Generator वह प्रमाण उपयोग नहीं कर सकता जो retrieve ही नहीं हुआ — छूटा प्रमाण किसी भी उत्तर की गुणवत्ता की सीमा तय करता है।