Try Hanzo

Benchmarks / LoCoMo

measured

LoCoMo

Ten long conversations, 1,540 questions with annotated evidence turns. Hanzo Context measured against cosine over turns and against the annotated gold turns, on the same split, embedder, reader and k.

dataset
LoCoMo
licence
CC BY-NC 4.0
introduced by
Evaluating Very Long-Term Conversational Memory of LLM AgentsMaharana, Lee, Tulyakov, Bansal, Barbieri, Fang, ACL 2024
harness
hanzoai/cloud · bench/brain
our paper
Hops Do Not Fix Multi-Hop Retrieval
node results.mjs

regenerates every table on this page from the raw runs

What is measured

Ten conversations, 5,882 turns, 1,540 questions, each annotated with the turns that answer it. Retrieval is scored against those turns; answering is scored by token F1 and exact match under LoCoMo’s own normalisation. Configurations are chosen on conversations 0–2 and frozen at a commit before conversations 3–9 run once. Adversarial questions are excluded, as Mem0 and Zep exclude them, and the reason is arithmetic rather than convenience: a system that replies “No information available” to every question scores 0.228 on the full set, above every arm that has to find its own evidence, because the metric awards a point for declining a trap. Any aggregate over the whole set rewards silence, so there is no aggregate over the whole set here.

Retrieval

Each row adds one candidate generator — BM25, the atomic fact index, canonical entities, the timeline, adjacency, one hop of typed expansion, then a second retrieval hop asked with what the first resolved. On the held-out split multi-hop ALL@20 goes from 18.8 to 37.5 and R@20 from 70.9 to 80.7. It costs candidates and time: 77 candidates examined against 40, and 1.67 ms against 0.55 ms — three times the retrieval latency, on a budget three orders of magnitude below the reader that consumes the result. The greyed rows are the shapes that lost, kept because a design is only informative next to what it was chosen over.

all ten conversations · zen-embedding-0.6b · k=20

facts LoCoMo’s own observation annotations · weights frozen on dev at 33d0f8749bd1 · ALL = every annotated turn inside the top 20; ANY = at least one; R@20 = |retrieved ∩ gold| / |gold|

configurationmulti-hop ALLmulti-hop ANYsingle-hop ALLtemporal ALLopen-domain ALLR@knDCG@ksupportedcandidatestokens/qp50 ms
semantic only22.779.878.277.333.771.949.681.0406600.55
+lexical22.778.082.578.837.074.653.283.3526650.61
+facts36.988.382.382.642.478.259.686.4717870.83
+adjacency39.088.784.283.544.679.761.487.8747820.83
+iterative hops39.087.986.884.445.780.962.688.0767881.65
failed: global RRF33.789.086.883.840.280.556.289.01377621.73

all ten conversations · all-MiniLM-L6-v2 · k=10

facts LoCoMo’s own observation annotations · weights frozen on dev at 33d0f8749bd1 · ALL = every annotated turn inside the top 10; ANY = at least one; R@10 = |retrieved ∩ gold| / |gold|

configurationmulti-hop ALLmulti-hop ANYsingle-hop ALLtemporal ALLopen-domain ALLR@knDCG@ksupportedcandidatestokens/qp50 ms
semantic only9.649.651.446.116.345.331.153.1402830.25
+lexical13.858.967.262.023.959.243.767.6543010.31
+facts20.973.473.172.025.066.752.075.6733640.42
+adjacency21.674.574.672.627.267.753.376.3773610.42
+iterative hops24.178.077.573.527.270.155.878.5783770.76
failed: global RRF20.274.873.474.128.367.248.676.11433820.43

test split, conversations 3–9 · zen-embedding-0.6b · k=20

facts LoCoMo’s own observation annotations · weights frozen on dev at 33d0f8749bd1 · ALL = every annotated turn inside the top 20; ANY = at least one; R@20 = |retrieved ∩ gold| / |gold|

configurationmulti-hop ALLmulti-hop ANYsingle-hop ALLtemporal ALLopen-domain ALLR@knDCG@ksupportedcandidatestokens/qp50 ms
semantic only18.880.378.372.335.670.948.880.5406510.55
+lexical21.278.482.873.638.473.952.983.2536560.62
+facts35.188.583.078.843.877.958.786.4717711.15
+entities35.188.583.078.843.877.958.786.4717711.10
+timeline34.688.583.379.745.278.259.986.8717691.04
+adjacency37.588.584.680.145.279.160.587.5757671.03
+typed graph37.588.584.680.145.279.160.587.5757670.98
+iterative hops37.588.087.781.445.280.761.687.8777711.67
failed: PRF19.775.572.469.335.666.446.375.86346651.10
failed: chain search37.588.083.878.845.278.556.786.3797641.64
failed: surface entities35.688.083.078.843.877.958.286.2827730.98
failed: global RRF32.288.586.780.138.479.655.588.41397511.20

Answers

The same questions, answered by a reader from the retrieved context. Within a reader the rows differ only in what was retrieved: cosine over turns, the engine, or the annotated gold turns. That last row is the ceiling and it is the column to read first, because it separates retrieval’s share of the error from the reader’s.

The comparison below is gemma4:31b on the 208 multi-hop questions of the test split, because it is the one that finished: the same reader answered every one of them under all three policies. Cosine reaches 36.3 token F1, the engine 39.0, and the annotated gold turns 50.8. So retrieval is worth 2.7 points here and perfect retrieval would be worth about 11.8 more — the larger part of the remaining multi-hop error is the reader, not what was retrieved.

3 readers finished the same questions from the same context, which puts a number on that share: gemma4:31b 39.0, enso-flash 43.1, gpt-oss-120b 43.1 — a spread of 4.1 points from the choice of reader alone, against the 2.7 points retrieval contributes. That is why every table here names its reader, and why a score quoted without one is not a score.

locomo-all-single-k20-gemma4-31b

k=20 · reader gemma4:31b · 282 of 282 answered · commit ddc076f5dd0506ce50428416c336e45c4a7ada73 · run locomo-all-single-k20-gemma4-31b

questionsnin setF1EMtokens/q
all28228237.6[33.6, 41.5]9.9[6.7, 13.5]835
all:multi-hop28228237.6[33.6, 41.5]9.9[6.7, 13.5]835
dev747441.1[33.2, 49.0]6.8[1.4, 12.2]831
dev:multi-hop747441.1[33.2, 49.0]6.8[1.4, 12.2]831
test20820836.3[31.5, 40.9]11.1[7.2, 15.4]836
test:multi-hop20820836.3[31.5, 40.9]11.1[7.2, 15.4]836

locomo-all-context-k20-gemma4-31b

k=20 · reader gemma4:31b · 282 of 282 answered · commit ddc076f5dd0506ce50428416c336e45c4a7ada73 · run locomo-all-context-k20-gemma4-31b

questionsnin setF1EMtokens/q
all28228240.5[36.4, 44.3]9.9[6.7, 13.5]971
all:multi-hop28228240.5[36.4, 44.3]9.9[6.7, 13.5]971
dev747444.7[36.8, 53.2]9.5[4.1, 17.6]984
dev:multi-hop747444.7[36.8, 53.2]9.5[4.1, 17.6]984
test20820839.0[34.7, 43.6]10.1[6.3, 14.4]967
test:multi-hop20820839.0[34.7, 43.6]10.1[6.3, 14.4]967

locomo-all-oracle-k20-gemma4-31b

k=20 · reader gemma4:31b · 282 of 282 answered · commit ddc076f5dd0506ce50428416c336e45c4a7ada73 · run locomo-all-oracle-k20-gemma4-31b

questionsnin setF1EMtokens/q
all28228253.0[49.0, 57.0]16.0[12.1, 20.2]169
all:multi-hop28228253.0[49.0, 57.0]16.0[12.1, 20.2]169
dev747459.2[51.9, 67.0]13.5[6.8, 21.6]135
dev:multi-hop747459.2[51.9, 67.0]13.5[6.8, 21.6]135
test20820850.8[46.0, 55.7]16.8[12.0, 21.6]180
test:multi-hop20820850.8[46.0, 55.7]16.8[12.0, 21.6]180

locomo-all-context-k20-enso-flash

k=20 · reader enso-flash · 282 of 282 answered · commit 9eab30f73493a28244d1cd00b3fa53b83fdfba3c · run locomo-all-context-k20-enso-flash

questionsnin setsupportedF1EMtokens/q
all282153613.545.1[41.2, 49.1]13.8[9.9, 18.1]971
dev7438313.550.9[42.8, 58.6]14.9[6.8, 23.0]984
test208115313.543.1[37.9, 47.5]13.5[9.1, 18.3]967

locomo-all-context-k20-gpt-oss-120b

k=20 · reader gpt-oss-120b · 282 of 282 answered · commit 9eab30f73493a28244d1cd00b3fa53b83fdfba3c · run locomo-all-context-k20-gpt-oss-120b

questionsnin setsupportedF1EMtokens/q
all282153613.545.3[41.6, 49.5]13.5[9.9, 17.4]971
dev7438313.551.5[42.9, 59.4]14.9[6.8, 23.0]984
test208115313.543.1[38.4, 47.8]13.0[8.7, 17.3]967

locomo-all-cer-k20-gemma4-31b

k=20 · reader gemma4:31b · 282 of 282 answered · commit ddc076f5dd0506ce50428416c336e45c4a7ada73 · run locomo-all-cer-k20-gemma4-31b

questionsnin setF1EMtokens/q
all28228240.7[36.7, 44.9]11.0[7.4, 14.5]968
all:multi-hop28228240.7[36.7, 44.9]11.0[7.4, 14.5]968
dev747444.5[36.6, 53.1]10.8[4.1, 17.6]964
dev:multi-hop747444.5[36.6, 53.1]10.8[4.1, 17.6]964
test20820839.3[34.6, 44.2]11.1[7.2, 15.4]970
test:multi-hop20820839.3[34.6, 44.2]11.1[7.2, 15.4]970

locomo-all-cer-k20-enso-flash

k=20 · reader enso-flash · 282 of 282 answered · commit 885a21a63c3254415e40555f7905c8c04aa0be65 · run locomo-all-cer-k20-enso-flash

questionsnin setsupportedF1EMtokens/q
all282153611.042.5[38.1, 46.5]11.7[8.2, 15.2]968
all:multi-hop28228211.042.5[38.1, 46.5]11.7[8.2, 15.2]968
dev7438310.849.6[41.3, 57.7]14.9[6.8, 24.3]964
dev:multi-hop747410.849.6[41.3, 57.7]14.9[6.8, 24.3]964
test208115311.139.9[35.5, 45.0]10.6[6.7, 14.9]970
test:multi-hop20820811.139.9[35.5, 45.0]10.6[6.7, 14.9]970

locomo-all-cer-k20-gpt-oss-120b

k=20 · reader gpt-oss-120b · 282 of 282 answered · commit 885a21a63c3254415e40555f7905c8c04aa0be65 · run locomo-all-cer-k20-gpt-oss-120b

questionsnin setsupportedF1EMtokens/q
all282153611.042.6[38.8, 46.9]11.3[7.8, 15.2]968
all:multi-hop28228211.042.6[38.8, 46.9]11.3[7.8, 15.2]968
dev7438310.848.9[40.5, 57.0]13.5[6.8, 21.6]964
dev:multi-hop747410.848.9[40.5, 57.0]13.5[6.8, 21.6]964
test208115311.140.4[35.9, 45.2]10.6[6.7, 14.9]970
test:multi-hop20820811.140.4[35.9, 45.2]10.6[6.7, 14.9]970

locomo-all-single-k20-qwen3.6-35b-a3b — partial

k=20 · reader qwen3.6:35b-a3b · 1525 of 1536 answered · commit bea5d0ad184462b76db19ad2d601f39c329b7c09 · run locomo-all-single-k20-qwen3.6-35b-a3b

questionsnin setF1EMtokens/q
all1525152548.8[46.6, 51.0]26.2[23.9, 28.5]841
all:multi-hop28228236.7[32.9, 41.0]9.2[6.0, 12.8]835
all:temporal32132147.5[43.3, 51.7]17.4[13.7, 21.8]856
all:open-domain929217.7[11.5, 25.4]12.0[5.4, 19.6]781
all:single-hop83083056.9[54.1, 59.5]37.0[33.9, 40.1]844
dev38338348.8[44.9, 52.7]24.8[20.6, 28.7]864
dev:multi-hop747440.9[33.4, 49.6]8.1[2.7, 14.9]831
dev:temporal909052.7[45.2, 60.3]21.1[13.3, 30.0]893
dev:open-domain19194.5[0.0, 12.0]0.0[0.0, 0.0]782
dev:single-hop20020054.2[48.2, 59.7]35.0[28.5, 41.5]872
test1142114248.8[46.5, 51.4]26.7[24.2, 29.5]833
test:multi-hop20820835.2[31.0, 40.3]9.6[5.8, 13.5]836
test:temporal23123145.4[40.5, 50.5]16.0[11.7, 20.8]842
test:open-domain737321.2[13.4, 29.6]15.1[6.8, 23.3]781
test:single-hop63063057.7[54.5, 61.2]37.6[33.8, 41.4]835

locomo-all-context-k20-qwen3.6-35b-a3b — partial

k=20 · reader qwen3.6:35b-a3b · 1525 of 1536 answered · commit 12468828cfba9497ebbb927af840534bb7e3fce2 · run locomo-all-context-k20-qwen3.6-35b-a3b

questionsnin setF1EMtokens/q
all1525152553.3[51.2, 55.4]29.0[26.9, 31.3]969
all:multi-hop28228243.0[38.7, 47.1]13.1[9.6, 17.4]971
all:temporal32132149.5[45.1, 53.6]18.1[14.0, 22.7]994
all:open-domain929219.8[13.0, 27.4]13.0[6.5, 20.7]917
all:single-hop83083061.9[59.1, 64.4]40.4[37.1, 43.5]964
dev38338351.9[48.0, 55.8]26.4[22.2, 30.8]1015
dev:multi-hop747445.1[36.6, 53.6]13.5[6.8, 21.6]984
dev:temporal909052.0[44.2, 59.0]18.9[11.1, 26.7]1058
dev:open-domain19197.4[1.3, 16.0]0.0[0.0, 0.0]987
dev:single-hop20020058.6[52.9, 64.0]37.0[30.5, 44.0]1010
test1142114253.7[51.5, 56.1]29.9[27.3, 32.6]954
test:multi-hop20820842.3[37.9, 47.0]13.0[8.7, 17.8]967
test:temporal23123148.5[43.3, 53.3]17.7[13.0, 22.9]969
test:open-domain737323.0[15.1, 31.7]16.4[8.2, 26.0]899
test:single-hop63063063.0[59.9, 66.1]41.4[37.6, 45.2]950

locomo-all-oracle-k20-qwen3.6-35b-a3b — partial

k=20 · reader qwen3.6:35b-a3b · 1525 of 1536 answered · commit 12468828cfba9497ebbb927af840534bb7e3fce2 · run locomo-all-oracle-k20-qwen3.6-35b-a3b

questionsnin setF1EMtokens/q
all1525152561.8[59.7, 63.8]34.6[32.5, 36.9]82
all:multi-hop28228255.6[51.2, 59.9]20.2[15.6, 24.8]169
all:temporal32132154.4[50.3, 58.7]22.7[18.4, 27.7]64
all:open-domain929226.4[18.7, 34.9]19.6[12.0, 28.3]117
all:single-hop83083070.8[68.2, 73.1]45.8[42.2, 49.0]56
dev38338361.2[57.4, 65.1]32.6[27.9, 37.3]76
dev:multi-hop747460.6[53.0, 69.3]18.9[10.8, 28.4]135
dev:temporal909057.0[49.1, 64.5]28.9[20.0, 37.8]63
dev:open-domain19199.1[2.1, 17.4]0.0[0.0, 0.0]114
dev:single-hop20020068.3[63.2, 73.3]42.5[36.0, 49.0]56
test1142114262.1[59.9, 64.4]35.3[32.5, 38.2]84
test:multi-hop20820853.9[49.2, 58.9]20.7[15.4, 26.4]180
test:temporal23123153.4[48.3, 58.2]20.3[15.2, 25.5]64
test:open-domain737331.0[22.2, 41.6]24.7[16.4, 35.6]118
test:single-hop63063071.5[68.8, 74.5]46.8[43.0, 51.0]56

locomo-all-cer-k20-qwen3.6-35b-a3b — partial

k=20 · reader qwen3.6:35b-a3b · 1525 of 1536 answered · commit 12468828cfba9497ebbb927af840534bb7e3fce2 · run locomo-all-cer-k20-qwen3.6-35b-a3b

questionsnin setF1EMtokens/q
all1525152550.3[48.2, 52.4]26.7[24.5, 28.9]970
all:multi-hop28228240.2[35.9, 44.4]11.3[7.8, 15.2]968
all:temporal32132148.6[44.3, 52.8]16.5[12.8, 20.9]995
all:open-domain929214.9[9.1, 22.0]9.8[4.3, 16.3]906
all:single-hop83083058.4[55.7, 61.2]37.7[34.6, 40.8]967
dev38338350.4[46.6, 54.4]25.1[20.9, 29.8]996
dev:multi-hop747443.3[34.8, 51.2]10.8[4.1, 18.9]964
dev:temporal909052.7[44.8, 60.5]17.8[11.1, 26.7]1039
dev:open-domain19197.3[1.1, 16.1]0.0[0.0, 0.0]940
dev:single-hop20020056.1[50.6, 61.8]36.0[30.0, 42.5]994
test1142114250.3[47.9, 52.6]27.2[24.7, 29.9]961
test:multi-hop20820839.1[34.3, 43.7]11.5[7.2, 15.9]970
test:temporal23123147.0[42.0, 52.1]16.0[11.7, 21.2]978
test:open-domain737316.9[9.8, 24.8]12.3[5.5, 20.5]897
test:single-hop63063059.1[55.7, 62.3]38.3[34.6, 42.1]959

Where it loses

The multi-hop answer gain does not clear its interval. Retrieval’s multi-hop ALL@20 roughly doubles — 18.8 to 37.5 — and the answer gain that follows it, 36.3 to 39.0, sits inside the bootstrap interval of the baseline. Two marginal intervals that overlap do not establish that there is no difference, and they do not establish that there is one. Finding the right turns is not the same problem as reasoning over them, and this benchmark says so.

Open-domain answers are below the baseline. On the 92 open-domain questions the earlier four-term re-rank scores 14.9 token F1 against cosine’s 17.7, on intervals wide enough that the ordering is all the table establishes. It is the one row where a shipped configuration is worse than the thing it replaced, and it is in the table above rather than in a footnote.

The full-question-set runs did not finish. The qwen3.6:35b-a3b runs are the only ones that answer all four question categories rather than multi-hop alone, and each stopped 11 questions short of its declared set. Their tables are above, dimmed, with both counts on them. They are not in the comparison, they carry the only open-domain figures on this page — which is why that loss is quoted from them and labelled — and the honest reading is that the whole-set answer picture on LoCoMo is not settled here yet.

The other LoCoMo harness

hanzoai/semantic · bench/locomo measures the same dataset and its numbers do not belong beside these. It uses lexical retrieval with no embedding model, a fixed extractive reader with no language model anywhere, and all 1,986 questions including the adversarial quarter, reported apart. Its absolute F1 is far below anything on this page for that reason, and comparing the two would be comparing readers, not memories. It has its own page and its own paper.

The other benchmarks

MemoryAgentBench · LongMemEval · RepoBench-R · LoCoMo · subject scope · LoCoMo-Conv · Fleet residency · Live agent footprint · Sandbox cold start · Inference vs llama.cpp · GPQA-Diamond · all of them, and the head-to-head

raw runs, traces, prompts and scoring: hanzoai/cloud · bench/brain · protocol in METHOD.md · every table above regenerated by node results.mjs