الأدلة الإرشادية
مرجع SDK
كل اسم تصدّره الحزمتان oloproof وoloproof.evaluators، مع توقيعه، وهل هو متزامن أم غير متزامن، وما يعيده. للحصول على مقدمة موجَّهة اقرأ واجهة Python البرمجية أولًا.
هاتان الحزمتان وحدهما هما الواجهة العامة. وأي شيء يُستورد من oloproof_core هو من داخليات المحرك وقد يتغير دون إشعار. وكل دالة أدناه تعمل محليًا على مخزن المشروع؛ ولا ترسل أيٌّ منها بيانات إلى أي مكان ما لم يستدعِ مُقيِّمٌ تمرره مزوِّدَ نماذج.
تشغيل تقييم
evaluate وaevaluate
def evaluate(*, system, dataset, evaluators, policy=None, **kwargs) -> EvaluationResult
async def aevaluate(*, system, dataset, evaluators, policy=None, **kwargs) -> EvaluationResult| الوسيط | النوع | ما هو |
|---|---|---|
| system | دالة @system، أو صنف أو نسخة @rag_system، أو كائن قابل للاستدعاء | النظام قيد الاختبار. |
| dataset | مسار | مجموعة اختبار JSONL. انظر مجموعات الاختبار. |
| evaluators | قائمة | نسخ من oloproof.evaluators، أو دوال @evaluator. |
| policy | مسار إلى release.yaml، أو ReleasePolicy، أو None | سياسة الإصدار. لا يشغّل None أي بوابة: يكون result.gate هو None ولا يُقرَّر شيء. |
| concurrency | ConcurrencyConfig أو تعيين مثل {"system": 8, "judge": 4} | الاستدعاءات الجارية في آن واحد. |
| slices | قائمة سلاسل نصية | شرائح استكشافية، كما في oloproof.yaml. |
| min_slice_support | عدد صحيح | دون هذا العدد من الحالات المؤهَّلة لا تكون للشريحة فترة. الافتراضي 30. |
| replicates | عدد صحيح | قِس كل حالة هذا العدد من المرات. الافتراضي 1. |
evaluate متزامنة. إذا استُدعيت دون حلقة أحداث قيد التشغيل فإنها تستخدم asyncio.run؛ وإذا استُدعيت من داخل حلقة قيد التشغيل (دفتر ملاحظات، اختبار غير متزامن) فإنها تشغّل التقييم في خيط منفصل وتنتظر حتى ينتهي، فهي آمنة في الموضعين. وaevaluate هي الروتين المشترك؛ استخدم await معها من الشيفرة غير المتزامنة.
وسائط الكلمات المفتاحية الباقية (metrics، store، predictive، event_sink، retry_policy، traffic_draw_id) تأخذ أنواعًا من المحرك من oloproof_core وليست جزءًا من الواجهة المستقرة.
from oloproof import evaluate, system, current_case
from oloproof.evaluators import ExactMatch, evaluator
@system(name="support-bot", version="1")
def answer(case):
current_case().usage(input_tokens=12, output_tokens=3)
return {"label": "refund" if "refund" in case["question"].lower() else "other"}
@evaluator(criterion="short_label")
def short_label(case):
return len(case.output["label"]) <= 6
result = evaluate(
system=answer,
dataset="cases.jsonl",
evaluators=[ExactMatch(criterion="correct_label", field="label"), short_label],
)
for metric in result.metrics:
print(metric.metric, metric.estimate, metric.interval, metric.n_observed, metric.n_missing)عند تشغيله على مجموعة اختبار من حالتين دون سياسة، طبع هذا:
correct_label 1.0 lower=0.15811388300841903 upper=1.0 2 0
short_label 1.0 lower=0.15811388300841903 upper=1.0 2 0EvaluationResult
| العضو | النوع | ما هو |
|---|---|---|
| run | سجل تشغيل | التشغيل المخزَّن، مع id وحالته واكتماله. |
| suite، system، evaluators | سجلات نسخ | النسخ الدقيقة التي قاسها هذا التشغيل. |
| metrics | صف من نتائج المقاييس | واحد لكل معيار ومقياس مُعلَن: metric، estimate، interval، n_total، n_eligible، n_observed، n_missing، exclusions، method. |
| gate | نتيجة بوابة أو None | مع سياسة: release_action، exit_code، decisions، وreasons. |
| decisions | صف | قرارات البوابة، أو فارغ دون سياسة. |
| cases() | قائمة | كل حالة مع تنفيذها وأحكامها. |
| failures() | قائمة | الحالات التي لم تنتهِ، أو وقع فيها خطأ، أو أخفقت في مُقيِّم واحد على الأقل. |
| print(stderr=False) | لا شيء | تقرير الطرفية الذي يطبعه oloproof run. |
| to_bundle(path) | مسار | يكتب حزمة قابلة للنقل، كما يفعل oloproof export. |
معنى الحالات ورموز الأسباب والأعداد موجود في النتائج والتنفيذ.
evaluate_comparison وaevaluate_comparison
def evaluate_comparison(*, candidate_system, baseline_system, dataset, evaluators, policy, **kwargs) -> ComparisonEvaluationResult
async def aevaluate_comparison(*, candidate_system, baseline_system, dataset, evaluators, policy, **kwargs) -> ComparisonEvaluationResultيشغّل النظامين على مجموعة الاختبار نفسها بترتيب واحد مبنيّ على بذرة ويحسم قواعد المقارنة في السياسة. policy مطلوب ويجب أن يحتوي على قاعدة superiority أو non_inferiority أو equivalence واحدة على الأقل، وإلا رفع الاستدعاء خطأ تهيئة. وسائط كلمات مفتاحية إضافية: concurrency، وreplicates، وmetrics وstore وretry_policy ذات أنواع المحرك. والسلوك المتزامن وغير المتزامن كما في evaluate.
يحتوي ComparisonEvaluationResult على candidate وbaseline (كل منهما EvaluationResult) وcomparison، الذي يحمل الفروق المزدوجة وقراراتها. انظر مقارنة نسختين.
إعلان نظام
@system
def system(func=None, *, name=None, version=None, config=None, timeout_s=None, records=())يُستخدم مجردًا (@system) أو مع وسائط (@system(name=..., version=...))، أو يُستدعى على كائن (system(model.answer, version="v2")). تتلقى الدالة كائن input الخاص بالحالة، لا الحالة كلها، وتعيد المُخرَج الذي تقرؤه المُقيِّمات. ويجوز أن تكون def أو async def؛ والدالة المتزامنة تعمل في خيط عامل.
| الوسيط | الافتراضي | ما هو |
|---|---|---|
| name | اسم الدالة | جزء من هوية النسخة. |
| version | غائب | مطلوب لتابع مرتبط أو كائن قابل للاستدعاء، لأن سلوكهما يعتمد على حالة لا يستطيع Oloproof رؤيتها. |
| config | فارغ | إعدادات تُسجَّل مع النسخة. |
| timeout_s | 120 | حد لكل استدعاء. والاستدعاء الذي يتجاوزه يُسجَّل تنفيذًا انتهت مهلته. |
| records | فارغ | أنواع المُخرَجات الفنية التي يسجّلها النظام، مثل retrieval/v1. والمُقيِّم الذي يتطلب نوعًا لا يعلنه النظام يُرفض قبل بدء التشغيل. |
تدخل الشيفرة المصدرية لوحدة الدالة نفسها في بصمة النسخة، فتعديلها يُبطل عمليات التنفيذ المخزّنة مؤقتًا. انظر مرجع التهيئة لمعرفة ما يُبطلها أيضًا وما لا يُبطلها.
current_case
def current_case() -> CaseRecorderمتاحة فقط بينما يستدعي Oloproof نظامك؛ وفي أي مكان آخر ترفع RuntimeError. توابع المُسجِّل:
| التابع | يسجّل |
|---|---|
| usage(*, input_tokens=None, output_tokens=None, cost_usd=None) | رموز استدعاء نموذج وتكلفته. والقيمة المتروكة تبقى غير مسجَّلة، لا صفرًا. |
| artifact(kind, data) | أي قيمة JSON أو نموذج Pydantic تحت نوع مثل trace أو conversation/v1. |
| retrieval(retrieval) | المرشَّحات المرتَّبة التي أعادها المسترجِع (retrieval/v1). |
| context(context) | السياق المجمَّع للتوليد (context/v1). |
| citations(ids) | المعرّفات التي تستشهد بها الإجابة، بصيغة doc_id أو doc_id#chunk_id (citations/v1). |
| agent_trajectory(trajectory) | خطوات الوكيل، واستدعاءات أدواته ونتائجها، ونقاط الحفظ (agent_trajectory/v1). |
يعيد كل منها ArtifactRef (باستثناء usage، الذي لا يعيد شيئًا). وتُصدَّر الحمولات ذات الأنواع لبناء هذه السجلات: Retrieval، Passage، Context، ContextItem، DroppedItem، Citations، StageTimings، AgentTrajectory، AgentStep، AgentCheckpoint، AgentConstraintCheck، واسم النوع CONVERSATION (conversation/v1).
@rag_system
def rag_system(*, name, depth, top_k, token_budget=None, index_version=None, version=None, config=None, citations_path="citations")مُزخرِف أصناف. يوفّر الصنف retrieve(input, depth) وgenerate(input, context)، إضافة إلى count_tokens(passage) حين يضبط token_budget. وcontext هو قائمة كائنات Passage التي اجتازت top_k والميزانية، بترتيب الرتبة. يسجّل Oloproof بنفسه retrieval/v1 وcontext/v1 وcitations/v1 وstage_timings/v1، ويخزّن كل مرحلة مؤقتًا على حدة. ويسمّي citations_path حقل المُخرَج الذي يحمل المعرّفات التي تستشهد بها الإجابة. انظر RAG.
المُقيِّمات
كل الأصناف موجودة في oloproof.evaluators. ويسمّي criterion في كل منها المقياس الذي ينتجه. وأي المُخرَجات الفنية يقرؤها كل منها، وما يقابله في YAML، موجودان في جدول المُقيِّمات في مرجع التهيئة.
| الصنف | التوقيع |
|---|---|
| ExactMatch | (*, criterion, field=None, expected_field=None, strip=True, casefold=False) |
| Contains | (*, criterion, field=None, expected_field=None) |
| Regex | (*, criterion, pattern, field=None, pass_if="match") |
| JsonSchema | (*, criterion, schema, field=None) |
| RubricJudge | (*, criterion, provider, model, rubric_text=None, rubric_file=None, api_key_env=None, base_url=None, temperature=0, max_tokens=512, timeout_s=60.0) |
| Groundedness | (*, provider, model, criterion="groundedness", **options) |
| CitationSupport | (*, provider, model, criterion="citation_support", **options) |
| CitationValidity | (*, criterion="citations_valid", require_citations=False) |
| HitRate، Recall | (k=None, *, criterion=None, relevance_unit="doc")، وk افتراضيًا 5 |
| MRR، NDCG | (k=None, *, criterion=None, relevance_unit="doc")، وk افتراضيًا 10 |
| AgentMaxSteps | (max_steps, *, criterion=None) |
| AgentToolCalled | (tool_name, *, min_calls=1, criterion=None) |
| AgentNoToolLoop | (*, max_repeats=2, criterion="agent_no_tool_loop") |
| AgentToolSequence | (*, ordered=True, criterion="agent_tool_sequence") |
| AgentNoUndeclaredTool | (*, criterion="agent_no_undeclared_tool") |
| AgentConstraintsSatisfied | (constraints=(), *, criterion="agent_constraints_satisfied") |
| AgentRoute | (*, criterion="agent_route") |
| AgentToolPermissions | (permissions, *, criterion="agent_tool_permissions") |
| AgentMaxHandoffs | (max_handoffs, *, criterion=None) |
| ConversationCompleted | (*, criterion="conversation_completed") |
| ConversationJudge | كما في RubricJudge |
| PredictiveCorrect، PredictiveRecall، PredictivePrecision | (*, criterion, positive=True, field="label", expected_field="label") |
| AbsoluteError | (*, criterion, target_range, field="label", expected_field="label") |
| Brier، PredictiveRanking | (*, criterion, positive=True, field="score", expected_field="label") |
| LogLoss | (*, clip, criterion, positive=True, field="score", expected_field="label") |
| CustomEvaluator | (func, *, criterion, reads=("output", "expected"), cacheable=False, version=None, value_type="binary", score_range=None) |
provider هو "anthropic" أو "openai" أو "openai_compatible". يقرأ الحَكَم مفتاحه من متغير البيئة الذي يسمّيه api_key_env (ANTHROPIC_API_KEY أو OPENAI_API_KEY افتراضيًا) ويحاسبه ذلك المزوِّد. ويأخذ Groundedness وCitationSupport بقية إعدادات RubricJudge عبر **options. وليس للحَكَم الاحتمالي ولمُصنِّف النموذج وللتتالي صنفٌ في SDK؛ فهي موجودة في YAML فقط.
يقرأ ConversationCompleted وConversationJudge مُخرَجًا فنيًا من نوع conversation/v1 يسجّله نظامك. ولا يقود Oloproof المحادثة: يشغّل تطبيقك كل دور ويسجّل النص الكامل. انظر الوكلاء.
@evaluator
def evaluator(*, criterion, reads=("output", "expected"), cacheable=False, version=None, value_type="binary", score_range=None)يغلّف دالة ذات وسيط واحد، هو الحالة، في CustomEvaluator. للحالة output وexpected وscenario، ويعيد artifacts(name) حمولات نوع مسجَّل. ويجوز أن تكون الدالة def أو async def. يعيد المُقيِّم الثنائي True أو False؛ ويعلن مُقيِّم الدرجة value_type="score" وscore_range=(low, high) ويعيد رقمًا. والاستثناء الذي ترفعه الدالة يسجّل الحالة مفقودة لذلك المعيار، لا إخفاقًا أبدًا.
يجب أن يسرد reads كل حقل تقرؤه الدالة (input، output، expected، metadata، metadata.<key>، أو artifacts.<name>)، لأن الحكم المخزَّن مؤقتًا مفتاحه هذه الحقول بالضبط. ولا يُعاد استخدام الأحكام عبر التشغيلات إلا مع cacheable=True. وتدخل الشيفرة المصدرية للوحدة المعرِّفة في النسخة، فتعديلها يُبطلها. ولا يستطيع YAML تسمية مُقيِّم مخصّص.
التشخيص
diagnose وadiagnose
def diagnose(run_id, **kwargs) -> InterventionResult
async def adiagnose(run_id, *, system, evaluators, intervention, criterion, control=True, top_k=None, reranker=None, reranker_root=None, store=None, concurrency=None) -> InterventionResultيعيد تنفيذ الحالات المُخفِقة لتشغيل مخزَّن تحت تدخّل واحد: "gold-context"، أو "top-k" (مع top_k)، أو "reranker" (مع reranker). يجب أن يكون system وevaluators النسختين اللتين استخدمهما التشغيل؛ والنسخة المختلفة تُرفض قبل تنفيذ أي شيء. ومع control=True تُشغَّل عيّنة ضابطة جديدة بجانب التدخل، كي يمكن تمييز التغيير عن التباين بين تشغيل وآخر. وdiagnose هي الصيغة المتزامنة وتتصرف داخل حلقة قيد التشغيل كما تفعل evaluate. انظر RAG لسير العمل.
يحمل InterventionResult معرّف التشغيل الأصل، والتدخل، وهل كان مدعومًا، وتشغيلَي التدخل والضابط، ونتيجة لكل حالة، وDiagnosisReport من إدخالات CaseDiagnosis حين يُنتَج.
إعادة تشغيل الوكيل
def supports_replay(system) -> bool
def checkpoint_for(trajectory, step_index) -> AgentCheckpoint | None
async def replay_case(system, *, scenario_id, trajectory, checkpoint, change) -> ReplayOutcome
def label_case(outcome) -> CaseDiagnosis
def label_cases(outcomes) -> tuple[CaseDiagnosis, ...]
def unnecessary_steps(labels) -> tuple[UnnecessaryStep, ...]إعادة التشغيل شيء يفعله نظامك، لا شيء يحاكيه Oloproof. ولا يدعمها النظام إلا بتنفيذ async def replay(self, trajectory, *, checkpoint, change) -> AgentTrajectory، الذي يعيد ما فعله الوكيل من نقطة الحفظ فصاعدًا؛ ويلصق Oloproof ذلك على البادئة المسجَّلة ويقارن. ويملك تطبيقك حالته وجلساته والآثار الجانبية لأدواته، بما في ذلك إعادة ضبطها قبل إعادة التشغيل. ويُبلغ supports_replay عمّا إذا كان النظام يعلن هذا التابع.
replay_case روتين مشترك: استخدم await معه، أو استدعِه عبر asyncio.run. وهو يشغّل ضابطًا (نقطة الحفظ نفسها مع ReplayChange(kind="resume")) قبل إعادة التشغيل، ولا يحاول إعادة التشغيل حين لا يعيد الضابط إنتاج التسجيل. وchange هو ReplayChange(kind="drop_step", step_index=...) أو ReplayChange(kind="resume"). ويختار checkpoint_for آخر نقطة حفظ مسجَّلة تقع قبل خطوة ما تمامًا، أو None، وفي هذه الحالة تُستبعد النتيجة بوصفها no_checkpoint_recorded دون لمس النظام.
يحمل ReplayOutcome القيم scenario_id وchange، والحالات النهائية لإعادة التشغيل والضابط، وdiscarded مع سبب حين لا تعطي الحالة أي دليل. والحالة المستبعدة ليست حالة مُخفِقة. ويحوّل label_case النتيجة إلى CaseDiagnosis مع FailureLabel وLabelReason الخاص به؛ ويسرد unnecessary_steps الخطوات التي ترك حذفُها النتيجةَ سليمة. انظر الوكلاء.
الوسوم البشرية والثقة بالمُقيِّم
def record_label(*, run_id, scenario_id, criterion, passed, labelled_by, note=None, purpose="measurement", sample_index=0, config="oloproof.yaml", store=None, ...) -> HumanLabelيخزّن حكم نجاح/إخفاق لشخص واحد على حالة واحدة من تشغيل مخزَّن. وتغذّي الوسوم oloproof evaluators validate، الذي يقيس اتفاق الحَكَم معها (AgreementResult) ويسجّل حالته (RegistryEntry). وتربط وسائط measurement_sample_* الإضافية الوسمَ بعيّنة قياس؛ ويملؤها لك oloproof labels export وoloproof labels import في CLI. انظر الحُكّام.
السياسات في الشيفرة
تبني ReleasePolicy وIntervalThresholdRule وObservedCountRule وDecisionRule (اتحاد الاثنتين) سياسةً دون ملف. وحقولها هي حقول release.yaml في مرجع التهيئة؛ وتأخذ قاعدة الفترة direction (min أو max) وthreshold بدلًا من min: أو max:. وليس لقواعد المقارنة صنف مُصدَّر؛ اكتبها في release.yaml ومرّر مساره.
from oloproof import IntervalThresholdRule, ReleasePolicy
policy = ReleasePolicy(
rules=(IntervalThresholdRule(id="accuracy", metric="correct_label", direction="min", threshold=0.8),),
)صادرات أخرى
| الاسم | ما هو |
|---|---|
| ConcurrencyConfig | حدّا system وjudge، كما في oloproof.yaml. |
| TransientError | ارفعه من نظام، مع retryable=True، لتُعاد محاولة الاستدعاء مع تراجع. |
| ArtifactRef | المرجع الذي يعيده مُخرَج فني مسجَّل: نوعه وبصمته. |
| __version__ | نسخة الحزمة المثبّتة. |