Eine Vektordatenbank speichert hochdimensionale Dense- und Sparse-Embeddings samt Metadaten und ermöglicht über Approximate-Nearest-Neighbor-(ANN)-Indizes eine Ähnlichkeitssuche im Millisekundenbereich – die zentrale Speicher- und Retrieval-Schicht für RAG, semantische Suche und KI-Agenten.
| Anforderung / Rahmenbedingung | Empfohlene Kategorie | Typische Systeme | Begründung |
|---|---|---|---|
| Bestehender PostgreSQL-Stack, unter ~10 Mio. Vektoren | Relationale DB-Erweiterung | pgvector (+ halfvec / HNSW) | Nutzt ACID-Transaktionen, SQL-JOINs und vorhandenen Betrieb ohne neue Infrastruktur |
| Volltext-BM25 + Vektor-Hybrid-Scoring | Suchmaschinen-Erweiterung | Elasticsearch / OpenSearch / Vespa | Ausgereifte invertierte Indizes und mehrstufiges Hybrid-Ranking |
| Eigenständiger High-QPS-Dienst mit komplexen Filtern | Dedizierte verteilte Vektor-DB | Qdrant / Milvus / Weaviate | Spezialisierte Storage-Engine, schnelle Payload-Filterung und horizontale Skalierung |
| Lokale Entwicklung, Edge-Apps oder Data-Lake-Direktzugriff | Eingebettete / spaltenorientierte DB | LanceDB / Chroma / FAISS | In-Process-Ausführung mit Zero-Copy-Integration in Apache Arrow / Parquet |
| Riesige Cold/Warm-Datenbestände bei minimalen Kosten | Object-Storage-natives SaaS | Turbopuffer | Object Storage (S3/GCS) als Source of Truth + lokaler NVMe/RAM-Cache |
| Wartungsfreies Serverless tief im Cloud-Ökosystem | Vollverwalteter Cloud-Dienst | Pinecone / Vertex AI Vector Search / Azure AI Search | Elastische Serverless-Skalierung und nahtlose Cloud-IAM-Integration |
🔗 Verwandte Spickzettel: LLM & KI-Agenten Konzepte · Moderne KI-Algorithmen · PostgreSQL-Befehle · Redis-Befehle · MongoDB-Befehle
1. Kernkonzepte & Distanzmetriken
1.1 Zentrale Begriffe
| Begriff | Definition | Technische Relevanz |
|---|---|---|
| Embedding | Festlängen-Float-Vektor zur semantischen Codierung von Text, Bild oder Audio | Übliche Dimensionen: 384 / 768 / 1024 / 1536 / 3072; RAM und Rechenlast steigen linear |
| ANN (Approximate Nearest Neighbor) | Indexgestützte Suche, die minimalen Recall (z. B. 95–99 %) gegen 100×–1000× Tempo tauscht | Kernabwägung Latenz vs. Recall im Gegensatz zum exakten k-NN-Scan |
| Metadata Filtering | Einschränkung der Vektorsuche per Skalarattribut (Mandant, Zeit, ACL, Kategorie) | Unterscheidung zwischen Pre-Filtering, Single-Stage / Inline und Post-Filtering |
| Hybrid Search | Kombination aus Dense-Vektoren (Semantik) und Sparse-Vektoren / BM25 (exakte Terme) | Behebt Trefferlücken der reinen Vektorsuche bei SKUs, Fehlercodes und Abkürzungen |
| Sparse Vector | Hochdimensionaler Vektor mit fast ausschließlich Nullwerten (z. B. SPLADE, BM25) | Speichert nur Indizes und Gewichte ungleich null; ideal als Partner zur Dense-Suche |
1.2 Drei Standard-Distanzmetriken
Cosine(u, v) = (u · v) / (‖u‖₂ · ‖v‖₂)
IP(u, v) = u · v = ∑ᵢ (uᵢ × vᵢ)
L₂(u, v) = √( ∑ᵢ (uᵢ − vᵢ)² )
| Metrik | Bedeutung | Mathematische Äquivalenz | Typische Einsatzgebiete |
|---|---|---|---|
| Kosinus-Ähnlichkeit (Cosine) | Misst nur den Winkel ohne Vektorlänge (−1 bis 1; Distanz = 1 - cos) |
Identische Rangfolge zum Skalarprodukt bei L₂-normalisierten Vektoren | Textsemantik, RAG, Sentence-Embeddings (Standardwahl) |
| Skalarprodukt (Inner Product / IP) | Berücksichtigt Winkel und Länge; geringster Rechenaufwand | Ersetzt Cosine bei normalisierten Vektoren ohne Normierungskosten | Two-Tower-Recommender, normalisierte Embeddings (z. B. OpenAI) |
| Euklidische Distanz (L₂) | Direkter geometrischer Abstand; kleiner = ähnlicher | Für Einheitsvektoren gilt L₂² = 2 − 2 · cos(u, v) |
Bild-/Gesichtserkennung, räumliches Clustering, längensensitive Daten |
2. ANN-Indexalgorithmen & Quantisierung
2.1 Vergleich der Vektorindizes
| Indextyp | Funktionsprinzip | RAM-Bedarf | Latenz & Recall | Größenordnung & Engines |
|---|---|---|---|---|
| Flat (Exakter Scan) | Vollständige Distanzberechnung über alle Vektoren | Mittel (nur Roh-/quantisierte Vektoren) | 100 % Recall; Latenz steigt ab ~100k stark an | Kleine Bestände (<100k), Ground-Truth-Benchmarks |
| IVF-Flat (Inverted File) | K-Means-Clustering in nlist Buckets; Scan der nächsten nprobe Buckets |
Niedrig (kein Graph-Overhead) | Über nprobe steuerbar; mittlerer bis hoher Recall |
1M–10M Vektoren bei knappem RAM (FAISS / Milvus / pgvector) |
| IVF-PQ (IVF + Product Quantization) | Bucket-Partitionierung plus Teilraum-Codebuch-Kompression | Sehr niedrig (16×–64× kleiner) | Extrem schnell, geringerer Erst-Pass-Recall (Rescoring nötig) | 100M+ In-Memory-Suche (FAISS / Milvus / LanceDB) |
| HNSW (Hierarchical Navigable Small World) | Mehrschichtiger Nachbarschaftsgraph (oben grob, unten fein) | Hoch (Vektoren + Graphkanten im RAM oder hot mmap) | Millisekunden + 95–99 % Recall; Industriestandard | 1M–100M+ Echtzeit-Suche (Qdrant / Milvus / Weaviate / pgvector) |
| DiskANN (Vamana-Graph) | SSD-optimierter Graph: komprimierte Vektoren im RAM, Vollgraph auf NVMe | Niedrig (5×–10× weniger RAM) | 100M+ pro Knoten im ms-Bereich; erfordert schnelle NVMe-IOPS | Speicherlimitierte 100M–1B+ Bestände (Milvus / LanceDB / Azure) |
| ScaNN | Anisotrope Vektorquantisierung + Baum-Partitionierung | Niedrig–Mittel | Top-Recall-pro-Latenz bei Inner Product | Große Empfehlungs- und Suchsysteme (Vertex AI Vector Search / OSS) |
Zentrale HNSW-Tuningparameter:
M(max. bidirektionale Kanten pro Knoten, typisch16–64): HöheresMsteigert den Recall bei hohen Dimensionen, erhöht aber RAM und Build-Zeit.efConstruction(Kandidatenliste beim Indexbau, typisch100–400): Beeinflusst nur die Bauzeit; höhere Werte liefern bessere Graphqualität.efSearch(Suchbreite pro Abfrage, muss ≥top_ksein): Einziger pro Query anpassbarer Parameter; höher = mehr Recall, weniger QPS.
2.2 Quantisierung & Speicherbedarf
Referenzbasis für 10 Millionen × 1536-dimensionale Vektoren (rohes FP32):
Rohvektorgröße ≈ N × D × 4 Bytes (HNSW-Graphstruktur benötigt ca. 1,2×–1,5× Zusatz-RAM)
| Quantisierung | Breite / Dim | Kompression | 10M × 1536-Dim Größe | Genauigkeitsabwägung & Einsatz |
|---|---|---|---|---|
| FP32 (Unkomprimiert) | 32 Bit (4 B) | 1× | ~57,2 GB | Referenzpräzision; teuer im dauerhaften RAM-Betrieb |
| FP16 / BF16 (Halbe Präzision) | 16 Bit (2 B) | 2× | ~28,6 GB | Nahezu verlustfreier Recall (z. B. pgvector halfvec), hohes Preis-Leistungs-Verhältnis |
| SQ8 (Skalare Quantisierung Int8) | 8 Bit (1 B) | 4× | ~14,3 GB | Hält meist 97 %+ Recall; bewährter Produktionsstandard |
| PQ (Product Quantization) | Codebuch-basiert | 16×–64× | ~1–4 GB | Codebuch-Training nötig; mit Oversampling + Rescore kombinieren |
| BQ (Binäre Quantisierung 1-Bit) | 1 Bit | 32× | ~1,79 GB | Rasend schneller Hamming-Scan; 3×–5× Rescore empfohlen (ideal ab ≥1024 Dim.) |
3. Schichtweiser Vergleich der Systeme
3.1 Dedizierte native Vektordatenbanken
| Produkt | Lizenz / Betrieb | Sprache & Storage-Engine | Indizes & Besonderheiten | Einsatzprofil |
|---|---|---|---|---|
| Qdrant | Apache 2.0 / Self-hosted & Cloud | Rust; In-Memory, mmap-Disk & Disk-Quantisierung | HNSW + SQ8/BQ; native Sparse-Vektoren, schnelle Payload-Filterindizes | High-QPS-Standalone-Dienst, Mandantenfähigkeit, komplexe Filter |
| Milvus | Apache 2.0 / Verteilt & Zilliz Cloud | Go Control Plane + C++ Execution; Object Storage + MQ entkoppelt | IVF, HNSW, DiskANN, GPU CAGRA; Multi-Tenant-Partitionen | Milliarden-Maßstab, Hochdurchsatz-Plattformen |
| Weaviate | BSD-3-Clause (einige Enterprise-Add-ons proprietär) | Go; integrierter Object Store + invertierter Index | HNSW + dynamische/PQ/BQ-Quantisierung; GraphQL/REST, Vectorizer-Module | RAG-Apps mit integrierter Embedding-Pipeline |
| Chroma | Apache 2.0 / Embedded & Client-Server | Python / Rust-Kern; SQLite + lokal oder verteilt | HNSW; minimale API, enge LangChain-/LlamaIndex-Integration | Schnelles Prototyping, kleine bis mittlere Python-RAGs |
| LanceDB | Apache 2.0 / Embedded & Enterprise | Rust; Lance-Spaltenformat & Apache Arrow | IVF-PQ, HNSW, DiskANN; Zero-Copy-I/O, natives Multimodal (Audio/Video/Tabellen) | Lokale Embedded-Apps, Serverless-S3-Zugriff, multimodale Data Lakes |
| Pinecone | Proprietäres Serverless SaaS | Verwaltete verteilte Engine (von Pods zu Serverless) | Entkoppelter proprietärer Index; Sparse-Dense-Hybrid, Namespace-Isolation | Zero-Ops-Teams mit Fokus auf vollverwaltetes Cloud-SaaS |
| Turbopuffer | Proprietäres SaaS / BYOC | Rust; Object Storage (S3/GCS) als Hauptspeicher + NVMe/RAM-Cache | Zentroid-Index (SPFresh-Prinzip) statt Random-I/O-Graph; Volltext + Vektor | Große Cold/Warm-Daten (z. B. Code-Indizierung) bei minimalen Storage-Kosten |
3.2 Reine Vektor-Suchbibliotheken (keine Voll-DB)
| Produkt | Lizenz | Funktionsgrenzen | Typischer Einsatz |
|---|---|---|---|
| FAISS (Meta) | MIT | C++ / Python Suchbibliothek (keine Metadaten-Persistenz, verteilte Transaktionen oder Auth-Server); CPU-SIMD & Multi-GPU | Offline-Batch-Berechnung, Forschung, eingebetteter Kern in Eigenentwicklungen |
3.3 Erweiterungen klassischer Datenbanken & Suchmaschinen
| Produkt | Basis | Vektorfunktionen | Stärken & Grenzen |
|---|---|---|---|
| pgvector | PostgreSQL-Erweiterung (inkl. Supabase) | Typen vector / halfvec / sparsevec / bit; HNSW & IVFFlat |
Stärken: ACID, SQL-JOINs, kein Zusatzbetrieb; Grenzen: Write-Amplification & RAM-Druck über ~10M–50M Zeilen |
| Elasticsearch / OpenSearch | Lucene Invertiert + HNSW | Natives Dense-Vector + BM25-Hybrid, RRF-Fusion, Nested-Filter | Stärken: Nutzt bestehende Search-Stacks; Grenzen: hoher JVM-Off-Heap-Bedarf & Segment-Merges |
| Redis (Query Engine) | In-Memory-KV-Store | Flat & HNSW, Sub-Millisekunden-Latenz, Echtzeit-Updates | Stärken: Ideal für Semantic Cache & Feature Stores; Grenzen: hohe RAM-Kosten bei großen Mengen |
| MongoDB Atlas Search | Dokumenten-DB (Atlas / Local CLI) | Lucene-basierter HNSW direkt neben BSON-Dokumenten | Stärken: Kein Dual-Write zwischen Dokument- und Vektor-DB; Grenzen: stark an Atlas gebunden |
| SingleStore | Verteilte HTAP-SQL-DB | SQL + native Vektorfunktionen (Dot / L₂), Column- + Rowstore | Enterprise-Workloads mit Echtzeit-Analytics und Transaktionen |
| Vespa | Apache 2.0 Big-Data-Engine | HNSW + exakt/approximativ hybrid, mehrstufiges ML-Ranking (Tensor/XGBoost/ONNX) | Große Such- und Empfehlungsplattformen; höhere Einarbeitungs- und Betriebskomplexität |
3.4 Vollverwaltete Cloud-Dienste
| Dienst | Cloud-Anbieter | Kernarchitektur & Merkmale |
|---|---|---|
| Vertex AI Vector Search (ehem. Matching Engine) | Google Cloud (GCP) | Basiert auf ScaNN; Streaming-Updates im Milliarden-Bereich und Sparse-Dense-Hybrid |
| Amazon OpenSearch Serverless / Aurora pgvector | AWS | Verwaltete Serverless-Cluster bzw. RDS/Aurora-Erweiterung mit Amazon-Bedrock-Integration |
| Azure AI Search | Microsoft Azure | Semantic Ranker, integrierte Vektorisierungspipelines und Enterprise-RBAC-Zugriffssteuerung |
4. Filterstrategien & Hybridsuche
4.1 Ausführungsmodi für Metadatenfilter
| Strategie | Ablaufreihenfolge | Problemfall & Gegenmaßnahme |
|---|---|---|
| Pre-Filtering | Zuerst ID-Bitmap über Skalarindex bestimmen, danach Vektorsuche | Bei sehr engen Filtern (<1 % Treffer) zerfällt der Graph; Lösung: automatischer Fallback auf exakten Scan |
| Post-Filtering | Globales Vektor-Top-K holen, dann unpassende Einträge verwerfen | Liefert weniger als K Treffer (oder 0); Lösung: niemals allein ohne starkes Oversampling nutzen |
| Single-Stage / Inline | Filter-Bitmap bei jedem HNSW-Sprung dynamisch mitprüfen | Heutiger Standard (Qdrant / Milvus / Weaviate / pgvector 0.8+ Iterative Scan) für hohen Recall bei niedriger Latenz |
4.2 Reciprocal Rank Fusion (RRF)
Da Dense-Vektor-Scores und BM25-Scores unterschiedliche Skalen besitzen, kombiniert RRF beide Ergebnislisten direkt über ihren Rang:
RRF_Score(d) = ∑_{r ∈ R} 1 / (k + rank_r(d)) (übliche Glättungskonstante k = 60)
5. Produktionsnahe Code-Snippets
5.1 pgvector Schema, HNSW & Iterative 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 spart 50 % RAM gegenüber 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-Distanzoperatoren:
<->Euklidisch (L₂) ·<=>Kosinus-Distanz (1 - cos) ·<#>Negatives Skalarprodukt ·<+>Manhattan (L₁).
5.2 Qdrant Collection, binäre Quantisierung & Payload-Filter (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