MemUse: evaluating whether conversational memory is actually used — benchmark, negatives split, judge harness, baselines (EMNLP 2026)
See the code40 users · 4 months · 1,872 sessions · 72 real memory moments · 316 fact questions
Give a model more memory and retrieval scores soar — but natural integration and user satisfaction never move.
Paper: arXiv:2608.24189 · Hugging Face paper page — Dataset: RuiSumida/memuse
We need to test whether the system actually uses memories in conversation — not just whether it can answer correctly when asked directly. An AI that can answer "my dog's name is Momo" when quizzed, but never says "how's Momo doing?" on its own, isn't really remembering you.
MemUse evaluates memory at the moments real users actually cue it — "as I wrote yesterday…", "do you remember…?" — mined from a 4-month deployment of an AI diary companion and verified by human annotators.
The gap: GPT-4.1-mini answers 78.8% of MemUse fact questions when asked directly, yet mentions those facts in its natural reply just 7.9% of the time. Same model, same context.
🗨️ User (session 5): "I'm thinking I'll try to relax by listening to the music Luke recommended the other day."
🔎 Prior sessions: the system had recommended Bruno Mars, Ryuichi Sakamoto, Hikaru Utada, Yumi Matsutoya, Haruka Nakamura.
❌ Deployed reply (full history in context): "That sounds like a perfect way to unwind. I hope the music brings you some calm…" — 0/4 facts referenced
✅ Same model, asked directly "What Japanese artists did you recommend?" → "Ryuichi Sakamoto, Hikaru Utada, Yumi Matsutoya, Haruka Nakamura." — correct
from datasets import load_dataset
bench = load_dataset("RuiSumida/memuse", split="test") # 72 positives
negs = load_dataset("RuiSumida/memuse", "negatives", split="test") # 72 negatives
ex = bench[0]
ex["input"]["sessions"] # all prior sessions, verbatim (mean ≈ 306 turns)
ex["input"]["current_session"] # current session up to the trigger
ex["input"]["trigger_quote"] # the user turn your system must reply to
Reply to each trigger with your system — long context, RAG, Mem0/Letta-style agents, anything — then score:
export OPENAI_API_KEY=...
uv run --with openai python eval/run_judge.py --responses my_responses.json
uv run --with openai python eval/run_judge_negatives.py --responses my_neg_responses.json
{"natural": {"pos_001": "…your reply…", "pos_002": "…"},
"direct_qa": {"pos_001": ["…reply to sub_question 0…", "…"]}} // optional
data/ instances.test.jsonl · negatives.test.jsonl (corpus/users configs live on HF)
eval/ run_judge.py · run_judge_negatives.py · prompts/ · metadata.json
baselines/ run_fullcontext.py · run_mem0.py · run_letta.py · results/
Judge is GPT-5.4-nano at temperature 0, validated against human annotators (swap_judge() to change it). pip install openai, plus mem0ai / letta for those baselines.
| config | rows | what it is |
|---|---|---|
benchmark | 72 | user-cued memory moments, full history inline, gold facts + 316 fact questions |
negatives | 72 | matched turns needing no memory — catches over-eager / fabricated recall |
corpus | 1,872 | every deployment session (21,575 turns) with per-session satisfaction ratings |
users | 40 | per-user aggregates + monthly summaries |
| system | memory | Direct QA ↑ | Reference ↑ | Natural Integration ↑ |
|---|---|---|---|---|
| GPT-4.1-mini | summary only | 44.9 | 7.9 | 23.6 |
| GPT-4.1-mini | full history | 78.8 | 7.9 | 22.2 |
| GPT-5.5 | summary only | 50.0 | 15.4 | 53.4 |
| GPT-5.5 | full history | 82.9 | 13.6 | 52.1 |
| Gemini 3.1 Pro | summary only | 37.9 | 8.2 | 32.9 |
| Gemini 3.1 Pro | full history | 72.3 | 7.6 | 37.0 |
| GPT-4.1-mini + Mem0 | extract/store/retrieve | 42.4 | 7.3 | 27.8 |
| GPT-4.1-mini + Letta | archival memory agent | 61.1 | 11.1 | 29.2 |
Values in %; judge fixed at GPT-5.4-nano. Paper numbers use 73 instances; the released 72 drop one contaminated probe (≤ 1.4 pp effect). Mem0/Letta Natural Integration corrected on 2026-10-07 (eval schema 1.2): the arXiv v1 values (58.3 / 56.9) were scored with judge inputs that did not match the paper's; with matched inputs they fall in the same range as the other rows. Per-instance outputs in baselines/results/.
| system | memory | unprompted recall ↓ | fabricated recall ↓ |
|---|---|---|---|
| GPT-4.1-mini | none | 0.0 | 0.0 |
| GPT-4.1-mini | full history | 0.0 | 0.0 |
| GPT-4.1-mini + Mem0 | extract/store/retrieve | 0.0 | 0.0 |
None of these baselines volunteers or fabricates prior-session memory on uncued turns; the split is there to catch systems tuned to over-trigger recall.
benchmark row:
{
"instance_id": "pos_001",
"user_id": "annotator_11",
"event_type": "user_re_provision", // or "user_memory_probe"
"trigger_session_idx": 4,
"input": {
"sessions": [ // ALL sessions before the trigger session, verbatim
{"session_idx": 0, "date": "2025/November/05",
"turns": [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
],
"current_session": { // the trigger session, truncated at the trigger turn
"session_idx": 4, "date": "2025/November/09",
"turns": [/* ... */, {"role": "user", "content": "As I wrote yesterday, ..."}]
},
"trigger_quote": "As I wrote yesterday, ..."
},
"target": {
"ground_truth": "In session 3 (the previous day) the user ...",
"sub_questions": [{"question": "...", "answer": "..."}] // 3–5 fact questions (316 total)
}
}
The assistant's original reply is deliberately not included — it is not a gold answer, and it would invite string-matching. Dates matter: many triggers are temporal ("yesterday", "the other day").
negatives row: same input schema; target is {"memory_needed": false, "pcd_score": 0, "prior_session_summaries": [...]} plus matched_positive. Selection: no detected memory event, a substantive user turn, and a GPT-5.4 prior-context-dependence check = 0; 70/72 come from the same user as their positive.
corpus row (one session): user_id, chronological session_idx (joins to trigger_session_idx), date, summary, daily_summary, user_feedback (1–7 rating + comment), full turns with telemetry. 30 sessions have empty turns; ignore talking_index.
users row: num_sessions, date_range, total_turns, mean_rating, monthly_summaries.
Memory moments are rare — ~1.4% of user turns — which is exactly why they are worth testing on: existing benchmarks pair externally authored questions with 15–24% of turns.
annotator_NN; all personal names, pet names, and residence-level places / small local organizations replaced with consistent substitutes (same name → same substitute everywhere, including gold facts and questions), after a GPT-5.4 screen of every turn and human review. Public figures, brands, and large cities unchanged. Paper numbers were computed before pseudonymization.@inproceedings{sumida2026memuse,
title = {{MemUse}: Moving Memory Evaluation from Direct {QA} to Natural Integration in Long-Term Human-{AI} Conversation},
author = {Sumida, Ryuichi and Inoue, Koji and Kawahara, Tatsuya},
booktitle = {Proceedings of the 2026 Conference on Empirical Methods in Natural Language Processing (EMNLP)},
year = {2026},
eprint = {2608.24189},
archivePrefix = {arXiv},
primaryClass = {cs.CL},
url = {https://arxiv.org/abs/2608.24189}
}
MemUse: evaluating whether conversational memory is actually used — benchmark, negatives split, judge harness, baselines (EMNLP 2026)
See the code40 users · 4 months · 1,872 sessions · 72 real memory moments · 316 fact questions
Give a model more memory and retrieval scores soar — but natural integration and user satisfaction never move.
Paper: arXiv:2608.24189 · Hugging Face paper page — Dataset: RuiSumida/memuse
We need to test whether the system actually uses memories in conversation — not just whether it can answer correctly when asked directly. An AI that can answer "my dog's name is Momo" when quizzed, but never says "how's Momo doing?" on its own, isn't really remembering you.
MemUse evaluates memory at the moments real users actually cue it — "as I wrote yesterday…", "do you remember…?" — mined from a 4-month deployment of an AI diary companion and verified by human annotators.
The gap: GPT-4.1-mini answers 78.8% of MemUse fact questions when asked directly, yet mentions those facts in its natural reply just 7.9% of the time. Same model, same context.
🗨️ User (session 5): "I'm thinking I'll try to relax by listening to the music Luke recommended the other day."
🔎 Prior sessions: the system had recommended Bruno Mars, Ryuichi Sakamoto, Hikaru Utada, Yumi Matsutoya, Haruka Nakamura.
❌ Deployed reply (full history in context): "That sounds like a perfect way to unwind. I hope the music brings you some calm…" — 0/4 facts referenced
✅ Same model, asked directly "What Japanese artists did you recommend?" → "Ryuichi Sakamoto, Hikaru Utada, Yumi Matsutoya, Haruka Nakamura." — correct
from datasets import load_dataset
bench = load_dataset("RuiSumida/memuse", split="test") # 72 positives
negs = load_dataset("RuiSumida/memuse", "negatives", split="test") # 72 negatives
ex = bench[0]
ex["input"]["sessions"] # all prior sessions, verbatim (mean ≈ 306 turns)
ex["input"]["current_session"] # current session up to the trigger
ex["input"]["trigger_quote"] # the user turn your system must reply to
Reply to each trigger with your system — long context, RAG, Mem0/Letta-style agents, anything — then score:
export OPENAI_API_KEY=...
uv run --with openai python eval/run_judge.py --responses my_responses.json
uv run --with openai python eval/run_judge_negatives.py --responses my_neg_responses.json
{"natural": {"pos_001": "…your reply…", "pos_002": "…"},
"direct_qa": {"pos_001": ["…reply to sub_question 0…", "…"]}} // optional
data/ instances.test.jsonl · negatives.test.jsonl (corpus/users configs live on HF)
eval/ run_judge.py · run_judge_negatives.py · prompts/ · metadata.json
baselines/ run_fullcontext.py · run_mem0.py · run_letta.py · results/
Judge is GPT-5.4-nano at temperature 0, validated against human annotators (swap_judge() to change it). pip install openai, plus mem0ai / letta for those baselines.
| config | rows | what it is |
|---|---|---|
benchmark | 72 | user-cued memory moments, full history inline, gold facts + 316 fact questions |
negatives | 72 | matched turns needing no memory — catches over-eager / fabricated recall |
corpus | 1,872 | every deployment session (21,575 turns) with per-session satisfaction ratings |
users | 40 | per-user aggregates + monthly summaries |
| system | memory | Direct QA ↑ | Reference ↑ | Natural Integration ↑ |
|---|---|---|---|---|
| GPT-4.1-mini | summary only | 44.9 | 7.9 | 23.6 |
| GPT-4.1-mini | full history | 78.8 | 7.9 | 22.2 |
| GPT-5.5 | summary only | 50.0 | 15.4 | 53.4 |
| GPT-5.5 | full history | 82.9 | 13.6 | 52.1 |
| Gemini 3.1 Pro | summary only | 37.9 | 8.2 | 32.9 |
| Gemini 3.1 Pro | full history | 72.3 | 7.6 | 37.0 |
| GPT-4.1-mini + Mem0 | extract/store/retrieve | 42.4 | 7.3 | 27.8 |
| GPT-4.1-mini + Letta | archival memory agent | 61.1 | 11.1 | 29.2 |
Values in %; judge fixed at GPT-5.4-nano. Paper numbers use 73 instances; the released 72 drop one contaminated probe (≤ 1.4 pp effect). Mem0/Letta Natural Integration corrected on 2026-10-07 (eval schema 1.2): the arXiv v1 values (58.3 / 56.9) were scored with judge inputs that did not match the paper's; with matched inputs they fall in the same range as the other rows. Per-instance outputs in baselines/results/.
| system | memory | unprompted recall ↓ | fabricated recall ↓ |
|---|---|---|---|
| GPT-4.1-mini | none | 0.0 | 0.0 |
| GPT-4.1-mini | full history | 0.0 | 0.0 |
| GPT-4.1-mini + Mem0 | extract/store/retrieve | 0.0 | 0.0 |
None of these baselines volunteers or fabricates prior-session memory on uncued turns; the split is there to catch systems tuned to over-trigger recall.
benchmark row:
{
"instance_id": "pos_001",
"user_id": "annotator_11",
"event_type": "user_re_provision", // or "user_memory_probe"
"trigger_session_idx": 4,
"input": {
"sessions": [ // ALL sessions before the trigger session, verbatim
{"session_idx": 0, "date": "2025/November/05",
"turns": [{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}]}
],
"current_session": { // the trigger session, truncated at the trigger turn
"session_idx": 4, "date": "2025/November/09",
"turns": [/* ... */, {"role": "user", "content": "As I wrote yesterday, ..."}]
},
"trigger_quote": "As I wrote yesterday, ..."
},
"target": {
"ground_truth": "In session 3 (the previous day) the user ...",
"sub_questions": [{"question": "...", "answer": "..."}] // 3–5 fact questions (316 total)
}
}
The assistant's original reply is deliberately not included — it is not a gold answer, and it would invite string-matching. Dates matter: many triggers are temporal ("yesterday", "the other day").
negatives row: same input schema; target is {"memory_needed": false, "pcd_score": 0, "prior_session_summaries": [...]} plus matched_positive. Selection: no detected memory event, a substantive user turn, and a GPT-5.4 prior-context-dependence check = 0; 70/72 come from the same user as their positive.
corpus row (one session): user_id, chronological session_idx (joins to trigger_session_idx), date, summary, daily_summary, user_feedback (1–7 rating + comment), full turns with telemetry. 30 sessions have empty turns; ignore talking_index.
users row: num_sessions, date_range, total_turns, mean_rating, monthly_summaries.
Memory moments are rare — ~1.4% of user turns — which is exactly why they are worth testing on: existing benchmarks pair externally authored questions with 15–24% of turns.
annotator_NN; all personal names, pet names, and residence-level places / small local organizations replaced with consistent substitutes (same name → same substitute everywhere, including gold facts and questions), after a GPT-5.4 screen of every turn and human review. Public figures, brands, and large cities unchanged. Paper numbers were computed before pseudonymization.@inproceedings{sumida2026memuse,
title = {{MemUse}: Moving Memory Evaluation from Direct {QA} to Natural Integration in Long-Term Human-{AI} Conversation},
author = {Sumida, Ryuichi and Inoue, Koji and Kawahara, Tatsuya},
booktitle = {Proceedings of the 2026 Conference on Empirical Methods in Natural Language Processing (EMNLP)},
year = {2026},
eprint = {2608.24189},
archivePrefix = {arXiv},
primaryClass = {cs.CL},
url = {https://arxiv.org/abs/2608.24189}
}