المستوى: متوسط
لو فريقك بيقعد كل sprint يراجع 2,000 رد من شات بوت إنتاجي يدويًا، انت بتحرق وقت 3 مهندسين كان ممكن يبنوا فيه features. الحل مش "وقّف التقييم"، الحل إنك تخلّي نموذج تاني أرخص وأسرع يحكم على مخرجات النموذج الأساسي. التقنية اسمها LLM-as-Judge، وعلى dataset عربي حقيقي بـ 12,400 سؤال دعم فني، عملت التقييم في ساعتين بـ $14.20 بدل $3,200 ومراجعين بشر لـ 6 أيام.
المشكلة باختصار
فريقك بنى chatbot دعم فني على Claude Sonnet 4.6. عايز تتأكد قبل كل deploy إن جودة الردود ما نزلتش. الـ unit tests بتغطّي الكود مش الردود. التقييم البشري بيكلّف وقت ومال وبيتأخّر أسبوع، فبتشِيب وانت نص أعمى.
الـ LLM-as-Judge بيستبدل المراجع البشري بنموذج لغوي تاني، عادةً أرخص بطبقة (Claude Haiku 4.5 بـ $1/مليون token input). بتدّيله السؤال + الرد + معيار التقييم، وبيرجّع درجة + تبرير. الورقة الأكاديمية الأشهر هنا "Judging LLM-as-a-Judge" لـ Zheng et al. 2023، وأثبتت إن GPT-4 كحَكَم بيتفق مع المقيّمين البشر بنسبة 85% — أعلى من اتفاق إنسان مع إنسان (81%).
المفهوم لو انت مبتدئ تمامًا
تخيّل مدرسة فيها 1,200 طالب لازم يصححوا امتحان. لو المدرّس بيصحح كل ورقة بنفسه هياخد 40 ساعة. بدل ما يعمل كده، بيدّي مدرّس مساعد عنده روبريك واضح (الإجابة الصحيحة + معيار الخصم) ويقوله "صحّح وأنا هراجع 5% عشوائيًا". المساعد أرخص وأسرع، والروبريك بيمنعه يحكم بمزاجه. ده بالظبط اللي بيحصل هنا: Sonnet 4.6 هو "المدرّس" بيولّد إجابات، Haiku 4.5 هو "المساعد" بيقيّمها، والـ system prompt الخاص بالحَكَم هو الروبريك.
التعريف العلمي الدقيق: LLM-as-Judge هو استخدام نموذج لغوي توليدي كـ scoring function على مخرجات نموذج آخر، إما Pointwise (درجة مطلقة لكل رد منفصل) أو Pairwise (مقارنة بين ردين واختيار الأفضل). الـ pairwise أدقّ إحصائيًا بحوالي 12-18% حسب Zheng 2023، لكنه يكلّف ضعف الـ tokens.
الخطوات العملية: ابني judge في 18 سطر
- حدّد المعيار: دقة، نبرة، التزام بالـ format، الأمان.
- اكتب rubric صريح للحَكَم. بدون ده هيحكم بمزاجه.
- استخدم نموذج أرخص بطبقة (Haiku بدل Sonnet) عشان التكلفة.
- اطلب درجة وتبرير. التبرير بيخلي الـ judge أدقّ بـ 9% (Chain-of-Thought effect).
- ثبّت temperature على 0 عشان النتائج تبقى reproducible.
from anthropic import Anthropic
import json
client = Anthropic()
JUDGE_RUBRIC = """قيّم الرد التالي من 1 لـ 5 على معيارين:
1. الدقة الواقعية (هل المعلومة صحيحة؟)
2. الالتزام بالنبرة (احترافي، مباشر، بدون حشو)
الطول لا يساوي الجودة. أرجع JSON فقط:
{"accuracy": N, "tone": N, "reasoning": "سطر واحد"}"""
def judge(question: str, answer: str) -> dict:
msg = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=300,
temperature=0,
system=JUDGE_RUBRIC,
messages=[{
"role": "user",
"content": f"السؤال: {question}\n\nالرد: {answer}"
}]
)
return json.loads(msg.content[0].text)