0Pricing
AI Engineering Academy · درس

بناء خط أنابيب للتقييم المستمر

ادمج تقييم LLM-as-judge في خط أنابيب CI/CD، بحيث يُقيَّم كل تغيير في الـprompt أو النموذج تلقائيًا مقابل مجموعة اختبارات الانحدار قبل النشر.

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

لماذا يجب أن يكون التقييم مستمرًا

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

المكونات الأساسية لخط الأنابيب

يتكوّن خط أنابيب التقييم المستمر من خمسة مكوّنات: مجموعة بيانات الاختبار (أسئلة منتقاة مع المخرجات المتوقعة)، ومشغّل النظام (يستدعي خط أنابيب LLM لكل سؤال اختبار)، والمحكّم (يقيّم كل استجابة)، ومخزن النتائج (قاعدة بيانات أو مخزن سلاسل زمنية للمقاييس التاريخية)، وطبقة إعداد التقارير (لوحات المعلومات والتنبيهات). ويمكن ترقية كل مكوّن بشكل مستقل.

# Pipeline architecture:
#
# test_dataset.json
#       |
#       v
# system_runner.py  --> calls your LLM pipeline
#       |
#       v
# judge.py          --> scores each (question, answer) pair
#       |
#       v
# results_db        --> stores timestamped metric history
#       |
#       v
# dashboard + alert --> Grafana / Slack notification

هيكلة مجموعة بيانات الاختبار

خزّن مجموعة اختبار التقييم في ملف JSON أو YAML مُدار بالإصدارات داخل المستودع الخاص بك. يحتوي كل إدخال على سؤال، وفئة (واقعي، إجرائي، خارج النطاق)، وإجابة مرجعية اختيارية. أدر مجموعة الاختبار بإصدارات منفصلة عن الشيفرة — فإضافة حالات اختبار جديدة تغيير متوافق مع الإصدارات السابقة، بينما قد يؤدي حذف الحالات إلى إخفاء حالات التراجع. استهدف 200 إلى 500 حالة تغطي جميع الفئات ذات الصلة.

# eval/test_set_v3.json
# {
#   'version': '3.0',
#   'created': '2026-06-01',
#   'cases': [
#     {
#       'id': 'faq_001',
#       'category': 'factual',
#       'question': 'What is the cancellation policy?',
#       'reference': 'Cancellations must be made 24 hours in advance.',
#       'min_correctness': 4
#     },
#     ...
#   ]
# }

تشغيل مجموعة التقييم

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

import asyncio
import uuid
from datetime import datetime

async def run_eval_suite(system, test_set: list, commit_sha: str) -> dict:
    run_id = str(uuid.uuid4())
    results = []
    for case in test_set:
        response = await system.answer(case['question'])
        score = await judge(case['question'], response, case.get('reference'))
        results.append({
            'run_id': run_id,
            'commit_sha': commit_sha,
            'case_id': case['id'],
            'category': case['category'],
            'response': response,
            'score': score.model_dump(),
            'evaluated_at': datetime.utcnow().isoformat()
        })
    return {'run_id': run_id, 'results': results}

تخزين المقاييس التاريخية والاستعلام عنها

احفظ نتيجة كل عملية تشغيل للتقييم في قاعدة بيانات. يكفي جدول eval_results بسيط يحتوي على الحقول run_id وcommit_sha وcase_id وscore. نفّذ استعلامًا عن الدرجات المجمّعة حسب run_id لحساب المقاييس لكل عملية تشغيل. قارن العملية الحالية بآخر عملية تشغيل ناجحة على الفرع الرئيسي لاكتشاف حالات التراجع. وتعمل قاعدة بيانات سلاسل زمنية مثل InfluxDB بكفاءة في المراقبة المستمرة.

-- PostgreSQL schema
CREATE TABLE eval_runs (
    run_id UUID PRIMARY KEY,
    commit_sha TEXT NOT NULL,
    test_set_version TEXT NOT NULL,
    triggered_by TEXT,  -- 'ci', 'scheduled', 'manual'
    started_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE eval_results (
    id SERIAL PRIMARY KEY,
    run_id UUID REFERENCES eval_runs(run_id),
    case_id TEXT NOT NULL,
    category TEXT,
    correctness INT,
    overall INT,
    response TEXT
);

CREATE INDEX idx_run_id ON eval_results(run_id);

اكتشاف حالات التراجع تلقائيًا

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

def detect_regression(current: dict, baseline: dict, threshold_pct: float = 5.0) -> dict:
    regressions = []
    for metric in ['correctness', 'helpfulness', 'clarity']:
        delta_pct = (current[metric] - baseline[metric]) / baseline[metric] * 100
        if delta_pct < -threshold_pct:
            regressions.append({
                'metric': metric,
                'baseline': baseline[metric],
                'current': current[metric],
                'delta_pct': round(delta_pct, 1)
            })
    return {'has_regression': len(regressions) > 0, 'regressions': regressions}

التكامل مع CI/CD

أضف مجموعة التقييم كخطوة CI تُشغَّل مع كل طلب سحب. يستدعي خط أنابيب CI نظام الاختبار التجريبي الخاص بك، ويشغّل المحكّم، ويخزّن النتائج، ويفحص حالات التراجع. إذا اكتُشفت حالة تراجع، تفشل خطوة CI وتمنع دمج طلب السحب. أضف هذه الخطوة كفحص حالة مطلوب في GitHub أو GitLab حتى لا يتمكن أحد من تجاوزها. حافظ على مدة تشغيل التقييم أقل من 10 دقائق باستخدام مجموعة فرعية من 50 إلى 100 حالة لفحوصات طلبات السحب.

# .github/workflows/eval.yml
# name: LLM Quality Evaluation
# on: [pull_request]
# jobs:
#   eval:
#     runs-on: ubuntu-latest
#     steps:
#       - uses: actions/checkout@v4
#       - name: Run eval suite
#         run: python eval/run_suite.py --commit $GITHUB_SHA --mode pr
#         env:
#           OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
#       - name: Check for regressions
#         run: python eval/check_regression.py --run-id $EVAL_RUN_ID

عمليات تشغيل التقييم الكامل المجدولة

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

# Separate eval modes:
EVAL_CONFIGS = {
    'pr_check': {
        'test_cases': 'eval/test_set_core_100.json',
        'target': 'staging',
        'max_runtime_min': 8
    },
    'nightly': {
        'test_cases': 'eval/test_set_full_350.json',
        'target': 'production',
        'max_runtime_min': 30
    },
    'weekly_deep': {
        'test_cases': 'eval/test_set_full_350.json',
        'target': 'production',
        'include_pairwise': True,
        'max_runtime_min': 90
    }
}

التنبيه عند تدهور الجودة

اضبط التنبيهات عندما تتجاوز اتجاهات المقاييس حدود التحذير والحدود الحرجة. يؤدي انخفاض متوسط الصحة بنسبة 3% خلال الأيام السبعة الماضية إلى إطلاق تحذير. ويؤدي انخفاض بنسبة 10% في عملية تشغيل واحدة إلى إطلاق تنبيه فوري. وجّه التحذيرات إلى قناة Slack الخاصة بالفريق، والتنبيهات الحرجة إلى PagerDuty. أدرج تحليل التراجع، ورابطًا إلى لوحة التقييم، ونتيجة git blame للتغييرات الأخيرة في كل رسالة تنبيه.

import httpx

def send_regression_alert(regression_report: dict, webhook_url: str):
    regressions = regression_report['regressions']
    blocks = [{
        'type': 'section',
        'text': {'type': 'mrkdwn', 'text': '*LLM Quality Regression Detected*'}
    }]
    for r in regressions:
        blocks.append({
            'type': 'section',
            'text': {'type': 'mrkdwn',
                     'text': f'*{r["metric"]}*: {r["baseline"]} -> {r["current"]} ({r["delta_pct"]}%)'}
        })
    httpx.post(webhook_url, json={'blocks': blocks})

إدارة توسيع مجموعة الاختبار

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

def add_to_test_set(question: str, reference_answer: str, category: str,
                    source: str, test_set_path: str):
    import json, uuid
    with open(test_set_path, 'r') as f:
        test_set = json.load(f)
    test_set['cases'].append({
        'id': f'user_report_{uuid.uuid4().hex[:8]}',
        'category': category,
        'question': question,
        'reference': reference_answer,
        'source': source,  # 'user_report', 'regression', 'manual'
        'added': '2026-06-21'
    })
    with open(test_set_path, 'w') as f:
        json.dump(test_set, f, indent=2)

تصوير اتجاهات الجودة بمرور الوقت

أنشئ لوحة معلومات بسيطة للجودة ترسم مقاييسك الأساسية بمرور الوقت: متوسط درجة الصحة، ومعدل إصابة ذاكرة التخزين المؤقت، وزمن الاستجابة عند p95، والتكلفة لكل استعلام. استخدم متوسطًا متحركًا أسبوعيًا لتقليل الضوضاء الناتجة عن أحجام العينات الصغيرة. يجعل مخطط الاتجاه انجراف الجودة ظاهرًا فورًا — فانخفاض تدريجي بنسبة 3% خلال ستة أسابيع قد لا يظهر في تقارير التشغيل الفردية، لكنه سيكون واضحًا في مخطط السلاسل الزمنية. ويعمل Grafana أو حتى نص Python بسيط باستخدام matplotlib بكفاءة لهذا الغرض.

import matplotlib.pyplot as plt
import pandas as pd

def plot_quality_trend(eval_history: list):
    df = pd.DataFrame(eval_history)
    df['date'] = pd.to_datetime(df['evaluated_at'])
    df = df.sort_values('date')
    # 7-day rolling average
    df['score_ma7'] = df['mean_correctness'].rolling(window=7).mean()
    plt.figure(figsize=(12, 4))
    plt.plot(df['date'], df['mean_correctness'], alpha=0.3, label='Daily')
    plt.plot(df['date'], df['score_ma7'], label='7-day avg', linewidth=2)
    plt.axhline(y=4.0, color='r', linestyle='--', label='Min threshold')
    plt.legend()
    plt.title('LLM Answer Quality Over Time')
    plt.savefig('quality_trend.png')

تحقق سريع

اختبر مدى فهمك لخطوط أنابيب التقييم المستمر لتطبيقات LLM.

مراجعة الدرس

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

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

هل درس «بناء خط أنابيب للتقييم المستمر» مجاني؟

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

ماذا ستتعلم في «بناء خط أنابيب للتقييم المستمر»؟

ادمج تقييم LLM-as-judge في خط أنابيب CI/CD، بحيث يُقيَّم كل تغيير في الـprompt أو النموذج تلقائيًا مقابل مجموعة اختبارات الانحدار قبل النشر. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «بناء خط أنابيب للتقييم المستمر»؟

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

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

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

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

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