提示系統:分層控制模型行為

提示不是一整塊文字,而是由多層控制面組成的架構。理解每一層的職責與時機,才能精準調校模型行為。

90 秒總覽

Claude Code 的提示並非一整塊靜態文字,而是由多層控制面組成的架構。最外層是系統提示組裝(system prompt assembly),定義基線行為與動態注入區段;中間層包含工具提示、技能指令與記憶注入,各自在特定時機觸發;最內層是側查詢(side-query)與子代理提示,執行高度聚焦的分析任務。整體共有 8 大提示家族,涵蓋從全域行為到單一工具的完整控制範圍。理解這套分層結構,才能在對的層級做對的調校,避免提示之間互相衝突。

執行路徑(主骨架)

當使用者輸入一個回合後,提示系統會按照以下路徑組裝並執行:

input: 使用者訊息
1. 組裝系統提示(靜態基線 + 動態注入)
2. 注入記憶與指令(CLAUDE.md、相關記憶篩選)
3. 送入主模型執行
4. 主模型依需求觸發:
   a. 工具提示 → 工具呼叫
   b. 側查詢 → 聚焦分析(分類、摘要、風險評估)
   c. 技能/指令 → 多階段工作流程
   d. 子代理 → 專責代理執行
flowchart LR
  A[使用者回合] --> B[系統提示組裝]
  B --> C[主模型執行]
  C --> D[工具提示與工具呼叫]
  C --> E[側查詢:聚焦提示]
  C --> F[技能/指令提示擴展]
  C --> G[專責子代理]

每一個分支都有獨立的提示控制面,不會與系統提示混在一起。

8 大提示家族

flowchart TD
  P[提示系統] --> P1[系統提示組裝]
  P --> P2[記憶與指令注入]
  P --> P3[壓縮/摘要提示]
  P --> P4[建議與工作階段提示]
  P --> P5[工具行為提示]
  P --> P6[側查詢提示]
  P --> P7[指令與技能提示]
  P --> P8[代理特化提示]

路徑判讀重點

  • 系統提示是所有下游提示品質的基礎,必須精確且無衝突。
  • 工具提示在工具 schema 暴露與呼叫決策時執行,是操作護欄。
  • 側查詢提示是任務專用的,精確度與輸出格式比創意更重要。
  • 記憶注入在回合開始時執行,需篩選高訊號記憶避免雜訊。

關鍵決策(為什麼這樣設計)

決策 1:分層提示架構而非單一提示

原因:單一巨型提示會在不同職責之間產生衝突(例如安全規則與工具使用指引互相干擾),且難以局部更新。分層設計讓每一層各司其職:系統提示定義基線、工具提示嵌入護欄、側查詢提示聚焦單一任務。

代價:提示散佈在多個檔案中,需要清楚的命名慣例與文件說明才能追蹤。新增提示時必須確認不與其他層級衝突。

決策 2:靜態/動態分割策略

原因:系統提示使用 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 將穩定指令文字(靜態區段)與會話/環境/功能開關相關內容(動態區段)分離。靜態區段可被 API 快取重複使用,大幅減少 token 消耗與延遲。

代價:開發者必須判斷新增內容屬於靜態或動態,分類錯誤會導致快取失效或指令過時。

決策 3:工具提示嵌入操作護欄

原因:工具提示不只描述功能,還明確編碼使用契約與禁止行為(例如「不得使用 AskUserQuestion 來要求計畫核准,應使用 ExitPlanMode」)。這讓模型在工具選擇階段就受到約束,而非事後修正。

代價:工具提示的文字量較大,每次工具 schema 暴露都會消耗額外 token。護欄措辭不夠強時容易被模型忽略。

替代方案與取捨

方案 優點 缺點 為何未採用/何時可採用
單一巨型提示(所有指令合併為一塊) 簡單直覺,所有規則集中管理 職責衝突、難以局部更新、快取效率差 適合極簡應用;Claude Code 的複雜度已超過此方案上限
硬編碼注入(所有指令寫死在程式碼中) 無需動態組裝邏輯,行為完全可預測 無法依環境/功能調整,每次修改需重新部署 適合行為固定的工具;Claude Code 需要依會話/環境動態調整
自由格式輸出(不強制輸出結構) 模型回應更自然,不受格式約束 下游程式碼無法可靠解析,錯誤難以偵測 適合面向人類的對話;機器消費路徑必須使用結構化輸出
抽象指導語(「請謹慎行事」) 撰寫簡單,適用範圍廣 模型解讀不一致,行為不可測試 適合低風險場景;高精度任務需要操作性語言(精確命令、判定標準)

失敗路徑與防護

Failure 1:權限邊界模糊

症狀:提示在應該只做驗證的路徑上編輯了檔案,或在唯讀分析中觸發了寫入操作。

防護:在提示中明確使用「MUST NOT」約束與禁止工具清單,讓模型在決策階段就被限制,而非依賴事後檢查。

Failure 2:輸出格式鬆散

症狀:預期收到 JSON 或判定行(如 VERDICT: PASS|FAIL),模型卻回傳散文式回應,導致下游解析失敗。

防護:強制要求嚴格的 JSON schema 或精確的行格式,並在提示中加入輸出範例。在驗證、會話標題(由 SESSION_TITLE_PROMPT 產生的短標題)、記憶篩選等機器消費路徑上必須落實。

Failure 3:記憶選擇過於廣泛

症狀:記憶召回充滿低訊號雜訊,模型被不相關的歷史記憶干擾,導致回應品質下降。

防護:在記憶篩選提示中設定選擇性標準,明確接受空列表(「寧可不選,也不要選錯」),並限制召回數量上限。

Failure 4:工作流程分支混淆

症狀:模型透過錯誤的工具請求計畫核准(例如用 AskUserQuestion 取代 ExitPlanMode)。

防護:在工具提示中編碼明確的路由規則:「不得使用 X 來執行 Y」,讓模型在工具選擇時就被導正。

Failure 5:長工作階段摘要偏移

症狀:壓縮輸出遺漏了近期使用者意圖,模型在恢復時失去脈絡。

防護:使用「僅近期」變體提示,並要求結構化區段(如 <summary>)確保關鍵資訊不被省略。

實作驗證(你改完要怎麼確認)

合併前檢查

  • 此提示是否掛載在明確命名的執行路徑上?
  • 若輸出由程式碼消費,輸出格式是否為確定性格式(JSON / 判定行 / 結構化區段)?
  • 禁止行為是否已明確寫出(MUST NOT / 禁止工具清單)?
  • 已知的失敗模式是否已在提示文字中記載?
  • 是否與其他層級已有的規則重複?
  • 措辭是否足夠精簡以減少 token 膨脹?

合併後驗證

  • 在真實流程中驗證觸發條件是否正確。
  • 驗證輸出解析在成功與失敗案例上都能正常運作。
  • 抽查提示中聲稱處理的邊界案例是否確實被覆蓋。

這份清單對應漸進式提示設計模板(Progressive Prompt Design Template)的六個層級:目標(Objective)→ 觸發與範圍(Trigger & Scope)→ 程序(Procedure)→ 輸出契約(Output Contract)→ 失敗控制(Failure Controls)→ 證據標準(Evidence Standard)。新增或改寫提示時,按此順序由淺入深逐層填寫。

← 上一頁:代理與擴充 下一頁:Hooks 與自動化 →