Benchmarks

Measured results, with the method shown.

How fast and how accurate M.N.E.M.O. retrieval is, and how that holds up as memory grows. For why it works this way, read the architecture.

The data structure on its own

OAT lookup time as memory grows

Measured separately from the product benchmark further down this page: the OAT library itself in Java 21, three axes (Topic × TimeRange × Speaker), one memory per unique combination, looked up by its full intersection key. Each figure is the median of six runs, and each run takes the median of 500 batches of 1,000 random lookups. The linear scan searches the same memories one by one for a randomly chosen target.

MemoriesOAT lookupLinear scanOAT advantage
1,00060 ns15 µs~260×
5,000190 ns130 µs~670×
20,000270 ns0.79 ms~3,000×
50,000470 ns2.7 ms~5,600×

The lookup stays under half a microsecond at 50,000 memories. Its small rise with size comes from CPU cache misses as the index outgrows the processor cache, not from extra work: with the same keys held in cache, a lookup takes 30–60 ns at every size. The scan's cost grows with the data.

Benchmarked, not just argued

OAT vs. vector search vs. GraphRAG, measured

These are real numbers from mnemo-benchmark, measured on a synthetic benchmark dataset — 25 hand-authored queries across five complexity categories over 101 records, a controlled comparison rather than a large-scale production sample. At this size, differences that only appear as memory grows can't show up here; the data-structure measurement above shows how OAT behaves as memory grows. All three retrieval approaches run against the same dataset: OAT through a real, unmodified MNEMO agent (not a reference implementation), vector search through real OpenAI embeddings and brute-force cosine similarity, GraphRAG through real LLM entity/relationship extraction and graph traversal. Every synthesized answer uses the same LLM for all three systems, so the numbers below isolate retrieval quality, not model quality.

Pure retrieval speed is measured separately, with no LLM in the loop, in the data-structure comparison further down (warmed up, averaged over 50 runs, in nanoseconds). The numbers here are full turns. Inside a turn, MnemoRAG's retrieval step also parses the chosen path and renders the results as text, so it takes longer than the bare OAT lookup. The LLM step that decideswhere to look is real, necessary work the other two systems' simpler indexes skip, and it's counted in the full turn, not hidden.

Across these 25 queries, MnemoRAG's average full turn of 1.7s breaks down into 43ms of path selection (the LLM reading the Memory Path index), 5ms of retrieval, and 1.6s of answer writing. Most of MnemoRAG's time goes to path selection, not to OAT.

Methodology: what each metric measures

Accuracy grades the full pipeline's final synthesized answer against ground truth — not retrieval in isolation. A wrong or incomplete retrieval fails accuracy too, since the LLM can't correctly answer from data it never got.

Groundedness is graded independently of correctness: does the synthesized answer's claims trace to what was actually retrieved? A confidently wrong answer built from mis-retrieved data can still score as grounded by this definition — it's checking traceability, not correctness. The two numbers are meant to be read together, not collapsed into one.

Hallucination rate is not simply 100% minus the average groundedness score above, and the two aren't expected to sum to 100% — they're computed differently. Groundedness is a continuous score (0–1) averaged across every query. Hallucination is a per-query flag, true whenever that query's individual groundedness score falls below 0.8 — so a batch of queries clustered just above that threshold can pull the average groundedness score down further than the hallucination rate alone would suggest.

The correctness judge sees the question, the reference answer, and the candidate answer — not the retrieved content. The groundedness judge sees the candidate answer and the retrieved content — not the reference answer. Both use the same fixed judge model and prompt applied uniformly across all three systems, so no system is graded more leniently than another.

On Multi Axis Pivot and Aggregation queries, the number itself comes from OAT's accumulate, which computes the exact total or average directly. The LLM only phrases the final sentence around that value; it never adds up the figures itself.

Timing resolution. Full-turn times are recorded in whole milliseconds. Pure retrieval is timed separately in nanoseconds, warmed up and averaged, in the data-structure comparison.

Primary comparison

End-to-end time by query type

Retrieval + reasoning + answer synthesis combined — the number a user actually waits for.

<1ms5.0s10.0s15.0s20.0s1.4s1.6s1.6s1.4s2.5s1.6s2.6s3.8s13.6s1.3s2.0s1.5s1.7s1.9s2.0sExact LookupMulti Axis PivotAggregationEntity RelationshipSemantic Fuzzy
MnemoRAGVector RAGGraphRAG

Content shape and confidence

Accuracy and refusal rate by document format

Structured records, unstructured prose, multi-axis pivot tables, and flat lookup tables — the same three systems, four content shapes. Every LLM call in this benchmark, judge included, uses the same model: Claude Haiku 5.5. Each format category is a small, single-digit set of queries drawn from the 25-query dataset above — read the percentages below as directional signal, not statistically robust point estimates.

A wrong answer can mean two very different things: the system invented a fact, or it retrieved nothing and honestly said so. Refusal rate below is the second case — a per-query judge flag for an honest "I don't know" or "not found," independent of whether the question even had an answer available. It is not the same chart as hallucination rate (fabrication), which stays near-zero across every format shown here — see "Reading these numbers" further down for that number. A low accuracy bar paired with a high refusal bar means the system is failing honestly, by retrieving badly, not by making things up.

The Vector arm is a deliberately plain baseline: the top 5 chunks of 800 characters by cosine similarity, no re-ranking, no hybrid search. That is why it scores 0% on pivot tables: matching a transaction ID such as TXN-00151 is not something embeddings do well, and a total or average over hundreds of rows cannot fit in five chunks. A tuned retrieval stack would do better; this chart shows what the plain approach does.

Accuracy

0%25%50%75%100%100%100%17%100%100%100%100%0%33%100%100%80%StructuredUnstructuredPivot TableTabular
MnemoRAGVector RAGGraphRAG

Refusal rate

0%25%50%75%100%0%0%83%0%0%0%0%33%67%0%0%20%StructuredUnstructuredPivot TableTabular
MnemoRAGVector RAGGraphRAG

Gloves off — no LLM, no agent layer

Pure data-structure performance: OAT vs. Vector vs. GraphRAG

Every chart above still includes MnemoRAG's LLM path-selection cost — real, necessary work for a product, but it obscures what OAT the data structure actually costs to query. Below, every system's one-time LLM/ embedding call (deciding where to look) happens once and is excluded from the timed loop; the native data-fetch itself then repeats 60 times per query with zero further API calls, and both speed and accuracy are measured directly against the same ground truth used everywhere else on this page.

This is deliberately not an apples-to-apples operation, and no system's JSON or text rendering is timed (JSON exists only because an LLM reads and writes text; it is not part of any data structure). OAT's request is resolved to tree objects beforehand, then the timed work is the native lookup: an intersection-index lookup when the path names several axes, a walk of the path's subtree when it names one, or a scan and aggregate over the matching leaves for sums and averages. Vector's native operation is a full brute-force cosine-similarity scan over its entire indexed corpus, because that scan is what vector search is. GraphRAG's is a linear substring scan over every known entity name plus a capped tabular-row scan. Comparing these numbers compares what each data structure actually costs to query on its own terms. Aggregation has to read every matching value, so its cost follows the number of matching records; OAT reaches those records through an inverted index rather than scanning the tree.

The first 10 of the 60 runs per query are discarded as warm-up. Times are shown in nanoseconds so the sub-millisecond differences between the three are visible.

Speed (no LLM)

0 ns500,000 ns1.00 ms1.50 ms2.00 ms3,204 ns1.82 ms157,793 ns19,060 ns1.81 ms168,190 ns39,546 ns1.78 ms146,401 ns728 ns1.87 ms180,111 nsExact LookupMulti Axis PivotAggregationEntity Relationship
OATVector RAGGraphRAG

Accuracy (no LLM)

0%25%50%75%100%100%0%100%100%0%0%100%60%100%100%100%100%Exact LookupMulti Axis PivotAggregationEntity Relationship
OATVector RAGGraphRAG

Overall: OAT 15,634 ns / 100% accurate  ·  Vector 1.82 ms / 40% accurate  ·  GraphRAG 163,124 ns / 75% accurate. Semantic Fuzzy queries are excluded — no deterministic ground truth to grade without an LLM judge.

View full numbers — every query type, every system
Query typeSystemFull turnAccuracyGroundedness
Exact LookupMnemoRAG1.4s100%100%
Vector RAG1.6s0%100%
GraphRAG1.6s100%95%
Multi Axis PivotMnemoRAG1.4s100%100%
Vector RAG2.5s0%100%
GraphRAG1.6s0%99%
AggregationMnemoRAG2.6s100%91%
Vector RAG3.8s40%100%
GraphRAG13.6s100%90%
Entity RelationshipMnemoRAG1.3s100%100%
Vector RAG2.0s100%100%
GraphRAG1.5s100%100%
Semantic FuzzyMnemoRAG1.7s100%98%
Vector RAG1.9s100%97%
GraphRAG2.0s80%100%
OverallMnemoRAG1.7s100%98%
Vector RAG2.4s48%99%
GraphRAG4.0s76%97%

Reading these numbers

Faster and more accurate.

There are two different clocks here. With no LLM in the loop, OAT is the faster data structure in every category measured: an exact lookup takes 3,204 ns against GraphRAG's 157,793 ns (49× faster), a multi-axis pivot 9× and an aggregation 4×. In a full turn, MnemoRAG skips its LLM path-selection call when the question names its data (an ID, a customer and a product, or the values that fix an aggregate), so exact lookups (1.4s against GraphRAG's 1.6s), multi-axis questions (1.4s against 1.6s), aggregations (2.6s against 13.6s), entity-relationship questions (1.3s against 1.5s) and semantic questions (1.7s against 2.0s) are all at or ahead of GraphRAG. On aggregation the lead is largest because OAT computes the total itself while GraphRAG's LLM adds up the rows. Every question in this benchmark names the records it is about, so this is the fast case: a question that describes a problem without naming the customer or the product still needs the LLM to decide where to look, and takes a few seconds longer.

The speed does not cost any accuracy. On accuracy, MnemoRAG leads (100% vs. GraphRAG's 76%). On hallucination, MnemoRAG flagged 4% of its answers and GraphRAG 0% in this run — a per-query flag from a judge model (see Methodology), so treat small differences as noise. Over the whole benchmark a full MnemoRAG turn averages 1.7s against GraphRAG's 4.0s, with the higher accuracy.