Agent 設計模式
上下文的三招
當任務跨越多個上下文視窗,每個新視窗都會失憶。生產環境中已驗證三種策略來應對這個根本挑戰,讓 Agent 能在長任務中保持連貫和高效。
根本挑戰
長任務的失憶問題
一個複雜的程式設計任務可能需要 Agent 執行數十步操作,產生數萬 Token 的對話歷史。當上下文視窗快滿時,系統面臨兩難選擇:
Option A:開啟新視窗,但新視窗什麼都不記得,Agent 會重複已做過的工作。
Option B:繼續在舊視窗工作,但隨著 Token 增多,模型的注意力被稀釋,表現下降。
這不是理論問題。Claude Code、Cursor、Devin 這些產品每天都在解決這個問題。
Option A:開啟新視窗,但新視窗什麼都不記得,Agent 會重複已做過的工作。
Option B:繼續在舊視窗工作,但隨著 Token 增多,模型的注意力被稀釋,表現下降。
這不是理論問題。Claude Code、Cursor、Devin 這些產品每天都在解決這個問題。
策略一
1
Compaction
上下文壓縮
當對話快要觸達上下文視窗上限時,用一次 LLM 呼叫對已有對話做摘要:保留關鍵資訊,丟棄冗餘細節,然後在壓縮後的上下文上繼續工作。
- 關鍵決策:選擇什麼保留、什麼丟棄。這是一個資訊理論問題:並非所有 Token 都等價,有些資訊丟了就無法恢復。
- 低風險操作:清理舊的 tool call 結果(比如檔案列表、搜尋輸出),這些通常不影響後續推理。
- 高風險操作:丟棄架構決策的推理過程、未解決的 bug 描述,這些如果丟了,Agent 會重蹈覆轍。
- Claude Code 的實踐:保留架構決策和未解決的 bug 資訊,丟棄冗餘的檔案內容輸出和已完成任務的中間步驟。
實踐 Tip
壓縮時讓 LLM 生成的摘要應該是結構化的,自由文字很難快速定位資訊。例如:「已完成:[列表] | 未完成:[列表] | 關鍵決策:[列表] | 已知問題:[列表]」,這樣後續推理可以快速找到需要的資訊。
策略二
2
Structured Note-taking
結構化筆記
Agent 在執行過程中主動將關鍵資訊寫到外部檔案,而不僅僅依賴對話歷史。當上下文重置(新視窗)後,從筆記檔案讀回這些資訊來恢復記憶。
- 核心思想:把短期記憶(上下文視窗)外化為長期記憶(檔案系統),實現跨視窗的資訊延續。
- Claude Code 的實踐:維護 TODO list 檔案,每完成一步就更新,這樣即使上下文被壓縮或重置,開啟 TODO 就知道進度。
- Claude 打寶可夢的案例:Agent 維護一個遊戲筆記檔案,記錄地圖位置、已獲道具、下一步計劃。每次新對話開始時先讀這個筆記,實現記憶傳遞。
- 關鍵設計:筆記格式要固定且結構化,不能是自由散文,否則讀回來時還要額外 Token 來理解筆記內容。
對比 Compaction
Compaction 是壓縮舊資訊繼續用,Note-taking 是把資訊存到外面以後取用。前者適合連續工作場景,後者適合可能被中斷或需要跨 session 延續的場景。兩者可以組合使用。
策略三
3
Sub-agent Architecture
子 Agent 架構
主 Agent 把需要深入探索的子任務委派給子 Agent。子 Agent 在自己獨立的上下文視窗中工作(可能消耗數萬 Token),最終只返回一個精煉的摘要(1000-2000 Token)給主 Agent。
- 核心價值:關注點分離 + 上下文隔離。子 Agent 的工作草稿不會汙染主 Agent 的上下文。
- Token 經濟:一個子 Agent 可能在內部消耗 30,000 Token 來讀程式碼、分析依賴、做推理,但只向上報告 1,500 Token 的結論。主 Agent 的上下文保持精簡。
- 並行優勢:多個子 Agent 可以同時工作,各自探索不同方向,最後由主 Agent 整合。這比單一 Agent 序列探索快得多。
- 真實應用:Cursor 的 background agent、Claude Code 的 Task tool,都是子 Agent 架構的體現。
類比
想像一個 CEO(主 Agent)讓 3 個部門經理(子 Agent)分別調研競品、分析市場、評估技術。每個經理可能花了一週(大量 Token),但彙報給 CEO 的只是一頁 PPT(精煉摘要)。CEO 的認知頻寬始終保持在戰略層面。
JIT Context vs 預載入
預載入(Preloading)
在對話開始時就把資訊塞進上下文
- CLAUDE.md / Rules 檔案直接載入
- 使用者偏好、專案配置
- 高頻使用的上下文資訊
- 優點:即時可用,無需額外呼叫
- 缺點:每次都佔 Token,不管用不用得到
JIT(Just-In-Time 按需取得)
只在需要時才檢索資訊到上下文
- 用 glob/grep 按需搜尋檔案
- 用 RAG 檢索相關文件
- 呼叫 API 取得即時資料
- 優點:上下文保持精簡,只含當前需要的
- 缺點:多一次工具呼叫的延遲
最佳實踐:混合策略
高頻資訊預載入(專案約定、核心規則、使用者偏好)+ 長尾資訊按需取得(具體檔案內容、API 文件、歷史記錄)。
類比瀏覽器快取策略:熱資料放記憶體快取(預載入),冷資料放磁碟或網路取得(JIT)。目標是讓上下文的命中率最大化:大多數推理所需的資訊已經在視窗裡,偶爾需要的才動態取得。
類比瀏覽器快取策略:熱資料放記憶體快取(預載入),冷資料放磁碟或網路取得(JIT)。目標是讓上下文的命中率最大化:大多數推理所需的資訊已經在視窗裡,偶爾需要的才動態取得。
三種策略對比
| 策略 | 核心思想 | 適用場景 | 代表產品 |
|---|---|---|---|
| Compaction | 壓縮舊上下文,保留關鍵資訊繼續 | 連續長對話,不會被中斷 | Claude Code auto-compact |
| Note-taking | 主動寫筆記到外部,跨視窗讀回 | 可能中斷、需跨 session 延續 | Claude Code TODO、Cursor Rules |
| Sub-agent | 子 Agent 深入探索,只回傳摘要 | 需要深度探索但不想汙染主上下文 | Cursor Task、Claude Code spawn |
長任務的本質挑戰是有限的注意力視窗 vs 無限增長的資訊量。壓縮、筆記、子 Agent 三招,分別解決三個問題:在視窗內保持精簡、跨視窗傳遞記憶、隔離深度探索的噪聲。三者組合使用,才能讓 Agent 在複雜長任務中保持高效。