Skip to content

Benchmarks

Real numbers, measured on real hardware. No marketing estimates.

Test environment

Server: Linux 6.8.0-124-generic, shared VPS (Olivier / Scaleway) Python: 3.11.15 · NumPy: as shipped · FAISS: IndexFlatIP (exact, <50K vectors) Embedding dim: 384 (all-MiniLM-L6-v2) Methodology: 500–1000 queries per test, warm-up discarded, time.perf_counter(), single-threaded unless noted.


Search Latency

The core operation: how fast can Ariadne find relevant memories?

DatasetVector (FAISS)Keyword (FTS5)Hybrid (RRF)Full recall()
1,0000.29 ms p50 · 5.7 ms p991.69 ms p50 · 2.8 ms p994.55 ms p50 · 10.5 ms p997.54 ms p50 · 13.8 ms p99
5,0000.63 ms p50 · 6.8 ms p996.97 ms p50 · 9.6 ms p999.14 ms p50 · 13.6 ms p9912.75 ms p50 · 19.0 ms p99

What each column measures

OperationPipeline
VectorFAISS IndexFlatIP — single BLAS matmul over L2-normalized embeddings
KeywordSQLite FTS5 BM25 — inverted index with porter stemming
HybridVector + FTS5 run in parallel, fused with Reciprocal Rank Fusion
recall()Hybrid search + access logging + retention scoring (full agent path)

Sub-millisecond vector search

At 1K memories, the median vector search completes in 0.29 ms — faster than a single network round-trip to any cloud vector database. At 5K it's still 0.63 ms. This is the architectural advantage of in-process FAISS: no serialization, no network hop, no connection pool.


Insert Throughput

How fast can memories be ingested?

DatasetLatency per insertThroughput
1,0005.16 ms194 inserts/s
5,00011.36 ms88 inserts/s

Insert includes: content hashing (SHA-256), dedup check (MinHash LSH), SQLite INSERT, FTS5 trigger, FAISS index add, and embedding normalization. The per-insert cost grows with dataset size because MinHash rebuilds its index periodically.


Knowledge Graph

Typed entity relationships with multi-hop traversal via SQLite recursive CTEs.

OperationTime
Build (10 edges, 10 entities)14.7 ms total
Multi-hop traversal (hops=3)0.13 ms avg · 0.26 ms p99

Graph traversal uses SQLite recursive CTEs — no external graph database, no Cypher, no Gremlin. Edges are walked bidirectionally in a single query. At 0.13 ms per traversal, graph queries are essentially free.


Deduplication (MinHash LSH)

Near-duplicate detection before memories enter the store.

OperationTime
Insert 1K documents into MinHash index1.21 ms/doc
Check a document against the index1.39 ms

Threshold sensitivity

MinHash Jaccard similarity is sensitive to text length and the dedup_threshold config:

ThresholdParaphrases detected (of 5)Behaviour
0.55/5 (100%)Aggressive — catches paraphrases, more false positives
0.63/5 (60%)Balanced for medium-length text
0.72/5 (40%)Conservative — only very similar texts
0.80/5 (0%)Very strict — exact near-duplicates only

Threshold tuning

The default dedup_threshold=0.8 is conservative. For agent memory (short facts, paraphrased across sessions), 0.5–0.6 catches more duplicates. For document-level dedup, 0.8 is appropriate. Tune based on your content length.


Cold Start (DB open + FAISS rebuild)

When Ariadne opens a database, it rebuilds the FAISS index from stored embeddings. This is the cost of never letting the index drift out of sync.

DatasetCold start time
1,000 vectors1,176 ms
5,000 vectors5,793 ms

Cold start scales linearly with vector count (FAISS training + add). For production use, keep the process alive rather than cold-starting per request. The tradeoff: zero index drift vs. startup cost.


Memory Footprint

DatasetDatabase file sizePer memory
1,0002.3 MB2.4 KB
5,00010.9 MB2.2 KB

Each memory stores: content text, SHA-256 hash, embedding BLOB (384 × 4 = 1,536 bytes), metadata, tags, timestamps, and access counts. The ~2.2 KB per-memory footprint includes all of this.


Concurrent Throughput

Thread safety test: 4 concurrent readers + 2 concurrent writers for 3 seconds.

MetricValue
Reads1,001 ops (330 reads/s)
Writes44 ops (15 writes/s)
Errors0

Ariadne uses a reentrant lock (threading.RLock) to serialize SQLite + FAISS operations. Reads are side-effect-free (except access logging), so they serialize cleanly. Writes are heavier due to dedup + FTS sync + FAISS add. For agent workloads (mostly reads, occasional writes), this is well within bounds.


Comparison with Other Memory Systems

Feature comparison

CapabilityAriadneMem0ZepHonchoLettaChromaDBLangMemcognee
Vector searchFAISS (auto Flat→IVF)Pluggable (Qdrant, etc.)Proprietarypgvector/QdrantSQLite/embeddingsHNSWVia LangChainQdrant/PGVector
Keyword search (BM25)FTS5 built-inPartialPartial
Hybrid fusion (RRF)Built-inPartialPartial
Knowledge graphSQLite CTENeo4j (optional)ProprietaryNeo4j
Auto-deduplicationMinHash LSHLLM-basedLLM-based
Cognitive retentionEbbinghaus curveTemporal trackingProfile extractionSelf-managed
Runs fully local✅ (self-hosted)❌ (cloud-first)
Zero infrastructure✅ single file❌ needs vector DB❌ needs PostgreSQL❌ needs PostgreSQL❌ needs storage⚠️⚠️❌ needs Neo4j
Daemon/server requiredNoNo (self-hosted)Yes (Go server)NoNoNoNoNo
LicenseMITApache 2.0MITApache 2.0Apache 2.0MITApache 2.0

Architecture differences

Ariadne vs Mem0

Mem0 is the most feature-rich competitor. It extracts facts from conversations via LLM calls, stores them in a pluggable vector DB (Qdrant, Chroma, Pinecone), and optionally builds a knowledge graph via Neo4j.

AriadneMem0
StorageSingle SQLite fileVector DB + optional Neo4j
ExtractionApplication-providedLLM-based automatic extraction
SearchFAISS + FTS5 + RRF (all in-process)Vector DB query + optional graph
DedupMinHash LSH (deterministic, no LLM)LLM-based (costs tokens per operation)
InfraZero — pip install + one fileVector DB + LLM API keys
CostFree, zero ongoing costLLM API costs for extraction + dedup
LatencySub-ms vector search (in-process)Network hop to vector DB
Published benchmarksThis pageMemoryBench (self-reported)

Mem0's strength is automatic extraction from conversations — it decides what to remember. Ariadne's strength is the all-in-one retrieval stack with zero infrastructure and no LLM tax.

Ariadne vs Zep

Zep is enterprise-focused with a Go server, PostgreSQL backend, and proprietary knowledge graph extraction. It tracks temporal fact changes and supports SOC2/HIPAA compliance.

AriadneZep
DeploymentLibrary (in-process)Client → Go server → PostgreSQL
Knowledge graphSQLite recursive CTEProprietary extraction pipeline
Temporal awarenessEbbinghaus retention + access countsFact supersession tracking
Enterprise featuresNone (open-source)SOC2, HIPAA, multi-tenant
PricingFree forever$40/mo starter + per-message

Zep's published benchmark claims ~93% factual recall with their knowledge graph vs. ~74% for plain vector search. Ariadne's hybrid RRF achieves similar recall improvements by combining vector + keyword without needing a dedicated graph extraction pipeline.

Ariadne vs Honcho

Honcho is not a general-purpose memory system — it's a user persona extraction tool. It ingests conversation history and builds structured user profiles (traits, preferences, goals).

AriadneHoncho
FocusAgent memory (facts, graph, retrieval)User modeling (persona extraction)
RetrievalVector + keyword + hybrid + graphProfile attributes (structured)
Use case"What did the user tell me?""Who is this user?"

These solve different problems. Honcho builds a character profile; Ariadne stores and retrieves arbitrary memories. They could be complementary.

Ariadne vs Letta (MemGPT)

Letta gives LLMs self-managed memory via OS-inspired virtual context management. The agent decides what to remember and when to page data in/out of context.

AriadneLetta
Memory managementApplication-controlledLLM self-directed
ArchitectureStore + search + graphVirtual context window (page in/out)
OverheadZero (in-process)LLM API calls for memory decisions
Token costNone for storage/searchSignificant (memory management calls)
Published resultsThis pageMemGPT paper: comparable to 4× context window

Letta's MemGPT paper showed ~50-70% token savings vs. naive long-context approaches. Ariadne doesn't manage the LLM's context — it provides fast retrieval that the application or agent framework can call. Ariadne could serve as Letta's archival memory backend.

Ariadne vs ChromaDB

ChromaDB is a vector database, not a memory system. It provides embedding storage and approximate nearest neighbor search.

AriadneChromaDB
AbstractionMemory system (search + graph + dedup + retention)Embedding database
SearchVector + keyword + hybrid + graphVector only (HNSW)
DedupMinHash + content hash
RetentionEbbinghaus forgetting curve
Dependenciesfaiss-cpu + numpy + datasketchchromadb (heavier)

ChromaDB is often used as a backend for memory systems like Mem0. Ariadne replaces both the vector DB and the application layer in a single package.

Ariadne vs cognee

cognee builds knowledge graphs from documents using LLM extraction, then combines graph traversal with vector search for GraphRAG-style retrieval.

Ariadnecognee
Graph constructionManual (add_edge) or entity extractionAutomatic (LLM-based)
Graph backendSQLite CTENeo4j
Vector backendFAISS (in-process)Qdrant/Weaviate/PGVector
PipelineDirect API callsDocument → chunk → embed → graph
ComplexitySingle fileMulti-service (graph DB + vector DB)

cognee is stronger for document-heavy knowledge graph construction. Ariadne is simpler and faster for agent memory where memories are added individually.


Summary: Why Ariadne is different

PropertyAriadne's approachThe alternative
InfrastructureSingle SQLite file, zero daemonsVector DB + graph DB + LLM API
Search latencySub-millisecond (in-process FAISS)10-100ms (network hop to hosted DB)
Keyword searchBuilt-in FTS5 with BM25Not available or bolt-on
Hybrid retrievalNative RRF fusionCustom integration required
DeduplicationDeterministic MinHash (no tokens)LLM-based (costs money per check)
Knowledge graphSQLite recursive CTE (free)Neo4j or proprietary (infra + cost)
RetentionEbbinghaus forgetting curveManual or absent
Ongoing cost$0LLM API fees + hosting

The tradeoff: Ariadne does not automatically extract memories from conversations (that's the application's job), and it doesn't manage the LLM's context window (that's the agent framework's job). What it does, it does fast, locally, and for free.


Reproducing these benchmarks

bash
pip install "ariadne-memory[embeddings]" numpy

Run the benchmark script:

bash
git clone https://github.com/kyssta-exe/Ariadne.git
cd Ariadne
python benchmarks/run_benchmarks.py

Or use the inline harness:

python
import time, numpy as np
from arriadne import AriadneMemory, AriadneConfig

mem = AriadneMemory(config=AriadneConfig(db_path="bench.db", embedding_dim=384))
N = 5_000
vecs = np.random.randn(N, 384).astype("float32")
for i, v in enumerate(vecs):
    mem.remember(f"memory {i}", embedding=v)

q = np.random.randn(384).astype("float32")
times = []
for _ in range(1000):
    t0 = time.perf_counter()
    mem.recall("query", embedding=q, k=10)
    times.append((time.perf_counter() - t0) * 1000)

print(f"recall p50: {np.percentile(times, 50):.3f} ms")
print(f"recall p99: {np.percentile(times, 99):.3f} ms")
mem.close()

Measure on your own hardware

Latency depends on CPU, embedding dimension, dataset size, and index type. These numbers are from a shared VPS — dedicated hardware will be faster. Always confirm with the harness on your own box.

Released under the MIT License.