Benchmarks¶
Every figure here is traceable to a committed artifact. Each section opens with the outcome it proves — cost, latency, or operational footprint — then shows the measured numbers. uniko is measured on the full LoCoMo10 benchmark (1,986 questions) and against the KTH dmas-memory testbed of five other memory systems, plus a set of write-path microbenchmarks.
Ingest costs you nothing, and finishes in minutes¶
Ingest extracts entities and observations through a local INT8 ONNX cascade (kniv-deberta) with zero LLM API calls — $0 in ingest tokens by construction. The full 5,882-turn LoCoMo corpus loads in 7.5 minutes, ~76 ms/turn.
| System | Total $ | Tokens | Wall (min) | per-turn ms |
|---|---|---|---|---|
| uniko | ~$0 | 0 (local NLP) | 7.5 | 76 |
| full_context | $0.00 | 0 | 21.08 | ~215 |
| rag | $0.006 | 308k | 40.29 | ~411 |
| cognee | $1.32 | 6.7M | 493.47 | ~5031 |
| mem0 | $4.82 | 51.7M | 250.95 | ~2560 |
| graphiti | $5.49 | 34.6M | 568.97 | ~5804 |
Against the graph backends (Graphiti, Cognee), uniko is 33–76× faster at the per-turn level and avoids $1.32–$5.49 of ingest cost per corpus. (KTH dmas-memory comparison, arXiv:2601.07978, measured 2026-06-14.)
Queries return in 4 seconds, with the fewest tokens¶
uniko answers in 4.04s mean wall time — the fastest of all six systems measured — using 2,468 total tokens per query.
| System | Answer $/q | Total $ (1540 q) | Avg wall | Ctx-in tok | Total tok |
|---|---|---|---|---|---|
| mem0 | $0.000179 | $0.28 | 4.56s | 752 | 1235 |
| rag | $0.000259 | $0.40 | 4.34s | 1308 | 1790 |
| uniko | $0.000657 | $1.01 | 4.04s | 2435 | 2468 |
| graphiti | $0.000657 | $1.01 | 6.20s | 2174 | 4546 |
| cognee | $0.000715 | $1.10 | 6.99s | 248 | 4780 |
| full_context | $0.006786 | $10.45 | 9.51s | 44312 | 45708 |
- Fastest Q&A wall time of all six systems (4.04s). The two graph backends are 53% (Graphiti) and 73% (Cognee) slower.
- Half the total LLM tokens per query of either graph backend (2,468 vs Graphiti 4,546, Cognee 4,780).
- Answer cost is driven by retrieved-context size (2,435 input tokens) — a recall-budget setting you tune, not an architectural floor.
It runs with zero infrastructure¶
The entire suite — database, NLP cascade, embeddings, optional reranker — runs in one process on a 22-core CPU and an 8 GB consumer GPU. There is no Neo4j, Qdrant, or Postgres to operate, and no network plane to constrain. Ingest has no per-message network dependency, so it stays fast and free offline.
Recall quality you can defend¶
uniko scores 0.8117 LLM-judge accuracy on all 1,986 LoCoMo10 questions, with 0.8555 retrieval hit, F1 0.321, at $3.55 total LLM cost — judged with Mem0's verbatim prompt for comparability.
| Metric | Value |
|---|---|
| LLM-judge (gemini-3.1) | 0.8117 |
| Retrieval hit | 0.8555 |
| F1 | 0.321 |
| Total LLM cost (answer + judge) | $3.55 |
| Ingest wall time | 7.5 min for 5,882 turns (~62 ms/turn) |
| Ingest API cost | $0 |
| Mean Q&A latency | 4.04s (2.84s recall + 1.20s generation) |
Published competitor judge scores on LoCoMo: Mem0 91.6%, Graphiti 75–84%, Letta 74.0%, LangMem 58.1%.
Two source-faithful ingest rates
Both numbers describe the same 7.5 min / 5,882-turn run: ~76 ms/turn is the wall-clock rate
reported in the KTH comparison; ~62 ms/turn is the steady-state post-warmup rate from
perf-journey.md.
Source: data/locomo_gemini31_merged.json, baseline dated 2026-05-26.
How these were measured¶
Both benchmarks feed an agent a long, multi-session conversation, ask questions about that history, and score whether the right evidence was retrieved and the right answer produced.
- LoCoMo (10 conversations, 1,986 questions) measures end-to-end question answering across categories — single-hop, multi-hop, temporal, adversarial, open-domain — scored with an LLM-as-judge.
- LongMemEval measures retrieval quality on three question types: SSU
(single-session-user), SSA (single-session-assistant), and MS (multi-session), scored
with
contains, R@5, and NDCG@5.
Local-only ingest, LLM only for answer and judge
During ingest, uniko runs a local ONNX NLP cascade and makes zero LLM API calls — $0 in ingest tokens by construction. An LLM is invoked only at answer time (to generate the response) and, in evaluation, at judge time (to score it).
Two question sets — don't conflate them
The 0.8117 judge figure is the full 1,986-question LoCoMo10 run; the KTH cost and latency tables above use the 1,540-question non-adversarial subset.
Supporting evidence¶
LongMemEval retrieval slice¶
An 11-question slice (5 SSU + 3 SSA + 3 MS), GPU, BGE-small 384d embedder, retrieval-only (no LLM judge). Numbers are verbatim from the bench output JSON.
| Category | n | contains | R@5 | NDCG@5 |
|---|---|---|---|---|
| SSU | 5 | 1.000 | 1.000 | 1.000 |
| SSA | 3 | 0.333 | 1.000 | 1.000 |
| MS | 3 | 0.667 | 0.667 | 0.650 |
| ALL | 11 | 0.727 | 0.909 | 0.905 |
SSA is a chunking-strategy lever
On the 3 SSA questions, session-level retrieval is perfect (R@5 = 1.000 on all three) — the
right session is always retrieved. On 2 of 3, the answer text simply isn't in that session's
top-5 chunks. The Phase-1 gate measures chunk-level containment, so this is a
chunking-strategy tuning lever, not a recall-algorithm gap. Adding the
cross-encoder/ms-marco-MiniLM-L-6-v2 reranker on the 6 non-SSU questions lifts aggregate R@5
from 0.833 to 0.875 with no change in contains rate, at ~2× latency.
Directional at n = 11
This slice is 11 questions; per-question variance is high (flipping one R@5 from 0.5 to 1.0 moves a category average by ~0.17). Treat these as directional, and validate on your own workload.
Source: uniko LongMemEval bench run (2026-05-17).
Perf journey: hours → minutes¶
The same-size LoCoMo conversation that took 2h 7m to ingest on 2026-04-21 now ingests at ~62 ms/turn — a ~22–28s ingest for the same 369-turn conversation, ≈ 300× faster.
graph LR
A["2026-04-21<br/>2h 7m / 369 turns"] -->|uni-db fixes<br/>bulk APIs<br/>mimalloc| B["2026-06-14<br/>7.5 min / 5,882 turns<br/>~62 ms/turn"]
The April pathology was not a slow uniko algorithm — it was two uni-db bugs (a 600 ms retry-storm
per flush and an O(total_rows) index rebuild) that uniko isolated as minimal repros and filed
upstream. The ~300× win is a substrate win unlocked by that repro discipline, compounded by
uni-db's bulk_insert APIs and the mimalloc allocator (~3×). Source: uniko perf-journey
records.
Microbenchmarks: bulk API vs Cypher UNWIND¶
uniko's ingest hot paths write through uni-db's bulk API (bulk_insert_vertices /
bulk_insert_edges) instead of Cypher UNWIND … CREATE. Measured on the real batch-size
distribution of LoCoMo conv-26 ingestion (419 turns, 19 sessions), median over 5 reps.
| Operation | Speedup | Detail |
|---|---|---|
| Edges | 524× | ~2.6 µs vs ~1367 µs/op; 11.4 ms vs 5954 ms whole-conv |
| Nodes (no embed) | 49.6× | 3.4 ms vs 167 ms |
| Nodes (with embed) | 1.4× | embedder dominates both arms |
The practical takeaway
Use the bulk API for all edge writes (the 524× gap is structural). Use it for node writes too, but the ~50× win applies only when the label is not auto-embedding — for auto-embed labels like Chunk and Observation, the embedder is the bottleneck and the write path is a rounding error.
Source: uniko bulk-vs-unwind microbenchmark (uni-db 2.0.2, CPU, BGE-small).
Canonical current numbers¶
| Benchmark | Metric | Value | Date |
|---|---|---|---|
| LoCoMo10 (1,986q) | judge / hit / F1 / cost | 0.8117 / 0.8555 / 0.321 / $3.55 | 2026-05-26 |
| LoCoMo10 | ingest | 7.5 min / 5,882 turns / $0 (~62 ms/turn) | 2026-06-14 |
| LME 11q slice | contains / R@5 | 0.727 / 0.909 (retrieval-only) | 2026-05-17 |
| Bulk vs UNWIND | edges / nodes | 524× / 49.6× | — |