W&B Weave للتقييم
LLM-as-Judge في Weave
3 دقيقة للقراءة
عندما تحتاج تقييماً دقيقاً يتجاوز المطابقة البسيطة، استخدم LLMs كحكام. Weave يسهّل بناء مسجلين مدعومين بـ LLM يقيّمون الجودة والمساعدة ومعايير ذاتية أخرى.
لماذا LLM-as-Judge في Weave؟
| الفائدة | الوصف |
|---|---|
| تقييم دقيق | تقييم النبرة، المساعدة، التماسك |
| قابل للتوسع | تقييم آلاف الأمثلة تلقائياً |
| قابل للتخصيص | عرّف معاييرك الخاصة |
| متتبع | جميع استدعاءات الحاكم تُسجل وتُصدَر |
حاكم LLM أساسي
أنشئ مسجلاً بسيطاً مدعوماً بـ LLM:
import weave
from openai import OpenAI
weave.init('my-team/my-project')
client = OpenAI()
@weave.op()
def helpfulness_judge(output: str, question: str) -> dict:
"""استخدم LLM لتقييم المساعدة."""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": """أنت حكم تقييم. قيّم مساعدة
الاستجابة على مقياس من 1-5.
1 = غير مفيد على الإطلاق
3 = مفيد إلى حد ما
5 = مفيد للغاية
أرجع فقط كائن JSON: {"score": <number>, "reasoning": "<explanation>"}"""
}, {
"role": "user",
"content": f"السؤال: {question}\n\nالاستجابة: {output}"
}],
response_format={"type": "json_object"}
)
result = json.loads(response.choices[0].message.content)
return {
"helpfulness_score": result["score"] / 5.0, # تطبيع إلى 0-1
"reasoning": result["reasoning"]
}
حاكم متعدد المعايير
قيّم على أبعاد متعددة:
@weave.op()
def quality_judge(output: str, question: str, context: str = None) -> dict:
"""قيّم الاستجابة على أبعاد جودة متعددة."""
criteria_prompt = """
قيّم هذه الاستجابة على هذه المعايير (1-5 لكل منها):
1. **الدقة**: هل المعلومات صحيحة؟
2. **الاكتمال**: هل تجيب على السؤال بالكامل؟
3. **الوضوح**: هل من السهل فهمها؟
4. **النبرة**: هل النبرة مناسبة ومهنية؟
أرجع JSON: {
"accuracy": <1-5>,
"completeness": <1-5>,
"clarity": <1-5>,
"tone": <1-5>,
"overall": <1-5>,
"feedback": "<تعليقات محددة>"
}
"""
response = client.chat.completions.create(
model="gpt-4o", # استخدم نموذجاً أقوى للحكم
messages=[
{"role": "system", "content": criteria_prompt},
{"role": "user", "content": f"السؤال: {question}\nالاستجابة: {output}"}
],
response_format={"type": "json_object"}
)
result = json.loads(response.choices[0].message.content)
# تطبيع جميع الدرجات إلى 0-1
return {
"accuracy": result["accuracy"] / 5.0,
"completeness": result["completeness"] / 5.0,
"clarity": result["clarity"] / 5.0,
"tone": result["tone"] / 5.0,
"overall": result["overall"] / 5.0,
"feedback": result["feedback"]
}
حاكم المقارنة الثنائية
قارن استجابتين مباشرة:
@weave.op()
def pairwise_judge(response_a: str, response_b: str, question: str) -> dict:
"""احكم أي استجابة أفضل."""
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": """قارن هاتين الاستجابتين لنفس السؤال.
أيهما أفضل؟ أرجع JSON:
{
"winner": "A" أو "B" أو "tie",
"reasoning": "<شرح>"
}"""
}, {
"role": "user",
"content": f"""السؤال: {question}
الاستجابة أ: {response_a}
الاستجابة ب: {response_b}"""
}],
response_format={"type": "json_object"}
)
result = json.loads(response.choices[0].message.content)
return {
"winner": result["winner"],
"a_wins": 1.0 if result["winner"] == "A" else 0.0,
"reasoning": result["reasoning"]
}
استخدام حكام LLM في التقييم
ادمج الحكام في خط أنابيب التقييم:
import weave
weave.init('my-team/my-project')
# نموذجك
class SupportBot(weave.Model):
@weave.op()
def predict(self, question: str) -> str:
# توليد الاستجابة
pass
# التقييم مع حكام LLM
evaluation = weave.Evaluation(
dataset=weave.ref("support-test-cases").get(),
scorers=[
helpfulness_judge,
quality_judge
]
)
# تشغيل التقييم
model = SupportBot()
results = await evaluation.evaluate(model)
# عرض الدرجات المجمعة
print(results.summary)
# {
# "helpfulness_score": 0.82,
# "accuracy": 0.88,
# "completeness": 0.75,
# ...
# }
أفضل الممارسات لحكام LLM
| الممارسة | لماذا |
|---|---|
| استخدم مخرجات منظمة | JSON يضمن نتائج قابلة للتحليل |
| ضمّن التفسير | يساعد في تصحيح قرارات التسجيل |
| طبّع الدرجات | نطاق 0-1 للمقارنة السهلة |
| استخدم نماذج حاكمة قوية | فئة GPT-4 للتقييم الدقيق |
| أضف أمثلة | few-shot يحسن الاتساق |
معايرة حاكمك
تحقق من دقة الحاكم على أمثلة معروفة:
# أمثلة جيدة/سيئة معروفة للمعايرة
calibration_set = [
{"output": "استجابة ممتازة", "expected_score": 0.9},
{"output": "استجابة ضعيفة", "expected_score": 0.2},
{"output": "استجابة متوسطة", "expected_score": 0.5}
]
# تحقق إذا كانت درجات الحاكم تطابق التوقعات
for example in calibration_set:
result = helpfulness_judge(example["output"], "سؤال اختبار")
assert abs(result["helpfulness_score"] - example["expected_score"]) < 0.2
تتبع اتساق الحاكم
جميع استدعاءات حاكم LLM تُسجل في Weave:
- شاهد الموجهات الدقيقة المُرسلة للحاكم
- راجع استجابات الحاكم
- حدد التسجيل غير المتسق
- صحح النتائج غير المتوقعة
نصيحة: سجّل تفسير الحاكم مع الدرجات. هذا يساعد في تصحيح لماذا حصلت استجابات معينة على درجات عالية أو منخفضة.
مع إتقان الأدوات الثلاث، لنستكشف أنماط مراقبة الإنتاج والخطوات التالية. :::