Context Rot:為什麼更大的 Context Window 不是答案
Context window 已達百萬 token,但這並沒有解決記憶問題,反而引出了一個新名詞:context rot。當你把所有對話塞進一個超長 context,模型的注意力品質會下降——越來越多的 token 競爭注意力,早期的關鍵指令被壓在雜訊之下,事實上被「遺忘」了,即使它仍然在 context 裡。
另一條路是積極修剪:每隔一段時間把舊對話刪掉。但修剪是有損的。「用 pnpm 而非 npm」、「這個 API 的 rate limit 在四月事件後改了」、「他們的 on-call 流程是這樣的」——這些細節被刪掉就是刪掉了,下次 session 再也找不回來。
Agent Memory 是第三條路:在壓縮時不是刪除,而是萃取。把對話中真正重要的知識——偏好、事實、流程、進行中的任務——以結構化的方式儲存起來,等需要時再精準取回,而不是讓它永遠佔用 context window。
Agent Memory 不取代 context,而是讓 context 只包含當下任務需要的內容。過去的知識不是刪除,是分類儲存,等待被呼叫。結果是:更乾淨的 context、更準確的模型回應、跨 session 和跨重啟的持續知識積累。
API 設計:Profile 是記憶的基本單位
Agent Memory 的設計圍繞一個核心概念:Profile。Profile 以名稱定址,代表一個記憶空間——可以是一個使用者、一個 agent、或一個團隊。不同 profile 之間的記憶完全隔離,防止跨用戶洩漏。
四個核心操作構成了整個 API:
const profile = await env.MEMORY.getProfile("my-project");
// 壓縮時批次擷取
await profile.ingest([
{ role: "user", content: "用 pnpm,不要 npm。深色模式預設開啟。" },
{ role: "assistant", content: "好,已記錄 pnpm 和深色模式設定。" },
], { sessionId: "session-001" });
// 模型主動記住
await profile.remember({
content: "API rate limit 在 4 月 10 日事件後提升至 10,000 req/s。",
sessionId: "session-001",
});
// 檢索
const result = await profile.recall("用戶偏好哪個套件管理器?");
console.log(result.result); // "用戶偏好 pnpm 而非 npm。"
這個 API 設計的哲學是:把記憶的複雜性封裝在服務內部。調用方只需要問「我記得什麼?」,不需要知道底下有多少條管道、向量空間是怎麼索引的,或者哪條記憶比哪條新。
三種使用場景
Agent Memory 設計成可以接在任何 agent 框架上,不需要改動 agent 的核心迴圈。Cloudflare 描述了三個主要場景,彼此的記憶需求截然不同:
你當然可以自己用 PostgreSQL 或 Redis 存記憶。但問題在於:怎麼知道要存什麼?怎麼決定什麼是「重要的事實」而不是閒聊?怎麼做到同一件事更新後舊版本被取代?怎麼搜尋一句話找到相關記憶?Agent Memory 把這些問題都封裝掉了——工程師不需要自己設計知識萃取、分類、版本管理和多模態檢索的完整系統。
擷取管道:四類記憶的生命週期
當你呼叫 ingest(),對話進入一條五階段的處理管道。這條管道的設計目標是:在壓縮時把知識萃取出來,而不是只做摘要。
這個管道的設計考量在於:記憶的品質比數量更重要。每條進入儲存的記憶都是通過多個關卡驗證的,而不是把所有對話摘要直接堆進向量資料庫。
檢索管道:五管道 + RRF 融合
當你呼叫 recall(),Agent Memory 同時觸發五條並行的檢索管道,最後用 Reciprocal Rank Fusion(RRF)把結果融合成一個排序清單,再交給合成模型生成自然語言摘要。
基於 Porter stemming 演算法的全文搜尋,適合精確關鍵字匹配。「pnpm」、「rate limit」、「Stripe webhook」這類術語用 FTS 最可靠,不受向量語意漂移影響。
直接命中已知 topic key 的最新有效記憶。當查詢問「用戶的套件管理器偏好」,如果系統已知這是一個 Fact key,直接拿最新版本,不需要向量搜尋。Fact-key 匹配在 RRF 中擁有最高權重。
搜尋原始訊息內容,而不只是萃取後的記憶。補捉萃取管道可能泛化掉的細節——例如某段對話中提到的具體 URL、精確的錯誤訊息、逐字的用戶引述。
對查詢做 embedding,在記憶向量空間中找語意相似的記憶。適合語意查詢——「我們討論過的部署方式」不一定包含任何精確關鍵字,但向量搜尋能找到相關記憶。
Hypothetical Document Embeddings:把問題先轉成「假設的答案文字」,再對這段答案做 embedding 去搜尋。特別適合抽象或高層次查詢,因為假設答案的 embedding 空間和記憶的 embedding 空間更接近。
包含時間語意的查詢(「最近」、「上週」、「2026-04-10 之後」)由 regex + 算術處理,而不是讓 LLM 做日期數學。確保時間範圍精準,不因模型的日期推算不穩定而遺漏記憶。
「用戶偏好哪種深色主題?」和「dark mode preference」這類查詢用向量搜得到。但「2026-04-10 rate limit 事件的具體數值」用向量搜尋可能找到語意相近但數值錯誤的記憶。FTS 抓得到精確術語,Exact Fact-key 直接命中最新版本,Temporal 查詢確保日期不偏移。五管道融合的本質是:沒有一種搜尋方法在所有情境下都最優,用多管道互補才能讓 recall 準確率最大化。
RRF 融合時,Exact Fact-key 命中的記憶獲得最高排名加成。最終結果交給合成模型生成自然語言摘要,recall() 回傳的 result.result 是一段可直接注入 system prompt 的文字,不需要調用方自行處理原始記憶清單。
技術架構:Cloudflare 平台的自我應用
Agent Memory 是 Cloudflare 把自己的平台能力拼裝成一個服務的典型例子——不是專用硬體,而是 Durable Objects、Vectorize、Workers AI 三者的組合,透過設計決策讓它們協同運作。
recall() 的最終合成步驟用 Nemotron 3(120B MoE,12B active)——這是整個管道中唯一真正需要更大模型的步驟,因為合成摘要需要更強的語言理解和生成能力。
這個架構選擇有一個有趣的含義:Agent Memory 的核心狀態完全在 Durable Objects 中,向量索引是輔助的可重建結構。如果 Vectorize 索引出問題,只需要重新 embed 並重建索引,不會丟失任何記憶的原始內容。
Agent Memory 最有意思的地方不是 API 設計,而是 shared team memory 的想像:團隊裡每個人的 coding agent 學到的東西,都能沉澱成可被所有人查詢的知識庫。code review bot 的每一條 review 意見,都可能影響所有隊員的 coding agent 下次怎麼寫程式。這把「context 清空後就消失的對話歷史」轉成了一個持續成長的機構資產——像一個從來不會忘記東西的技術文件系統,而且是自動寫入、自動更新的。
Agent Memory 目前在 Private Beta 階段,有興趣的開發者可以前往 developers.cloudflare.com/agents 申請早期存取。Cloudflare 表示 GA 後將納入 Workers 付費方案,定價尚未公布。