ابدأ الآن
واجهة Python البرمجية
تغيّرت النسخة الإنجليزية من هذه الصفحة منذ ترجمتها. الصفحة الإنجليزية هي النسخة الحالية. اقرأها بالإنجليزية
كل ما تفعله CLI تفعله المكتبة. استخدمها حين ينتمي التقييم إلى داخل سكربت أو دفتر ملاحظات أو مجموعة اختبارات، لا إلى جوار ملف إعدادات.
from oloproof import evaluate, system, current_case
from oloproof.evaluators import ExactMatch, Contains, JsonSchema, Regex, RubricJudge, evaluatorكل ما يقع تحت oloproof_core هو من الأجزاء الداخلية للمحرك، وليس جزءًا من هذه الواجهة.
يتلقى النظام مُدخَل الحالة لا الحالة نفسها
هذا هو الأمر الوحيد الذي يستحق أن تُحسنه أولًا، لأن الخطأ فيه يفشل بصمت.
@system(name="support-bot", version="1")
def answer(case):
return {"label": "refund" if "refund" in case["question"].lower() else "other"}يبدو صف مجموعة البيانات هكذا:
{"id":"refund_00","input":{"question":"Can I get a refund? #0"},"expected":{"label":"refund"}}تتلقى الدالة الكائن input، لذا فإن case["question"] هو السؤال، ولا يوجد case["expected"]. وما تُعيده هو المُخرَج الذي يقرؤه المُقيِّم، لذا يقارن ExactMatch(field="label") قيمة label المُعادة بقيمة label المتوقعة للحالة.
تشغيل واحد
result = evaluate(
system=answer,
dataset="data/example.jsonl",
evaluators=[ExactMatch(criterion="exact_label", field="label")],
)
for metric in result.metrics:
print(metric.metric, metric.estimate, metric.interval, metric.n_observed, metric.n_missing)exact_label 1.0 lower=0.8842966917779722 upper=1.0 30 0ثلاثون حالة، كلها صحيحة، ومع ذلك تمتد الفترة نزولًا حتى 88.4%. لا تستطيع ثلاثون حالة أن تُثبت أكثر من ذلك، أيًّا كان ما يقوله التقدير.
قراءة حالة فشلت
إذا رفع النظام استثناءً، فتلك الحالة مفقودة لا خاطئة، ويُبلغ عنها المقياس:
exact_label None lower=0.0 upper=1.0 0 30التقدير None مع فترة تغطي النطاق كله يعني أنه لم يُرصد شيء. تحقّق من n_missing قبل أن تثق بأي تقدير: النظام الذي رفعت كل حالاته استثناءً يُنتج كائن نتيجة سليمًا من حيث البنية، والعدد هو ما يخبرك بأنه فارغ.
هذا هو عقد المقام يؤدي وظيفته لا إخفاقٌ فيه — فالحالة التي وقع فيها خطأ تُحصَر ولا تُسقَط — لكن لا شيء يرفع استثناءً نيابةً عنك، فالتحقق مسؤوليتك.
كتابة مُقيِّمك الخاص
يحوّل @evaluator دالةً إلى مُقيِّم. تأخذ الدالة وسيطًا واحدًا، هو الحالة، وتقرأ منها ما تحتاجه: case.output هو ما أعاده النظام، وcase.expected هو الكائن expected في الصف.
from oloproof.evaluators import evaluator
@evaluator(criterion="known_label", reads=("output",))
def known_label(case):
return case.output["label"] in {"refund", "other"}
result = evaluate(system=answer, dataset="data/example.jsonl", evaluators=[known_label])known_label 1.0 lower=0.8842966917779722 upper=1.0 30 0يُصرّح reads بأجزاء الحالة التي يقرؤها المُقيِّم، لأغراض المنشأ؛ والقيمة الافتراضية هي ("output", "expected"). ويُعيد True أو False، أو درجةً إذا صرّح بـ value_type="score" وبـ score_range الذي تقع فيه درجاته. ويتضمن إصداره بصمةً (digest) للملف الذي يعرّفه، لذا فإن تعديله يُبطل أحكامه المخزّنة في ذاكرة التخزين المؤقت.
الدالة المكتوبة على هيئة def f(output, expected) تُرفض عند التصريح بها، مع ذكر الصيغة التي تعمل، بدلًا من أن تفشل في كل حالة.
تطبيق سياسة
يأخذ evaluate سياسةً ويتخذ القرار بشأن التشغيل، بالقواعد نفسها التي تقرؤها CLI من release.yaml:
result = evaluate(
system=answer,
dataset="data/example.jsonl",
evaluators=[ExactMatch(criterion="exact_label", field="label")],
policy="release.yaml",
)
print(result.gate)من دون سياسة، تكون result.gate هي None: لا توجد قاعدة يُقصَّر عنها، فلا يوجد ما يُقرَّر.
إلى أين بعد ذلك
- يتناول كتابة مجموعة اختبار المُقيِّمات نفسها بوصفها إعدادات.
- يتناول تسجيل ما فعله النظام الدالة current_case() وقراءة المُخرَجات داخل
مُقيِّم.
- يتناول مقارنة مرشَّح بخط أساس سير العمل الذي وُجدت الفترات من أجله.