Embeddings und Vektorsuche: Ein Einsteiger-Roadmap
Du möchtest semantische Suche in deine App integrieren – Nutzer geben eine Anfrage ein und erhalten Ergebnisse basierend auf Bedeutung, nicht auf exakten Schlüsselwörtern. Aber du weißt nicht, wo du anfangen sollst: Was sind Embeddings? Brauchst du eine Vektordatenbank? Wie misst man Ähnlichkeit? Diese Roadmap beantwortet diese Fragen mit praktischen Schritten und Code, den du heute ausführen kannst.
Was sind Embeddings?
Ein Embedding ist ein dichter Vektor aus Gleitkommazahlen, der die Bedeutung einer Eingabe repräsentiert – Text, Bild, Audio usw. Für Text wandelt ein Modell wie text-embedding-3-small oder eine Open-Source-Alternative (z. B. all-MiniLM-L6-v2) einen Satz in einen beispielsweise 384-dimensionalen Vektor um. Wörter oder Sätze mit ähnlicher Bedeutung landen in diesem Vektorraum nahe beieinander.
Beispiel: "Katze" und "Kätzchen" haben Vektoren, die näher beieinander liegen als "Katze" und "Flugzeug". Diese Eigenschaft ermöglicht semantische Suche: Du embeddest deine Dokumente und die Anfrage und findest dann die nächstgelegenen Dokumentvektoren.
Wie Vektorsuche funktioniert
Vektorsuche (auch Ähnlichkeitssuche genannt) findet die Vektoren in deinem Datensatz, die einem Anfragevektor am ähnlichsten sind. Die Ähnlichkeit wird typischerweise mit Kosinus-Ähnlichkeit oder Skalarprodukt gemessen. Bei normalisierten Vektoren sind Kosinus-Ähnlichkeit und Skalarprodukt äquivalent.
Brute-Force-Suche vergleicht die Anfrage mit jedem Vektor – in Ordnung für Tausende von Vektoren, zu langsam für Millionen. Hier kommen Approximate Nearest Neighbor (ANN)-Algorithmen ins Spiel, wie HNSW (Hierarchical Navigable Small World) oder IVF (Inverted File Index). Sie tauschen ein winziges bisschen Genauigkeit gegen massive Geschwindigkeitsgewinne.
Schritt für Schritt: Baue einen Prototyp für semantische Suche
- Wähle ein Embedding-Modell. Für englischen Text beginne mit einem kleinen, schnellen Modell wie
all-MiniLM-L6-v2(384 Dimensionen) von Sentence Transformers. Für die Produktion ziehe OpenAIstext-embedding-3-small(1536 Dimensionen) odertext-embedding-3-large(3072 Dimensionen) in Betracht. - Embedde deine Dokumente. Teile lange Texte in Chunks auf (z. B. 200–500 Wörter), damit jeder Chunk eine kohärente Idee erfasst. Speichere den Originaltext zusammen mit dem Vektor.
- Wähle einen Vektorspeicher. Für einen schnellen Start nutze eine In-Memory-Bibliothek wie FAISS oder ein einfaches NumPy-Array. Für die Produktion wähle eine dedizierte Vektordatenbank (siehe Tabelle unten).
- Embedde die Anfrage. Verwende dasselbe Modell, um die Suchanfrage des Nutzers zu embedden.
- Suche. Berechne die Ähnlichkeit zwischen dem Anfragevektor und allen Dokumentvektoren (oder nutze einen ANN-Index) und gib die Top-k-Ergebnisse zurück.
- Iteriere. Bewerte die Ergebnisse, passe Chunk-Größe, Modell oder Ähnlichkeitsmetrik an.
Minimales Python-Beispiel mit Sentence Transformers und FAISS
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 1. Modell laden
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2. Beispieldokumente
docs = [
"Die Katze saß auf der Matte.",
"Ein Kätzchen spielt mit Garn.",
"Der Aktienmarkt ist heute abgestürzt.",
"Investoren sind wegen der Inflation besorgt."
]
# 3. Embeddings erstellen
embeddings = model.encode(docs, convert_to_numpy=True)
# 4. FAISS-Index aufbauen
dim = embeddings.shape[1]
index = faiss.IndexFlatL2(dim) # L2-Distanz; für Kosinus zuerst normalisieren
index.add(embeddings)
# 5. Suchen
query = "katzenartig ruhend"
query_vec = model.encode([query], convert_to_numpy=True)
D, I = index.search(query_vec, k=2)
print([docs[i] for i in I[0]])
# Ausgabe wahrscheinlich: ['Die Katze saß auf der Matte.', 'Ein Kätzchen spielt mit Garn.']
Auswahl einer Vektordatenbank
Für kleine Projekte kannst du Vektoren in einer einfachen Datei oder einem In-Memory-Index speichern. Mit zunehmender Skalierung bietet eine dedizierte Vektordatenbank Persistenz, Filterung und ANN-Indizes. Hier ein kurzer Vergleich:
| Datenbank | Typ | Am besten für |
|---|---|---|
| FAISS | Bibliothek | Prototyping, lokale Experimente |
| Chroma | Embedded / Client-Server | Kleine bis mittlere Apps, einfache Einrichtung |
| Pinecone | Managed Cloud | Produktion, serverlose Skalierung |
| Weaviate | Open Source / Cloud | Hybride Suche, GraphQL-API |
| Qdrant | Open Source / Cloud | Hohe Leistung, Filterung |
| pgvector | PostgreSQL-Erweiterung | Bestehender Postgres-Stack |
Best Practices und häufige Fallstricke
- Normalisiere Vektoren, wenn du Kosinus-Ähnlichkeit verwendest – viele Bibliotheken setzen Einheitsvektoren für das Skalarprodukt voraus.
- Wähle Chunks mit Bedacht: Zu groß und du verlierst Spezifität; zu klein und du verlierst Kontext. Experimentiere mit Überlappung.
- Verwende dasselbe Modell für Dokumente und Anfragen. Das Mischen von Modellen bricht die Ähnlichkeit.
- Ziehe Dimensionsreduktion (z. B. PCA) nur in Betracht, wenn Speicher oder Geschwindigkeit kritisch sind; sie kann die Genauigkeit beeinträchtigen.
- Hybride Suche (Kombination von Schlüsselwort- und Vektorsuche) verbessert oft die Ergebnisse für exakte Übereinstimmungen.
FAQ
Brauche ich eine Vektordatenbank für ein kleines Projekt?
Nein. Für bis zu ein paar Tausend Vektoren kannst du eine In-Memory-Bibliothek wie FAISS oder sogar ein NumPy-Array verwenden. Eine Vektordatenbank wird nützlich, wenn du Persistenz, Filterung oder Skalierung über den Speicher hinaus benötigst.
Wie wähle ich ein Embedding-Modell aus?
Beginne mit einem kleinen, schnellen Modell wie all-MiniLM-L6-v2 für das Prototyping. Wenn du höhere Genauigkeit benötigst und API-Kosten tragen kannst, probiere OpenAIs text-embedding-3-small oder text-embedding-3-large. Bewerte immer auf deinen eigenen Daten.
Was ist der Unterschied zwischen Kosinus-Ähnlichkeit und euklidischer Distanz?
Kosinus-Ähnlichkeit misst den Winkel zwischen Vektoren und ignoriert die Länge. Die euklidische Distanz misst die geradlinige Entfernung. Bei normalisierten Vektoren ergeben sie die gleiche Rangfolge. Kosinus ist für Text-Embeddings üblich, weil er sich auf die Richtung (Bedeutung) statt auf die Länge konzentriert.
Nächste Schritte
Jetzt, da du die Grundlagen verstehst, versuche eine kleine semantische Suche über deine eigenen Notizen oder Dokumentationen zu bauen. Experimentiere mit Chunk-Größen und Modellen. Wenn du wächst, migriere zu einer verwalteten Vektordatenbank und füge hybride Suche hinzu. Das Feld entwickelt sich schnell, aber diese Grundlagen bleiben relevant.
Wenn du API-Antworten formatieren oder JSON-Payloads von Embedding-Diensten debuggen musst, kann dir der JSON Formatter helfen, die Daten schnell zu inspizieren und zu validieren.