幫你的 AI 記憶打分數

LongMemEval 實戰教學.2026-10-10 阿普實跑一次 500 題的完整做法。照做就能跟 Mastra、Hindsight、Zep 這些記憶系統用同一把尺比。

一句話:拿 500 題考你的記憶系統,每題先給它一大份聊天紀錄(平均 48 段、約 11.5 萬 token),答案只藏在其中一兩段;系統要自己記住、找出來、答對。最後由 GPT-4o 用官方題型專屬的判分 prompt 判對錯,算正確率。

我們的成績

88.2%

整體正確率.500 題全跑完.官方 GPT-4o 判分.2026-10-10

題型平均90.7%六型各自算再平均
拒答題26 / 30沒提過的事有說不知道
檢索撈到任一證據段97.5%前 5 段(any@5)
檢索撈齊全部證據段87.7%前 5 段(all@5)
題型題數正確率
單段・助理說過56100.0%
知識更新7893.6%
單段・偏好3093.3%
單段・使用者說過7092.9%
時間推理13384.2%
多段推理13380.5%

怎麼解讀這個分數

想比記憶系統本身的功力:作答模型一樣用 Claude Sonnet 5.5,只把第 3、4 步換成你的記憶層。這樣差出來的分數,就純粹是記憶系統的差別。

這把尺量什麼

LongMemEval 是 ICLR 2025 的長期記憶基準(Di Wu 等人),市面上記憶系統宣稱的分數大多用它的 S 版。每題有自己獨立的一份聊天紀錄,題目分六型,另有 30 題是「紀錄裡根本沒提過」、要系統老實說不知道的拒答題。

題型考什麼題數
單段・使用者說過使用者某次提過的細節(我養的貓叫什麼)70
單段・助理說過AI 自己之前講過的內容56
單段・偏好從對話推出使用者喜好,給個人化建議30
多段推理答案散在好幾段,要合起來算(總共買了幾樣)133
時間推理「兩個月前那次」「先後順序」,要懂日期133
知識更新後來改口了,要答最新那個78

合計 500 題,其中 30 題是拒答題(題號結尾 _abs),散在各型裡。

各家分數(同一把尺)

以下都是 S 版 500 題、GPT-4o 判分的 QA 正確率,數字取自 Mastra 研究頁與 Hindsight 官方 benchmark repo,全是各家自報。

系統作答模型正確率
Mastra Observational Memorygpt-5-mini94.87%
Hindsightgemini-3-pro91.40%
HindsightGPT-OSS 120B89.00%
阿普(陽春向量檢索前 5)Claude Sonnet 5.588.20%
Supermemorygemini-3-pro85.20%
Mastra Observational Memorygpt-4o84.23%
Oracle(直接只給證據段)gpt-4o82.40%
Supermemorygpt-4o81.60%
Mastra RAG(取前 20)gpt-4o80.05%
Zepgpt-4o71.20%
整份紀錄硬塞(不用記憶系統)gpt-4o60.20%

看表的三個重點

完整流程

粉紅色那兩步,就是把你自己的記憶系統接上去的地方;其他步驟照官方做,分數才能跟上表比。

  1. 下載資料從 Hugging Face 抓 longmemeval_s_cleaned.json(2025 年 9 月清理過的版本,277 MB),以及官方 GitHub repo(作答與判分的 prompt 都在裡面)。
  2. 每題的聊天紀錄拆成一段一檔每段寫成一個檔,開頭記日期,內文是 user/assistant 逐句。檔名與內文都不能帶原始的 session id,原因見下面「踩過的坑」第一條。
  3. 寫入:把紀錄餵進你的記憶系統接這裡每題要有自己獨立的記憶空間,只能搜到自己那份紀錄。我們的做法是每題建一個向量索引集合(500 題=500 個集合、23,867 段),用本機 0.6B 的嵌入模型,全部嵌完約 70 分鐘、不花錢。
  4. 召回:拿題目去問你的記憶系統接這裡用題目本身當查詢,取前 5 段(官方預設讀法)。順便算檢索召回:前 5 段有沒有撈到任一證據段(any@5)、是否撈齊全部證據段(all@5)。
  5. 作答用官方 run_generation.py 裡的 prepare_prompt 組 prompt:撈到的段落依日期排序、帶上每段日期與「提問當天日期」、要求先推理再作答。我們丟給 Claude Sonnet 5.5,每題約 2.3 萬 token input、平均 5 秒。
  6. 判分用官方 evaluate_qa.py 的題型專屬判分 prompt,模型 gpt-4o-2024-08-06、temperature 0、max_tokens 10,只回 yes/no。每題約 0.001 美元,500 題實付 0.45 美元。
  7. 彙總算三個數:整體正確率(上表比的就是這個)、六型平均正確率、拒答題正確率;另附檢索召回。

如果你的系統是整包的(自己存、自己找、自己答)

那就不用拆第 3 到 5 步:把每題的紀錄依時間順序餵進你的系統,再把題目問它,把回答存成 jsonl,一行一題:

{"question_id": "e47becba", "hypothesis": "你的系統的回答"}

然後直接跑官方判分:

export OPENAI_API_KEY=...
cd src/evaluation
python3 evaluate_qa.py gpt-4o 你的回答.jsonl ../../data/longmemeval_s_cleaned.json
python3 print_qa_metrics.py gpt-4o 你的回答.jsonl.log ../../data/longmemeval_s_cleaned.json

餵紀錄時記得把每段的日期一起給系統,時間推理題靠這個。

成本與時間(實測)

寫入 2.4 萬段約 70 分鐘本機嵌入,0 元
檢索每題 3 秒500 題約 10 分鐘
作答 input1,158 萬 token每題約 2.3 萬
GPT-4o 判分0.45 美元每題約 0.001

作答走 Claude 訂閱方案,不另付費;換算 API 定價約 25 美元。嵌入完之後,檢索約 10 分鐘、作答與判分 4 路並行約 12 分鐘就出分。正式跑之前先跑 10 題冒煙,量出每題成本再乘上去,超過自訂停損就先停下來想。

踩過的坑

  1. 原始 session id 會洩題。資料裡證據段的 id 都以 answer_ 開頭。把 id 寫進檔名或內文,檢索就會被這個字串帶著走,等於偷看答案。拆檔時改用流水號,對照表另外存。
  2. 先 10 題冒煙,再把自己的判分器跟官方對帳。挑六型各至少一題、含一題拒答題。我們把冒煙的 10 筆回答原樣丟給官方 evaluate_qa.py,跟自己的判分器 10/10 一致,才開全量。
  3. 作答要「乾淨」,不然量到的是 agent 的個性。關掉工具、記憶、人設檔、hook,system prompt 只留一句「You are a helpful assistant.」,從空資料夾執行。我們量過,空問題只吃約 600 token 的常駐脈絡。
  4. 每題 prompt 都不同時,prompt 快取只會多收錢。快取寫入比一般 input 貴,可是 500 題沒有一題會重複命中。關掉快取之後,單題成本直接砍半。
  5. 檢索工具的預設門檻會偷砍結果。我們用的工具,最低分數傳 0 會被當成「沒傳」,退回預設 0.3,有些題就撈不滿 5 段。要傳一個極小的正數才拿得到完整排序。
  6. 有查詢改寫的檢索,重跑結果會變。如果你的召回會先用 LLM 改寫查詢,同一題跑兩次前 5 名會不一樣。檢索跑一次就存檔,作答一律讀存檔。
  7. 分數有 ±1.5 分左右的雜訊。作答與判分都有隨機性,同設定跑兩次不會逐題一致。差 1 分不要當成勝負。
  8. 斷點續跑+停損是必備。檢索、作答、判分每題各自落檔,中斷就從斷點接。碰到限流或額度用完就停、連續 5 題失敗就停、判分花費超過上限就停。
  9. 換一個閒置帳號跑,而且準備好半路換帳號。1,000 多萬 token 會吃掉不少額度,用平常在用的帳號,跑分期間你自己的 AI 就卡住了。我們用的那個帳號剛降成 Pro,跑到第 191 題就撞上五小時上限;靠斷點續跑換一個帳號接著做,前面的成績一題都沒丟。

要跟別人比,先對齊這四件