Zum Inhalt springen

Anleitungen

SDK-Referenz

Jeder Name, den die Pakete oloproof und oloproof.evaluators exportieren, mit seiner Signatur, ob er synchron oder asynchron ist und was er zurückgibt. Für eine geführte Einführung lesen Sie zuerst Die Python-API.

Nur diese beiden Pakete sind die öffentliche Oberfläche. Alles, was aus oloproof_core importiert wird, sind Interna der Engine und kann sich ohne Ankündigung ändern. Jede Funktion unten läuft lokal gegen den Store des Projekts; keine sendet Daten irgendwohin, es sei denn, ein übergebener Evaluator ruft einen Modell-Provider auf.

Eine Evaluation ausführen

evaluate und aevaluate

def evaluate(*, system, dataset, evaluators, policy=None, **kwargs) -> EvaluationResult
async def aevaluate(*, system, dataset, evaluators, policy=None, **kwargs) -> EvaluationResult
ArgumentTypWas es ist
systemeine @system-Funktion, eine @rag_system-Klasse oder -Instanz oder ein CallableDas getestete System.
datasetPfadEine JSONL-Suite. Siehe Suites.
evaluatorsListeInstanzen aus oloproof.evaluators oder @evaluator-Funktionen.
policyPfad zu einer release.yaml, eine ReleasePolicy oder NoneDie Release-Policy. None führt kein Gate aus: result.gate ist None, und nichts wird entschieden.
concurrencyConcurrencyConfig oder ein Mapping wie {"system": 8, "judge": 4}Gleichzeitig laufende Aufrufe.
slicesListe von StringsExplorative Slices, wie in oloproof.yaml.
min_slice_supportGanzzahlUnter so vielen zulässigen Fällen hat ein Slice kein Intervall. Standard 30.
replicatesGanzzahlJeden Fall so oft messen. Standard 1.

evaluate ist synchron. Ohne laufende Event-Loop aufgerufen, verwendet es asyncio.run; aus einer laufenden Loop heraus (ein Notebook, ein asynchroner Test) führt es die Evaluation in einem eigenen Thread aus und blockiert, bis sie fertig ist, sodass es an beiden Orten sicher ist. aevaluate ist die Coroutine; warten Sie in asynchronem Code mit await darauf.

Die übrigen Schlüsselwortargumente (metrics, store, predictive, event_sink, retry_policy, traffic_draw_id) nehmen Engine-Typen aus oloproof_core und gehören nicht zur stabilen Oberfläche.

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)

Auf einer Suite mit zwei Fällen ohne Policy ausgeführt, gab dies aus:

correct_label 1.0 lower=0.15811388300841903 upper=1.0 2 0
short_label 1.0 lower=0.15811388300841903 upper=1.0 2 0

EvaluationResult

MitgliedTypWas es ist
runLauf-DatensatzDer gespeicherte Lauf, mit seiner id, seinem Status und seiner Vollständigkeit.
suite, system, evaluatorsVersions-DatensätzeDie genauen Versionen, die dieser Lauf gemessen hat.
metricsTupel von MetrikergebnissenEines pro Kriterium und deklarierter Metrik: metric, estimate, interval, n_total, n_eligible, n_observed, n_missing, exclusions, method.
gateGate-Ergebnis oder NoneMit einer Policy: release_action, exit_code, decisions und reasons.
decisionsTupelDie Entscheidungen des Gates, oder leer ohne Policy.
cases()ListeJeder Fall mit seiner Ausführung und seinen Urteilen.
failures()ListeFälle, die nicht fertig wurden, einen Fehler hatten oder mindestens einen Evaluator nicht bestanden.
print(stderr=False)keinerDer Terminalbericht, den oloproof run ausgibt.
to_bundle(path)PfadSchreibt ein portables Bundle, wie oloproof export.

Was die Zustände, Begründungscodes und Zählungen bedeuten, steht in Ergebnisse und Ausführung.

evaluate_comparison und 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

Führt beide Systeme auf derselben Suite in einer geseedeten Reihenfolge aus und entscheidet die Vergleichsregeln der Policy. policy ist erforderlich und muss mindestens eine superiority-, non_inferiority- oder equivalence-Regel enthalten, sonst wirft der Aufruf einen Konfigurationsfehler. Weitere Schlüsselwortargumente: concurrency, replicates und die Engine-typisierten metrics, store und retry_policy. Synchrones und asynchrones Verhalten sind wie bei evaluate.

ComparisonEvaluationResult hat candidate und baseline (jeweils ein EvaluationResult) und comparison, das die gepaarten Differenzen und ihre Entscheidungen trägt. Siehe Zwei Versionen vergleichen.

Ein System deklarieren

@system

def system(func=None, *, name=None, version=None, config=None, timeout_s=None, records=())

Verwendbar ohne Argumente (@system) oder mit (@system(name=..., version=...)) oder auf ein Objekt angewendet (system(model.answer, version="v2")). Die Funktion erhält das input-Objekt des Falls, nicht den ganzen Fall, und gibt die Ausgabe zurück, die Evaluatoren lesen. Sie darf def oder async def sein; eine synchrone Funktion läuft in einem Worker-Thread.

ArgumentStandardWas es ist
nameder Name der FunktionTeil der Versionsidentität.
versionfehltErforderlich für eine gebundene Methode oder ein aufrufbares Objekt, weil ihr Verhalten von Zustand abhängt, den Oloproof nicht sehen kann.
configleerEinstellungen, die mit der Version aufgezeichnet werden.
timeout_s120Limit pro Aufruf. Ein Aufruf, der es überschreitet, wird als Ausführung mit Timeout aufgezeichnet.
recordsleerArtefaktarten, die das System aufzeichnet, etwa retrieval/v1. Ein Evaluator, der eine Art verlangt, die das System nicht deklariert, wird vor dem Start des Laufs abgewiesen.

Der Quelltext des eigenen Moduls der Funktion geht in den Versions-Digest ein, sodass eine Änderung daran gecachte Ausführungen ungültig macht. Was sonst dazu führt und was nicht, steht in der Konfigurationsreferenz.

current_case

def current_case() -> CaseRecorder

Nur verfügbar, während Oloproof Ihr System aufruft; anderswo wirft es RuntimeError. Die Methoden des Recorders:

MethodeZeichnet auf
usage(*, input_tokens=None, output_tokens=None, cost_usd=None)Tokens und Kosten eines Modellaufrufs. Ein weggelassener Wert bleibt unaufgezeichnet, nicht null.
artifact(kind, data)Jeden JSON-Wert oder jedes Pydantic-Modell unter einer Art wie trace oder conversation/v1.
retrieval(retrieval)Die gerankten Kandidaten, die ein Retriever zurückgab (retrieval/v1).
context(context)Den für die Generierung zusammengestellten Kontext (context/v1).
citations(ids)Die IDs, die eine Antwort zitiert, als doc_id oder doc_id#chunk_id (citations/v1).
agent_trajectory(trajectory)Die Schritte, Tool-Aufrufe und Ergebnisse sowie Checkpoints eines Agenten (agent_trajectory/v1).

Jede gibt eine ArtifactRef zurück (außer usage, das nichts zurückgibt). Die typisierten Payloads zum Aufbau dieser Datensätze werden exportiert: Retrieval, Passage, Context, ContextItem, DroppedItem, Citations, StageTimings, AgentTrajectory, AgentStep, AgentCheckpoint, AgentConstraintCheck und der Artname 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")

Ein Klassendekorator. Die Klasse stellt retrieve(input, depth) und generate(input, context) bereit, dazu count_tokens(passage), wenn sie ein token_budget setzt. context ist die Liste der Passage-Objekte, die top_k und das Budget überstanden haben, in Rangfolge. Oloproof zeichnet retrieval/v1, context/v1, citations/v1 und stage_timings/v1 selbst auf und cacht jede Stufe getrennt. citations_path benennt das Ausgabefeld mit den IDs, die die Antwort zitiert. Siehe RAG.

Evaluatoren

Alle Klassen liegen in oloproof.evaluators. Das criterion jeder Klasse benennt die Metrik, die sie erzeugt. Welche Artefakte jede liest und ihr YAML-Gegenstück stehen in der Evaluator-Tabelle der Konfigurationsreferenz.

KlasseSignatur
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 ist standardmäßig 5
MRR, NDCG(k=None, *, criterion=None, relevance_unit="doc"), k ist standardmäßig 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")
ConversationJudgewie 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 ist "anthropic", "openai" oder "openai_compatible". Ein Judge liest seinen Schlüssel aus der Umgebungsvariable, die api_key_env benennt (standardmäßig ANTHROPIC_API_KEY oder OPENAI_API_KEY), und wird von diesem Provider abgerechnet. Groundedness und CitationSupport nehmen die übrigen Einstellungen von RubricJudge über **options. Der Wahrscheinlichkeits-Judge, der Modell-Klassifikator und die Kaskade haben keine SDK-Klasse; es gibt sie nur in YAML.

ConversationCompleted und ConversationJudge lesen ein conversation/v1-Artefakt, das Ihr System aufzeichnet. Oloproof steuert die Konversation nicht: Ihre Anwendung führt jeden Turn aus und zeichnet das Transkript auf. Siehe Agenten.

@evaluator

def evaluator(*, criterion, reads=("output", "expected"), cacheable=False, version=None, value_type="binary", score_range=None)

Verpackt eine Funktion mit einem Argument, dem Fall, in einen CustomEvaluator. Der Fall hat output, expected und scenario, und artifacts(name) gibt die Payloads einer aufgezeichneten Art zurück. Die Funktion darf def oder async def sein. Ein binärer Evaluator gibt True oder False zurück; ein Score-Evaluator deklariert value_type="score" und score_range=(low, high) und gibt eine Zahl zurück. Eine Ausnahme der Funktion zeichnet den Fall für dieses Kriterium als fehlend auf, nie als Fehlschlag.

reads muss jedes Feld aufführen, das die Funktion liest (input, output, expected, metadata, metadata.<key> oder artifacts.<name>), weil das gecachte Urteil genau auf diese verschlüsselt ist. Urteile werden nur mit cacheable=True über Läufe hinweg wiederverwendet. Der Quelltext des definierenden Moduls geht in die Version ein, sodass eine Änderung daran sie ungültig macht. YAML kann keinen eigenen Evaluator benennen.

Diagnose

diagnose und 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

Führt die fehlgeschlagenen Fälle eines gespeicherten Laufs unter einer Intervention erneut aus: "gold-context", "top-k" (mit top_k) oder "reranker" (mit reranker). system und evaluators müssen die Versionen sein, die der Lauf verwendet hat; eine andere Version wird abgewiesen, bevor irgendetwas ausgeführt wird. Mit control=True läuft neben der Intervention eine frische Kontrollstichprobe, sodass sich eine Änderung von der Variation zwischen Läufen unterscheiden lässt. diagnose ist die synchrone Form und verhält sich in einer laufenden Loop wie evaluate. Den Ablauf beschreibt RAG.

InterventionResult enthält die ID des Elternlaufs, die Intervention, ob sie unterstützt wurde, die Interventions- und Kontrollläufe, ein Ergebnis pro Fall und einen DiagnosisReport aus CaseDiagnosis-Einträgen, wenn einer erzeugt wurde.

Agenten-Replay

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, ...]

Replay ist etwas, das Ihr System tut, nicht etwas, das Oloproof simuliert. Ein System unterstützt es nur, indem es async def replay(self, trajectory, *, checkpoint, change) -> AgentTrajectory implementiert und zurückgibt, was der Agent ab dem Checkpoint tat; Oloproof fügt das aufgezeichnete Präfix an und vergleicht. Ihre Anwendung besitzt ihren Zustand, ihre Sitzungen und die Nebeneffekte ihrer Tools und setzt sie auch vor einem Replay zurück. supports_replay meldet, ob ein System die Methode deklariert.

replay_case ist eine Coroutine: Warten Sie mit await darauf oder rufen Sie sie über asyncio.run auf. Sie führt vor dem Replay eine Kontrolle aus (derselbe Checkpoint mit ReplayChange(kind="resume")) und versucht das Replay nicht, wenn die Kontrolle die Aufzeichnung nicht reproduziert. change ist ReplayChange(kind="drop_step", step_index=...) oder ReplayChange(kind="resume"). checkpoint_for wählt den letzten aufgezeichneten Checkpoint strikt vor einem Schritt, oder None; dann wird das Ergebnis als no_checkpoint_recorded verworfen, ohne das System zu berühren.

ReplayOutcome trägt scenario_id, change, die Endzustände von Replay und Kontrolle und discarded mit einem Grund, wenn der Fall keine Evidenz liefert. Ein verworfener Fall ist kein fehlgeschlagener Fall. label_case macht aus einem Ergebnis eine CaseDiagnosis mit einem FailureLabel und seinem LabelReason; unnecessary_steps listet die Schritte auf, deren Entfernen das Ergebnis unverändert ließ. Siehe Agenten.

Menschliche Labels und Vertrauen in Evaluatoren

def record_label(*, run_id, scenario_id, criterion, passed, labelled_by, note=None, purpose="measurement", sample_index=0, config="oloproof.yaml", store=None, ...) -> HumanLabel

Speichert das Bestanden/Nicht-bestanden-Urteil einer Person über einen Fall eines gespeicherten Laufs. Labels speisen oloproof evaluators validate, das die Übereinstimmung eines Judges mit ihnen misst (AgreementResult) und seinen Status aufzeichnet (RegistryEntry). Die weiteren measurement_sample_*-Argumente binden ein Label an eine Messstichprobe; oloproof labels export und oloproof labels import in der CLI füllen sie für Sie aus. Siehe Judges.

Policies im Code

ReleasePolicy, IntervalThresholdRule, ObservedCountRule und DecisionRule (die Vereinigung der beiden) bauen eine Policy ohne Datei. Ihre Felder sind die release.yaml-Felder der Konfigurationsreferenz; eine Intervallregel nimmt direction (min oder max) und threshold statt min: oder max:. Vergleichsregeln haben keine exportierte Klasse; schreiben Sie sie in release.yaml und übergeben Sie deren Pfad.

from oloproof import IntervalThresholdRule, ReleasePolicy

policy = ReleasePolicy(
    rules=(IntervalThresholdRule(id="accuracy", metric="correct_label", direction="min", threshold=0.8),),
)

Weitere Exporte

NameWas es ist
ConcurrencyConfigDie Limits system und judge, wie in oloproof.yaml.
TransientErrorWerfen Sie sie aus einem System mit retryable=True, damit der Aufruf mit Backoff wiederholt wird.
ArtifactRefDie Referenz, die ein aufgezeichnetes Artefakt zurückgibt: seine Art und sein Digest.
__version__Die installierte Paketversion.