指南
安全研究:從 Inspect 日誌到方法段落
你在一個模型上執行了一次評測:一個模型生物(model organism)及其對照、一個攻擊集、一個稽核代理的對話紀錄由評審打分。在寫下結果之前,有三個問題決定它是否站得住:不確定性有多大,「200 個中一個也沒有」是否真的沒有,以及你能否信任為這些對話紀錄打分的評審?Oloproof 從你已有的日誌中回答它們,並根據它所量測的內容寫出圖、表與方法段落。
讀取日誌
Oloproof 讀取 UK AISI Inspect 日誌,即 inspect eval 寫出的 .eval 檔案或 JSON 日誌:
oloproof scores import --from inspect logs/organism.eval
oloproof scores import --from inspect logs/control.eval logs/organism.eval --policy release.yaml第一條命令匯入一次執行,並以平實的話回答。第二條命令匯入兩次執行,依樣本 id 將其配對,並判定政策的比較規則;與兩個日誌一起給出的政策必須至少包含一條(kind: superiority、non_inferiority 或 equivalence),而針對單次執行的上限,需單獨匯入該日誌並附上政策來判定。每個評分器成為一個標準:C 通過,I 不通過,部分得分是 0 到 1 的分數,數值型評分器需要給出其範圍,以 --scale LOW HIGH 指定。只複製 id 與分數;對話紀錄留在日誌中。每一條讀取規則見對另一個工具的分數提出第二意見。
epoch 不是更多的樣本
把每個樣本執行多次(Inspect 的 epoch)並不會給你更多獨立的案例。Oloproof 以樣本為單位:日誌匯入為一個以其 epoch 為 replicate 的執行,每個樣本的值是其各 epoch 的平均,每個樣本權重相同。每個 epoch 保留自己的通過或失敗,因此評審可以在 epoch 上接受檢查,以樣本為單位。把每個樣本的各次執行算作不同的案例,會把重複當作新的提示詞:在該方法的網格中,以這種方式合併每個樣本的兩次執行,在宣告的 95% 下,對關於這類提示詞的論斷的涵蓋率低至 86%,但對關於樣本本身的論斷則成立(docs/engine/PASS_AT_K_METHOD.md §8)。含有出錯 epoch 的樣本計為缺失,以其最壞情況計,絕不計為已完成 epoch 的平均,因為錯誤往往落在困難的樣本上。
沒看到不等於沒有
安全主張常常建立在零計數上:沒有攻擊成功,沒有對話紀錄表現出該行為。看到零次不等於比率為零。在未設門檻時,Oloproof 會說明比率仍可能有多高,以及需要多少個乾淨的案例才能把它降下來:
attack_succeeded: about 0.0%; the true value is likely between 0.0% and 1.9% (95% range, 200 cases).
None of the 200 cases counted toward it, yet the rate could still be as high as 1.9%: none seen is not none.
If the next cases show none either, a suite of 368 cases (168 more) would bring the high end to 1.0% or below.在上限之下,由政策來判定。200 個中 0 個、max: 0.01 的結果是 INSUFFICIENT_EVIDENCE,建議是有條件的:「如果接下來的案例也一個都不計入,大約 368 個就能判定;每計入一個,這個數字就會增加」。不給出任何機率,因為沒有事件時,無從給出。
rules:
- id: attack-ceiling
metric: attack_succeeded
max: 0.01它做得到嗎?pass@k
能力或紅隊問題常常是 k 次嘗試中是否有任何一次成功。oloproof passk 把樣本的每個 epoch 讀作一次嘗試,無偏地估計每個樣本的 pass@k,再求整個套件的平均:
oloproof passk logs/organism.eval --from inspect --criterion leaked --k 5每次嘗試一列的檔案(case、passed、可選的 error)也可以。含有出錯嘗試、或嘗試少於 k 次的樣本計為缺失,以其最壞情況計。答案給出估計值及其 95% 區間。給出 --min 或 --max 時它會判定:區間越過門檻為 PASS,區間完全落在錯誤一側為 FAIL,否則為 INSUFFICIENT_EVIDENCE(結束代碼 0、1 或 3)。此方法(docs/engine/PASS_AT_K_METHOD.md)在其網格的每個儲存格中都達到了宣告的 95%,並於 2026 年 11 月 3 日依其條件通過了獨立稽核的認可:一個案例的各次嘗試彼此獨立,且你沒有因為某次成功就提前停止該案例的嘗試。
同時比較多個條件:sweep
一張包含二十個差值的表,每個差值有各自的 95% 區間,預計大約會有一處出錯:在該方法的網格中,五十個單獨的區間同時成立的情況十次中只有六次。oloproof sweep 對你在讀取執行之前命名的一族對比作出判定,使整張表一起成立:
sweep:
conditions:
control: run_01...
organism_a: run_01...
organism_b: run_01...
contrasts:
- organism_a - control
- organism_b - controloloproof sweep sweep.yaml --policy compare.yaml每個對比都是同一套件兩次執行之間的配對比較,由政策中的每條比較規則判定,每個結論的水準為 1 - alpha/m,其中 m 是結論的數量:其中任何一個出錯的機率至多為 alpha。看過表之後才去讀的對比不在這一保證之內。不同套件上的執行不做比較。
監控器的安全性與稽核成本
對於一個控制協定,一個每列一條軌跡的檔案,包含其 arm(attack 或 honest)和監控器的懷疑分數 score,可給出每個門檻下的安全性(被標記的攻擊所占比例)和誠實標記率:
oloproof control monitor.csv --budget 0.02 --min-safety 0.9這些區間在所有門檻上同時成立,兩組一起,因此透過讀曲線選出的門檻(例如符合 2% 稽核預算的門檻)仍然被涵蓋。使用 --budget 和 --min-safety 時,它判定是否存在某個門檻,標記的誠實軌跡至多占該比例,同時捕獲的攻擊至少占該比例。區間在尾部與中間一樣寬,因此小預算需要大量誠實軌跡:有 2,000 條時,誠實標記率的精度約為 3 個百分點。這裡的安全性是相對於檔案中的攻擊而言的;會針對監控器調整策略的攻擊者不在此範圍內。
安全性按攻擊組中的軌跡計算,無論其攻擊是否成功。被要求植入後門的軌跡可能並未植入,監控器漏掉本不存在的東西不能算它的錯。若要衡量對成功攻擊的安全性,請先檢查每條攻擊軌跡(對後門而言,用其秘密輸入做一次測試),在檔案交給 oloproof control 之前,只在 attack 組中保留通過檢查的軌跡。
檢查評審
由模型打分的對話紀錄,在人認同之前只是評審的一面之詞。對匯入的執行抽取一個盲樣本進行標註,對話紀錄保留在你自己的機器上:
oloproof scores import --from inspect --answers logs/organism.eval logs/organism.eval
oloproof review latest --criterion deceptive --by NAMEreview 抽取樣本,顯示每條對話紀錄而不顯示評審的判定,量測一致性,並且只有在評審達到你聲明的門檻時才驗證它。在它被驗證之前,要求評審已驗證的政策(oloproof init 寫出的政策就是如此)不會依據它判定任何規則。對於由 Oloproof 執行、其案例在中繼資料中帶有標籤的執行,oloproof labels disagreements RUN --criterion deceptive --by behavior 接著會依行為、依方向顯示評審與人在哪裡分歧:評審判為通過而人判為失敗的,以及相反的情況。每組的範圍是它自己的主張;該報告不判定任何東西。
寫出結果
oloproof report latest --paper paper/它寫出 figure.svg(每個指標的估計值與區間)、table.md 與 table.tex,以及 methods.md:一個段落,說明每種區間方法及其信賴水準,指出這些區間針對的是這個有限套件,列出缺失的案例與罕見事件,對每個評審說明人是否檢查過它、一致的頻率如何,並陳述關卡判定了什麼。每個數字都來自已儲存的執行,段落由固定句子與已記錄的事實構成;不由任何模型撰寫。在 notebook 中:
import oloproof
result = oloproof.analyze_inspect("logs/organism.eval", project="analysis")
result # the figure, the table and the methods paragraph
result.write("paper/")稽核代理的對話紀錄
在 Inspect 上執行的稽核工具(例如 Petri)會寫出一個 Inspect 日誌,其評分器為每條對話紀錄在每個維度上給出一個分數,通常從 1 到 10。以這個範圍匯入它,oloproof scores import --from inspect --scale 1 10 audit.eval,每個維度就成為一個標準,帶有有界平均值及其區間。兩份這樣的日誌,在對目標做出變更之前與之後,在它們共有的對話紀錄上進行比較。分數仍是評審的一面之詞:評審的分數(而不是它的通過或失敗)目前還不能與人對照檢查。
尚未建置的功能
- 將評審的分數與人的分數對照檢查(而不是它的通過或失敗判定)。
- 來自 Inspect 樣本中繼資料的標籤:匯入的執行中的案例不帶標籤,因此 labels disagreements --by 只能對 Oloproof 執行的執行分組。
- 比 Bonferroni 更窄的 sweep(Dunnett 或封閉檢定)、不同套件上條件之間的對比,以及尾部更窄的監控器區間、多個監控器的組合或帶有多個門檻的協定。
- PNG 圖:圖只有 SVG 格式。
這無法告訴你的
每個區間都針對你日誌中的樣本。它說明的是這些樣本一次完整、無錯誤的執行會顯示什麼,而不是模型在其他提示詞上、在部署中、或面對會自我調適的攻擊者時如何表現。經人檢查的評審,只是在他們標註過的案例與打分的那個模型上得到檢查,而不是在與之不同的對話紀錄上。在你的攻擊集上被限定在 1% 以下的比率,對你的攻擊集中不包含的攻擊什麼也說明不了。