Snelle referentie

Vectordatabases & Retrieval-architectuur Spiekbrief: concepten, indexen, kwantisatie & keuze

Compact naslagwerk voor vectordatabases en semantisch zoeken: afstandsmetrieken, ANN-indexen (HNSW, IVF, DiskANN, ScaNN), geheugenberekening met kwantisatie, inline-filtering, RRF-hybride zoekopdrachten en gelaagde vergelijking van native vector-DB's, extensies en clouddiensten.

· Gepubliceerd

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, typisch 16–64): hogere M verhoogt recall bij hoge dimensies maar kost extra RAM en bouwtijd.
  • efConstruction (kandidaatlijst tijdens indexbouw, typisch 100–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

Verwante onderwerpen