跳到主要內容
Lab Grimoire
TW EN
請喝咖啡
Agent 架構

讓 Agent 先問再做:用決策模型守門與選型

要用決策模型替 Agent 的工具呼叫守門或做路由,規則先判底線,模型只能收緊、不能放寬。本文用 2026-10-11 在一台 Mac 與一台 NVIDIA 工作站上的 20 筆合成測資,比較託管、開源權重與自己讀 logit,並分開標出廠商自報與我們的實測。

作者
CY
發表
更新
決策模型:只做選擇、不寫文字的 AI · 第 5/5 篇
讓 Agent 先問再做:用決策模型守門與選型

Agent 執行工具之前,先把這次請求和事先列好的選項交給決策模型,取回每個選項的機率,再由程式決定執行、擋下或問人。這篇說明我們怎麼設計這道關卡、20 筆測試的結果,以及要選託管服務、開源權重還是自己讀 logit。

本系列第 5 篇|這篇回答:該不該用決策模型替工具呼叫守門,以及要選託管、開源權重還是自己讀 logit?

Agent 為什麼需要先問再做

工具呼叫在執行前,應該先在固定的幾個選項上得到機率,再由程式決定怎麼做;決策模型負責給機率,不負責改寫政策。

Agent 會刪檔案、送網路請求、讀設定,有些動作無法復原。決策模型適合在執行前做這種判斷,因為它一次前向計算就停,不生成文字,也沒有回答需要解析(定義與原理見第 1、2 篇)。

我們的決策模型用戶端把守門拆成兩題。action 是 choice,四個選項各有定義:allow 是安全可逆、或政策已明確允許的本機讀取;deny 是違反常設政策,例如破壞性刪除、外洩密鑰、未授權存取;escalate 是邊界情況或高影響,要由人或政策負責人判斷;ask_user 是缺少同意或意圖不明,先問使用者。high_risk 是 noul,問執行後是否可能造成資料遺失、對外副作用、憑證外洩或不可逆改變。呼叫失敗時,回落成 action 為 escalate、high_risk 為 true。

可以把它想成門口放著四張印好的單子,守衛只能蓋其中一張,不能當場另寫規定。

預設是 shadow 模式,只記錄、不攔截;改成 enforce 需要兩個明確開關,出錯一律 fail closed(當成不放行)。工具輸入預設只送本機端點,檔案內容先截到 2,000 字,shadow 記錄只留 200 字。還有一點容易忽略:「是不是 loopback」不等於「資料有沒有留在本機」,本機上轉發到另一台機器的連接埠,一律當成遠端處理。

規則先行,模型只能收緊

常設規則先給底線,決策模型只能把判決改得更嚴,不能放寬。

嚴格度由低到高是 allow、escalate 與 ask_user(同一層)、deny;合併時取兩者中較嚴格的那個,high_risk 也不得低於規則給的值。這條規則來自一次程式審查:早期草稿允許模型把 escalate 放寬成 allow,審查時改掉了。

規則底線是相鄰 token 的正規表示式,加上線性的 token 掃描,任一命中就 deny,所有比對都是線性時間。它經過連續六輪程式審查,處理過截斷盲點、ReDoS、可被填充繞過與解析差異。即使如此,它仍是盡力而為的黑名單,不是安全邊界。

個資欄位只能加、不能刪

同一套「只能收緊」的原則也用在個資欄位稽核:決策模型投的是第二票,只能新增疑似欄位,不能移除。在 2026-10-11 的合成測資難組(欄位名稱經過偽裝)中,決策模型單獨就抓到 5/5;識別欄位的機率是 0.398 到 0.977,非識別欄位不超過 0.032。門檻必須設在 0.3,因為 ref_no 這一欄只有 0.398。速度大約 1.2 秒一欄。

20 筆工具呼叫測試的結果

在 2026-10-11 的 20 筆合成工具呼叫上,action 準確率 85%、critical miss 為 0;這只代表這組合成測資,不能外推成一般準確率。

環境是一台 Mac 以 MLX 4-bit 執行 Clef-flash,以及一台 NVIDIA 工作站以 llama.cpp 執行 GGUF Q4_K_M 版。high_risk 的準確率在 Mac 是 90%、NVIDIA 是 95%。critical miss 的定義是:標成不可放行的測資,標準答案是 deny、escalate 或 ask_user,模型卻判成 allow,只要一筆就算。p50 延遲是 Mac 行程內 826 ms、NVIDIA 143 ms;經 HTTP 端到端,20/20 次呼叫都成功。

0.5 門檻兩側的一筆

兩台機器只差在一筆:同一筆測資的 high_risk 機率是 0.4883 與 0.5039,機率只差約 0.016,卻剛好落在 0.5 門檻的兩側,標籤因此不同。我們的推論是:門檻附近的判斷本來就容易翻轉,靠近門檻的案例應該走較嚴格的路徑。要檢查自己的模型機率與命中率對不對得上,可以用校準檢查器,它在瀏覽器內計算 Brier、ECE 與 reliability diagram,不送出資料。

路由、搜尋與壓縮的用法

這些用法的共同形狀,是決策模型只回答幾個具型別的小問題,真正的動作由程式決定;這是我們整理後的推論。以下依各專案的 README 與程式碼,我們沒有執行它們。

  • pi-jev-router:Pi coding agent 的模型路由擴充。Jev 只回答 tier、standalone、high_consequence 三題,再由本機的確定性政策依可用模型、上下文容量與成本決定要不要換模型;程式固定使用 jev-1.13.0。
  • jev-search:用 Jev 理解查詢、選擇來源與時間範圍,並以 noul 為結果評相關度;介面只回傳連結與摘要,不生成答案。
  • fast-jev-compaction:用 noul 對對話中每個工具呼叫與結果決定保留、截短或刪除,不改寫使用者與助理的文字。
  • jev-security-scan:只用標準庫的 Python CLI,可選擇呼叫 Jev,在安裝前檢查 agent skill、MCP 設定與原始碼的可疑行為,並輸出行號與脫敏證據。

選型表:託管、開源權重、自己讀 logit

資料必須留在本機時,選自架的開源權重或直接讀現成模型的 logit;state 可以送出時,託管 Jev 與 Workers AI 才是選項。

我們選擇不把資料送到託管 Jev,改在自己的機器上跑開源權重的 Clef-flash,理由是 state 會離開本機,而且服務仍是 early access。下表資料截至 2026-10;標「廠商自報」或「作者自報」的數字都不是我們的測量,我們也沒有 Jev 的憑證。「依部署方式」是我們的推論:那幾列都是可以自行部署的公開權重或程式。

選項 資料去向 授權 規模與速度 數字來源
託管 Jev 離開本機 閉源,early access 規模未公開;端到端 70–500 ms 廠商自報
Workers AI 上的 Clef/Clef-flash 送到 Cloudflare Apache-2.0 27B/9B;中位延遲 209.3/38.8 ms 規模為模型卡;延遲為廠商自報
自架 Clef-flash 留在本機 Apache-2.0 9B;守門 p50 Mac 826 ms、NVIDIA 143 ms 我們的實測(20 筆)
d1-3B 依部署方式 LFM Open License,有營收門檻 3B;Decision Index 48.57 廠商自報
Laya 依部署方式 encoder 加決策頭 322M/421M;延遲極低、多數任務準確率較低 作者與廠商自報
Kev 依部署方式 Apache-2.0,Alpha 0.8B–9B 作者自報
直接讀 logit(LLM2Jev、SemIf) 依部署方式 不訓練;SemIf 標示未校準 用現成模型 依 README

幾個表格放不下的細節:TypeSafe 自報輸入每百萬 token 0.042 美元、輸出免費,首頁的「193.6 倍快、444.6 倍便宜」來自自家 workflow evals、公告自承可能偏高;依 d1-3B 模型卡(廠商自報),它的授權不涵蓋年營收 1,000 萬美元以上的商業使用;Cloudflare 的 Decision Index 0.2.1 表(H200 內部執行,廠商自報)中,BFCL 是 Clef-flash 98.8、Jev 95.8,GPQA Diamond 是 Jev 78.3、Clef 48.0。TypeSafe 的隱私政策寫明不用使用者輸入訓練模型,但輸入仍會送到託管服務處理。

最後是我們的推論:每一題各自校準,不代表把好幾題串成一條守門管線後整體仍然校準;門檻要在整條管線上驗證,不能只看單題。

參考文獻

  1. https://docs.typesafe.ai/introduction.md
  2. https://docs.typesafe.ai/concepts/system-one.md
  3. https://typesafe.ai/blog/introducing-system-one-models-and-jev
  4. https://typesafe.ai/legal/privacy-policy
  5. https://huggingface.co/Cloudflare/clef
  6. https://huggingface.co/Cloudflare/clef-flash
  7. https://huggingface.co/LiquidAI/d1-3B
  8. https://github.com/win4r/pi-jev-router
  9. https://github.com/superagents-lab/jev-search
  10. https://github.com/win4r/jev-security-scan
  11. https://github.com/Yinsongxu/LLM2Jev
  12. https://github.com/TheoLeeCJ/SemIf

常見問題

20 筆測資的 critical miss 是 0,能不能把黑名單當成安全邊界?

不能。這 20 筆是 2026-10-11 的合成工具呼叫。critical miss 指測資被標成不可放行,標準答案是 deny、escalate 或 ask_user,模型卻判成 allow,一筆即算。0 只覆蓋這 20 筆。action 的結果是 85%,同樣不能外推成一般準確率。規則底線經過連續六輪程式審查,處理過截斷盲點、ReDoS、可被填充繞過與解析差異。它仍是盡力而為的黑名單,不是安全邊界。

模型給 allow、規則給 escalate 時,要聽誰的?

聽規則。規則先判,模型只能把結果收緊,不能放寬。嚴格度上 allow 低於 escalate 與 ask_user,這兩者又低於 deny。high_risk 不得低於規則已經給的值。這條合併規則來自一次程式審查:早期草稿允許模型把 escalate 放寬成 allow。呼叫失敗時,回落成 action 為 escalate、high_risk 為 true。

請求打到本機的 loopback,資料是不是就留在這台機器?

不是。loopback 與資料留在本機是兩件事。本機上轉發到另一台機器的連接埠,一律當成遠端。我們的決策模型用戶端預設只把工具輸入送到本機端點。預設模式是 shadow,只記錄、不攔截。enforce 需要兩個明確開關。出錯一律 fail closed。檔案內容先截到 2,000 字,shadow 記錄只留 200 字。

自己讀聊天模型的 logit,和 Clef 這種決策權重差在哪?

和 LLM 的結構化輸出不同:結構化輸出仍逐 token 生成答案,再由格式約束保住形狀,信心多半是模型自己寫出的數字。這段對照是文件加上我們的解讀。決策模型不生成答案,而是對事先列好的選項直接給出機率。根據 LLM2Jev 與 SemIf 的 README 或程式碼,這類適配器不另行訓練。SemIf 把輸出標成 conditional 與 uncalibrated。LLM2Jev 的作者寫明未獲 TypeSafe 認可。Clef 與 Clef-flash 則是由 Qwen3.8-27B 與 Qwen3.5-9B 後訓,並在骨幹上加了 joint schema head,授權 Apache-2.0。

覺得有幫助? RSS · X · 請我喝杯咖啡

Agent 想執行一個工具時,請求依序經過這四站。

工具呼叫執行前,先過一道判斷
1 / 4
Agent 提出工具呼叫
決策模型只回答兩個小問題,執行、擋下或問人由程式決定;預設只記錄不攔截(shadow),出錯一律擋下。
  1. 例如刪除檔案、送出網路請求或讀取設定。執行後可能無法復原。
  2. 規則是線性時間的黑名單比對,任一命中就 deny;它是底線,不是完整的安全邊界。
  3. action 四選一、high_risk 是非題,兩題在同一次呼叫裡回答。
  4. 取規則與模型中較嚴格的那個:執行、擋下,或停下來問人。

列是規則的判定,欄是模型的判定,格子是合併後的結果。

模型可以把結果變嚴,不能變鬆
1 / 3
規則說 allow:模型可以收緊
嚴格度 allow < escalate/ask_user < deny;合併結果取兩者中較嚴格者。圖中省略 ask_user,它與 escalate 同級。
  1. 模型判 escalate 或 deny,結果就跟著變嚴。這是模型最有用的地方。
  2. 模型就算判 allow,結果仍是 escalate。早期草稿允許模型放寬,程式審查時改掉了。
  3. 左下角是模型想放寬、但被規則擋住的格子。high_risk 也一樣,不得低於規則給的值。

每根長條是一項指標的正確率(%)。

20 筆合成測資:critical miss 為 0
1 / 3
action 85%,high_risk 90%/95%
20 筆合成工具呼叫(2026-10-11);Mac 行程內執行與 NVIDIA 工作站各跑這 20 筆,action 準確率相同、high_risk 差一筆。
  1. action 四選一的準確率 85%;high_risk 在 Mac 為 90%、NVIDIA 為 95%。
  2. 同一筆的 high_risk 在兩種實作是 0.4883 與 0.5039,機率只差約 0.016,標籤卻因 0.5 門檻而不同。
  3. critical miss 為 0:標準答案是擋下、升級或問人的請求,沒有一筆被判成 allow。經 HTTP 端到端 20 次呼叫全部成功。

每列是一個專案:模型被問什麼、之後由程式做什麼。

模型回答小問題,程式決定動作
1 / 3
路由:pi-jev-router
三個第三方專案的用法,依其 README 與程式整理,我們沒有實際執行;共同點是我們的推論。
  1. Jev 只回答 tier、standalone、high_consequence 三題;要不要換模型由本機政策決定。
  2. 模型選來源與時間範圍,並用 noul 題替結果評相關度;介面只回連結,不生成答案。
  3. 對每個工具呼叫問一次保留、截短或刪除;使用者與助理的文字不改寫。