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:

  • شاهد الموجهات الدقيقة المُرسلة للحاكم
  • راجع استجابات الحاكم
  • حدد التسجيل غير المتسق
  • صحح النتائج غير المتوقعة

نصيحة: سجّل تفسير الحاكم مع الدرجات. هذا يساعد في تصحيح لماذا حصلت استجابات معينة على درجات عالية أو منخفضة.

مع إتقان الأدوات الثلاث، لنستكشف أنماط مراقبة الإنتاج والخطوات التالية. :::

اختبار

الوحدة 5: W&B Weave للتقييم

خذ الاختبار