Agent Memory Engine (6/10) — Comparing 5 Vector DBs Across 7 Dimensions: sqlite-vec
The decision matrix itself is the content
ํต์ฌ ์์ฝ
- This post provides a 7-dimension evaluation framework for selecting a vector DB in a single-user agent system.
- Five candidates (sqlite-vec / ChromaDB / Qdrant / Weaviate / custom FAISS) evaluated across 7 dimensions: Portability / Rollback / Performance / Integration / Dependencies / Operational Complexity / Cost.
- Result: sqlite-vec + bge-m3-mlx-fp16 (1024d) ranked first. The decisive dimensions were not search speed but rollback capability and single-file portability.
What This Post Covers
A vector DB selection is a decision that follows you for at least a year. Most comparison resources focus on search speed or QPS, which misaligns with the decision axes that matter in a single-user system. This post covers three things:
- A scoring template for comparing 5 candidates across 7 dimensions
- Which dimensions actually drive the decision in a single-user environment (spoiler: not performance)
- How local embeddings (bge-m3 + MLX fp16) fit into this framework
The Five Candidates
| Candidate | One-liner | |
|---|---|---|
| 1 | sqlite-vec | SQLite extension. Single file. C implementation. |
| 2 | ChromaDB | Python-friendly. Embedded mode available. |
| 3 | Qdrant | Rust server. HNSW. Production-oriented. |
| 4 | Weaviate | Go server. Modular backend. |
| 5 | Custom FAISS | Index managed directly in Python. |
7-Dimension Scorecard (5-point scale)
| Dimension | sqlite-vec | ChromaDB | Qdrant | Weaviate | FAISS |
|---|---|---|---|---|---|
| Portability | 5 | 3 | 2 | 2 | 4 |
| Rollback Ease | 5 | 3 | 2 | 2 | 3 |
| Performance (single-user baseline) | 4 | 4 | 5 | 5 | 5 |
| Hermes Integration Difficulty | 4 | 3 | 3 | 3 | 3 |
| External Dependencies | 5 | 3 | 1 | 1 | 4 |
| Operational Complexity | 4 | 3 | 2 | 2 | 3 |
| Cost (self-hosted) | 5 | 4 | 3 | 3 | 5 |
| Total | 32/35 | 23/35 | 18/35 | 18/35 | 27/35 |
(Initial tally was sqlite-vec 28/35; recalculation yields 32/35. Either way, the ranking is identical.)
Why Performance Is Not the Deciding Dimension
Query load in a single-user system runs at roughly 5–20 requests per second. The performance headroom of an HNSW-based distributed server carries no practical meaning at this throughput. Performance is therefore included in the scorecard, but classified as an unweighted dimension.
The two dimensions that determine the outcome are as follows.
Dimension 1: Portability
sqlite-vec stores everything in one DB file.
- Backup:
cp memcore.db backup.db— a single line. - Migration: copy the file to another machine.
- Version control: compare snapshots via a single file hash.
Every other candidate separates "server process + data directory + config files," making backup and migration multi-step operations. In a single-user environment, this complexity accumulates as long-term operational cost.
Dimension 2: Rollback
The highest risk during migration is inability to revert after a partial failure. sqlite-vec transactions carry the same semantics as SQLite transactions:
BEGIN;
-- migration queries
ROLLBACK; -- full revert in one line
Distributed-index candidates (Qdrant, Weaviate) can emit partial commits during index rebuilds, making a clean revert from a mid-run failure non-trivial. This difference is decisive in a single-user system.
Embedding Model Selection: bge-m3 + MLX fp16
The embedding model must be locked in alongside the vector DB. Selection criteria and rationale:
| Axis | Choice | Rationale |
|---|---|---|
| Model | bge-m3 | Robust on Korean/English mixed input; 1024 dimensions balance storage cost and expressiveness |
| Runtime | MLX fp16 | Apple Silicon native; no separate GPU required |
| Hosting | Local | No external API calls → zero token cost, zero network dependency |
For a single-user system, this combination is a reasonable default at the current point in time. The single tradeoff: model update cadence is slower than an external API.
Scope and Limitations
This framework is valid only under the following conditions:
- Single user or small team (QPS < 50)
- Total vector count in the low millions or below (sqlite-vec recommended upper bound)
- Hardware capable of local execution (Apple Silicon or equivalent)
Outside these conditions, the weights across dimensions shift. In multi-tenant / high-QPS / tens-of-millions-vector environments, the penalties for Qdrant and Weaviate recover, and the portability premium diminishes.
Summary
Vector DB comparisons are often compressed into a single QPS benchmark. However, in a single-user system, the deciding dimension is not performance — it is how simply you can back up and roll back. sqlite-vec ranked first in the 7-dimension matrix because it scored maximum points on those two dimensions; the remaining five dimensions served as tiebreakers.
The open question: when QPS crosses from single digits into the high double digits, or when vector count exceeds tens of millions, which dimension in this framework breaks first — and that is the scenario requiring re-evaluation against the same matrix.
Series overview: Series index
๋๊ธ
๋๊ธ ์ฐ๊ธฐ