Ga naar de inhoud

Handleidingen

SDK-referentie

Elke naam die de pakketten oloproof en oloproof.evaluators exporteren, met zijn signatuur, of hij synchroon of asynchroon is, en wat hij teruggeeft. Lees voor een begeleide inleiding eerst De Python-API.

Alleen deze twee pakketten vormen het publieke oppervlak. Alles wat uit oloproof_core wordt geïmporteerd is interne engine en kan zonder aankondiging veranderen. Elke functie hieronder draait lokaal tegen de store van het project; geen ervan stuurt ergens gegevens heen, tenzij een evaluator die je meegeeft een modelprovider aanroept.

Een evaluatie draaien

evaluate en aevaluate

def evaluate(*, system, dataset, evaluators, policy=None, **kwargs) -> EvaluationResult
async def aevaluate(*, system, dataset, evaluators, policy=None, **kwargs) -> EvaluationResult
ArgumentTypeWat het is
systemeen @system-functie, een @rag_system-klasse of -instantie, of een callableHet geteste systeem.
datasetpadEen JSONL-suite. Zie Suites.
evaluatorslijstInstanties uit oloproof.evaluators, of @evaluator-functies.
policypad naar een release.yaml, een ReleasePolicy, of NoneHet releasebeleid. None draait geen gate: result.gate is None en er wordt niets beslist.
concurrencyConcurrencyConfig of een mapping zoals {"system": 8, "judge": 4}Aanroepen die tegelijk lopen.
sliceslijst van stringsVerkennende slices, zoals in oloproof.yaml.
min_slice_supportgeheel getalOnder dit aantal in aanmerking komende cases heeft een slice geen interval. Standaard 30.
replicatesgeheel getalMeet elke case zo vaak. Standaard 1.

evaluate is synchroon. Aangeroepen zonder lopende event loop gebruikt het asyncio.run; aangeroepen binnen een lopende loop (een notebook, een asynchrone test) draait het de evaluatie op een aparte thread en blokkeert tot die klaar is, dus het is op beide plekken veilig. aevaluate is de coroutine; await die vanuit asynchrone code.

De overige keyword-argumenten (metrics, store, predictive, event_sink, retry_policy, traffic_draw_id) nemen enginetypen uit oloproof_core en horen niet bij het stabiele oppervlak.

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)

Gedraaid op een suite van twee cases zonder beleid, printte dit:

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

LidTypeWat het is
runrunrecordDe opgeslagen run, met zijn id, status en volledigheid.
suite, system, evaluatorsversierecordsDe exacte versies die deze run mat.
metricstuple van metriekresultatenEén per criterium en gedeclareerde metriek: metric, estimate, interval, n_total, n_eligible, n_observed, n_missing, exclusions, method.
gategateresultaat of NoneMet een beleid: release_action, exit_code, decisions en reasons.
decisionstupleDe beslissingen van de gate, of leeg zonder beleid.
cases()lijstElke case met zijn uitvoering en oordelen.
failures()lijstCases die niet klaar kwamen, een fout gaven, of voor minstens één evaluator mislukten.
print(stderr=False)geenHet terminalrapport dat oloproof run print.
to_bundle(path)padSchrijft een draagbare bundel, zoals oloproof export doet.

Wat de toestanden, redencodes en aantallen betekenen staat in Resultaten en uitvoering.

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

Draait beide systemen op dezelfde suite in één geseede volgorde en beslist de vergelijkingsregels van het beleid. policy is verplicht en moet minstens één superiority-, non_inferiority- of equivalence-regel bevatten, anders geeft de aanroep een configuratiefout. Extra keyword-argumenten: concurrency, replicates, en de engine-getypeerde metrics, store en retry_policy. Synchroon en asynchroon gedrag zijn als bij evaluate.

ComparisonEvaluationResult heeft candidate en baseline (elk een EvaluationResult) en comparison, dat de gepaarde verschillen en hun beslissingen draagt. Zie Twee versies vergelijken.

Een systeem declareren

@system

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

Bruikbaar zonder argumenten (@system) of met (@system(name=..., version=...)), of aangeroepen op een object (system(model.answer, version="v2")). De functie krijgt het input-object van de case, niet de hele case, en geeft de output terug die evaluators lezen. Ze mag def of async def zijn; een synchrone functie draait op een workerthread.

ArgumentStandaardWat het is
namede naam van de functieDeel van de versie-identiteit.
versionafwezigVerplicht voor een gebonden methode of een callable object, omdat hun gedrag afhangt van toestand die Oloproof niet kan zien.
configleegInstellingen die met de versie worden vastgelegd.
timeout_s120Limiet per aanroep. Een aanroep die hem overschrijdt wordt vastgelegd als een uitvoering met timeout.
recordsleegArtefactsoorten die het systeem vastlegt, zoals retrieval/v1. Een evaluator die een soort vereist die het systeem niet declareert, wordt geweigerd voordat de run begint.

De broncode van de eigen module van de functie gaat mee in de versiedigest, dus wie die bewerkt maakt gecachete uitvoeringen ongeldig. Zie de Configuratiereferentie voor wat dat verder wel en niet doet.

current_case

def current_case() -> CaseRecorder

Alleen beschikbaar terwijl Oloproof je systeem aanroept; overal elders geeft het RuntimeError. De methoden van de recorder:

MethodeLegt vast
usage(*, input_tokens=None, output_tokens=None, cost_usd=None)Tokens en kosten van een modelaanroep. Een weggelaten waarde blijft onvastgelegd, niet nul.
artifact(kind, data)Elke JSON-waarde of elk Pydantic-model onder een soort zoals trace of conversation/v1.
retrieval(retrieval)De gerangschikte kandidaten die een retriever teruggaf (retrieval/v1).
context(context)De context die voor generatie is samengesteld (context/v1).
citations(ids)De ids die een antwoord citeert, als doc_id of doc_id#chunk_id (citations/v1).
agent_trajectory(trajectory)De stappen, toolaanroepen en resultaten, en checkpoints van een agent (agent_trajectory/v1).

Elk geeft een ArtifactRef terug (behalve usage, dat niets teruggeeft). De getypeerde payloads worden geëxporteerd om deze records te bouwen: Retrieval, Passage, Context, ContextItem, DroppedItem, Citations, StageTimings, AgentTrajectory, AgentStep, AgentCheckpoint, AgentConstraintCheck, en de soortnaam 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")

Een klassedecorator. De klasse levert retrieve(input, depth) en generate(input, context), plus count_tokens(passage) als ze een token_budget zet. context is de lijst van Passage-objecten die top_k en het budget overleefden, in rangvolgorde. Oloproof legt zelf retrieval/v1, context/v1, citations/v1 en stage_timings/v1 vast, en cachet elke fase apart. citations_path noemt het outputveld met de ids die het antwoord citeert. Zie RAG.

Evaluators

Alle klassen staan in oloproof.evaluators. Het criterion van elk noemt de metriek die het produceert. Welke artefacten elk leest, en het YAML-equivalent, staan in de evaluatortabel van de Configuratiereferentie.

KlasseSignatuur
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 is standaard 5
MRR, NDCG(k=None, *, criterion=None, relevance_unit="doc"), k is standaard 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")
ConversationJudgeals 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 is "anthropic", "openai" of "openai_compatible". Een judge leest zijn sleutel uit de omgevingsvariabele die api_key_env noemt (standaard ANTHROPIC_API_KEY of OPENAI_API_KEY) en wordt door die provider gefactureerd. Groundedness en CitationSupport nemen de overige instellingen van RubricJudge via **options. De kansjudge, de modelclassifier en de cascade hebben geen SDK-klasse; ze bestaan alleen in YAML.

ConversationCompleted en ConversationJudge lezen een conversation/v1-artefact dat je systeem vastlegt. Oloproof stuurt het gesprek niet aan: je applicatie draait elke beurt en legt het transcript vast. Zie Agents.

@evaluator

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

Verpakt een functie met één argument, de case, tot een CustomEvaluator. De case heeft output, expected en scenario, en artifacts(name) geeft de payloads van een vastgelegde soort terug. De functie mag def of async def zijn. Een binaire evaluator geeft True of False terug; een score-evaluator declareert value_type="score" en score_range=(low, high) en geeft een getal terug. Een exceptie die de functie opwerpt legt de case voor dat criterium vast als ontbrekend, nooit als mislukking.

reads moet elk veld noemen dat de functie leest (input, output, expected, metadata, metadata.<key> of artifacts.<name>), omdat het gecachete oordeel precies op die velden is gesleuteld. Oordelen worden alleen met cacheable=True tussen runs hergebruikt. De broncode van de definiërende module gaat mee in de versie, dus wie die bewerkt maakt ze ongeldig. YAML kan geen eigen evaluator noemen.

Diagnose

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

Voert de mislukte cases van een opgeslagen run opnieuw uit onder één interventie: "gold-context", "top-k" (met top_k) of "reranker" (met reranker). system en evaluators moeten de versies zijn die de run gebruikte; een andere versie wordt geweigerd voordat er iets wordt uitgevoerd. Met control=True draait er naast de interventie een verse controlesteekproef, zodat een verandering te onderscheiden is van variatie tussen runs. diagnose is de synchrone vorm en gedraagt zich binnen een lopende loop zoals evaluate. Zie RAG voor de werkwijze.

InterventionResult bevat het id van de ouderrun, de interventie, of die ondersteund werd, de interventie- en controleruns, een uitkomst per case, en een DiagnosisReport met CaseDiagnosis-items als er een is gemaakt.

Agent-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 is iets wat je systeem doet, niet iets wat Oloproof simuleert. Een systeem ondersteunt het alleen door async def replay(self, trajectory, *, checkpoint, change) -> AgentTrajectory te implementeren, dat teruggeeft wat de agent vanaf het checkpoint deed; Oloproof plakt het vastgelegde begin ervoor en vergelijkt. Je applicatie beheert haar eigen toestand, sessies en neveneffecten van tools, inclusief het terugzetten ervan vóór een replay. supports_replay meldt of een systeem de methode declareert.

replay_case is een coroutine: await hem, of roep hem aan via asyncio.run. Hij draait vóór de replay een controle (hetzelfde checkpoint met ReplayChange(kind="resume")), en probeert de replay niet als de controle de opname niet reproduceert. change is ReplayChange(kind="drop_step", step_index=...) of ReplayChange(kind="resume"). checkpoint_for kiest het laatste vastgelegde checkpoint strikt vóór een stap, of None, waarna de uitkomst wordt verworpen als no_checkpoint_recorded zonder het systeem aan te raken.

ReplayOutcome draagt scenario_id, change, de eindstatussen van de replay en de controle, en discarded met een reden als de case geen bewijs oplevert. Een verworpen case is geen mislukte case. label_case maakt van een uitkomst een CaseDiagnosis met een FailureLabel en zijn LabelReason; unnecessary_steps noemt de stappen waarvan het weglaten de uitkomst intact liet. Zie Agents.

Menselijke labels en vertrouwen in evaluators

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

Slaat het geslaagd/mislukt-oordeel van één persoon over één case van een opgeslagen run op. Labels voeden oloproof evaluators validate, dat de overeenstemming van een judge ermee meet (AgreementResult) en zijn status vastlegt (RegistryEntry). De verdere measurement_sample_*-argumenten binden een label aan een meetsteekproef; oloproof labels export en oloproof labels import in de CLI vullen ze voor je in. Zie Judges.

Beleid in code

ReleasePolicy, IntervalThresholdRule, ObservedCountRule en DecisionRule (de vereniging van die twee) bouwen een beleid zonder bestand. Hun velden zijn de release.yaml-velden uit de Configuratiereferentie; een intervalregel neemt direction (min of max) en threshold in plaats van min: of max:. Vergelijkingsregels hebben geen geëxporteerde klasse; schrijf ze in release.yaml en geef het pad mee.

from oloproof import IntervalThresholdRule, ReleasePolicy

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

Andere exports

NaamWat het is
ConcurrencyConfigLimieten voor system en judge, zoals in oloproof.yaml.
TransientErrorWerp hem op vanuit een systeem, met retryable=True, om de aanroep met backoff opnieuw te laten proberen.
ArtifactRefDe referentie die een vastgelegd artefact teruggeeft: zijn soort en digest.
__version__De geïnstalleerde pakketversie.