Source code for rath.eval.runner

"""Offline evaluation runner and baseline regression gate."""

from __future__ import annotations

from collections.abc import Awaitable, Callable, Sequence
from uuid import UUID, uuid4

from rath.eval.models import (
    Dataset,
    EvaluationResult,
    Evaluator,
    Example,
    Experiment,
    GateDecision,
)
from rath.runtime import Run

__all__ = ["EvaluationRunner", "regression_gate"]


[docs] class EvaluationRunner:
[docs] async def run( self, dataset: Dataset, *, revision_id: UUID, execute: Callable[[Example], Awaitable[Run]], evaluators: Sequence[Evaluator], ) -> Experiment: results: list[EvaluationResult] = [] for example in dataset.examples: run = await execute(example) for evaluator in evaluators: results.append(await evaluator.evaluate(example, run)) return Experiment( id=uuid4(), dataset_id=dataset.id, revision_id=revision_id, results=tuple(results), )
[docs] def regression_gate( candidate: Experiment, *, baseline: Experiment, maximum_regression: float = 0.02, minimum_score: float = 0.8, ) -> GateDecision: if candidate.mean_score < minimum_score: return GateDecision.FAIL if candidate.mean_score < baseline.mean_score - maximum_regression: return GateDecision.FAIL return GateDecision.PASS