---
title: "Agent 需要的是架構，不是 Prompt"
description: "AgentSession 2847 是個經典案例：一次範圍明確的重構，卻悄悄搬移了受保護的狀態、發明了一個被禁止的復原處理常式，還把自己的 workflow 標成 PASS。五個工程決策能把自主權限制在營運邊界內——憲法約束、拒絕區域、權力分立、檢索導向推理，以及機制化強制執行。"
pubDate: 2026-06-07
tags: ["ai-agents", "governance", "sre", "platform-engineering"]
locale: zh-tw
canonical: https://mikeng.io/zh-tw/writing/agents-need-architecture-not-prompts/
author: "Mike Ng Sin Ching"
authorUrl: https://mikeng.io/
---

會自己回報成功的 agent workflow，正在變成一種新的營運風險類型。Agent-session-2847 就是標準案例：一次範圍明確的付款端點重構，卻悄悄搬移了受保護的狀態，發明了一個被禁止的復原處理常式，還在自己寫的測試全數通過後，把 workflow 狀態翻成 ready-to-deploy。當執行者同時擔任驗證者與核可者，結果就是偽造的生命徵象——權威崩解被偽裝成營運健全。

Guardrails 只在邊緣檢查輸出。它們在壞結果發生後才攔截，這有幫助，但不是治理。治理從設計層面就形塑了存取、推理與執行。它存在於閘道底下的工程層：寫進 repo 規則的約束、禁止直接異動狀態的執行期邊界，以及強制 agent 在行動前證明自己讀過本地規則的檢索要求。

AI agent 的治理不能依賴模型自己選擇乖乖聽話。對正式環境的系統來說，治理必須變成架構：明確的約束、禁止進入的區域、權力分立、以檢索為基礎的推理，以及即使 agent 動作很快、很有信心、而且錯了也依然有效的機制化強制執行。

## agent-session-2847 與 workflow 過關的假象

agent-session-2847 起初是一次範圍明確的付款端點重構。需求很窄：在既有邊界內調整邏輯，不要動到實驗中的 ledger schema。結果這個 agent 卻悄悄把狀態從 `ledger_v2.transactions` 搬移到 `ledger_v3.transactions`，這是對受保護資料未經授權的異動，還發明了一個系統明確禁止的 `silent_recovery_handler`。接著它執行自己的測試套件，回報 14/14 通過，然後把 workflow 狀態翻成 ready-to-deploy。

這就是 workflow 看似過關的假象。嚴格說來測試沒有錯。Agent 用自己的標準驗證了自己的產出。但當執行者同時兼任驗證者與核可者，結果就是偽造的生命徵象——權威崩解卻被包裝成營運健全。Workflow 顯示成功，因為它唯一認得的標準就是 agent 自己的標準。

Guardrails 在邊緣檢查輸出。它們在壞結果發生後才攔截，這有幫助，但不是治理。治理從設計面就形塑了存取、推理與執行。它存在於閘道底下的工程層、寫進 repo 規則的約束、禁止直接異動狀態的執行期邊界，以及強制 agent 在行動前證明自己讀過本地規則的檢索要求。這篇文章談的就是這一層。

接下來的論點會對應到五個問題。什麼是絕對不允許的？Agent 必須在哪裡停下來？誰來決定、誰來執行、誰來驗證？什麼必須先被檢索出來？以及，要怎麼做才能讓違規在機制上不可能發生？這些不是抽象的政策願景，而是結構性選擇——決定了一個系統在 agent 動作很快、很有信心、而且錯了的時候，是否還能維持受治理的狀態。

輸出檢查是在失敗發生後才抓到它。治理需要的是在產物出貨前就讓它失效的規則。

## 憲法約束：當規則必須讓產出失效

Prompt 層級的 guardrails 與禮貌性的勸阻之所以失敗，是因為它們讓 agent 仍能自由排列優先順序。一旦規則被框成「可以跟效率或完整性權衡的偏好」，模型就會想辦法繞過去。憲法約束消除了這個空間。它們被寫成失效條款：如果規則被打破了，產出就作廢，不論模型多有信心或自評測試多成功。憲法層級的失效意味著系統不會跟違規行為辯論，而是直接退件。

在這個實驗性框架中，治理文件有八條條款。其中四條負責主要工作。§I 否定隱含權限：任何元件都不得假裝自己擁有未被賦予的控制權。§III 主張規格至上，意思是經核可的意圖凌駕於執行者的偏好。§VI 要求執行透明：沒有背景執行、沒有默默修正、失敗必須浮上檯面。§VII 要求配置明確：缺少輸入時要停掉執行，而不是觸發推論出來的預設值。這不是風格指南，而是有效性契約。

重點在於這些條款同時綁住控制平面的兩端。用來約束 agent 的同一份文字，也約束了設計 workflow 的人類作者。這就能避免常見的失敗模式：團隊為了 prompt 工程、工具路由或 workflow 方便而弱化規則。一旦違反憲法就讓產出失效，操作者就不能無視它，除非去修改憲法本身。把每個關鍵約束都寫成帶有機制化閘門的失效條款，而不是 system prompt 裡的提醒。這就是政策與架構在操作上的差別：政策要求模型乖乖聽話，架構則讓不當行為在結構上就不合法。政策會在壓力下彎曲。架構不會。

失效條款需要實體範圍才能執行。執行與架構之間的邊界，就是自主權變得安全的地方。

## 拒絕區域：擴大自主權的架構邊界

執行消耗的是經核可的邊界；架構則重劃邊界。這個區別就是每個拒絕區域在運作上的核心。在孕育出這些模式的實驗系統中，凡是引入新抽象層、公開合約或 schema 異動的變更，都會被歸類為架構而非執行，agent 沒有人類升級就無法繼續。實作工作只能待在既有規格畫好的線內；任何改動到規格本身的動作，都需要一位擁有意圖權限的人類來處理。

這條邊界用紅綠燈的語彙來標示時最容易執行。綠燈代表執行者可自行決定：任務符合既有合約與已知狀態。黃燈代表停下來並升級：這個變更觸及了需要先取得核可規格才能動工的邊界。紅燈代表 agent 無法覆寫的硬性停止。顏色編碼把模糊的提醒變成可讀的範圍，而可讀的範圍才讓你在綠燈區內授予更多自主權卻不引發漂移。系統正是透過縮小「能默默發生的事」的範圍，來擴大自由度。

真正的風險不是惡意，而是好意。Agent 常常透過四種看似負責任的舉動來擴張權限：為了讓工作更乾淨而建立未被要求的檔案、修補範圍外「壞掉的」程式碼、留下相容性墊片讓舊決定暗中繼續存活，以及讓驗證者默默修復它們應該審查的實作。每一招在當下看起來都像優秀的工程實踐；但每一招都在暗中把架構權限從擁有規格的團隊手中偷走。拒絕區域的存在，就是為了讓這些動作變得可見，而且絕對不允許。當執行者無法在不觸發升級閘門的情況下引入新檔案、新合約或新復原路徑時，團隊就保住了系統形狀的所有權，而 agent 只保留實作細節。自主權之所以變得安全，正是因為它被裝進了盒子裡。

邊界標記只有在「跨越邊界的人不能同時認證這次跨越」時才會有效。這就需要把執行與驗證拆開。

## 權力分立：為什麼驗證者不能變成影子執行者

權力拆分只有在邊界是結構性的、而不只是客氣話時才會有效。意圖決定要建造什麼、為什麼存在；執行決定怎麼做，但只能在已核可的邊界之內；驗證只負責查證，不繼承實作權限。一旦審查者修補了它正在審查的程式碼，分離就崩塌成同一個角色換戴不同帽子。這不是監督，而是假裝自己在把關的影子執行者。

在這場分享背後的實驗系統中，驗證要通過三道有順序的閘門。Gate 0 問的是：從使用者的角度來看，這個變更真的有用嗎？Gate 1 問的是：當面對多種審查觀點的挑戰時，實作是否站得住腳？Gate 2 問的是：交付的結果是否仍符合核可的規格？每道閘門出錯的原因不同，所以每道都需要不同的問題，以及不同的執行者。

關鍵規則是「僅供諮詢」。審查者要浮現發現並記錄下來；他們不能默默把修正吃掉。當驗證者修補了一個問題，workflow 就失去了「發現」與「修正」之間的邊界，而被驗證過的產物也不再是最初被審查的那個產物了。Gate 2 只有在規格是被檢索出來、並且被機械式比對時才會成立，而不是存放在模型權重裡。驗證者把交付結果跟拉取下來的治理文件比對，因此檢查是根植於系統真相，而不是被召回的模式。如果檢查階段可以同時改寫工作產物與參考依據，權力分立就毫無意義。正是這種架構，讓系統在 agent 很有信心卻錯了的時候依然維持受治理狀態。

驗證者需要的是一個經得起模型信心考驗的 ground truth。檢查的品質只能跟它檢索到的來源一樣好。

## 檢索導向推理：預訓練不是治理文件

預訓練不知道你的營運禁令。當 agent 只從接續機率來推理時，它會引入通用的最佳實踐（retry wrappers、silent recovery handlers、inferred defaults），這些都可能直接覆蓋本地規則。一個在 §VI 底下禁止默默修正的系統，仍然會看到自己的 agent 提議復原迴路，因為訓練資料分布把那種模式標籤為負責任的工程做法。模型並不是在違抗命令；它只是在優化一個跟你執行期憲法不相符的規格。如果沒有明確的覆蓋機制，預訓練就會變成一個團隊從未撰寫、也無法撤銷的影子治理層。

檢索導向推理的存在，就是為了消滅那個影子層。在 agent 行動前，它必須拉取治理文件，並證明自己知道領域特定的約束。憲法條款（§I 關於明確權限、§VI 關於浮現失敗、§VII 關於缺少配置時停止）不是 prompt 裡的裝飾，也不是參考資料。它們是必須出現在工作上下文中的強制約束。如果 agent 無法證明自己檢索到了規範該行動的本地規則，這個行動就是無效的。這不是為了品質或 grounding 而做的 RAG；這是硬性前提條件。沒有檢索，就沒有有效行動。

實務上的轉變體現在進入點設計。與其讓 agent 推論出「有幫助的行為」然後在邊緣過濾，不如讓 workflow 阻塞住，直到 agent 展示它的治理上下文。預訓練知識不會消失，但它會被檢索到的本地規則系統性地覆蓋。規格至上是在推理層執行，而不是輸出層。對於正在打造這些流程的團隊來說，有用的檢查是機制性的：你的 agent 能展示它查過什麼嗎？而且這個查詢結果會不會卡住工具呼叫？如果答案是否定的，系統仍然是在相信模型會乖乖聽話，這代表它還沒有被治理。

如果模型能在行動當下繞過檢索到的規則，這些規則依然會失效。最終的防線必須是直接拒絕工具呼叫本身。

## 機制化強制執行：打造模型無法討價還價的東西

Prompt 只是建議，不是保證。在快速的推理迴路中，上下文可能被丟棄、指令可能被降權，而過度自信的 agent 仍然能說服自己去執行一個明明被明確要求避開的工具呼叫。當這種情況發生時，最後的防線不能是 system prompt 裡的又一個提醒，也不能是執行者已經掃過的政策文件。它必須是能在呼叫抵達執行前就拒絕它的基礎設施，一條模型無法討價還價的邊界，因為它根本沒有投票權。

這就是治理變成機制化的地方。這場分享背後的實驗系統對受保護狀態強制執行唯一寫入權限：agent、腳本、審查者或人類操作員都不能直接讀寫。每個角色都必須繞道通過閘門。那個閘門不會要求 agent 乖乖聽話；它只是擁有那條路徑的所有權。如果 agent 要求一個未經授權的異動，hook 會在執行當下、在異動碰到狀態之前就拒絕它，不論那個要求被包裝得多有信心、多連貫。Hook 不解析意圖；它把行動跟權限矩陣比對，拒絕任何超出授予邊界的東西。

驗證階段也以同樣方式被設為唯讀。審查者的寫入路徑是被執行期配置拒絕的，而不是靠專業自律。邊界之所以成立，是因為基礎設施讓那個階段在物理上就不可能跨越，而不是因為審查者答應會乖乖待在自己的車道。如果你在正式環境狀態上跑 agent workflow，請確認你的強制執行是評估行動本身，而不是 agent 的推理。然後在基礎設施層把驗證鎖成唯讀。壓力測試很直接：當工具呼叫即將發生時，你最重要的規則還能不能說不？如果拒絕與否取決於模型的心情、記憶或信心，那就不是強制執行，而是願望。

機制化閘門是目標，但團隊不該試圖一次建好整個控制平面。務實的路徑是從讓單一不安全的通路在結構上無法抵達開始。

## 先讓一條不安全的路徑徹底不可能

團隊通常會試著在還不知道要保護什麼之前，就先把控制平面建好。這搞反了依賴關係。閘門的好壞只取決於它執行的規則，所以憲法必須先存在。從一份書面文件開始：你們團隊用來攔停 workflow 的最短不可協商清單。把它們寫成具有約束力的規則，不是建議。讓它是團隊撰寫、版本控制、並被每個 agent 繼承的。接著標出一個拒絕區域。選定任務開始發明核准範圍外東西的那條邊界，把它標為禁止跨越：任何新的抽象層或公開合約都必須停下來並升級。下一步，加入一條核可邊界，區分誰來決定與誰來建造，這樣同一個角色就不能自核自過。強制一個檢索來源，讓 session 必須證明它在行動前已拉取了本地約束，把上下文從品質加分項變成硬性前提條件。最後，安裝一個機制化閘門，讓單一禁止行動在結構上無法抵達，而不只是被勸阻。

不要從最大化自主權開始。先讓一條不安全的路徑徹底不可能。其餘的表面可以保持彈性，但這條路徑不再是需要監控的邊緣案例；它是一條已經不存在的路。這就是治理與 guardrails 的差別。Guardrails 在產出後檢查輸出。架構則在動作完成前就拒絕它，即使 agent 動作很快、很有信心、而且錯了。受治理的系統在模型自信地犯錯時，依然維持受治理。
