Skip to content

開始使用

Python API

本頁的英文版本在翻譯之後已有變更。英文頁面為最新版本。 閱讀英文版

CLI 能做的一切,函式庫都能做。當評估應該放在腳本、notebook 或測試套件裡,而不是放在設定檔旁邊時,就使用它。

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

oloproof_core 底下的一切都屬於引擎內部實作,不屬於這個公開介面。

系統接收的是案例的輸入,而不是案例本身

這是最值得先弄對的一件事,因為弄錯的時候它會悄悄地失敗。

@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 相比較。

執行一次

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

三十個案例全部正確,區間仍然向下延伸到 88.4%。無論估計值怎麼說,三十個案例所能確立的就只有這麼多。

解讀失敗的案例

如果系統拋出例外,該案例會是缺失而不是錯誤,而指標會回報這一點:

exact_label None lower=0.0 upper=1.0 0 30

估計值為 None、區間涵蓋整個範圍,表示什麼都沒有被觀察到。在信任估計值之前,請先檢查 n_missing:一個每個案例都拋出例外的系統,所產生的結果物件在結構上完全正常,而告訴你它是空的,正是這個計數。

這是分母契約在發揮作用,而不是它的失誤——出錯的案例會被納入區間界限,而不是被丟棄——但不會有任何東西替你拋出例外,所以這項檢查得由你來做。

撰寫自己的評估器

@evaluator 會把函式變成評估器。函式接收一個參數,也就是案例,並從中讀取它需要的內容: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:沒有可以未達標的規則,也就沒有什麼需要決定。

下一步