Skip to content

はじめる

Python API

このページの英語版は、翻訳後に変更されています。最新の内容は英語版です。 英語で読む

CLI にできることは、すべてライブラリにもできます。評価を設定ファイルの横ではなく、スクリプト、ノートブック、テストスイートの中に置きたいときに使います。

from oloproof import evaluate, system, current_case
from oloproof.evaluators import ExactMatch, Contains, JsonSchema, Regex, RubricJudge, evaluator

oloproof_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 0

30 ケースすべてが正解でも、区間は 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 0

reads は、来歴のために、ケースのどの部分を読むかを宣言します。デフォルトは ("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 です。満たすべきルールがないので、判断することもありません。

次に読むページ