開始使用
Python API
本頁的英文版本在翻譯之後已有變更。英文頁面為最新版本。 閱讀英文版
CLI 能做的一切,函式庫都能做。當評估應該放在腳本、notebook 或測試套件裡,而不是放在設定檔旁邊時,就使用它。
from oloproof import evaluate, system, current_case
from oloproof.evaluators import ExactMatch, Contains, JsonSchema, Regex, RubricJudge, evaluatoroloproof_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 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() 以及如何在評估器中讀取成品。
- 將候選版本與基準版本比較 說明這些區間所服務的工作流程。