0Pricing
AI Engineering Academy · درس

معايرة نماذج التحكيم مقارنة بالبشر

اجمع مجموعة بيانات مرجعية لأحكام التفضيلات البشرية، وقِس مدى اتفاق المُقيِّم مع البشر باستخدام Cohen's Kappa، واضبط الـprompt للمُقيِّم لتقليل التحيزات المنهجية.

معايرة نماذج التحكيم مقارنة بالبشر درس مجاني في AI Engineering Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Engineering Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

لماذا لا غنى عن المعايرة

قد يمنح مقيّم LLM غير المُعاير درجات أعلى أو أقل من البشر بصورة منهجية، أو يفضّل أسلوبًا كتابيًا معينًا، أو يفشل في الحالات الحدية التي لم يتوقعها rubric. وإذا استخدمت هذا المقيّم لاتخاذ قرارات النشر، فأنت تثق بأداة متحيزة. وتتحقق المعايرة من المقيّم بمقارنته بالحقيقة المرجعية البشرية، كما تحدد مقدار الثقة التي يمكنك منحها لدرجاته قبل الاعتماد عليها في الإنتاج.

بناء مجموعة بيانات للمعايرة

أنشئ مجموعة معايرة تضم 100 إلى 500 استجابة نموذجية جرى تقييمها من قِبل البشر. واستهدف التنوع، فأدرج استجابات عالية الجودة (الدرجة 5)، ومتوسطة الجودة (الدرجة 3)، واستجابات سيئة بوضوح (الدرجة 1). اطلب من 3 إلى 5 مقيّمين بشريين مستقلين تقييم كل مثال، لقياس اتفاق المقيّمين وحساب درجة الحقيقة المرجعية التوافقية من خلال أخذ المتوسط أو المنوال.

# Calibration dataset structure:
# [
#   {
#     'question': 'What causes inflation?',
#     'response': '...',
#     'human_scores': [4, 4, 3, 5, 4],  # 5 raters
#     'human_consensus': 4,              # mean or mode
#     'rater_ids': ['r1', 'r2', 'r3', 'r4', 'r5']
#   },
#   ...
# ]

# Typical calibration set composition:
# 30% excellent responses (score 4-5)
# 40% adequate responses (score 2-4)
# 30% poor responses (score 1-2)
# Include adversarial / edge cases

قياس اتفاق المقيّمين

قبل اعتبار الدرجات البشرية حقيقة مرجعية، تحقق من اتفاق المقيّمين البشريين فيما بينهم. يقيس Cohen's Kappa الاتفاق بين مقيّمين اثنين بما يتجاوز ما قد يحدث بالصدفة: وتُعد القيمة التي تتجاوز 0.6 مقبولة، والتي تتجاوز 0.8 ممتازة. وبالنسبة إلى المقاييس ذات الخمس نقاط، احسب kappa الموزون (بأوزان خطية). ويعني انخفاض اتفاق المقيّمين أن المهمة مصاغة بصورة ملتبسة؛ لذا حسّن إرشادات المقيّمين قبل استخدام الدرجات لمعايرة المقيّم.

from sklearn.metrics import cohen_kappa_score
import numpy as np

def measure_inter_rater_agreement(rater1_scores: list, rater2_scores: list) -> dict:
    kappa = cohen_kappa_score(rater1_scores, rater2_scores, weights='linear')
    exact_agreement = sum(a == b for a, b in zip(rater1_scores, rater2_scores)) / len(rater1_scores)
    adjacent_agreement = sum(abs(a - b) <= 1 for a, b in zip(rater1_scores, rater2_scores)) / len(rater1_scores)
    return {
        'weighted_kappa': round(kappa, 3),
        'exact_agreement': round(exact_agreement, 3),
        'adjacent_agreement': round(adjacent_agreement, 3),
        'acceptable': kappa >= 0.6
    }

تشغيل المقيّم على بيانات المعايرة

شغّل مقيّم LLM على كل مثال في مجموعة المعايرة باستخدام prompt نفسه الذي تنوي استخدامه في الإنتاج. اجمع درجة المقيّم لكل مثال إلى جانب درجة الإجماع البشري. حافظ على محاذاة القائمتين حتى تتمكن من مقارنتهما عنصرًا بعنصر. تكشف هذه المقارنة الثنائية التحيزات المنهجية والفروق في نطاق الدرجات.

async def run_judge_on_calibration(calibration_set: list) -> list:
    pairs = []
    for item in calibration_set:
        judge_result = await async_judge(item['question'], item['response'])
        pairs.append({
            'question': item['question'],
            'human': item['human_consensus'],
            'judge': judge_result.correctness,
            'judge_rationale': judge_result.rationale
        })
    return pairs

حساب الارتباط بين المقيّم والبشر

احسب ارتباط Pearson بين درجات المقيّم ودرجات الإجماع البشري. ويقيس هذا الاتفاق الخطي؛ إذ يعني الارتباط البالغ 1.0 أن المقيّم يتتبع الترتيبات البشرية بصورة مثالية. واحسب أيضًا متوسط الخطأ المطلق (MAE) لفهم متوسط الفارق بين الدرجات. ويشير الارتباط الذي يتجاوز 0.7 وMAE الأقل من 0.8 نقطة على مقياس من 5 نقاط عادةً إلى أن المقيّم موثوق بما يكفي للاستخدام في الإنتاج.

from scipy.stats import pearsonr, spearmanr
import numpy as np

def calibration_metrics(pairs: list) -> dict:
    humans = [p['human'] for p in pairs]
    judges = [p['judge'] for p in pairs]
    pearson_r, p_val = pearsonr(humans, judges)
    spearman_r, _ = spearmanr(humans, judges)
    mae = np.mean([abs(h - j) for h, j in zip(humans, judges)])
    return {
        'pearson_r': round(pearson_r, 3),
        'spearman_r': round(spearman_r, 3),
        'p_value': round(p_val, 5),
        'mae': round(mae, 3),
        'reliable': pearson_r >= 0.7 and mae <= 0.8
    }

تحديد التحيزات المنهجية

إضافةً إلى الارتباط، ابحث عن التحيزات المنهجية: هل يمنح المقيّم درجات أعلى أو أقل باستمرار؟ ارسم درجات المقيّم مقابل الدرجات البشرية، وابحث عن خط انحدار لا يمر بنقطة الأصل. فإذا منح المقيّم درجات 4 عندما يمنح البشر درجات 3 في المتوسط، فذلك يدل على تحيز تضخيمي. صحّح ذلك إما بتعديل rubric أو بتطبيق تحويل معايرة خطي على الدرجات الأولية.

import numpy as np
from scipy import stats

def detect_score_bias(pairs: list) -> dict:
    humans = np.array([p['human'] for p in pairs])
    judges = np.array([p['judge'] for p in pairs])
    slope, intercept, r, p, se = stats.linregress(judges, humans)
    bias = np.mean(judges - humans)  # positive = judge over-scores
    return {
        'mean_bias': round(bias, 3),  # > 0 means judge inflates
        'calibration_slope': round(slope, 3),
        'calibration_intercept': round(intercept, 3),
        # Corrected score = slope * judge_score + intercept
        'correction_formula': f'human_score ≈ {slope:.2f} * judge + {intercept:.2f}'
    }

تطبيق تصحيح المعايرة

بعد الحصول على انحدار المعايرة (الميل والمقطع)، طبّقه لتحويل درجات المقيّم الأولية إلى درجات مُعايرة تتوافق بصورة أفضل مع الأحكام البشرية. وهذا التصحيح الخطي بسيط وفعال. قصّ الدرجة المصححة إلى النطاق الصالح (1-5) لمنع قيم الانحدار الخارجة عن الحدود. خزّن الدرجات الأولية والمصححة معًا لإتاحة المقارنة بأثر رجعي مع نمو بيانات المعايرة.

def calibrate_score(raw_judge_score: float, slope: float, intercept: float,
                    min_score: int = 1, max_score: int = 5) -> float:
    corrected = slope * raw_judge_score + intercept
    return max(min_score, min(max_score, round(corrected, 1)))

# Example: if judge inflates by 0.5 points on average
# slope=0.85, intercept=0.3
# raw_score=4 -> corrected = 0.85*4 + 0.3 = 3.7

العثور على أنماط الخطأ المنهجية

جمّع أخطاء المعايرة حسب نوع السؤال وطول الاستجابة ومجال الموضوع للعثور على حالات الفشل المتكررة. فقد يكون المقيّم غير موثوق في أسئلة البرمجة التقنية، لكنه دقيق في الأسئلة الواقعية. وقد يمنح درجات أعلى للاستجابات الطويلة جدًا، ودرجات أقل للإجابات القصيرة والموجزة. وتساعد هذه الأنماط في إجراء تحسينات موجّهة على rubric أو إنشاء prompts خاصة بكل موضوع للمجالات التي تكون فيها المعايرة أضعف.

from collections import defaultdict

def error_by_category(pairs: list) -> dict:
    by_cat = defaultdict(list)
    for p in pairs:
        error = abs(p['judge'] - p['human'])
        by_cat[p.get('category', 'unknown')].append(error)
    return {
        cat: {
            'mean_error': round(sum(errs)/len(errs), 2),
            'max_error': max(errs),
            'n': len(errs)
        }
        for cat, errs in by_cat.items()
    }

إعادة المعايرة مع نمو البيانات

المعايرة ليست مهمة تُجرى مرة واحدة. فأثناء جمع مزيد من التقييمات البشرية ومع تغيّر سلوك المقيّم بسبب تحديثات النموذج، أعد تشغيل المعايرة كل ثلاثة أشهر. وتتبع مقاييس المعايرة بمرور الوقت؛ فإذا انخفض ارتباط Pearson إلى أقل من 0.7، فتحقق مما إذا كان تحديث النموذج قد غيّر توزيع درجات المقيّم. وأتمت خط أنابيب المعايرة بحيث تؤدي إعادة تشغيله إلى أمر واحد ينتج معامل تصحيح محدّثًا.

def run_calibration_pipeline(calibration_data: list) -> dict:
    # 1. Measure human inter-rater agreement
    ira = measure_inter_rater_agreement(
        [d['rater_1'] for d in calibration_data],
        [d['rater_2'] for d in calibration_data]
    )
    # 2. Run judge on all items
    pairs = run_judge_on_calibration(calibration_data)
    # 3. Compute correlation metrics
    metrics = calibration_metrics(pairs)
    # 4. Detect bias
    bias = detect_score_bias(pairs)
    return {'ira': ira, 'metrics': metrics, 'bias': bias}

توثيق إعدادات المقيّم

وثّق نموذج المقيّم وإصدار prompt وحجم مجموعة بيانات المعايرة وتاريخها ومقاييس المعايرة وأي معاملات تصحيح في ملف إعدادات المقيّم المُدرج ضمن نظام التحكم في الإصدارات. وينشئ ذلك سجلًا تدقيقيًا يفهم منه أعضاء الفريق مستقبلًا سبب ظهور الدرجات بهذا الشكل، كما يتيح اكتشاف ما إذا كانت تغيّرات المقاييس ناتجة عن إعادة إعداد المقيّم أم عن تغيّرات حقيقية في الجودة.

# judge_config.yaml
# judge_model: gpt-4o-2025-01-01
# judge_prompt_version: v3.2
# calibration_date: 2026-05-15
# calibration_set_size: 312
# calibration_metrics:
#   pearson_r: 0.81
#   spearman_r: 0.79
#   mae: 0.54
# bias_correction:
#   slope: 0.88
#   intercept: 0.45
# next_recalibration: 2026-08-15

Prompts خاصة بكل بُعد للمقيّم

غالبًا ما ينتج prompt واحد للمقيّم يقيّم أبعادًا متعددة في آن واحد درجات مترابطة؛ إذ يمنح المقيّم درجة عالية للصحة لأنه منح درجة عالية للوضوح، متأثرًا بانطباعه الأول. وتقيّم prompts الخاصة بكل بُعد كل معيار بصورة مستقلة في استدعاء API منفصل. وهذا أكثر تكلفة، لكنه ينتج درجات أكثر موثوقية تمثل قياسات مستقلة فعلًا. استخدم prompts منفصلة للأبعاد التي تتوقع أن تختلف درجاتها بصورة مستقلة.

async def multi_dimension_judge(question: str, answer: str) -> dict:
    # Run each dimension as a separate judge call
    correctness, helpfulness, clarity = await asyncio.gather(
        judge_single_dimension(question, answer, 'correctness'),
        judge_single_dimension(question, answer, 'helpfulness'),
        judge_single_dimension(question, answer, 'clarity')
    )
    return {
        'correctness': correctness,
        'helpfulness': helpfulness,
        'clarity': clarity,
        'composite': 0.5 * correctness + 0.3 * helpfulness + 0.2 * clarity
    }

تحقق سريع

اختبر مدى فهمك لمعايرة نماذج مقيّمي LLM مقابل التقييمات البشرية.

مراجعة الدرس

تعلمت في هذا الدرس أن مجموعات بيانات المعايرة ذات درجات الإجماع البشري توفر الحقيقة المرجعية لقياس موثوقية المقيّم، وأن ارتباط Pearson وMAE يحددان مدى جودة تتبع المقيّم للأحكام البشرية، وأن تصحيح التحيز الخطي يعالج منح درجات أعلى أو أقل بصورة منهجية. بعد ذلك سنبني خط أنابيب للتقييم المستمر مدمجًا مع CI/CD.

الأسئلة الشائعة

هل درس «معايرة نماذج التحكيم مقارنة بالبشر» مجاني؟

نعم — نص درس «معايرة نماذج التحكيم مقارنة بالبشر» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Engineering Academy، انتقل إلى CoddyKit PRO. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

ماذا ستتعلم في «معايرة نماذج التحكيم مقارنة بالبشر»؟

اجمع مجموعة بيانات مرجعية لأحكام التفضيلات البشرية، وقِس مدى اتفاق المُقيِّم مع البشر باستخدام Cohen's Kappa، واضبط الـprompt للمُقيِّم لتقليل التحيزات المنهجية. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Engineering Academy؟

لا تُشترط خبرة سابقة. AI Engineering Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «معايرة نماذج التحكيم مقارنة بالبشر»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Engineering Academy هذا؟

نعم. كل درس في AI Engineering Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نمط LLM بوصفه حَكَمًا
  2. التقييم النقطي والزوجي
  3. معايرة نماذج التحكيم مقارنة بالبشر
  4. بناء خط أنابيب للتقييم المستمر
← العودة إلى AI Engineering Academy