Mem0 把記憶做成一個外掛在 LLM 呼叫兩側的服務:你照舊呼叫自己的模型,它在對話後從中抽取事實,在下次呼叫前把相關事實注入。它的貢獻不在儲存技術(底層就是向量庫加上可選的圖),而在把「寫入決策」明確地形式化成一條兩階段管線與四種操作——這是整個生態裡最容易被搬走、也最應該被搬走的設計。


核心機制:兩階段管線

Mem0 的運作是兩個階段,論文(arXiv:2504.19413,ECAI 2025)與官方文件都以此描述:

Extraction(抽取)——每一組新的訊息對(使用者訊息+助理回覆)進來後,用 LLM 從中拉出候選事實。輸出是一組去脈絡化的陳述句,例如從「我最近改吃素了,所以上次那家燒肉店可能不適合」抽出「使用者是素食者」。

Update(更新)——對每一個候選事實,先用向量相似度從既有記憶中取回語意相近的鄰域,再用第二次 LLM 呼叫,把候選事實與這個鄰域一起交給模型,讓它判斷該執行哪一種操作:

  • ADD——是新資訊,存為新條目。
  • UPDATE——與既有條目講同一件事但資訊量增加,覆寫既有條目。
  • DELETE——與既有條目矛盾,移除舊的。
  • NOOP——沒有新資訊,什麼都不做。

這四個操作是本篇最重要的產出。 它們把一個含糊的問題(「記憶要怎麼維護」)拆成一組互斥且窮盡的決策,而且這組決策與任何特定儲存技術無關——你可以在檔案系統上、在 SQL 表上、在圖上實作同一組操作。任何新專案的記憶寫入管線都應該明確地實作這四種結果,而不是預設「寫入等於 append」。

漏掉 NOOP 是最常見的錯誤。沒有 NOOP 的系統會把每一次重複提及都存成新條目,於是同一件事在庫裡有二十個措辭略異的版本,召回時互相稀釋——這正是 無限膨脹與召回不準 的主要成因。


圖變體:Mem0g

Mem0 的圖版本(文獻中寫作 Mem0g)在抽取階段多做一步:把訊息轉成實體與關係三元組,而不只是自然語言事實。更新階段則加上圖層面的衝突偵測與解決,把新的三元組整合進既有圖譜。

它與 Zep/Graphiti 的差異在時間模型:Mem0g 處理衝突的方式偏向解決(更新或刪除),Graphiti 偏向保留並標記失效這個差異決定了你能不能回答「三個月前他的偏好是什麼」這種問題——Mem0 的預設路線把舊值刪掉了。


儲存後端

向量庫為主(支援多種後端),可選圖資料庫,另有歷史紀錄用的關聯式儲存。它是一個服務/SDK,不接管你的 agent 迴圈——這是它與 Letta 最根本的定位差異。你的 orchestration 用什麼框架、agent 怎麼推理,Mem0 一概不管,它只負責在你呼叫 add() 時處理寫入、在你呼叫 search() 時回傳相關記憶。

這個「非侵入式」的定位是它最大的實務優勢。 在架構還沒定型、或者要把記憶加到一個既有系統上時,它的整合成本遠低於換一個 runtime。


寫入與召回策略

寫入時機:由呼叫方顯式決定(你在每輪對話後呼叫 add()),可以在 hot path 也可以在背景。寫入的內容決策交給管線,呼叫方不需要判斷什麼值得記。

召回方式:以查詢向量做語意相似度檢索,回傳前 k 條。可加上 user_id / agent_id / run_id 之類的範圍過濾——這組範圍參數實質上實作了 分類學 的主體歸屬維度,是它設計上做對的一件事。

遺忘:靠 UPDATE 與 DELETE 隱含處理,沒有獨立的時間衰減或容量上限機制。這意味著長跑系統的儲存成長需要自己監控。


優缺點

優點:整合成本低,不綁 orchestration;寫入決策形式化得最清楚;召回的 token 用量可控(回傳精煉事實而非原始對話);有公開論文與 benchmark 數字可查證。

缺點:每次寫入至少兩次 LLM 呼叫(抽取+判斷),成本與對話量成正比而非與召回量成正比,這在高流量產品上是實質負擔;抽取階段會丟失情節脈絡(「為什麼」通常抽不出來);預設的衝突解決會刪除歷史,時序查詢能力弱;抽取品質完全取決於 prompt 與模型,跨領域的泛化沒有保證。

適合場景:對話式產品的個人化(偏好、身份、歷史)、需要快速把記憶加到既有系統、語意事實為主而情節脈絡不重要的應用。不適合:需要回答「什麼時候變成這樣」的時序問題、需要多跳關係推理、記憶主要是程序型規則的編碼 agent。


可抽取的模式

Extract-then-reconcile(先抽取、再對帳)——寫入不是 append,而是「抽出候選 → 取回相近鄰域 → 決定四種操作之一」。這是本專欄推薦的寫入管線骨架,完整版見 藍圖

四操作閉集(ADD/UPDATE/DELETE/NOOP)——把寫入結果限制在一組互斥且窮盡的操作上,讓寫入行為可稽核、可測試。每一次寫入都應該產出一個明確的操作決定與理由,而不是靜默地插入一列。

Neighborhood-scoped reconciliation(限定鄰域的對帳)——判斷衝突時不比對全庫,只比對向量相似度取回的鄰域。這是讓對帳成本保持常數的關鍵;代價是語意上相關但措辭差異大的衝突會被漏掉,這是一個必須知道的已知限制。

Scope keys as first-class(範圍鍵作為一等公民)——user_id / agent_id / session_id 不是後來補上的過濾條件,而是記憶條目的必要欄位。它同時解決了多租戶隔離、可刪除性與 多 agent 共享 三個問題。


相關