Agent 設計模式

上下文的三板斧

當任務跨越多個上下文窗口,每個新窗口都會失憶。生產環境中已驗證三種策略來應對這個根本挑戰,讓 Agent 能在長任務中保持連貫和高效。

根本挑戰
長任務的失憶問題
一個複雜的編程任務可能需要 Agent 執行數十步操作,產生數萬 Token 的對話歷史。當上下文窗口快滿時,系統面臨兩難選擇:

Option A:開啓新窗口,但新窗口什麼都不記得,Agent 會重複已做過的工作。
Option B:繼續在舊窗口工作,但隨着 Token 增多,模型的注意力被稀釋,表現下降。

這不是理論問題。Claude Code、Cursor、Devin 這些產品每天都在解決這個問題。
策略一
1
Compaction
上下文壓縮
當對話快要觸達上下文窗口上限時,用一次 LLM 調用對已有對話做摘要:保留關鍵信息,丟棄冗餘細節,然後在壓縮後的上下文上繼續工作。
實踐 Tip
壓縮時讓 LLM 生成的摘要應該是結構化的,自由文本很難快速定位信息。例如:「已完成:[列表] | 未完成:[列表] | 關鍵決策:[列表] | 已知問題:[列表]」,這樣後續推理可以快速找到需要的信息。
策略二
2
Structured Note-taking
結構化筆記
Agent 在執行過程中主動將關鍵信息寫到外部文件,而不僅僅依賴對話歷史。當上下文重置(新窗口)後,從筆記文件讀回這些信息來恢復記憶。
對比 Compaction
Compaction 是壓縮舊信息繼續用,Note-taking 是把信息存到外面以後取用。前者適合連續工作場景,後者適合可能被中斷或需要跨 session 延續的場景。兩者可以組合使用。
策略三
3
Sub-agent Architecture
子 Agent 架構
主 Agent 把需要深入探索的子任務委派給子 Agent。子 Agent 在自己獨立的上下文窗口中工作(可能消耗數萬 Token),最終只返回一個精煉的摘要(1000-2000 Token)給主 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)。目標是讓上下文的命中率最大化:大多數推理所需的信息已經在窗口裏,偶爾需要的才動態獲取。
三種策略對比
策略 核心思想 適用場景 代表產品
Compaction 壓縮舊上下文,保留關鍵信息繼續 連續長對話,不會被中斷 Claude Code auto-compact
Note-taking 主動寫筆記到外部,跨窗口讀回 可能中斷、需跨 session 延續 Claude Code TODO、Cursor Rules
Sub-agent 子 Agent 深入探索,只回傳摘要 需要深度探索但不想污染主上下文 Cursor Task、Claude Code spawn
長任務的本質挑戰是有限的注意力窗口 vs 無限增長的信息量。壓縮、筆記、子 Agent 三板斧,分別解決三個問題:在窗口內保持精簡、跨窗口傳遞記憶、隔離深度探索的噪聲。三者組合使用,才能讓 Agent 在複雜長任務中保持高效。