التقييم أولًا
درس 3 من 10
3التقييم أولًا
الصورة الكبيرةقبل أن تغيّر أي شيء في نظامك، النموذج أو القالب أو التقطيع، تحتاج رقمًا تقارن به. خمسون سؤالًا حقيقيًّا مع إجاباتها الصحيحة، تشغّلها قبل كل تغيير وبعده. بدون هذا، كل «تحسين» مجرّد شعور، وكثير من التحسينات بالشعور تجعل النظام أسوأ.
ماذا تشاهد في الرسم: في المركز مجموعة ذهبية لا تتغيّر، وحولها دورة لا تنتهي: تغيير واحد، ثم تشغيل، ثم رقم، ثم مقارنة. ثبات الأسئلة هو ما يجعل الرقمين قابلين للمقارنة، ولهذا لا تحذف سؤالًا لأن نظامك فشل فيه.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
قبل أن تحسّن طبخة، تحتاج من يتذوقها بنفس الطريقة في كل مرة، وإلا لن تعرف هل أصبحت أطيب أم أنك تتخيّل. التقييم أولًا أن تكتب خمسين سؤالًا تعرف أجوبتها الصحيحة قبل أي تعديل، ثم تقيس كل نسخة جديدة عليها.
مجموعة ذهبية golden set بأسئلة وإجابات مرجعية وحالات صعبة، ثم تقييم آلي بنموذج حَكَم LLM-as-judge بمعايير مكتوبة، أو مقارنة زوجية بين نسختين. تعاير الحَكَم على عينة يقيّمها إنسان، وتسجّل الرقم قبل وبعد كل تغيير.
قبل أن تبدأ
📏المقاييس
تعرف أن رقمًا واحدًا على بيانات ثابتة هو ما يحكم بين نموذجين، لا الانطباع.
🪟هندسة السياق
رأيت أن تغييرات القالب والترتيب «تُقاس على المجموعة الذهبية»، وهذا الدرس يبني تلك المجموعة.
الفكرة الجوهرية
قبل أن تغيّر شيئًا في نظامك تحتاج رقمًا تقارن به. تبني في هذا الدرس مجموعة ذهبية، ثم تعرف من أين تأتي أسئلتها، ثم تعاير نموذجًا حَكَمًا، ثم تكشف تحيّزه في المقارنة الزوجية.
1المجموعة الذهبية
المجموعة الذهبية أسئلة حقيقية مع ما يجب أن تحتويه إجاباتها الصحيحة، ثابتة لا تتغيّر بين التجارب. أبسط مقياس لها: هل الإجابة تحتوي العبارات المطلوبة؟
انظر إلى الرسم: نسختان من النظام على نفس الأسئلة الخمسة، وكل نسخة صار لها رقم.
golden = [
{"q": "How many annual leave days?", "must": ["21"]},
{"q": "Who approves sick leave?", "must": ["manager"]},
{"q": "Can leave be carried over?", "must": ["10 days", "next year"]},
{"q": "Notice period for annual leave?", "must": ["two weeks"]},
{"q": "What is the parking fee?", "must": ["not covered"]},
]
v1 = ["You get 21 days.", "HR approves it.", "Yes, up to 10 days into next year.",
"Two weeks notice.", "The fee is 50 riyals."]
v2 = ["21 working days.", "Your direct manager.", "Up to 10 days, used by March next year.",
"At least two weeks before.", "Parking is not covered by these documents."]
def score(answers):
hits = [all(m.lower() in a.lower() for m in g["must"]) for g, a in zip(golden, answers)]
return sum(hits), hits
for name, answers in [("v1", v1), ("v2", v2)]:
n, hits = score(answers)
print(f"{name}: {n}/{len(golden)} {['ok' if h else 'FAIL' for h in hits]}")
النسخة الأولى أخطأت في من يوافق على الإجازة المرضية، واخترعت رسوم مواقف غير موجودة. الثانية نجحت في الخمسة. السؤال الخامس مهم: سؤال خارج نطاق المستندات، والإجابة الصحيحة «لا يوجد». كل مجموعة ذهبية تحتاج أسئلة كهذه، وإلا كافأت نظامًا يخترع.
2من أين تأتي الأسئلة
المجموعة الجيدة فيها أسئلة من داخل المستندات وأسئلة من خارجها. انظر إلى الرسم: من خمسين سؤالًا، عشرة خارج المستندات، وإجابتها الصحيحة أن المعلومة غير موجودة.
من المستخدمين الحقيقيين لا من خيالك. اجمع أسئلة من البريد أو التذاكر أو جلسة مع خمسة أشخاص، واكتب الإجابة الصحيحة لكل منها مع صاحب المعرفة. خمسون سؤالًا متنوّعًا أفضل من خمسمئة متشابهة.
3نموذج يقوم بدور الحَكَم
المطابقة النصية تكفي للحقائق القصيرة، ولا تكفي حين تُصاغ الإجابة الصحيحة بطرق كثيرة. هنا يقيّم نموذج لغوي الإجابة وفق معيار مكتوب من أسئلة نعم أو لا.
لكن الحَكَم يحتاج معايرة. انظر إلى الرسم: عشرون إجابة قيّمها إنسان وقيّمها الحَكَم، فاتّفقا في 17 واختلفا في 3.
عشرون إجابة حكم عليها إنسان (1 جيدة، 0 سيئة) وحكم عليها النموذج.
from sklearn.metrics import cohen_kappa_score
human = [1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0]
judge = [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1]
agree = sum(h == j for h, j in zip(human, judge)) / len(human)
print(f"raw agreement: {agree:.0%}")
print(f"Cohen's kappa: {cohen_kappa_score(human, judge):.2f}")
fp = sum(1 for h, j in zip(human, judge) if j == 1 and h == 0)
print("judge said 'good' where the human said 'bad':", fp, "times")
85% اتفاق يبدو ممتازًا، لكن كابا 0.67 أدق لأنها تطرح الاتفاق الذي يحدث بالصدفة. والأهم: الأخطاء الثلاثة كلها في اتجاه واحد، الحَكَم قال «جيدة» لإجابات سيئة. حَكَم متساهل يجعلك تظن أن نظامك أفضل مما هو. اقرأ هذه الحالات الثلاث بنفسك، وعدّل المعيار ليلتقطها.
عايِر الحَكَم على 30 إلى 50 إجابة قيّمتها بنفسك قبل أن تثق به. كابا فوق 0.6 تقريبًا بداية جيدة، والأهم أن تعرف أين يخطئ.
4المقارنة الزوجية وتحيّز الموضع
بدل «قيّم من 1 إلى 10»، اسأل الحَكَم: أي الإجابتين أفضل؟ هذا أكثر ثباتًا، لكن الحَكَم يميل إلى الإجابة المعروضة أولًا حين تتقارب الاثنتان.
انظر إلى الرسم: الجودة عشوائية للطرفين، فالمتوقّع أن يفوز A نحو 100 مرة من 200. لكنه يفوز 139 مرة حين يُعرض أولًا دائمًا.
حَكَم يختار الأفضل حين يكون الفرق واضحًا، ويميل للإجابة الأولى حين تتقارب الإجابتان. هذا تحيّز موثّق في النماذج الحقيقية.
import random
random.seed(3)
def biased_judge(first, second):
"""Prefers the better answer, but also prefers whatever is shown first."""
if abs(first["quality"] - second["quality"]) < 0.15:
return "first" if random.random() < 0.75 else "second"
return "first" if first["quality"] > second["quality"] else "second"
pairs = [({"name": "A", "quality": random.uniform(0.4, 0.9)},
{"name": "B", "quality": random.uniform(0.4, 0.9)}) for _ in range(200)]
one_order = sum(biased_judge(a, b) == "first" for a, b in pairs)
consistent = ties = 0
for a, b in pairs:
r1 = biased_judge(a, b) == "first" # did A win when shown first?
r2 = biased_judge(b, a) == "second" # did A win when shown second?
if r1 == r2:
consistent += 1
else:
ties += 1
print("A wins when always shown first:", one_order, "of 200")
print("verdicts that survive swapping the order:", consistent)
print("verdicts that flip with the order (count as ties):", ties)
الجودة عشوائية للطرفين، فالمتوقّع أن يفوز A في نحو نصف الحالات. لكن حين يُعرض أولًا دائمًا يفوز 139 مرة من 200. حين نحكم مرتين بترتيبين، 72 حكمًا انقلب مع الترتيب، وهذه نعدّها تعادلًا. الدرس: لا تقارن نسختين بعرض الجديدة أولًا دائمًا، ستجدها «أفضل» دائمًا.
كيف يعمل، خطوة بخطوة: كيف تبني مجموعة ذهبية وتستخدمها
تجمع خمسين سؤالًا حقيقيًّا من المستخدمين، منها عشرة خارج المستندات، وتكتب الإجابة الصحيحة لكل منها مع صاحب المعرفة.
تقيّم الحقائق القصيرة بالمطابقة النصية، وما يُصاغ بطرق كثيرة بنموذج حَكَم بمعيار نعم أو لا.
تعاير الحَكَم على 30 إلى 50 إجابة قيّمتها بنفسك، وتقرأ الحالات التي اختلفتما فيها.
تشغّل كل نسخة على نفس الأسئلة، وتسجّل رقمها والأسئلة التي تغيّرت في جدول التجارب.
مثال محلول
المجموعة الذهبية (Golden set) لا تحتاج أدوات خاصة. ملف فيه سؤال وما يجب أن تحتويه الإجابة الصحيحة. نبدأ بأبسط مقياس: هل الإجابة تحتوي العبارات المطلوبة؟
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| اتفاق 85% مع البشر يعني حَكَمًا ممتازًا. | جزء من الاتفاق يحدث بالصدفة. في المثال كانت كابا 0.67، وكل الأخطاء الثلاثة في اتجاه واحد: حَكَم متساهل. |
| خمسمئة سؤال متشابه أفضل من خمسين متنوّعة. | الأسئلة المتشابهة تقيس الشيء نفسه مرات كثيرة. خمسون سؤالًا متنوّعًا من مستخدمين حقيقيين تكشف أكثر. |
| سؤال أكثر من 50 يكفي لاعتماد النسخة الجديدة. | فرق سؤال واحد قد يكون صدفة. انظر أي الأسئلة تغيّرت، وشغّل كل نسخة مرتين أو ثلاثًا قبل القرار. |
جرّب بنفسك
لماذا تحتاج المجموعة الذهبية أسئلة لا توجد إجابتها في المستندات؟
نظام يجيب عن كل شيء بثقة سيحصل على درجة كاملة في مجموعة بلا أسئلة كهذه، ثم يخترع إجابات لمستخدميك. هذا أخطر أخطاء أنظمة RAG.
كيف تكشف تحيّز الموضع عند حَكَم يقارن إجابتين؟
الحكم الذي يصمد أمام تبديل الترتيب حكم على المحتوى. الذي ينقلب حكم على الموضع.
بطاقات مراجعة سريعة
تحقق من فهمك
النسخة الجديدة حصلت على 41/50 والقديمة 40/50. هل تعتمد الجديدة؟
ليس بعد. فرق سؤال واحد قد يكون صدفة، خاصة إن كانت الإجابات تتغيّر بين تشغيلين. انظر أي الأسئلة تغيّرت: إن نجحت الجديدة في ثلاثة وفشلت في اثنين كانت تنجح فيهما، فقد تكون كسرت شيئًا. شغّل كلًّا منهما مرتين أو ثلاثًا، وقرّر بالفرق الثابت، وبالتكلفة والسرعة أيضًا.
في مثال النسختين، ما الخطأ الذي ارتكبته v1 في سؤال رسوم المواقف؟
اخترعت رسومًا قدرها 50 ريالًا لا وجود لها في المستندات. الإجابة الصحيحة «غير مغطّى»، ولهذا تحتاج المجموعة الذهبية أسئلة خارج النطاق.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.