讓分層架構真正發揮價值的非對稱性
如果你想改變 Agent 記憶體設計中的一件事,那就是:不要再把儲存成本與注意力成本視為同一回事。
我深入研究了 19 個系統,一個反覆出現的發現是:那些能妥善處理記憶的系統,未必擁有最先進的檢索技術。它們真正厲害的地方,在於搞清楚了哪些記憶才值得被放進提示詞(prompt)中。這是一個不同的問題,也需要不同的解決方案。
儲存很便宜,注意力很昂貴。實證顯示,一個擁有 128k 上下文的模型讀取 110k 的平庸內容,效能並不會比同一個模型只讀取 8k 的精選內容來得好。相關研究結果一致:當上下文中充滿雜訊時,檢索品質就會下降,而且這種下降並非線性的。模型不會直接忽略無關的資訊,它會處理這些資訊,而這個處理過程會淹沒真正的訊號。
儲存則沒有這個特性。一個存在資料庫裡的事實,保存它不需要任何成本。成本只發生在你「檢索」它並將其載入到提示詞中的時候。這意味著,問題不在於「我該不該儲存這個?」,而在於「我該不該檢索這個?如果是,在什麼時候檢索?」
這個重新定義的觀點,就是「分層」(tiering)的由來。不同的記憶項目有不同的存取模式。有些東西 Agent 每一輪都需要:使用者的名字、目前的專案、陳述過的偏好。有些東西它經常需要,但不是每次都需要:近期的決定、待解決的問題、過去幾次對話中的事件事實。有些東西它應該在需要時找得到,但絕不該讓每一輪都負擔:三個月前的會議記錄、已完成的任務、原始對話紀錄、一次性參考資料。
一個平鋪直敘的儲存空間(flat store)會將這三種類別一視同仁。熱門項目要為冷門項目付出搜尋成本;冷門項目則會讓提示詞充滿雜訊。沒有任何機制讓項目在變得更相關時「升級」,也沒有機制讓項目在變得不那麼相關時「降級」。這與作業系統的類比非常精準:CPU 之所以有 L1、L2、L3、RAM、SSD 和磁碟,不是因為位元組不同,而是因為存取頻率有數量級的差異。在我研究的 19 個系統中,有 7 個在我開始觀察之前就已經建立了明確的分層架構。其中兩個值得深入了解。
MemoryOS 作為參考實作
MemoryOS 是這 19 個系統中,分層記憶體實作最清晰的範例。它分為三層,每一層都有不同的資料形狀、不同的延遲預算,以及不同的角色。
短期層是一個 Python 的雙向佇列(deque),最多容納 10 組 QA 配對。沒有嵌入向量、沒有搜尋索引、沒有熱度追蹤。它就是純粹的對話原始素材,也就是最近十輪的交流,可以在微秒級延遲內取得。當佇列滿了,最舊的配對就會流失到中期層。
中期層最多容納 2000 個會話。每個會話都帶有一個摘要、一個嵌入向量、一組關鍵字和熱度計數器。這層使用 Faiss 進行索引,並透過餘弦相似度進行搜尋。當這層達到容量上限時,最冷的會話就會被驅逐。當某個會話變得很熱門時,它就會被升級到長期層。
長期層是一個 90 維的心理與對齊架構(psychology and alignment schema),包含兩個知識庫佇列,一個存放使用者事實,一個存放 Assistant 事實,每個佇列最多 100 個條目。這是持久層,能跨越不同會話存活,並承載關於使用者的持久模型。
控制升級的熱度公式,僅有十二行 Python 程式碼。它使用三個訊號:造訪頻率(類似 LFU)、互動深度(作為話題參與度的代理指標),以及時效衰減(以 24 小時為半衰期的指數衰減)。當某個區段的熱度超過 5.0 的升級門檻時,就會被升級。升級後,造訪次數和互動計數器會重置為零,熱度則大致回到 1.0。
一個很容易被忽略的設計決策是:熱度控制的是升級,而不是檢索。檢索器是純粹語義的,也就是對中期層嵌入向量進行餘弦相似度搜尋。熱度是一個背景訊號,用來決定某個區段是否應該畢業到長期層。這兩個關注點是去耦合的,而這種去耦合的意義遠大於公式本身。
MemoryOS 忽略的部分也值得一提。其係數被寫死為 1.0,沒有根據實際使用模式來學習權重的機制。也沒有降級路徑;一旦某個東西進入了長期層,它就會永遠待在那裡。此外,公式對「頻率」的優化勝過「重要性」。一個關鍵但罕見的事實(例如伴侶的名字、健康狀況、硬性限制),如果只出現過一次,可能永遠無法跨過升級門檻。一旦中期層將該區段驅逐,這個事實就消失了。
Hindsight 的理論衍生分層
Hindsight 從一個完全不同的起點,得出了與 MemoryOS 相同的三層結構。MemoryOS 借鑒了作業系統的快取理論,而 Hindsight 則借鑒了認知科學。
這三層分別是:世界(World)、經驗(Experience)和觀察(Observations)。「世界」層包含關於宇宙的客觀宣稱,是基本事實、永遠開啟、長期存在的。「經驗」層包含系統本身的第一人稱動作,是事件記錄。「觀察」層則包含從「世界」和「經驗」事實中推導出的統整信念,並攜帶來源記憶 ID、一個「證明次數」欄位,以及一個追蹤信念如何演變的「歷史」欄位。
這三層都位於同一個資料庫表中,並透過「事實類型」鑑別器來區分。系統會為每種事實類型建立部分的 HNSW 索引。架構是統一的,但存取模式不同。
Hindsight 中的升級機制並非由計數器驅動,而是由批次化的 LLM 統整所驅動。當一個新事實被寫入時,它會被放入一個非同步操作佇列中。一個背景工作程序會擷取新的事實以及現有的重疊觀察結果,建立一個批次提示詞,然後要求模型進行新增、更新和刪除操作。來源記憶會被標記上「統整時間戳」,以防止重複處理。每個新事實,無論其被存取的頻率如何,都會被考慮升級到「觀察」層。
這就是它與 MemoryOS 的關鍵區別。透過將上層的升級與統整(而非熱度)綁定,Hindsight 避免了「重要但罕見事實」的盲點。一次統整作業就會考慮每一個新事實。頻率對於某個東西能否畢業來說是無關緊要的。
簡而言之:兩個系統,不同的第一原理,不同的實作語言,不同的目標使用情境,但最終都落在了三層結構上:底層是原始素材,中間是工作層,頂層是經過統整的持久層。兩者都使用非同步升級。兩者都將來源追溯回較低層。這就是軟體架構中的「趨同演化」,也是我所知最強烈的訊號,表明一個模式是承載關鍵負載的。
@supermemory 的條件式分層
supermemory 採用的是受管 API 部署形式,這改變了實作方式,但沒有改變架構。它的三層是:靜態輪廓(static profile)、動態輪廓(dynamic profile),以及文件與區塊儲存(document and chunk store)。
靜態輪廓存放穩定的長期事實,也就是熱層。它會從輪廓端點以靜態陣列的形式回傳,並在邊緣快取,延遲預算大約 50 毫秒。動態輪廓存放近期和事件上下文,是溫層。許多條目都帶有一個 forgetAfter 欄位,用來設定 TTL(存活時間)。文件與區塊儲存是冷層,在有需要時透過搜尋端點進行查詢。
分層指派發生在寫入時。一個提取用的 LLM 會將每個傳入的記憶分類,標上 isStatic 布林值,並可選擇性地加上 forgetAfter 值。這個分類是由一個封閉的提取提示詞強制執行的,對所有消費者都是一致的。
受管 API 部署形式帶來了三項優勢,這是程序內設計者無法直接複製,但應該要理解的。冷層資料可以放在更便宜的硬體上:原始位元組放在物件儲存,後設資料和區塊放在標準關聯式儲存,而熱層輪廓則在邊緣獨立快取。熱層有自己的端點和自己的 SLA(服務水準協議),獨立於搜尋路徑。此外,提取提示詞是集中化的,這使得分層指派的一致性遠高於每個 Agent 各自分類的狀況。
當然,取捨也是真實存在的。遠端的熱層只有在網路夠快時才快。Agent 無法覆蓋引擎的分層分類結果。提取提示詞是一個黑盒子。但無論部署形式是否相同,這個架構模式——熱層作為獨立端點、冷層放在更便宜的硬體上、在寫入時就決定分層——都是值得複製的。
升級 vs. 固定類型學(Fixed Typology)
mem9 是一個對比案例,可以幫助我們釐清「分層」(tiering)不是什麼。
mem9 有一個記憶類型欄位,包含三個值:pinned(釘選)、insight(洞察)和 digest(摘要)。pinned 記憶是透過明確的內容寫入路徑來指定的,是手動建立的,不受 LLM 重新協調的影響。insight 則由每次 LLM 提取的寫入動作所指定,是可變的、可建立版本的、可被取代的。兩者都參與相同的混合召回(hybrid recall),使用相同的 RRF 評分。這個類型欄位是一個寫入保護標記,而不是檢索篩選器,也不是分層訊號。
這是「類型學」(typology),不是「分層」(tiering)。這個區別很重要,因為兩者很容易被混淆。類型學描述的是治理方式:誰可以在什麼條件下修改這個記憶。分層描述的則是存取模式:這個記憶被需要的頻率有多高,以及哪種儲存表現形式最能滿足這個頻率。一個系統可以同時擁有兩者。supermemory 的 isStatic 是一個分層訊號,而另一個 isInference 標記則更接近治理類別。但在實務中,把它們混為一談會產生最多的模糊地帶。
如果你發現自己在記憶體列中增加了一個類型欄位,請捫心自問:這個欄位描述的是存取模式,還是治理類別?如果是存取模式,那你正在建立的是分層架構。如果是治理類別,那你正在建立的是類型學。兩者都很有用。但它們不是同一件事。
平鋪直敘(Flat)的成本是什麼
使用一個平鋪直敘的記憶儲存空間,會帶來四項具體的問題。
熱路徑要為冷路徑付出搜尋成本。 每一次檢索都會掃描相同的索引,遍歷相同的項目。用來查詢使用者名稱的 Agent,與用來查詢六個月前會議記錄的 Agent,付出了相同的搜尋成本。在小規模時,這不明顯。但到了大規模,這就是一個延遲問題。
冷路徑會讓提示詞充滿雜訊。 檢索會回傳語義上相近的項目,這包括了常駐上下文、已被取代的事實,以及雖然事實正確但與當前這輪無關的素材。模型會處理所有這些內容。隨著儲存空間增長,上下文視窗中的訊號雜訊比會下降。
沒有機制讓項目升級。 記憶不是靜態的。一段關係初期一個轉瞬即逝的事件事實,隨著時間推移,可能成為關於使用者偏好或限制的持久訊號。平鋪直敘的儲存空間沒有提供任何機制來察覺這種轉變。該項目會一直停留在最初被寫入時的那種表現形式中,無論其相關性發生了怎樣的變化。
沒有機制讓項目降級。 降級不是刪除。一個平鋪直敘的儲存空間如果想要移除過時的素材,就必須刪除它。而一個分層的儲存空間可以將其移動到更冷的表現形式中,仍然可以被找到,但不再拖累熱路徑。平鋪直敘的儲存空間強迫你做一個二元選擇,而分層儲存空間則不需要。
最終結果
在 19 個系統中,有 18 個系統實作了分層架構、或展現了分層的雛型、或提出了明確的相關建議。唯一的例外是 mem9,它有一個解決不同問題的類型學層,並且可以從在其之上疊加分層架構中受益。
如果你要從頭開始建立 Agent 的記憶體,這 19 個系統所指向的進程如下:首先,找出 Agent 每一輪都需要什麼——那就是你的熱層。接著,找出它經常需要但非每次都需要什麼——那就是你的溫層。然後,找出它應該在需要時能找到,但絕不該讓每一輪都負擔什麼——那就是你的冷層。選擇一個升級機制:像 MemoryOS 那樣的熱度驅動、像 Hindsight 那樣的 LLM 判斷驅動、或是像 supermemory 那樣的提取時間分類。選擇一個降級機制:時間衰減、TTL、或是新鮮度類別。在一開始,請將升級與檢索取分開,因為去耦合比後來再拆開要容易得多。將從上層追蹤到下層的來源(provenance)記錄下來,這樣你隨時都能回答「這個經過統整的信念是從哪裡來的?」這個問題。
這 19 個系統在許多事情上意見並不一致。但在這一點上,它們是一致的:對於任何不平凡的 Agent 記憶體系統來說,一個單一且平鋪直敘的記憶儲存空間,都是錯誤的預設值。
儲存很便宜。注意力很昂貴。請建立一個能善用這個差異的系統。
如果你覺得這篇文章很有趣,歡迎分享。





