انتقل إلى المحتوى الرئيسي

الوحدة 8 — التقييم: الأمانة والملاءمة والتغطية

الوحدات السابقة بنت نظامًا: استخراج، تقطيع، تضمينات، بحث هجين، إعادة ترتيب، تعليمة نهائية. الآن السؤال المُقلق: هل يعمل فعلًا؟. الجواب لا يأتي من الانطباع بعد ثلاثة أسئلة تجريبية، بل من تقييم منتظم يُتيح مقارنة إصدارين ورؤية الأثر الحقيقي لكلّ قرار.

ماذا نقيس بالضبط؟

خطأ الشائع: قياس «هل الإجابة صحيحة؟» ككتلة واحدة. النظام له مرحلتان مستقلّتان، ولكلّ منهما إخفاقاتها:

  • الاسترجاع: هل جاء المقطع الصحيح ضمن الأوّل الخمسة؟
  • التوليد: بمعطى المقاطع الجيّدة، هل استعملها النموذج جيّدًا؟

فصل هذين البعدين يُتيح معرفة أين المشكلة. إجابة رديئة قد تعود إلى استرجاع فشل (المقطع ليس هناك حتّى) أو إلى نموذج توليد أخفق في استعمال مقطع كان أمامه.

مقاييس الاسترجاع

المقاييس الكلاسيكية من علم الاسترجاع:

  • Recall@k: نسبة الأسئلة التي يظهر مقطعها الصحيح ضمن أوّل kk نتائج. يقيس التغطية.
  • Precision@k: نسبة المقاطع في أوّل kk التي هي فعلًا صحيحة. يقيس الدقّة.
  • MRR (Mean Reciprocal Rank): متوسّط 1/rank1 / \text{rank} للمقطع الأوّل الصحيح. يقيس مدى تقدّمه في الترتيب.
MRR=1QqQ1rank(q)\text{MRR} = \frac{1}{|Q|} \sum_{q \in Q} \frac{1}{\text{rank}(q)}

المقاييس مكمِّلة. Recall@10 مرتفع لكنّه Precision@3 منخفض يعني «المقاطع الصحيحة موجودة، لكنّها ليست في القمّة»: علاجه إعادة الترتيب (الوحدة 6). Recall@10 منخفض يعني «المقاطع الصحيحة ليست ضمن العشرة»: علاجه تحسين الاسترجاع نفسه (تغيير نموذج التضمين، تحسين التقطيع، إضافة BM25).

مقاييس التوليد: الأمانة والملاءمة

للتوليد ثلاثة أبعاد ينبغي قياسها بشكل مستقلّ:

الأمانة (Faithfulness): هل كلّ جملة في الإجابة مدعومة بمقطع من السياق؟ درجة الإجابة تُحسَب بالنسبة بين الجمل المدعومة والجمل الكلّية.

الملاءمة للسؤال (Relevance): هل الإجابة تُخاطب فعلًا ما سُئل عنه، أم تنحرف إلى موضوع مشابه؟

التغطية (Coverage): هل الإجابة تعطي كلّ المعلومات المطلوبة، أم تُهمل جانبًا؟

هذه الأبعاد الثلاثة مستقلّة: إجابة قد تكون أمينة (تنقل حرفيًّا من المقطع) لكن غير ملائمة (المقطع ليس عن السؤال أصلًا)، أو ملائمة لكن غير كاملة (نصف الإجابة فقط).

مجموعة الأسئلة الموصوفة

الاستثمار الحاسم في مشروع RAG جدّي: بناء مجموعة من 100 – 200 سؤال يعرف الفريق جوابها الصحيح، ومقطعها المصدر.

بنية الملفّ:

- question: "ما مدّة إشعار الاستقالة للفئة أ؟"
expected_answer: "شهر واحد."
ground_truth_chunks:
- source: "reglement-interieur.pdf"
page: 12
category: "موارد بشرية"

- question: "من المسؤول عن اعتماد المصاريف فوق 5000 دينار؟"
expected_answer: "المدير المالي."
ground_truth_chunks:
- source: "procedure-comptable.pdf"
page: 3
category: "مالية"

هذه المجموعة تُبنى مرّة (بضعة أيّام عمل)، ثم تُعاد عند كلّ تعديل جوهري في النظام. القيمة الحقيقية: رقم واحد يقول هل المشروع تحسّن أم تراجع بعد كلّ تغيير.

النموذج الحَكَم

قياس الأمانة والملاءمة يدويًّا مكلف. الحلّ الشائع: استعمال نموذج لغوي كحَكَم يُحلّل الإجابة والسياق ويعطي درجة.

JUDGE_PROMPT = """أنت مقيّم لجودة إجابات مساعد مستندي.
لديك: السؤال، الإجابة، المقاطع المستعملة.

قيّم على ثلاثة أبعاد، درجة من 1 إلى 5 لكلّ منها:
- الأمانة: هل كلّ ادّعاء في الإجابة مدعوم بمقطع؟
- الملاءمة: هل الإجابة تُخاطب السؤال فعلًا؟
- التغطية: هل الإجابة كاملة قياسًا بالمقاطع المتاحة؟

أعد نتيجة بصيغة JSON بهذا الشكل بالضبط:
{{"faithfulness": 4, "relevance": 5, "coverage": 3, "reasoning": "..."}}

السؤال: {question}
الإجابة: {answer}
المقاطع:
{context}"""

import json

def judge(question, answer, context):
response = llm.invoke(JUDGE_PROMPT.format(
question=question, answer=answer, context=context,
)).content
return json.loads(response)

النموذج الحَكَم ليس مثاليًّا، لكنّه يُتيح تقييم مئات الأسئلة في دقائق ويكشف الانحدارات الجسيمة. للثقة، صادق نتائجه على عيّنة يدويًّا مرّة كلّ فترة.

الاحتياطات: استعمل نموذجًا مختلفًا عن نموذج التوليد (وإلّا يُقيّم نفسه)، ولا تفسِّر الفروق دون العُشر بجدّية لأنّ ضجيج التقييم يبلغها.

RAGAS في لمحة

RAGAS مكتبة مفتوحة تُنَظِّم هذا التقييم. تعطي أربعة مقاييس مضبوطة:

  • faithfulness: نسبة ادّعاءات الإجابة المدعومة بالسياق.
  • answer_relevancy: التشابه بين السؤال وسؤال مُعاد توليده انطلاقًا من الإجابة.
  • context_precision: هل المقاطع المسترجَعة مفيدة فعلًا للإجابة؟
  • context_recall: هل السياق يحوي كلّ ما يحتاجه الجواب المرجعي؟
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision, context_recall
from datasets import Dataset

data = {
"question": [q.question for q in test_set],
"answer": [a.text for a in system_answers],
"contexts": [[c.text for c in a.contexts] for a in system_answers],
"ground_truth": [q.expected_answer for q in test_set],
}
ds = Dataset.from_dict(data)

results = evaluate(
ds,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
)
print(results)

فائدة RAGAS: مقاييس مُوحَّدة يشترك فيها فرق كثيرة، فتُتيح مقارنة النتائج. حدّها: القيم مطلقة عادةً منخفضة (0.6 – 0.8 نتائج شائعة على مشاريع جدّية)، وينبغي عدم تفسيرها كنسب دقّة صريحة.

المصفوفة الحاكمة: أين المشكلة؟

عند تقييم نظام كامل، هذه المصفوفة تُتيح تشخيص العطب:

Recall@5Faithfulnessالتفسيرالعلاج
منخفضلا يُهمّاسترجاع فاشلتحسين التضمين، إضافة BM25، مراجعة التقطيع
مرتفعمنخفضالنموذج يهلوس رغم توفّر المقاطعتشديد تعليمة الامتناع، تحقّق الاستشهاد
مرتفعمرتفع لكن غير ملائماسترجاع صحيح، توليد ينحرفإعادة صياغة التعليمة، اختيار نموذج أذكى
منخفضمرتفعالنموذج يعترف بالجهلتحسين الاسترجاع، لا حاجة لتغيير النموذج

هذه الشجرة الذهنية تُتيح تحديد المشكلة قبل تغيير الحلّ، وتوفّر أسبوعًا من التخبّط في كلّ تكرار.

تقييم على 5 أسئلة ليس تقييمًا

الإغراء دائمًا: «جرّبت السؤالين، يعمل، إذن التعديل صحيح». على مجموعة صغيرة يهيمن ضجيج المُصادفة على الأثر الحقيقي. حدّ أدنى معقول: 50 سؤالًا، مثاليًّا 200 مع تنويع في الفئات (موارد بشرية، مالية، إجراءات جودة). أقلّ من ذلك، القرارات تُبنى على الوهم.

قِس قبل أن تُحسِّن، وقِس بعده

اجعل نتيجة كلّ تعديل مطبوعة في ملفّ سجلّ مع التاريخ والوصف. بعد شهرين ستكتشف أنّ ثلاث «تحسينات» ادّعت تقدّمًا مبنيًّا على انطباع، وثلاثة تعديلات هي التي تحسِّن حقًّا. لا تتقدّم مشاريع RAG بدون هذا السجلّ.

في الخلاصة

  • افصل تقييم الاسترجاع عن تقييم التوليد؛ الخلط بينهما يخفي مصدر الخطأ الحقيقي.
  • المقاييس الأساسية: Recall@k، Precision@k، MRR للاسترجاع؛ الأمانة، الملاءمة، التغطية للتوليد.
  • مجموعة الأسئلة الموصوفة استثمار حاسم؛ خمسون سؤالًا حدّ أدنى معقول، ومئتان مثالي.
  • النموذج الحَكَم وRAGAS يجعلان التقييم قابلًا للتشغيل تلقائيًّا؛ مصفوفة (Recall × Faithfulness) تُشخِّص أين العطب بالضبط.

الوحدة التالية: التخزين المؤقّت والتحكّم في الكلفة، أي كيف نجعل هذا النظام مستدامًا اقتصاديًّا عند توسّعه إلى آلاف الاستفسارات اليومية.