
Eine Vektordatenbank ist eine spezielle Datenbank zum Speichern, Indizieren und Abfragen hochdimensionaler Vektoreinbettungen. Unlike traditional databases that search by exact keyword matches or structured queries, vector databases search by semantic similarity — finding data that is conceptually related even if it uses different words.
Eine Vektordatenbank ist eine spezielle Datenbank zum Speichern, Indizieren und Abfragen hochdimensionaler Vektoreinbettungen. Unlike traditional databases that search by exact keyword matches or structured queries, vector databases search by semantic similarity — finding data that is conceptually related even if it uses different words.
Vektordatenbanken sind zu einer wesentlichen Infrastruktur für KI-Anwendungen geworden: Sie unterstützen Retrieval-Augmented Generation (RAG), semantische Suche, Empfehlungssysteme, Anomalieerkennung und multimodale KI (Text, Bild, Audio).
Einbettungen sind numerische Darstellungen von Daten – Text, Bilder, Audio oder andere Modalitäten – die von Modellen des maschinellen Lernens erstellt werden. Der Zauber besteht darin, dass ähnliche Elemente im Vektorraum nahe beieinander landen:
"king" ──► [0.23, -0.45, 0.78, ..., 0.12] (768 dimensions)
"queen" ──► [0.25, -0.42, 0.76, ..., 0.15] (close to king)
"apple" ──► [-0.12, 0.65, 0.33, ..., -0.28] (far from king)
┌───────┐
│ man │
└───┬───┘
│
┌───────────────┼───────────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│ king │───────│ woman │───────│ queen │
└───┬───┘ └───┬───┘ └───┬───┘
│ │ │
└───────────────┼───────────────┘
│
┌───▼───┐
│ girl │
└───────┘
Vector arithmetic: king - man + woman = queen
| Modell | Abmessungen | Am besten für | Anbieter |
|---|---|---|---|
| Texteinbettung-3-klein | 512-1536 | Universell einsetzbar, kostengünstig | OpenAI |
| Texteinbettung-3-groß | 256-3072 | Hohe Genauigkeit, semantische Suche | OpenAI |
| Cohere Embed v3 | 1024 | Mehrsprachig, Klassifizierung | Kohärent |
| BAAI/bge-large-en-v1.5 | 1024 | Open Source, hohe Qualität | Umarmendes Gesicht |
| Satztransformatoren/all-MiniLM-L6-v2 | 384 | Leicht, schnell | Umarmendes Gesicht |
| Bildbinden | 1024 | Multimodal (Text, Bild, Audio) | Meta |
Die Brute-Force-Suche nach dem nächsten Nachbarn ist O(N) – zu langsam für Millionen von Vektoren:
# Brute force — O(N), not scalable
def brute_force_search(query_vector, all_vectors, k=10):
distances = []
for i, vec in enumerate(all_vectors):
dist = cosine_distance(query_vector, vec)
distances.append((dist, i))
return sorted(distances)[:k]
Vektordatenbanken verwenden ANN-Algorithmen, um eine sublineare Suchzeit zu erreichen:
| Algorithmus | Geschwindigkeit | Rückruf | Erinnerung | Bauzeit |
|---|---|---|---|---|
| HNSW (Hierarchical Navigable Small World) | ⚡ Schnell | 95-99 % | Hoch | Langsam |
| IVF (Invertierter Dateiindex) | 🐢 Langsam | 90-95 % | Mittel | Schnell |
| IVF + PQ (Produktquantisierung) | ⚡ Schnell | 85-95 % | Niedrig | Mittel |
| DiskANN | ⚡ Schnell | 90-95 % | Niedrig (Festplatte) | Mittel |
| LSH (Ortssensitives Hashing) | 🐢 Langsam | 80-90 % | Hoch | Schnell |
HNSW erstellt eine mehrschichtige Diagrammstruktur:
Layer 3: ────────●──────── (sparse, long-range connections)
│
Layer 2: ────●────────●─── (medium density)
│ │
Layer 1: ──●──●──●──●──●── (dense, short-range connections)
Search starts at top layer (coarse) and descends to bottom layer (fine).
| Funktion | Tannenzapfen | Weben | Qdrant | Milvus | Chroma | pgvector |
|---|---|---|---|---|---|---|
| Architektur | Verwaltetes SaaS | Hybrid | Standalone | Verteilt | Eingebettet | PostgreSQL-Erweiterung |
| Beharrlichkeit | Wolke | Cloud/On-Prem | Cloud/On-Prem | Cloud/On-Prem | Lokale Datei | PostgreSQL |
| Index | HNSW | HNSW | HNSW | IVF/HNSW | HNSW | IVFFlat/HNSW |
| Hybridsuche | Ja | Ja | Ja | Ja | Begrenzt | Ja (über SQL) |
| Mehrmandantenfähigkeit | Ja | Ja | Ja | Ja | Handbuch | Über Schemata |
| Filtern | Vorfilter | Vor-/Nachfilter | Vorfilter | Nachfilter | Begrenzt | Filter + Index |
| Metadaten | JSON | JSON | JSON | JSON | JSON | JSONB |
| Open Source | Nein | Ja (BSL) | Ja (Apache 2.0) | Ja (Apache 2.0) | Ja (Apache 2.0) | Ja (PostgreSQL) |
| Selbstveranstalter | Nein | Ja | Ja | Ja | Ja | Ja |
Der beliebteste Anwendungsfall für Vektordatenbanken – die Erweiterung von LLMs mit privaten Daten:
User Query: "What is our company policy on remote work?"
┌─────────────────────────┐
│ Embedding Model │
│ text-embedding-3-small │
└────────────┬────────────┘
│ (query vector)
▼
┌─────────────────────────┐
│ Vector Database │
│ (company policies) │
└────────────┬────────────┘
│ (relevant chunks)
▼
┌─────────────────────────┐
│ LLM (GPT-4 / Claude) │
│ "Based on our policy │
│ document X, remote │
│ work is allowed 3 │
│ days per week..." │
└─────────────────────────┘
Python-Implementierung:
import openai
from qdrant_client import QdrantClient
client = QdrantClient("localhost", port=6333)
def rag_query(question: str) -> str:
# 1. Embed the question
query_vector = openai.embeddings.create(
input=question, model="text-embedding-3-small"
).data[0].embedding
# 2. Search vector database
results = client.query_points(
collection_name="company_policies",
query=query_vector,
limit=5
)
# 3. Build context from retrieved chunks
context = "\n\n".join([r.payload["text"] for r in results.points])
# 4. Generate answer with context
response = openai.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Answer based on the provided context only."},
{"role": "user", "content": f"Context:\n{context}\n\nQuestion: {question}"}
]
)
return response.choices[0].message.content
Suchen Sie nach Bedeutung, nicht nach Schlüsselwörtern:
# Traditional keyword search — misses synonyms
SELECT * FROM products WHERE description LIKE '%cheap laptop%'
# May miss: "affordable notebook" or "budget computer"
# Vector semantic search — finds conceptually related items
results = vector_db.search(
query="budget-friendly portable computer",
collection="products",
limit=10
)
# Finds: "cheap laptop", "affordable notebook", "budget desktop", "entry-level PC"
Leistungsvergleich:
| Suchtyp | Rückruf | Benutzerzufriedenheit | Komplexität der Implementierung |
|---|---|---|---|
| Schlüsselwort (BM25) | 40-60 % | Niedrig | Niedrig |
| Semantik (Vektor) | 70-90 % | Hoch | Mittel |
| Hybrid (BM25 + Vector) | 85-95 % | Sehr hoch | Hoch |
Durchsuchen Sie verschiedene Datentypen:
# Text-to-image search
text_vector = embed_text("sunset over mountains")
image_results = vector_db.search(text_vector, collection="images")
# Image-to-text search
image_vector = embed_image(uploaded_photo)
text_results = vector_db.search(image_vector, collection="descriptions")
# Image-to-image search (visual similarity)
product_image_vector = embed_image(product_photo)
similar_products = vector_db.search(product_image_vector, collection="products")
def recommend_items(user_id: str, n: int = 10):
# Get user's embedding (from past behavior)
user_vector = get_user_embedding(user_id)
# Find similar items in vector space
recs = vector_db.search(
query=user_vector,
collection="items",
limit=n,
with_payload=True
)
# Diversity re-ranking
return diversify(recs, diversity_factor=0.3)
Qdrant-Beispiel:
from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance
client = QdrantClient("localhost", port=6333)
# Create collection with specific vector config
client.create_collection(
collection_name="documents",
vectors_config=VectorParams(
size=1536, # Matches text-embedding-3-small
distance=Distance.COSINE # or DOT, EUCLIDEAN
),
)
# Insert vectors with payload (metadata)
client.upsert(
collection_name="documents",
points=[
{
"id": "doc_001",
"vector": [0.12, -0.45, ..., 0.78], # 1536-dimensional
"payload": {
"title": "Remote Work Policy",
"category": "HR",
"author": "HR Team",
"date": "2026-01-15",
"chunk_index": 0,
"text": "Employees may work remotely up to 3 days per week..."
}
},
# ... more points
]
)
# Semantic search with metadata filters
results = client.query_points(
collection_name="documents",
query=query_vector,
query_filter=models.Filter(
must=[
models.FieldCondition(
key="category",
match=models.MatchValue(value="Engineering")
),
models.FieldCondition(
key="date",
range=models.Range(gte="2025-01-01")
),
],
should=[
models.FieldCondition(
key="author",
match=models.MatchValue(value="Alice")
),
]
),
limit=20,
score_threshold=0.75 # Minimum similarity score
)
| Betrieb | PostgreSQL | pgvector | Dedizierte Vektor-DB |
|---|---|---|---|
| Genaue KNN | ❌ (vollständiger Scan) | ❌ (langsam) | ✅ (mittels roher Gewalt) |
| ANN-Suche | ❌ | ✅ (IVFFlat, HNSW) | ✅ (optimiert) |
| Über 10 Millionen Vektoren | ✅ | ⚠️ Die Leistung nimmt ab | ✅ |
| Echtzeit-Streaming | ✅ | ⚠️ | ✅ |
| Hybridsuche | ✅ (SQL-Filter) | ✅ | ✅ |
| Multi-Tenant | ✅ (Schemata) | ✅ | ✅ (Muttersprache) |
| ACID-Transaktionen | ✅ | ✅ | ⚠️ (begrenzt) |
| Zeitreise-Abfragen | ❌ | ❌ | ✅ (WAL) |
vector_database_pricing:
pinecone:
starter: "$70/month for 100K vectors"
enterprise: "$2,000+/month for 10M+ vectors"
self_hosted_qdrant:
infrastructure: "$50-500/month (cloud VMs)"
maintenance: "Operational overhead"
Vektordatenbanken sind eine kritische Infrastrukturkomponente für KI-Anwendungen:
Die Vektordatenbanklandschaft entwickelt sich rasant weiter. Beginnen Sie einfach (pgvector oder Open-Source-Qdrant), vergleichen Sie es mit Ihren Daten und skalieren Sie es nach Bedarf.
Noch keine freigegebenen Kommentare sichtbar. Neue Antworten können moderiert werden.