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 在複雜長任務中保持高效。