VacantAI 的可究責層GitHub

系統架構 · L3 / L4 / 主力路徑 · 

可執行驗收層

可見測資 V 用來放行,隱藏測資 GT 只用來事後評分。沙箱讓候選程式在結構上看不到測試碼。驗收套件是資料不是程式,否則攻擊者能讓量具兩方向都滿分卻交付垃圾。

#L3 可見與隱藏的分離

每一道題目的需求由三部分組成:題目敘述、公開的輸入契約、驗收測資。

驗收測資切成兩組:

誰看得到用途
可見 V代理可以讀系統以它決定放行或拒交;修訂流程也只拿得到它的失敗訊息
隱藏 GT只有事後評分不得進入生成、選擇、修訂提示或停止條件

一份程式通過可見、卻沒通過隱藏,就是一次假交付。這是「產出看起來像需求,但不是需求」這個問題的可操作形式。

#動態稽核:隱藏測資有沒有漏進去

版本做法結果
v1關鍵詞比對90 筆偽陽性
v2改以「這段文字是誰寫的」為判準R460R 與 R529 全部 67 個區塊零違規;獨立程序掃 2,497 份提交文字、164,963 個比對項,零命中(附正控制)
回溯全臂補掃(2026-09-18)179 份紀錄、約 349 萬比對項165 無違規、10 無法驗證、4 判為違規(4 份皆屬未收官的 R530)

#沙箱

候選程式在獨立行程中執行:

限制值
時間10 秒
記憶體128 MiB
工作目錄暫存目錄
環境變數不繼承

測試程式與候選程式分處兩個行程,以帶隨機標記、只允許字面值的遠端呼叫溝通,使候選程式在結構上看不到測試碼。

實測(2026-07-09,24 通呼叫,思考模式開啟)延遲:中位數 9.1 秒、p95 40.0 秒、最大 41.7 秒,總計 5.4 分鐘;Hermes 端到端約 78 秒。

#L4 驗收套件是資料

#問題:量具可以被餵成廢的

2026-09-06 的攻擊實驗(R451)顯示,只要驗收套件是一段「被信任的程式碼」,攻擊者就能寫出有狀態的變體讓量具失效:量具兩方向都滿分,交付率卻掉 −75.20 pp,而量具仍然回報 ok。

371 題的批次裡,套件被綁進 commit 後,平凡套件得到 371/371 全拒(正常);但有狀態的變體讓交付率掉 75 個百分點,而量具回報 ok。

#修法:SuiteSpec

套件只包含三樣東西:

  1. 方言(dialect)
  2. 進入點名稱
  3. 「輸入—期望值」的字面值清單

執行器只跑自己的確定性渲染器從這份資料產生測試碼,渲染結果的雜湊可以跨機器比對。

攻擊修補前修補後
exec 走私368 / 3710 / 371
殘餘:generic_gauged—+2.72 pp
殘餘上界:weak_oracle—+4.35 pp

把驗收套件從程式變成資料之後

#量具檢查:單邊保證

套件在使用前還要通過量具檢查:參考解必須通過、每一個已知的錯誤樣本必須被擋下。

#CONFORM 與 H-MIX

兩條規則共用同一個閘門語意,差別在失敗之後做什麼。

#CONFORM(重抽)

依序生成候選 → 每份跑可見驗收 → 第一份通過者放行 → 最多五份 → 全不通過則拒交。拒交計為失敗,分母是全部題目。

#H-MIX(修訂)

  1. 第一輪提示包含題目原文、允許匯入的標準函式庫清單,以及一行「先用題目中的範例手動檢查你的函式」。
  2. 取出程式碼後先做零沙箱靜態預檢(語法、禁用的匯入與屬性、進入點是否存在),不過就回覆無法載入的原因。
  3. 在沙箱中執行可見驗收,通過即放行。
  4. 失敗時計算失敗簽名(失敗種類、例外型別、訊息雜湊)。若與上一輪相同,第一次附加「換個做法」的提示,第二次直接拒交。
  5. 每題上限:5 通呼叫、32,000 token、900 秒。
  6. 回饋訊息以 AssertionError: args=… got=… want=… 的固定格式呈現,過長者截斷。
  7. 脈絡只保留第一則使用者訊息、上一則模型回覆與這一則回饋。

見五次複製的裁決

#假交付率

R532 較大模型實驗(836 題、43 個區塊、0 作廢):

臂接受假交付率(占全部)占接受
CONFORM81112014.4%14.8%
OFF62521125.2%—

閘門把假交付大約砍掉四成,不是對半。論文原本寫「halved」,在事實查核中被判為 ERROR E6——那兩個率用了不同的分母。

#接下來

最後更新: · 閱讀約 5 分鐘

世新大學世新大學資訊傳播學系Vacant

世新大學資訊傳播學系 2026 畢業專題・實體展覽