Een vectordatabase slaat hoogdimensionale dense en sparse embeddings samen met metadata op en biedt via Approximate Nearest Neighbor (ANN)-indexen gelijkeniszoeken op millisecondeschaal als geheugen- en retrievallaag voor RAG, semantisch zoeken en AI-agents.
| Workload / Randvoorwaarde | Aanbevolen categorie | Representatieve oplossingen | Waarom dit past |
|---|---|---|---|
| Bestaande PostgreSQL-stack, onder ~10M vectoren | Relationele DB-extensie | pgvector (+ halfvec / HNSW) | Hergebruikt ACID-transacties, SQL-JOINs en bestaand beheer zonder nieuwe infra |
| Full-text BM25 + vector hybride scoring | Zoekmachine-extensie | Elasticsearch / OpenSearch / Vespa | Volwassen ecosysteem met inverted indexen en meertraps hybride ranking |
| Zelfstandige high-QPS-dienst met zware filters | Dedicated gedistribueerde vector-DB | Qdrant / Milvus / Weaviate | Speciale opslagengine, snelle payload-filtering en horizontale schaling |
| Lokale dev, edge/desktop-apps of directe data-lake-reads | Embedded / kolomgeoriënteerde DB | LanceDB / Chroma / FAISS | In-process uitvoering met zero-copy Apache Arrow / Parquet-integratie |
| Enorme cold/warm-datasets tegen minimale opslagkosten | Object-storage-native SaaS | Turbopuffer | Object storage (S3/GCS) als bron van waarheid + lokale NVMe/RAM-cache |
| Zero-ops serverless diep in een publieke cloud | Volledig beheerde clouddienst | Pinecone / Vertex AI Vector Search / Azure AI Search | Elastische serverless schaling met native cloud-IAM en monitoring |
🔗 Gerelateerde spiekbrieven: LLM & AI-agentconcepten · Moderne AI-algoritmen · PostgreSQL-commando's · Redis-commando's · MongoDB-commando's
1. Kernconcepten & afstandsmetrieken
1.1 Essentiële terminologie
| Term | Definitie | Technische aandachtspunten |
|---|---|---|
| Embedding | Float-array met vaste lengte die semantiek van tekst, beeld of audio codeert | Gebruikelijke dimensies: 384 / 768 / 1024 / 1536 / 3072; RAM en rekenwerk schalen lineair |
| ANN (Approximate Nearest Neighbor) | Indexgestuurd zoeken dat minimaal recall (95%–99%) inruilt voor 100×–1000× versnelling | Kernafweging latentie vs. recall versus exacte k-NN-scan |
| Metadata Filtering | Beperken van vectorzoeken via scalaire attributen (tenant, tijd, ACL, categorie) | Onderscheid Pre-filtering, Single-stage / Inline en Post-filtering |
| Hybrid Search | Combineren van dense vectoren (semantiek) en sparse vectoren / BM25 (exacte termen) | Voorkomt missers van puur semantisch zoeken op SKU's, foutcodes en afkortingen |
| Sparse Vector | Hoogdimensionale vector die grotendeels uit nullen bestaat (bijv. SPLADE, BM25-gewichten) | Slaat alleen niet-nul-indices en gewichten op; vult dense search aan |
1.2 Drie kernmetrieken voor afstand en gelijkenis
Cosine(u, v) = (u · v) / (‖u‖₂ · ‖v‖₂)
IP(u, v) = u · v = ∑ᵢ (uᵢ × vᵢ)
L₂(u, v) = √( ∑ᵢ (uᵢ − vᵢ)² )
| Metriek | Betekenis | Wiskundige equivalentie | Typische toepassingen |
|---|---|---|---|
| Cosinusgelijkenis (Cosine) | Meet alleen de hoek zonder lengte (−1 tot 1; afstand = 1 - cos) |
Identieke ranking aan inproduct bij L₂-genormaliseerde vectoren | Tekstsemantiek, RAG, zinsembeddings (standaardkeuze) |
| Inproduct (Inner Product / IP) | Weerspiegelt hoek én lengte; laagste rekenkosten | Vervang Cosine door IP bij eenheidsvectoren om wortels/delingen te sparen | Two-tower recommenders, genormaliseerde embeddings (bijv. OpenAI) |
| Euclidische afstand (L₂) | Rechte geometrische afstand; kleiner = dichterbij | Voor eenheidsvectoren geldt L₂² = 2 − 2 · cos(u, v) |
Beeld-/gezichtsembeddings, ruimtelijk clusteren, lengtegevoelige features |
2. ANN-indexalgoritmen & kwantisatie
2.1 Vergelijking van vectorindexen
| Indextype | Mechanisme | RAM-gebruik | Latentie & Recall | Schaal & typische engines |
|---|---|---|---|---|
| Flat (Exacte scan) | Volledige afstandsberekening over alle vectoren | Gemiddeld (alleen ruwe/gekwantiseerde vectoren) | 100% recall; latentie stijgt scherp >~100k rijen | Kleine datasets (<100k) en ground-truth benchmarks |
| IVF-Flat (Inverted File) | K-Means-clustering in nlist buckets; scant dichtstbijzijnde nprobe buckets |
Laag (geen grafiek-overhead) | Instelbaar via nprobe; gemiddelde tot hoge recall |
1M–10M rijen bij krap geheugen (FAISS / Milvus / pgvector) |
| IVF-PQ (IVF + Product Quantization) | Bucket-partitionering plus subruimte-codeboekcompressie | Zeer laag (16×–64× kleiner) | Razendsnel; lagere eerste-pass recall (rescoring nodig) | 100M+ in-memory zoeken (FAISS / Milvus / LanceDB) |
| HNSW (Hiërarchische graaf) | Meerlaagse skip-list-nabijheidsgraaf (boven grof, onder fijn) | Hoog (vectoren + graafranden in RAM of hot mmap) | Milliseconden + 95%–99% recall; industriestandaard | 1M–100M+ real-time lage latentie (Qdrant / Milvus / Weaviate / pgvector) |
| DiskANN (Vamana-graaf) | SSD-geoptimaliseerde graaf: gecomprimeerde vectoren in RAM, volledige graaf op NVMe | Laag (5×–10× minder RAM) | 100M+ per node in ms; vraagt snelle NVMe-IOPS | Geheugenbeperkte 100M–1B+ datasets (Milvus / LanceDB / Azure) |
| ScaNN | Anisotrope vectorkwantisatie + boompartitionering | Laag–Gemiddeld | Beste recall-per-latentie bij inproduct | Grootschalige aanbeveling & search (Vertex AI Vector Search / OSS) |
Belangrijkste HNSW-parameters:
M(max. bidirectionele verbindingen per knoop, typisch16–64): hogereMverhoogt recall bij hoge dimensies maar kost extra RAM en bouwtijd.efConstruction(kandidaatlijst tijdens indexbouw, typisch100–400): beïnvloedt alleen bouwtijd en verbetert graafkwaliteit.efSearch(zoekbreedte bij query, ≥top_k): enige parameter die per query te tunen is; hoger = hogere recall, lagere QPS.
2.2 Kwantisatie & geheugenschatting
Referentie voor 10 miljoen vectoren × 1536 dimensies (ruwe FP32):
Ruwe vectorgrootte ≈ N × D × 4 Bytes (HNSW-graaf voegt ~1,2×–1,5× RAM-overhead toe)
| Kwantisatie | Breedte / dim | Compressie | Grootte 10M × 1536-dim | Nauwkeurigheid & gebruik |
|---|---|---|---|---|
| FP32 (Ongecomprimeerd) | 32-bit (4 B) | 1× | ~57,2 GB | Referentieprecisie; duur om in RAM te houden |
| FP16 / BF16 (Halve precisie) | 16-bit (2 B) | 2× | ~28,6 GB | Vrijwel verliesvrije recall (bijv. pgvector halfvec), hoge ROI |
| SQ8 (Scalaire kwantisatie Int8) | 8-bit (1 B) | 4× | ~14,3 GB | Behoudt meestal 97%+ recall; productiestandaard |
| PQ (Product Quantization) | Subruimtes | 16×–64× | ~1–4 GB | Vereist codebook-training; combineren met oversampling + rescore |
| BQ (Binaire kwantisatie 1-bit) | 1-bit | 32× | ~1,79 GB | Ultrasnelle Hamming-scan; 3×–5× rescore aanbevolen (≥1024 dim) |
3. Gelaagde vergelijking van systemen
3.1 Dedicated native vectordatabases
| Product | Licentie / Deployment | Taal & Opslagengine | Indexen & Kernfuncties | Beste inzet |
|---|---|---|---|---|
| Qdrant | Apache 2.0 / Self-hosted & Cloud | Rust; in-memory, mmap-disk & disk-kwantisatie | HNSW + SQ8/BQ; native sparse vectoren en snelle payload-filterindexen | High-QPS standalone dienst, multi-tenant, complexe filters |
| Milvus | Apache 2.0 / Gedistribueerd & Zilliz Cloud | Go control plane + C++ executie; object storage + MQ losgekoppeld | IVF, HNSW, DiskANN, GPU CAGRA; multi-tenant partities | Enterprise-platformen op miljardenschaal |
| Weaviate | BSD-3-Clause (enkele enterprise-addons gesloten) | Go; ingebouwde object storage + inverted index | HNSW + dynamische/PQ/BQ-kwantisatie; GraphQL/REST, vectorizer-modules | RAG-apps met geïntegreerde embedding-pipelines |
| Chroma | Apache 2.0 / Embedded & Client-Server | Python / Rust-kern; SQLite + lokaal of gedistribueerd | HNSW; minimale API, nauwe integratie met LangChain / LlamaIndex | Snelle AI-prototyping en kleine/middelgrote Python RAG |
| LanceDB | Apache 2.0 / Embedded & Enterprise | Rust; gebouwd op Lance-kolomformaat & Apache Arrow | IVF-PQ, HNSW, DiskANN; zero-copy I/O, native multimodaal (audio/video/tabellen) | Lokale embedded apps, serverless S3-reads, multimodale data lakes |
| Pinecone | Propriëtaire Serverless SaaS | Beheerde gedistribueerde engine (van Pods naar Serverless) | Losgekoppelde propriëtaire index; sparse-dense hybride, Namespace-isolatie | Zero-ops cloudteams die beheerde eenvoud verkiezen |
| Turbopuffer | Propriëtaire SaaS / BYOC | Rust; object storage (S3/GCS) als bron + NVMe/RAM-cache | Centroïde-index (SPFresh-stijl) zonder random-I/O-graafhops; full-text + vector | Enorme cold/warm-datasets (bijv. code-indexering) tegen ultralage kosten |
3.2 Vector-zoekbibliotheken (geen volledige databases)
| Product | Licentie | Scope & Grenzen | Toepassingen |
|---|---|---|---|
| FAISS (Meta) | MIT | C++ / Python gelijkenisbibliotheek (geen metadata-persistentie, gedistribueerde transacties of auth-server); CPU SIMD & multi-GPU | Offline batch-berekeningen, ML-onderzoek, ingebouwde kernel in eigen engines |
3.3 Extensies van traditionele databases & zoekmachines
| Product | Basis | Vectorindexering & mogelijkheden | Sterktes & Beperkingen |
|---|---|---|---|
| pgvector | PostgreSQL-extensie (incl. Supabase) | vector / halfvec / sparsevec / bit; HNSW & IVFFlat |
Plus: ACID, SQL-JOINs, nul extra beheer; Min: write-amplification & RAM-druk >10M–50M rijen |
| Elasticsearch / OpenSearch | Lucene inverted index + HNSW | Native Dense Vector + BM25 hybride, RRF-fusie, geneste filters | Plus: hergebruikt bestaande search-teams; Min: zwaar JVM off-heap RAM-gebruik & segment merges |
| Redis (Query Engine) | In-memory KV-store | Flat & HNSW, submilliseconde latentie, real-time streaming | Plus: ideaal voor semantische cache & feature stores; Min: hoge RAM-kosten op schaal |
| MongoDB Atlas Search | Document-DB (Atlas / Local CLI) | Lucene-gebaseerde HNSW naast BSON-documenten | Plus: geen dubbele schrijfsync doc/vector; Min: kernfunctionaliteit gebonden aan Atlas |
| SingleStore | Gedistribueerde HTAP SQL-DB | SQL + native vectorfuncties (dot / L₂), columnstore + rowstore | Enterprise-workloads met real-time SQL-analytics en transacties |
| Vespa | Apache 2.0 big-data-engine | HNSW + exact/approximatief hybride, meertraps ML-ranking (Tensor/XGBoost/ONNX) | Grootschalige search- & aanbevelingsplatformen; steilere leercurve |
3.4 Volledig beheerde clouddiensten
| Dienst | Cloudprovider | Kernarchitectuur & Kenmerken |
|---|---|---|
| Vertex AI Vector Search (voorheen Matching Engine) | Google Cloud (GCP) | Gebaseerd op ScaNN; miljardenschaal streaming-updates en sparse-dense hybride |
| Amazon OpenSearch Serverless / Aurora pgvector | AWS | Beheerde serverless clusters en RDS/Aurora-extensies met native Amazon Bedrock-koppeling |
| Azure AI Search | Microsoft Azure | Ingebouwde Semantic Ranker, vectorisatie-pipelines en enterprise RBAC-documentrechten |
4. Filterstrategieën & hybride zoeken
4.1 Uitvoeringsmodi voor metadatafiltering
| Strategie | Uitvoeringsvolgorde | Risico & Oplossing |
|---|---|---|
| Pre-filtering | Evalueer eerst scalaire index voor ID-bitmap, voer daarna vectorzoekopdracht uit | Bij zeer selectieve filters (<1%) raakt de graaf gefragmenteerd; Oplossing: automatische fallback naar exacte scan |
| Post-filtering | Haal globale vector-Top-K op en verwijder items die niet aan het filter voldoen | Levert minder dan K resultaten (of nul) op; Oplossing: nooit los gebruiken zonder zware oversampling |
| Single-stage / Inline | Controleer het filter-bitmap dynamisch bij elke stap in de HNSW-graaf | Moderne standaard (Qdrant / Milvus / Weaviate / pgvector 0.8+ iterative scan) voor optimale balans |
4.2 Reciprocal Rank Fusion (RRF)
Omdat dense vectorscores en BM25-scores verschillende schalen hebben, combineert RRF de ranglijsten direct zonder kalibratie:
RRF_Score(d) = ∑_{r ∈ R} 1 / (k + rank_r(d)) (standaard afvlakkingsconstante k = 60)
5. Productieklare codevoorbeelden
5.1 pgvector-schema, HNSW-index & iteratieve scan (SQL)
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
content TEXT NOT NULL,
embedding halfvec(1536), -- float16 bespaart 50% RAM t.o.v. float32
fts tsvector GENERATED ALWAYS AS (to_tsvector('simple', content)) STORED
);
CREATE INDEX idx_docs_emb_hnsw ON documents
USING hnsw (embedding halfvec_cosine_ops)
WITH (m = 16, ef_construction = 128);
CREATE INDEX idx_docs_fts ON documents USING gin (fts);
SET hnsw.ef_search = 100;
SET hnsw.iterative_scan = relaxed_order;
SELECT id, content, 1 - (embedding <=> $1::halfvec) AS cosine_sim
FROM documents
WHERE tenant_id = 42
ORDER BY embedding <=> $1::halfvec
LIMIT 10;
pgvector-afstandsoperatoren:
<->Euclidisch (L₂) ·<=>Cosinusafstand (1 - cos) ·<#>Negatief inproduct ·<+>Manhattan (L₁).
5.2 Qdrant: binaire kwantisatie & payload-filtering (Python)
from qdrant_client import QdrantClient, models
client = QdrantClient(url="http://localhost:6333")
client.create_collection(
collection_name="knowledge_base",
vectors_config=models.VectorParams(
size=1536,
distance=models.Distance.COSINE,
on_disk=True,
),
quantization_config=models.BinaryQuantization(
binary=models.BinaryQuantizationConfig(always_ram=True)
),
)
client.create_payload_index(
collection_name="knowledge_base",
field_name="tenant_id",
field_schema=models.PayloadSchemaType.KEYWORD,
)
hits = client.query_points(
collection_name="knowledge_base",
query=[0.012, -0.045, ...],
query_filter=models.Filter(
must=[models.FieldCondition(key="tenant_id", match=models.MatchValue(value="org_a"))]
),
search_params=models.SearchParams(
quantization=models.QuantizationSearchParams(rescore=True, oversampling=3.0)
),
limit=10,
).points