Agent 上下文管理四大家族:殊途同歸的工程實踐 (Context Management in Agent Harnesses)
原始來源與檔名:20260512_2026-04-28T092549+0800-Agent 框架的上下文管理:四种实现,殊途同归.md
來源:[[@verysmallwoods]] / X (Twitter) — 2026-04-28
原始檔名:2026-04-28T092549+0800-Agent 框架的上下文管理:四种实现,殊途同归.md
NAPKIN | 餐巾紙
餐巾紙公式
Agent Context Management = File Truncation (Hard limits + Offset/Limit) + Session Compaction (LLM Summarization at 80% capacity) + Out-of-Context Persistence (Large outputs pushed to disk, leaving 2KB stubs) + Sub-agent Isolation (Blank slates or strictly filtered whitelists).
當 Agent 運行時間拉長,200K 的 Context 視窗也一定會被塞爆。本文從源碼層面拆解了 Pi, OpenClaw, Claude Code, Letta 四大框架的上下文管理策略。最驚人的發現是:它們在面對「大文件讀取」、「超長會話壓縮」與「子代理隔離」這三個問題時,獨立演化出了幾乎一模一樣的解法。Agent 框架的終極使命,不是把所有東西都丟給模型,而是像作業系統的記憶體管理(分頁、Swap)一樣,主動在幕後調度狀態。
一句話
這是一篇極硬核的 Agent 框架架構級分析文。作者對比了 Pi、OpenClaw、Claude Code、Letta 四套框架的源碼,發現它們都在解決同一個物理限制:上下文不夠用。於是所有框架都收斂到相似的防禦機制:讀檔時先截斷並要求模型翻頁;工具輸出過大時卸載到磁碟只留預覽;對話過長時呼叫 LLM 進行摘要壓縮(Compaction)並確保不切斷工具呼叫邊界。最好的上下文管理,是讓 Agent 感覺記憶無限,但框架在底層精準調度。
餐巾紙草圖
[ The Universal Agent Context Playbook ]
1. File Reading:
[>256KB?] -> Reject -> Suggest `grep` or `limit/offset`.
[<256KB?] -> Read -> Truncate at 2000 lines -> Prompt model to fetch next page.
2. Heavy Tool Outputs (e.g., massive JSON/Grep):
Save full output to disk -> Inject 2KB preview into context window.
3. Session Compaction (When Context > 80%):
Keep recent 20k tokens + Drop older turns -> Feed to LLM for Summary -> Inject Summary as a "User Message".
ROUND 1: SKELETON | 骨架掃描
“這篇文章在說什麼”
- 核心命題: 上下文不再是模型被動接收的緩衝區,而是框架必須主動管理的「工作集 (Working Set)」。
- 場景一:大文件讀取:
- 框架不相信模型能自己處理巨量字節。
- Pi / OpenClaw 採用硬上限截斷 (2000 行 / 50KB) 並附加提示詞教模型如何翻頁。
- Claude Code 採用雙層防禦(字節級拒絕 + Token 級截斷),並有文件去重機制。
- Letta 則是記憶體先行,強制向量化,上下文只放一小段,鼓勵模型用檢索工具。
- 場景二:會話裁剪 (Compaction):
- 四個框架都採用「Token 閾值觸發」的 LLM 摘要壓縮機制。
- 保留最近的歷史,把舊的歷史餵給 LLM 做摘要,然後把摘要當作新的 User Message 插入。
- 工具呼叫安全: 壓縮時必須沿著 Tool-call / Tool-result 的邊界切割,否則會破壞 API 結構。
- 查詢前優化: Claude Code 會將超過 50,000 字元的工具輸出直接存入磁碟,上下文中只留 2KB 預覽。
- 場景三:子代理 (Sub-agents) 隔離:
- 四個框架都沒有把父會話的完整歷史丟給子 Agent。子 Agent 都是從空白會話開始,或者只拿到嚴格過濾的白名單(如
AGENTS.md, 技能等),實現權限與上下文的隔離。
- 四個框架都沒有把父會話的完整歷史丟給子 Agent。子 Agent 都是從空白會話開始,或者只拿到嚴格過濾的白名單(如
ROUND 2: DISSECTION | 血肉解剖
“憑什麼這麼說”
核心論證鏈
- 無限上下文的錯覺: 就算模型支援百萬 Token,填滿它的成本與延遲也是災難性的。因此,所有生產級 Agent 都必須回到 1970 年代作業系統的設計老路:虛擬記憶體與分頁機制 (Paging & Swap)。
- 防禦性設計 (Defensive Design): AI 的行為是不可測的,框架必須「假設 AI 會做蠢事」(例如一口氣讀取 10MB 的 Log 檔)。因此在工具調用前 (Stat 檢查)、調用中 (字節截斷)、調用後 (Token 壓縮),都必須設置攔截閘門。
- 框架的終極收斂: Pi 和 Letta 的出發點不同,Claude Code 是寫碼的,Alyx 是看數據的。但當工程師們遇到 OOM (Out of Memory) 或 API 拒絕時,他們最終寫出來的防護邏輯竟然驚人地一致。這證明了「Agent 框架」這個軟體分類的底層抽象已經成熟。
關鍵證據
- 具體參數的收斂:保留 Token 數通常在 15,000~20,000 之間;壓縮觸發點通常在上下文的 50%~90% 之間;大檔案預設讀取行數被限制在 2000 行。
邊界條件
- 這種依賴 LLM 做 Compaction 的機制,會導致每次觸發壓縮時,產生一筆額外的 Token 消耗(用於讓 LLM 讀舊歷史寫摘要)。如果閾值設得太低,Agent 會頻繁壓縮,導致成本失控與「摘要遺失細節」。
ROUND 3: SOUL | 靈魂提取
“還能怎么用”
- 知識連結: 強烈呼應了《Context providers the missing layer》以及《How to correctly use MCP servers》。這三篇文章都在解決同一件事:「上下文污染 (Context Bloat)」是 Agent 死亡的唯一原因。
- 深層洞見: “最好的内存管理,是程序压根不去想它的那种。” (The best memory management is the kind the program never has to think about.) 開發者寫 prompt 時不該去擔心 token 是否超標,這是底層框架(Harness)該處理的髒活。Agent OS 正在誕生。
- 行動呼籲:
如果你在自己刻 Agent 腳本,請立刻補上這兩行邏輯:
- 對所有 API 返回的文本(特別是網頁抓取或
grep),強制執行substring(0, 4000)的長度截斷,並在結尾加上...[Truncated]。 - 永遠不要把完整的工具輸出丟給下一個 Agent,只傳遞「總結後的結論」。
- 對所有 API 返回的文本(特別是網頁抓取或