|
| 1 | +# Benchmark Matrix v2 — internal results (publication-ready) |
| 2 | + |
| 3 | +Supersedes `matrix-v1.2-summary.md` (pre-rubric-correction, pre-#994). Same |
| 4 | +harness, corrected judge rubric (basic-memory-benchmarks #36/#37), BM under test |
| 5 | +is **`main` post-#994** (FTS-revival merged). Internal-only; written to withstand |
| 6 | +external scrutiny. |
| 7 | + |
| 8 | +## Methodology (what makes these numbers fair) |
| 9 | + |
| 10 | +- **Zero API spend.** Answering and judging run through the Claude plan |
| 11 | + (`claude -p`); competitor internal LLM calls (mem0 extraction) run on local |
| 12 | + Ollama. No paid API. |
| 13 | +- **Fixed answerer and judge, identical for every provider.** Answerer |
| 14 | + `claude:claude-haiku-4-5`, judge `claude:claude-sonnet-4-6`. Each provider |
| 15 | + retrieves; the *same* answerer writes an answer from the retrieved memories; |
| 16 | + the *same* judge grades it against gold. Holding the answerer constant is what |
| 17 | + isolates retrieval — but it also means **absolute QA accuracy is |
| 18 | + answerer-dependent** (a stronger answerer would raise every number). Relative |
| 19 | + standings are the robust comparison. |
| 20 | +- **Corrected rubric**, validated on all gold-answer styles including abstention |
| 21 | + (the #36→#37 fix). Judge decisions are auditable per case via `run review` |
| 22 | + HTML reports. |
| 23 | +- **`run diagnose`** attributes every QA failure to *retrieval* (gold not found) |
| 24 | + vs the *answerer* (gold found, answer still wrong) — see below. |
| 25 | +- No feature flags: BM runs default `main`. |
| 26 | + |
| 27 | +## Anchors |
| 28 | + |
| 29 | +LongMemEval-S (stratified 60, 6 categories) and ConvoMem cs10 (274). LoCoMo is |
| 30 | +secondary (Penfield-corrected key, adversarial excluded) and reported separately. |
| 31 | + |
| 32 | +### 1. Retrieval — the answerer-independent signal (lead with this) |
| 33 | + |
| 34 | +| Benchmark | provider | recall@5 | recall@10 | MRR | mean lat | |
| 35 | +|---|---|---|---|---|---| |
| 36 | +| LongMemEval-60 | bm-local | 0.951 | 0.951 | **0.900** | 754ms | |
| 37 | +| LongMemEval-60 | mem0-local | **0.979** | 0.992 | 0.876 | 146ms | |
| 38 | +| LongMemEval-60 | baseline-grep | 0.846 | 0.937 | 0.832 | 5ms | |
| 39 | +| ConvoMem-274 | bm-local | 0.982 | 0.996 | 0.929 | 140ms | |
| 40 | +| ConvoMem-274 | mem0-local | **0.996** | 1.000 | **0.956** | 122ms | |
| 41 | +| ConvoMem-274 | baseline-grep | 0.954 | 1.000 | 0.863 | 1ms | |
| 42 | + |
| 43 | +Retrieval is **near-parity**: mem0 marginally leads recall@5, BM leads MRR on |
| 44 | +LongMemEval and is within ~0.03 on ConvoMem. Both systems find the gold evidence |
| 45 | +almost always (recall@10 ≥ 0.95). grep is a strong lexical baseline here. |
| 46 | + |
| 47 | +### 2. QA accuracy — corrected rubric (BM leads decisively) |
| 48 | + |
| 49 | +| Benchmark | bm-local | mem0-local | baseline-grep | full-context | |
| 50 | +|---|---|---|---|---| |
| 51 | +| LongMemEval-60 | **0.583** | 0.450 | 0.333 | 0.217 | |
| 52 | +| ConvoMem-274 | **0.755** | 0.464 | 0.380 | 0.799 | |
| 53 | + |
| 54 | +Abstention rates (answerer says "I don't know"): LongMemEval BM **20**/60 vs mem0 |
| 55 | +30/60; ConvoMem BM **86**/274 vs mem0 169/274. mem0 abstains ~2× more often. |
| 56 | + |
| 57 | +### 3. Diagnostic — why BM's QA lead is NOT a retrieval effect |
| 58 | + |
| 59 | +`run diagnose`, per provider, over answerable questions: |
| 60 | + |
| 61 | +| Benchmark | provider | retrieval ceiling | answerer gap | retrieval gap | of failures: answerer | |
| 62 | +|---|---|---|---|---|---| |
| 63 | +| LongMemEval-60 | bm-local | 0.983 | 0.400 | 0.017 | 96% | |
| 64 | +| LongMemEval-60 | mem0-local | 1.000 | 0.550 | 0.000 | 100% | |
| 65 | +| ConvoMem-274 | bm-local | 1.000 | 0.245 | 0.000 | 100% | |
| 66 | +| ConvoMem-274 | mem0-local | 1.000 | 0.535 | 0.000 | 100% | |
| 67 | + |
| 68 | +The retrieval ceiling (max QA if the answerer were perfect) is ~1.0 for **both** |
| 69 | +systems — i.e. essentially every QA failure is "the gold evidence *was* retrieved, |
| 70 | +the answer was still wrong," not "retrieval missed it." So the BM>mem0 QA gap is |
| 71 | +**not** a recall gap. It is that **the memories BM returns are more answerable by |
| 72 | +the fixed model** — BM returns dated, in-context chunks; mem0 (raw-add) returns |
| 73 | +material the small answerer more often can't commit to, so it abstains. On |
| 74 | +ConvoMem the haystack fully fits the retrieval window (ceiling 1.000 for |
| 75 | +everyone), so that benchmark measures *presentation + answering*, not recall. |
| 76 | + |
| 77 | +**Honest reading:** lead published comparisons with **recall@k / MRR** (parity, |
| 78 | +answerer-independent). Present QA as a secondary "answer-bearing context" signal |
| 79 | +where BM leads — with the mem0-infer caveat below kept prominent. |
| 80 | + |
| 81 | +## LoCoMo (secondary) — BM product progression |
| 82 | + |
| 83 | +LoCoMo is Penfield-flagged (~6.4% gold-key errors; adversarial excluded). We |
| 84 | +report BM's own improvement across the two shipped fixes, same q300 subset and QA |
| 85 | +stage, corrected rubric: |
| 86 | + |
| 87 | +| QA accuracy | BM main | +FTS (#994) | +FTS +title | |
| 88 | +|---|---|---|---| |
| 89 | +| overall | 0.439 | 0.475 | **0.641** | |
| 90 | + |
| 91 | +multi_hop is the driver (4/63 → 40/63): these are relative-date questions that |
| 92 | +were unanswerable until the dated session title was surfaced to the answerer |
| 93 | +(harness fix #31, provider-faithful — BM already returns the title). BM retrieval |
| 94 | +on this slice: recall@5 0.774, recall@10 0.875, MRR 0.697. Diagnostic: ceiling |
| 95 | +0.930, 19% of failures are true retrieval misses (the only anchor with real |
| 96 | +retrieval headroom). A corrected-rubric mem0 head-to-head on this exact subset is |
| 97 | +**not yet run** — the earlier mem0 LoCoMo number (0.535) predates the rubric fix |
| 98 | +and is not directly comparable. |
| 99 | + |
| 100 | +## supermemory-local — preliminary, fair full run blocked |
| 101 | + |
| 102 | +Provider works end-to-end vs `supermemory-server 0.0.2` (local, Ollama-backed). |
| 103 | +Preliminary 35-q ConvoMem smoke: QA tied (both 0.943), BM search **3.4× faster** |
| 104 | +(84ms vs 289ms). A fair full run is **blocked by upstream #1096**: supermemory's |
| 105 | +memory-agent calls the OpenAI Responses API (Ollama rejects it), spending ~228s/doc |
| 106 | +before skipping, so grouped ingest times out. Also #1093: on-device embedding RSS |
| 107 | +ballooned to ~24GB. Two findings stand: supermemory-local is operationally heavy |
| 108 | +(slow + memory-hungry vs BM's lightweight fastembed), and on the slice that |
| 109 | +completed, BM matches its QA and is markedly faster. Needs a |
| 110 | +Responses→ChatCompletions shim for a complete comparison. |
| 111 | + |
| 112 | +## Caveats (read before citing) |
| 113 | + |
| 114 | +- **mem0 ran raw-add (`infer=false`).** mem0's published numbers use `infer=true` |
| 115 | + (LLM fact extraction). We matched the June-10 baseline and avoided an unvetted |
| 116 | + local-3B extraction step. mem0's QA could improve under `infer=true`; a fair |
| 117 | + external comparison must run mem0 both ways with the extraction model documented. |
| 118 | +- **QA is answerer-bound** (the diagnostic). These absolute numbers reflect a |
| 119 | + haiku-class answerer; a stronger answerer raises all of them. Don't read QA as a |
| 120 | + pure retrieval-quality measure — that's what recall@k/MRR are for. |
| 121 | +- **Judge-human agreement not yet measured.** Every QA number rests on the LLM |
| 122 | + judge. The `run review` HTML reports support human labeling; the judge-vs-human |
| 123 | + agreement pass is the remaining validation before any external publication. |
| 124 | +- **LoCoMo** gold key is documented-imperfect; treat as directional. |
| 125 | +- **n sizes**: LongMemEval 60, LoCoMo q300 subset — modest; ConvoMem 274. |
| 126 | + |
| 127 | +## Remaining for external publication |
| 128 | + |
| 129 | +1. **Judge-human agreement pass.** A balanced 60-case sample is ready at |
| 130 | + `benchmarks/runs/judge-agreement-sample/review.html` (seed 42; 24 LongMemEval |
| 131 | + / 24 ConvoMem / 12 LoCoMo; 36 BM / 12 mem0 / 12 grep; 20 correct / 20 incorrect |
| 132 | + / 20 abstain). Open it, label each verdict agree/disagree/unsure, Export, and |
| 133 | + report agreement = agree / (agree + disagree). Publish the agreement rate |
| 134 | + alongside the numbers — every QA figure rests on the judge. |
| 135 | +2. mem0 `infer=true` (and corrected-rubric mem0 on LoCoMo q300) to complete the matrix. |
| 136 | +3. supermemory Responses→ChatCompletions shim (#1096) for a fair full run. |
0 commit comments