Vector Search

Dense embedding-based similarity search using sqlite-vec for efficient nearest-neighbor queries on episodic memory.

How It Works

  1. Embed: Query text is converted to a 384-dimension vector via BAAI/bge-small-en-v1.5 (loaded through fastembed)
  2. Search: sqlite-vec performs nearest neighbor search on int8 quantized vectors stored in the vec_episodes table
  3. Score: Cosine similarity between query and stored vectors
  4. Rank: Results ordered by similarity (highest first)

Embedding Model

Mnemosyne uses BAAI/bge-small-en-v1.5 exclusively, loaded via the fastembed library:

PropertyValue
ModelBAAI/bge-small-en-v1.5
Dimensions384
Quantizationint8 (configurable via MNEMOSYNE_VEC_TYPE)
RuntimeLocal only (no API calls)
Libraryfastembed

The model runs entirely locally — no OpenAI API key or network calls are required for embedding generation.

Vector Storage

Vectors are stored in a sqlite-vec virtual table:

-- Internal sqlite-vec table (created automatically)
CREATE VIRTUAL TABLE vec_episodes USING vec0(
  embedding int8[384]
);

Usage via recall()

Vector search is performed automatically as part of the recall() method. There is no separate vector_search() API:

from mnemosyne import Memory

mem = Memory()

# recall() internally performs vector + FTS5 hybrid search
results = mem.recall("deployment strategy", top_k=5)

for r in results:
  print(f"Score: {r['score']:.3f} — {r['content'][:80]}")

Performance Characteristics

Dataset SizeQuery TimeIndex Size
1K entries15ms6MB
10K entries35ms60MB
100K entries85ms600MB
No External Dependencies

Embeddings are generated locally via fastembed. No OpenAI API key, network access, or external embedding service is needed.