مقاييس الاسترجاع
درس 8 من 10
8مقاييس الاسترجاع
الصورة الكبيرةنظام RAG له مرحلتان تفشلان لأسباب مختلفة: الاسترجاع قد لا يجد المستند الصحيح، والتوليد قد يتجاهله أو يخترع فوقه. قِس كلًّا منهما وحده. مقاييس الاسترجاع (الاستدعاء والدقة وMRR) تخبرك أين المشكلة قبل أن تلوم النموذج، ومقياس الأمانة يخبرك هل التزم النموذج بما وجده.
ماذا تشاهد في الرسم: الهجين رفع الاستدعاء عند 3 من 0.70 إلى 1.00 وMRR من 0.67 إلى 0.90. لكن انظر خلف المتوسط: في السؤال الخامس نزل الصحيح من المرتبة الأولى إلى الثانية، ولهذا تقرأ الأسئلة التي ساءت مع كل مقارنة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
لكي تعرف هل البحث جيد، تسأل ثلاثة أسئلة: هل أحضر المقطع الصحيح أصلًا؟ كم من الذي أحضره مفيد؟ وكم كان ترتيب الصحيح متقدمًا؟ ثم السؤال الأهم: هل الجواب الأخير مبني على المصدر فعلًا، أم أن النموذج أضاف من عنده؟
Recall@k نسبة الأسئلة التي ظهر مصدرها في أول k، وPrecision@k نسبة المفيد بينها، وMRR متوسط مقلوب رتبة أول نتيجة صحيحة. وأمانة الإجابة faithfulness تقيس هل كل ادعاء في الجواب مدعوم بالمقاطع المسترجعة.
قبل أن تبدأ
📏المقاييس
تعرف الدقة والاستدعاء في التصنيف، وهنا نفس الفكرتين على قائمة نتائج مرتّبة.
📐التقييم أولًا
عندك مجموعة ذهبية، وكل ما تضيفه الآن هو المستندات الصحيحة لكل سؤال.
الفكرة الجوهرية
نظام RAG له مرحلتان تفشلان لأسباب مختلفة. تقيس في هذا الدرس كل مرحلة وحدها: الاستدعاء والدقة وRR لسؤال واحد، ثم MRR لمقارنة نظامين، ثم أمانة الإجابة.
1مرحلتان، ورقم لكل منهما
الاسترجاع قد لا يجد المستند الصحيح، والتوليد قد يتجاهله أو يخترع فوقه. إن قست الإجابة النهائية وحدها لن تعرف أيهما أخطأ.
انظر إلى الرسم: ثلاثة أرقام تقيسها بهذا الترتيب، ولا تنتقل إلى التالي حتى يصلح السابق.
2الاستدعاء والدقة وRR
الاستدعاء عند k: كم من المستندات الصحيحة ظهر في أول k. الدقة عند k: كم من أول k صحيح. وRR يساوي 1 / مرتبة أول نتيجة صحيحة.
انظر إلى الرسم: للسؤال مستندان صحيحان، والنظام أعاد خمسة بالترتيب، والصحيحان في المرتبتين 2 و4.
def recall_at_k(retrieved, relevant, k):
return len(set(retrieved[:k]) & relevant) / len(relevant)
def precision_at_k(retrieved, relevant, k):
return len(set(retrieved[:k]) & relevant) / k
def reciprocal_rank(retrieved, relevant):
for rank, doc in enumerate(retrieved, start=1):
if doc in relevant:
return 1 / rank
return 0.0
retrieved = ["d7", "d2", "d9", "d4", "d1"]
relevant = {"d2", "d4"}
print("recall@3: ", round(recall_at_k(retrieved, relevant, 3), 2))
print("recall@5: ", round(recall_at_k(retrieved, relevant, 5), 2))
print("precision@3:", round(precision_at_k(retrieved, relevant, 3), 2))
print("RR: ", reciprocal_rank(retrieved, relevant))
مستندان صحيحان من خمسة مسترجعة. في أول 3 نتائج وجدنا واحدًا من الاثنين: استدعاء 0.5. وفي أول 5 وجدنا الاثنين: استدعاء 1.0. والدقة في أول 3 هي 0.33 لأن واحدًا فقط من الثلاثة صحيح. وأول نتيجة صحيحة في المرتبة الثانية، فـRR تساوي 1/2.
3MRR ومقارنة نظامين
MRR متوسط RR عبر كل الأسئلة. يكافئ وضع الصحيح في الأعلى، ويهمّ حين ترسل للنموذج قطعة أو اثنتين فقط.
خمسة أسئلة، ونتائج نظامين لكل منها. نحسب متوسط الاستدعاء عند 3 وMRR.
golden = {"q1": {"d1"}, "q2": {"d4", "d5"}, "q3": {"d9"}, "q4": {"d2"}, "q5": {"d7"}}
runs = {
"vector": {"q1": ["d1", "d3", "d2"], "q2": ["d5", "d8", "d6"], "q3": ["d2", "d6", "d9"],
"q4": ["d3", "d1", "d8"], "q5": ["d7", "d5", "d1"]},
"hybrid": {"q1": ["d1", "d2", "d3"], "q2": ["d4", "d5", "d8"], "q3": ["d9", "d2", "d6"],
"q4": ["d2", "d3", "d1"], "q5": ["d5", "d7", "d1"]},
}
def rr(ranked, rel):
return next((1 / i for i, d in enumerate(ranked, 1) if d in rel), 0.0)
for name, run in runs.items():
recall = sum(len(set(run[q][:3]) & rel) / len(rel) for q, rel in golden.items()) / len(golden)
mrr = sum(rr(run[q], rel) for q, rel in golden.items()) / len(golden)
print(f"{name:7} recall@3 = {recall:.2f} MRR = {mrr:.2f}")
الهجين رفع الاستدعاء من 0.70 إلى 1.00 وMRR من 0.67 إلى 0.90. لاحظ السؤال الخامس: الهجين وضع الصحيح ثانيًا بدل أول، فخسر قليلًا في MRR هناك وربح في غيره. لهذا تنظر إلى المتوسط وإلى الأسئلة التي ساءت معًا، لا إلى المتوسط وحده.
4الأمانة
إجابة صحيحة بلا مصدر ما زالت مشكلة: النموذج خمّنها. الأمانة نسبة جمل الإجابة المدعومة بالمستندات المسترجعة.
انظر إلى الرسم: إجابة من ثلاث جمل، وكم من كلمات كل جملة موجود في المصدر.
لكل جملة في الإجابة، كم من كلماتها موجود في المصدر؟ فحص تقريبي، لكنه يلتقط الاختراع الصريح دون أي نموذج.
import re
source = ("يحق للموظف إجازة سنوية مدتها واحد وعشرون يوم عمل. "
"تقدم الطلبات قبل أسبوعين. يمكن ترحيل عشرة أيام إلى السنة التالية.")
answer = ("لك واحد وعشرون يوم عمل إجازة سنوية. "
"ويمكنك ترحيل عشرة أيام إلى السنة التالية. "
"ويمكنك صرف رصيد الإجازة نقدا عند الاستقالة.")
def words(t):
return set(re.findall(r"[ء-ي]+", t))
src_words = words(source)
for sentence in filter(None, (s.strip() for s in answer.split("."))):
w = words(sentence)
support = len(w & src_words) / len(w)
verdict = "supported" if support >= 0.6 else "NOT IN THE SOURCE"
print(f"{support:.0%} {verdict:17} {sentence}")
الجملتان الأوليان مدعومتان، والثالثة عن صرف الرصيد نقدًا لا أصل لها في المصدر: اخترعها النموذج. قد تكون صحيحة في الواقع، لكن النظام لا يستطيع إثباتها، وهذا يكفي لاعتبارها مشكلة. في الإنتاج يحلّ محلّ هذا الفحص حَكَم لغوي يسأل لكل جملة «هل يدعمها النص؟»، ويُعاير كما في درس التقييم أولًا.
كيف يعمل، خطوة بخطوة: كيف تحدّد أين يفشل نظام RAG
تكتب لكل سؤال ذهبي المستندات أو القطع التي تحتوي إجابته.
تقيس الاستدعاء عند k حيث k ما ترسله فعلًا؛ إن كان تحت 0.8 تقريبًا فأصلح الاسترجاع أولًا.
حين يصير الاستدعاء جيدًا، تقيس الأمانة: هل لكل جملة في الإجابة مصدر في المستندات؟
أخيرًا تقيس صحة الإجابة، وتسجّل الأرقام الأربعة والأسئلة التي ساءت في جدول التجارب.
مثال محلول
لكل سؤال ذهبي، اكتب أي المستندات (أو القطع) تحتوي إجابته. هذا كل ما تحتاجه لحساب مقاييس الاسترجاع، دون أي نموذج لغوي.
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| الإجابة النهائية وحدها تكفي لتقييم النظام. | إن كانت خاطئة فلن تعرف هل فشل الاسترجاع أم النموذج، فتغيّر النموذج والمستند الصحيح لم يدخل السياق أصلًا. |
| الإجابة الصحيحة مقبولة حتى لو لم يدعمها مستند. | النموذج أجاب من معرفته، وقد يجيب بنفس الثقة حين تكون معرفته قديمة أو خاطئة. هذه إجابة غير أمينة. |
| استدعاء عالٍ عند 20 يعني نظامًا جيدًا. | ما يهمّ هو k الذي ترسله فعلًا. إن أرسلت قطعة واحدة فالمهمّ MRR أو الاستدعاء عند 1. |
جرّب بنفسك
تأخذ قطعة واحدة فقط للسياق. أي مقياس يهمّك أكثر؟
إن لم يكن الصحيح أولًا، فلن يراه النموذج أبدًا. الاستدعاء عند 20 قد يكون ممتازًا ونظامك فاشل.
إجابة صحيحة في الواقع، لكن لا شيء في المستندات المسترجعة يدعمها. ما تقييمها؟
نظام RAG وعده أنه يجيب من مستنداتك. إجابة بلا أصل تعني أنه قد يجيب بنفس الثقة حين تكون معرفته قديمة أو خاطئة.
بطاقات مراجعة سريعة
1 / مرتبة أول نتيجة صحيحة عبر الأسئلة. يكافئ وضع الصحيح في الأعلى، ومهم حين تأخذ نتائج قليلة.تحقق من فهمك
الاستدعاء عند 5 يساوي 0.95، لكن الإجابات خاطئة في 30% من الحالات. أين تبحث؟
في التوليد لا الاسترجاع: المستند الصحيح موجود في السياق غالبًا، والنموذج لا يستخدمه جيدًا. افحص الأمانة، وترتيب القطع، وتعليمات القالب، وهل الدقة منخفضة فيغرق الصحيح بين قطع مضلّلة. وتأكّد أنك ترسل فعلًا 5 قطع لا 3.
في فحص الأمانة البسيط، لماذا قد تُرفض جملة «صرف رصيد الإجازة نقدًا» حتى لو كانت صحيحة في الواقع؟
لأن الأمانة تقيس الدعم من المستندات المسترجعة لا الصحة في العالم. لم يكن لها مصدر (0%)، فالنظام لا يستطيع إثباتها، وهذا يكفي لعدّها مشكلة.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
توثيق رسمي2
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.