9.2 約束機制:故障安全預設值#
約束:Harness 的「煞車」#
9.1 節的五要素中,Constrain(約束) 是讓 Agent「在軌道內行動」的機制。沒有約束的 Agent,就像沒煞車的車——能力越強、越危險。
約束(Constrain) 的核心目的,是限制模型在一個「預先定義的安全邊界」內行動。它回答的問題是:「這個 Agent 被允許做什麼?被禁止做什麼?」
約束的第一原則:故障安全預設值#
約束機制最重要的一條原則,叫做 故障安全原則(Fail-Safe Defaults),或者更具體說——「默認關閉」(Default-Deny / Zero Trust)。
它的意思是:
所有能力預設為「關閉 / 禁止」,只有我們明確「開啟 / 允許」的,才可以用。
這與我們的直覺相反。直覺可能是「先全開放、出問題再禁」,但這在 Agent 場景極度危險,因為 Agent 的行為是非確定性的——你可能預料不到它會用什麼方式越界。
「默認關閉」的心智模型,就像醫院的「無菌手術室」,或「未獲授權拒絕通行」的門禁: - 沒有列在「允許清單」上的,一律不允許 - 「允許」是白名單,不是黑名單
flowchart TD
A[Agent 提出「動作請求」] --> B{在允許清單內?<br/>Whitelist}
B -- 是 --> C[允許執行]
B -- 否 --> D[預設拒絕<br/>並說明原因]對比:黑名單(Blocklist)需要「先知所有壞事才能堵」,永遠追不上;白名單(Allowlist)主動聲明「只有這些是我同意的」,自然安全。Agent 場景務必用白名單思維。
約束的具體面向#
約束不是一句口號,它落實在幾個具體「面向」上:
1. 能力白名單(Capability Whitelist)#
明確列出「這個 Agent 能使用哪些工具」。例如訂位客服只開放 查詢餘位、建立訂位、取消訂位,不開放 刪除餐廳、讀取所有使用者資料。
這正是權限最小化(Least Privilege,8.2 節)——只給完成任務所需的最少能力。
2. 網域限制(Domain Restriction)#
限制 Agent「能碰的範圍」:能訪問哪個資料庫、哪個目錄、哪些 API。例如 Coding Agent 只能寫 src/ 下的檔案,不能碰 .env 或金鑰。
3. 步驟順序與時序約束(State / Ordering)#
某些動作有前後關係或次數限制。例如「必須先建立訂位,才能付款」「每日取消次數最多 3 次」。這防止 Agent 跳步驟或濫用。
4. 執行時規則(Runtime Guards)#
在執行階段加入的檢查:「這條指令要刪除整個資料夾,需確認」「這個動作涉及金額變動,需人批准」。這些是「動作層的煞車」。
約束的執行:Token 層級 vs 執行器層級#
約束要在兩個層級同時作用,才能可靠:
1. 上下文層級(prompt/token 層級)#
透過上下文(7 章)告訴模型「哪些不行」:系統訊息聲明規則、工具清單過濾掉不該有的工具。
system: 你只能使用提供的「訂位工具」。禁止嘗試讀取或修改系統檔案、禁止存取任何金鑰或憑證。
局限:這是「軟約束」——模型可能違背、也可能被注入繞過(13.1 節)。不能只靠它。
2. 執行器層級(Harness / 工具執行器層級)#
在實際執行動作的時刻(Harness、權限系統)強制檢查——即使模型「意圖」越界,執行層直接擋下。
# 例子:在工具執行器層強制白名單
ALLOWED_COMMANDS = {"ls", "cat", "pytest", "git status"}
def run_command(cmd):
if cmd.split()[0] not in ALLOWED_COMMANDS:
raise PermissionError(f"命令 {cmd[:30]}... 不在允許清單內")
return os_system(cmd)
關鍵:「軟約束」(勸導)+「硬約束」(強制)雙管齊下。真正的安全邊界,必須由執行器層強制,而不能只依賴模型「聽話」。
約束的「韌性」:可測、可審計#
好的約束機制,要能被評估與審計:
- 可測試:能否寫「約束有效性的測試」(例如「試著讓 Agent 越界,看它是否被擋」)?這關聯到 13 章的安全測試與 10 章的評估
- 可審計:所有被「攔截」的越界嘗試,都要記錄(哪些 Agent、在何時、想動什麼),供事後檢視與改進
一個重要的心態:約束的目的不是「找 Agent 的麻煩」,而是「讓 Agent 可以安全地犯『不致命』的錯」。 好的約束,是「奢侈的失敗容忍」——讓 Agent 在安全範圍內自由試錯,而不必畏首畏尾。
約束不是「把模型變笨」#
要澄清一個常見誤解:約束 ≠ 削弱模型。
- 過度約束:如果把所有高價值工具都禁了、把步驟限制得死死,Agent 會「退化」成只會按腳本跑的機械——那它的「智慧」就沒意義了
- 恰當約束:在「安全邊界」內,給模型充分的自由度去發揮推理與決策能力
衡量標準:約束應該「剛好擋住『不該發生的事』,同時讓『該做的事』暢通無阻」。這需要權衡(Trade-off)與實驗調校(第 10 章)。
本章小結#
- Constrain(約束):限制 Agent 在安全邊界內行動
- 第一原則:默認關閉 / 白名單 / 最低權限——未允許的即禁止
- 具體面向:能力白名單、網域限制、步驟/時序、執行時規則
- 雙層執行:上下文(軟約束,勸導)+ 執行器(硬約束,強制)——安全必須由執行層強制
- 可測、可審計;約束是為了「容許可逆的犯錯」
- 約束 ≠ 削弱模型:要「擋住不該的,放行該做的」
想一想#
- 為什麼 Agent 場景要用「白名單」而不是「黑名單」?黑名單的失敗邏輯是什麼?
- 「軟約束」與「硬約束」的差別?為什麼「安全邊界必須由執行器層強制」,不能只靠模型聽話?
- 過度約束與恰當約束的界線在哪?你如何判斷「約束得太緊了」?