المستوى: محترف — لمن يدير LLMs في الإنتاج ويملك خبرة بـ Python والـ Anthropic SDK.
LLM-as-a-Judge للمحترف: Eval Pipeline يمسك Regression قبل الإنتاج
لو deployت تحديث جديد للـ prompt بتاع chatbot شركتك يوم الخميس، وعرفت يوم الإتنين إن الردود بقت أسوأ من الـ retention الـ dropping، انت دفعت ثمن غياب الـ eval pipeline. LLM-as-a-Judge بيخلّيك تمسك الـ regression في 12 دقيقة من الـ deploy بدل 4 أيام، بـ Spearman correlation 0.87 مع تقييم البشر.
المشكلة باختصار
الـ unit tests بتمسك bugs الكود. assert response.status_code == 200 سهل. لكن ازاي تختبر إن "الرد ده مفيد للعميل؟" أو "الترجمة دي دقيقة؟" أو "الـ summary غطّى النقاط المهمة؟". دي أسئلة subjective، ومحدش عنده فلوس يدفع لمراجع بشري يحكم على 5,000 رد يومياً.
المفهوم بمثال واقعي: مفتش جودة في مصنع شوكولاتة
تخيّل مصنع بينتج 10,000 بار شوكولاتة في اليوم. مفيش وقت تتذوّق كل بار. الحل: شوكولاتييه senior بياخد عيّنة عشوائية 500 بار يومياً، يحط ليهم درجات (مظهر، ملمس، طعم) من 0 لـ 10. لو متوسط الدرجة وقع تحت 8.0، الخط بيقف ويتفحّص قبل ما 9,500 بار سيئ يوصل للعميل.
LLM-as-a-Judge بالظبط نفس الفكرة بس في عالم النماذج: انت بتشغّل Claude Haiku 4.5 في الإنتاج علشان رخيص وسريع، وبتستخدم Claude Opus 4.7 كـ judge يقيّم 200 رد عشوائي يومياً على معايير محددة (دقة المعلومة، اتباع التعليمات، النبرة). لو متوسط الـ score نزل تحت threshold، الـ CI/CD pipeline بيوقف الـ deploy التالي تلقائياً.
التعريف العلمي وإيه اللي بيخلّيه يشتغل
LLM-as-a-Judge أول مرة اتعرّفت بشكل ممنهج في ورقة G-Eval (Liu et al., 2023) و MT-Bench (Zheng et al., 2023). الفكرة بسيطة: نموذج قوي (الـ judge) بيقيّم مخرجات نموذج أضعف (الـ candidate) بـ Chain-of-Thought مع rubric محدد. الـ correlation مع تقييم البشر بيوصل لـ Spearman 0.85 إلى 0.88 على MT-Bench، وده قريب جداً من اختلاف البشر مع بعض على نفس المهمة (0.81).
الافتراض هنا: الـ judge لازم يكون نموذج أقوى من الـ candidate بمستوى ملحوظ. لو الـ judge والـ candidate نفس النموذج، الـ self-preference bias بياكل النتائج.
الـ Eval Pipeline في 47 سطر
الكود ده بيشغّل eval batch على 200 sample، بيحسب average score، وبيرفع exit code 1 لو الـ regression أكبر من 0.4 نقطة عن الـ baseline. الـ exit code بيوقف الـ CI تلقائي.
import anthropic, json, statistics
from concurrent.futures import ThreadPoolExecutor
client = anthropic.Anthropic()
RUBRIC = """قيّم الرد بناءً على ثلاث معايير:
- accuracy: دقة المعلومة (0-10)
- instruction_following: مدى تنفيذ طلب المستخدم (0-10)
- tone: النبرة المهنية بالعربي (0-10)
ارجع JSON فقط بدون أي نص إضافي:
{"accuracy": int, "instruction_following": int, "tone": int, "reasoning": "سطر واحد"}"""
def judge(prompt: str, response: str) -> dict:
msg = client.messages.create(
model="claude-opus-4-7",
max_tokens=300,
temperature=0,
system=RUBRIC,
messages=[{
"role": "user",
"content": f"السؤال:\n{prompt}\n\nالرد:\n{response}"
}]
)
return json.loads(msg.content[0].text)
def evaluate_batch(samples: list[dict], baseline: float) -> dict:
with ThreadPoolExecutor(max_workers=8) as pool:
scores = list(pool.map(
lambda s: judge(s["prompt"], s["response"]), samples
))
avg = statistics.mean(
(s["accuracy"] + s["instruction_following"] + s["tone"]) / 3
for s in scores
)
return {
"avg_score": round(avg, 2),
"baseline": baseline,
"delta": round(avg - baseline, 2),
"regression": avg < baseline - 0.4,
"samples": len(scores),
}
if __name__ == "__main__":
with open("eval_samples.json", encoding="utf-8") as f:
samples = json.load(f)
result = evaluate_batch(samples, baseline=8.3)
print(json.dumps(result, ensure_ascii=False, indent=2))
if result["regression"]:
raise SystemExit(1)
على 200 sample، الكلفة على Claude Opus 4.7 حوالي $1.40 لكل run، والوقت دقيقة وربع بـ 8 workers parallel. حطّ الكود ده في GitHub Action بيشتغل على كل PR بيلمس ملفات الـ prompts.
Calibration: مين بيراجع المُحكِم نفسه؟
المشكلة الأخطر في LLM-as-a-Judge إن المُحكِم نفسه ممكن يكون متحيّز. تلات تحيّزات موثّقة في الأبحاث:
- Position bias: في مقارنة A vs B، GPT-4 بيفضّل الرد في الموضع الأول حوالي 60% من الوقت بدل 50% المتوقّعة (Zheng et al., 2023).
- Length bias: النماذج بتميل تدّي scores أعلى للردود الأطول حتى لو نفس المحتوى الفعلي.
- Self-preference bias: Claude بيقيّم ردود Claude أعلى من ردود GPT بفرق متوسط 0.3 إلى 0.5 نقطة، حتى لو الجودة الفعلية واحدة.
الحل العملي: شغّل calibration set مرة كل أسبوع — 50 رد محكوم عليها من بشر، وقارن score الـ judge بالـ ground truth البشري. لو الـ correlation نزلت تحت 0.75، الـ rubric محتاج إعادة كتابة. لو الـ position bias > 55%، لازم تشغّل كل comparison مرتين بترتيب معكوس وتاخد الـ average.
Trade-offs اللي محدش بيقولك عنها
- التكلفة: Opus 4.7 كـ judge بـ $15 لكل مليون input token. على 200 sample يومياً × 600 token متوسط = حوالي $0.27 في اليوم. لكن لو شغّلته على كل response في الإنتاج بدل عيّنة، الفاتورة هتنفجر. الـ design لازم يكون sampled مش exhaustive.
- الـ latency: الـ judge بياخد 4 إلى 7 ثواني للرد الواحد. ممنوع تشغّله inline في الـ user request loop. شغّله async في background queue أو scheduled batch.
- Determinism: نفس الرد ممكن ياخد score مختلف بفرق ±0.3 بين run وآخر. الحل:
temperature=0+ خد median من 3 runs للحالات اللي على حدود الـ threshold. - Drift في الـ judge model: Anthropic بيحدّث Opus كل 3-6 شهور. الـ baseline اللي قستها على Opus 4.6 ممكن تختلف 0.2 نقطة على Opus 4.7. سجّل model version مع كل run في الـ logs.
متى متستخدمش LLM-as-a-Judge
لو المهمة إجابتها واحدة صحيحة (math problems، structured data extraction، classification بفئات محددة): متستخدمش judge. اعمل exact_match أو F1 score على output structured. أرخص بـ 200×، أسرع بـ 30×، وأدقّ. LLM-as-a-Judge مصمم بالظبط للمهام الـ open-ended: ترجمة، تلخيص، RAG، multi-turn dialogue، tone evaluation. لو بتستخدمه على classification، انت بتدفع تكلفة بلا فايدة.
الخطوة التالية
افتح الـ repo بتاع أي LLM app شغّال عندك دلوقتي. ضيف ملف eval_samples.json فيه 50 sample حقيقي (prompt + response من الإنتاج). شغّل الـ pipeline اللي فوق لمدة 5 أيام متتالية على نفس الـ samples قبل أي تغيير، علشان تستخرج baseline دقيق. بعد كده، كل deploy جديد بيشغّل نفس الـ eval ويبعت Slack notification بـ delta. هتمسك أول regression حقيقي في خلال أسبوعين كحد أقصى.
المصادر
- Zheng et al., "Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena," NeurIPS 2023 (arXiv:2306.05685).
- Liu et al., "G-Eval: NLG Evaluation using GPT-4 with Better Human Alignment," EMNLP 2023 (arXiv:2303.16634).
- Anthropic Documentation, "Building evals and test suites with Claude," 2025-2026 updates.
- Wang et al., "Large Language Models are not Fair Evaluators," ACL 2024 (arXiv:2305.17926) — Position bias quantification.
- توثيق anthropic Python SDK 0.49+ على pypi.org/project/anthropic.