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:

  1. A scoring template for comparing 5 candidates across 7 dimensions
  2. Which dimensions actually drive the decision in a single-user environment (spoiler: not performance)
  3. 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

๋Œ“๊ธ€

์ด ๋ธ”๋กœ๊ทธ์˜ ์ธ๊ธฐ ๊ฒŒ์‹œ๋ฌผ

"ML Foundations (9/9) — PyTorch vs TensorFlow, and the Road to Local LLMs"

Agent Memory Engine (2/10) — Building an AI Agent Memory System with SQLite Alone

"ML Foundations (8/9) — Deep Learning Architectures: CNN, RNN, Attention"

"RAG Core Study (14/26) — Evaluation Sets with RAGAS & DeepEval"

"ML Foundations (7/9) — Deep Learning Training: Optimizers, Regularization, Initialization"

AI Agents I Built (5/7) — Building an Automated Blogger API Publishing System

"ML Foundations (6/9) — Neural Networks: From Perceptron to MLP"