跳至主要內容
11.305 分鐘閱讀

Emergence AI 打破了 Agent Memory Benchmark。我試著打破他們的程式碼。

我在 blog 上講過很多次 LongMemEval 資料集。如果你沒深陷 agent memory 這圈,可能沒聽過。它是 ICLR 2025 的 poster paper,為 agent 記憶設了新標準。

  • llm
  • rags
  • agent memory
Emergence AI 打破了 Agent Memory Benchmark。我試著打破他們的程式碼。

我在 blog 上講過很多次 LongMemEval 資料集。如果你沒深陷 agent memory 這圈,可能沒聽過。它是 ICLR 2025poster paper,為 agent 記憶設了新標準。我們從 Meta 的 Beyond Goldfish MemoryMemGPT 這類早期里程碑走很長了,但那是另一天的故事。

簡單說,LongMemEval 是 benchmark 對話式 agent 記憶的新 gold standard。我以為 Zep/Graphiti 是明顯領先,直到我在前一篇 The AI Memory Challenge, Part 1 看到 Emergence AI Principal AI Research Scientist Marc 的留言。他邀我看他們的 blog:SOTA on LongMemEval with RAG,他們,嗯,把 Zep 甩很遠。🤯

他們怎麼做到的

在他們的文章裡,Emergence AI 詳述三種創紀錄的做法:

  1. EmergenceMem Simple — 82.40%
  2. EmergenceMem Simple Fast — 79.00%
  3. EmergenceMem Internal — 86.00%

以下是兩種公開討論方法的 breakdown:

EmergenceMem Simple 很聰明。不是檢索單一對話 turn,而是檢索整段對話。一個 session 的 relevance score 看 rerank 後 top 搜尋結果裡有多少 turn 來自它。例如若最高排名的 turn 多半來自 Session 37,就把整個 Session 37 拉進 LLM context。

EmergenceMem Simple Fast 用兩次 LLM call:

  1. 先做簡單搜尋,從對話中檢索相關 turn。
  2. 把問題和檢索到的 turn 組成 prompt,再 call LLM 依問題萃取關鍵事件和事實。
  3. 萃取的摘要給最終 LLM 生成答案。

他們在另一篇很棒的文章 State of the Art Results in Agentic MemoryInternal 版有更多 insight,對這題有興趣必讀。

這篇我想聚焦 EmergenceMem Simple Fast,因為他們好心 [open-sourced it],誰都能跑、驗證結果。

預算夠嗎?用 GPT-4o Mini 測試

Emergence AI 公布的結果用 GPT-4o 這類強模型,對 enterprise 聚焦很合理。我的工作偏向 consumer app,成本是關鍵因素。

如我在 SLMs as the New Memory Core 寫過,AI app 生態被兩大問題卡住:不完整的 AI Tool Layer貴到離譜的 token。foundation models 的高成本造成我說的 LLM-margin squeeze,讓開發者很難做可持續應用。社群要做出下一個 killer app,需要的不只是強,還要買得起。

LLM-margin squeeze

看到 Emergence AI 開源程式碼,我第一個問題:GPT-4o mini 能 work 嗎?

答案是響亮的 yes。

我愛他們 demo 的簡潔——基本上就是一個 main.py。上手超輕鬆:

  1. Clone repo
  2. pip install -r requirements.txt
  3. 加上 OpenAI API key,模型設 gpt-4o-mini
  4. python main.py

第一次跑結果很棒。腳本跟 GPT-4o mini 配合漂亮,準確率 71.2%。這結果很驚人,因為跟 Zep 用更強更貴的 GPT-4o 拿到的分數一模一樣!

在家試的話小心:盯著 API 帳單。跑完整 evaluation 不是免費的。

  • GPT-4o mini: ~$1.50
  • GPT-4o: ~$30.00

如果你只想知道現在 SOTA 是誰,答案有了。但我的工作是看解法是否 robust、可泛化,不是只在特定 dataset 上一次性成功。想知道它真正表現如何,繼續看。

小繞路:讓 Benchmark 更可靠

往下挖之前,得談 evaluation。在 AI Engineering 這本書裡,Chip Huyen 討論用 AI as a Judge 如何成為大趨勢。對評估複雜語言任務有用,但這方法可能不一致、昂貴,而且有點 tautological。

現代模型 structured output 做得很好,我長期倡議用選擇題(MCQ)。10 選格式讓 evaluation 客觀可靠。為此我做了 LongMemEval 的 10 選版本,在 這裡。用 EmergenceMem Simple Fast + GPT-4o mini 測這版,效能 nice bump 到 76.8%

為了看解法更 broadly 的表現,我也對另外兩個熱門對話 dataset 的 MCQ 版跑測:Multi-Session Chat (MSC)LoCoMo。結果如下:

EmergenceMem Simple Fast on MSC, LoCoMo, LongMemEval

MSC 高分不意外——dataset 相對簡單。LoCoMo 的分數卻是 huge red flag。

LoCoMo benchmark 不是第一次引人側目。Zep 創辦人在 Lies, Damn Lies, & Statistics 這篇 famously 點名 Mem0,質疑他們在該 dataset 上的分數。

Zep vs. Mem0 on LoCoMo

這帶出一個 critical puzzle。LongMemEval 普遍被認為比 LoCoMo 難很多。那為什麼 Emergence AI 解法在 supposedly 較簡單的 dataset 上表現差這麼多?

元兇:寫死的 K

要理解奇怪的 LoCoMo 結果,我得挖程式碼。調查聚焦任何 RAG 系統兩個最常見元兇:chunkingTop-k

第一個 chunking 定義資料單元大小。第二個 Top-k 決定檢索多少單元來答 query。根本問題是這些參數沒有 universal 設定。每個 dataset 都不同。

  • 有些文件資訊密度高;有些重複。
  • 有些問題要 broad context;有些只要一個特定事實。

對一個 use case 有效的固定 chunk size 和 k 值,對另一個幾乎肯定 suboptimal。

Emergence AI 程式碼揭露什麼?做法 refreshingly 簡單。沒有 explicit chunking,每個對話 turn 當 natural data unit。K 值呢?寫死了。

他們對一切設 k=42

我懂邏輯。turn 是自然的對話單元,42 當然是 life, the universe, and everything 的終極答案。他們似乎把精力放在核心架構挑戰,而不是陷在 hyperparameter tuning。

但這 fixed-k 做法幾乎肯定是 LoCoMo 表現 stumble 的原因。這正是 open-source 社群能發光的地方。我的目標不是找碴,而是看能不能在他們 fantastic 的工作上再疊一層。

超越魔法數字:Adaptive-k 做法

為了解決「fixed k」問題,我開發了更 dynamic、adaptive 的做法。三步驟:

  1. 設 Token Budget,不是 Chunk Count。 不是檢索固定 k 個 chunk,我先檢索一大批候選,再對最終 context 的總 token 數設 hard limit(例如 8192)。這讓流程獨立於 chunking 策略。 2. 用 MMR 確保多樣性。 我對初始結果套用 Maximal Marginal Relevance (MMR) 演算法。這很關鍵:它 re-rank 文件,打造 balanced context,優先選對 query 高度相關、彼此又 diverse 的項目。這步是避免 redundant 資訊的 key。 3. 用 Top-p 做 Adaptive 選擇。 最後,不用固定 Top-p,我用 Top-p (Nucleus) selection。它 adaptively 選 cumulative relevance score 超過某機率門檻 p 的最相關文件。這更聰明,因為檢索數量——我們的「adaptive k」——會隨每個 query 動態變。

視覺上流程大概像這樣:

MMR + Top-p

當然這做法也有自己的旋鈕要 tune——namely MMR diversity 參數 λ 和 Top-P 門檻 p。不過這些參數控制的是 dynamic 流程,讓 retrieval size 依需求伸縮,而不是鎖死在一個數字。

結果自己說話:

EmergenceMeme Simple Fast (MMR + Top-p) on MSC, LoCoMo, and LongMemEval

如你所見,三個 benchmark 都提升,problematic 的 LoCoMo 分數現在健康多了。最好的是?換新 dataset 不用再煩惱選「對的」k。系統會 adapt。

效能 bump 當然有成本。平均檢索數從固定 k=42 變成 dynamic 平均 k=62.5。這讓 GPT-4o mini 跑完整 evaluation 的成本升到 $1.99——漲 42%。我猜那數字真的是一切的答案。😉

再仔細看 retrieval stats,還有很大改善空間:

Retrieval Analysis (LongMemEval)

雖然 adaptive k 會變,分布 skew 偏高,mode(最常出現的值)大概在 68。但 quick regression 顯示單純多用 token 跟準確率沒有強 correlation。這告訴我流程還能更高效——完美留給未來文章!

結論

這趟旅程起點很簡單:理解 Emergence AI 在 LongMemEval 的新 SOTA 結果。他們的工作是 agent memory 的巨大前進,但 LoCoMo benchmark 上 surprising 的 performance dip 指向一個小但重要的細節:寫死的 retrieval limit k=42

這實驗顯示我們能在他們 impress 的基礎上再建。把 fixed k 換成用 MMRTop-p 的 dynamic adaptive 做法,我們看到 clear win。三個 benchmark 都顯著提升,系統也更 robust。不過雖然 adaptive 方法修復了 LoCoMo 的 initial performance drop,最終分數仍低於 Zep 等競品報告的 SOTA。

這個 lingering gap,即使有更 flexible 的 retrieval 演算法,強烈暗示瓶頸已從演算法移到 data representation。我的 gut feeling 是 LoCoMo dataset 獨特結構是 key。不像標準 user-assistant 聊天,它是兩個 distinct 人物(例如 Caroline 和 Melanie)之間的對話。為了塞進 conventional 格式,我 preprocess 時把 speaker 名字直接嵌進 content,像這樣:

[
  {
    "role": "user", 
    "content": "[CAROLINE]: Hey Mel! Good to see you! How have you been?"
  },
  {
    "role": "assistant", 
    "content": "[MELANIE]: Hey Caroline! Good to see you! I'm swamped with the kids & work. What's up with you? Anything new?"
  }
]

這做法雖然 functional,可能會 confuse 不是專為 multi-speaker turn-taking 設計的 retrieval 系統。要在 LoCoMo 這類 dataset 上關上最後缺口,很可能需要更 nuanced 的 data preparation 策略。

這 highlight 即使有 flexible 演算法,data representation 仍是 key。當然這 flexibility 不是免費午餐——adaptive 方法提高了平均檢索數,token 成本也跟著漲。

Ultimately,從 fixed k=42 到 adaptive k 的旅程 underscore 一個 crucial 原則:我們應偏好 dynamic、context-aware 元件,而不是 static、「魔法數字」設定。這種 adaptability 是打造不只強大、而且 reliable、efficient 解法的 key。

我相信這是 promising 方向,還有很多可探索——從優化 cost-performance balance 到為複雜對話開發更好的 data 策略。我已把含這些修改的程式碼開源,想實驗的歡迎來玩。

Fork 在這裡:Emergence Simple Fast (Adaptive-K Fork)

你的想法?你也遇過 fixed retrieval 參數或 multi-speaker dataset 的類似挑戰嗎?留言跟我說!


原文發表於 Medium