Embeddings und Vektorsuche: Ein Einsteiger-Roadmap

AI2026-09-28TryQuickToolBox

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

  1. 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 OpenAIs text-embedding-3-small (1536 Dimensionen) oder text-embedding-3-large (3072 Dimensionen) in Betracht.
  2. 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.
  3. 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).
  4. Embedde die Anfrage. Verwende dasselbe Modell, um die Suchanfrage des Nutzers zu embedden.
  5. Suche. Berechne die Ähnlichkeit zwischen dem Anfragevektor und allen Dokumentvektoren (oder nutze einen ANN-Index) und gib die Top-k-Ergebnisse zurück.
  6. 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:

DatenbankTypAm besten für
FAISSBibliothekPrototyping, lokale Experimente
ChromaEmbedded / Client-ServerKleine bis mittlere Apps, einfache Einrichtung
PineconeManaged CloudProduktion, serverlose Skalierung
WeaviateOpen Source / CloudHybride Suche, GraphQL-API
QdrantOpen Source / CloudHohe Leistung, Filterung
pgvectorPostgreSQL-ErweiterungBestehender Postgres-Stack

Best Practices und häufige Fallstricke

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.