はじめる
Python API
このページの英語版は、翻訳後に変更されています。最新の内容は英語版です。 英語で読む
CLI にできることは、すべてライブラリにもできます。評価を設定ファイルの横ではなく、スクリプト、ノートブック、テストスイートの中に置きたいときに使います。
from oloproof import evaluate, system, current_case
from oloproof.evaluators import ExactMatch, Contains, JsonSchema, Regex, RubricJudge, evaluatoroloproof_core 配下はすべてエンジンの内部実装であり、このインターフェースには含まれません。
システムが受け取るのはケースの入力であり、ケースそのものではない
最初に正しく押さえておく価値があるのはこの 1 点です。誤っても、何も言わずに失敗するからです。
@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 と比較します。
1 回実行する
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 030 ケースすべてが正解でも、区間は 88.4% まで下に伸びています。推定値が何を示していようと、30 ケースで確立できるのはそこまでです。
失敗したケースを読む
システムが例外を送出した場合、そのケースは誤りではなく欠測となり、メトリクスがそれを報告します。
exact_label None lower=0.0 upper=1.0 0 30推定値が None で区間が全範囲の場合、何も観測されなかったことを意味します。推定値を信頼する前に n_missing を確認してください。すべてのケースで例外を送出したシステムでも、構造的には問題のない結果オブジェクトが生成され、それが空であることを教えてくれるのは件数です。
これは分母の契約が失敗したのではなく、役目を果たしているのです(エラーになったケースは除外されず、区間の範囲に織り込まれます)。しかし、代わりに例外を送出してくれるものは何もないので、確認はご自身で行う必要があります。
独自の評価器を書く
@evaluator は関数を評価器に変えます。関数は引数としてケースを 1 つ受け取り、必要なものをそこから読み取ります。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 0reads は、来歴のために、ケースのどの部分を読むかを宣言します。デフォルトは ("output", "expected") です。評価器は True または False を返すか、value_type="score" とスコアの範囲を示す score_range を宣言していればスコアを返します。そのバージョンには、評価器を定義しているファイルのダイジェストが含まれるため、編集するとキャッシュされた判定は無効になります。
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() と、評価器でアーティファクトを読む方法を扱います。
- 候補をベースラインと比較する では、区間が存在する目的であるワークフローを扱います。