Hybrid Vektorsuche für Einsteiger – BM25 und Embeddings kombinieren
Du willst, dass deine Suche relevante Ergebnisse liefert – auch wenn Nutzer frei formulieren oder Synonyme verwenden. Klassische Volltextsuche mit BM25 ist schnell und robust, verpasst aber oft semantische Treffer. Embeddings verstehen Bedeutungen, können aber exakte Schlüsselwörter oder Zahlen nicht immer perfekt treffen.
Die Lösung ist eine hybride Suche, die beides vereint. Du nutzt die Präzision von BM25 und die Bedeutungsnähe von Embeddings. In diesem Guide bauen wir Schritt für Schritt eine leicht verständliche Pipeline, sprechen über Ranking-Fusion, Reranking und Messung, damit du deine Suche planbar verbesserst.
Grundlagen – was BM25 und Embeddings leisten
BM25 kurz erklärt
BM25 ist ein lexikalisches Rankingmodell. Es bewertet Dokumente anhand von Keyword-Übereinstimmungen, Termhäufigkeit und Dokumentlänge. Vorteil: exakt, schnell, transparent. Nachteil: Versteht Synonyme und Kontext nur indirekt.
Embeddings kurz erklärt
Embeddings bilden Wörter, Sätze oder Dokumente als Vektoren in einem Bedeutungsraum ab. Ähnliche Inhalte liegen nahe beieinander. Vorteil: erkennt Synonyme, Paraphrasen und Kontext. Nachteil: kann Zahlen, IDs, Code oder sehr seltene Begriffe übersehen, wenn sie semantisch ähnlich wirken.
Warum hybrid
Hybride Suche kombiniert Sparse Retrieval (BM25) und Dense Retrieval (Embeddings). Du bekommst hohen Recall für Bedeutungen und behältst präzise Keyword-Treffer. Ergebnis: konstant bessere Rankings bei realen Nutzerfragen.
Pipeline-Varianten – so setzt du Hybrid um
Parallel abrufen und fusionieren
Du führst zwei Abrufe aus: BM25 und Embeddings. Danach fusionierst du die Rankings, z. B. mit Reciprocal Rank Fusion (RRF) oder einer gewichteten Summe. Das ist einfach, stabil und funktioniert bei vielen Domains sofort.
Staged Retrieval
Du holst zuerst viele BM25-Treffer (z. B. k=200), filterst grob und lässt dann Embeddings auf dieser kleineren Menge arbeiten. Vorteil: niedrigere Latenz bei großen Korpora.
Dense-first mit Keyword-Filter
Du startest mit Embeddings (k=100) und lässt anschließend BM25 die Top-Kandidaten präzise sortieren. Nützlich bei offenen Fragen oder FAQ-Domains.
Reranking mit Cross-Encoder
Nach der Fusion schickst du die Top 20-50 Kandidaten an einen Cross-Encoder (z. B. ein kleines BERT-Modell), der Query-Dokument gemeinsam bewertet. Das liefert S-Qualität, kostet aber etwas Latenz. Ideal, wenn Qualität wichtiger als Geschwindigkeit ist.
Schritt für Schritt – deine erste Hybrid-Pipeline
1. Texte sauber vorbereiten
Zerlege Inhalte in Chunks von ca. 200-400 Wörtern. Entferne Boilerplate, behalte Titel und Zwischenüberschriften als Felder. Gute Chunking-Regeln sind die halbe Miete.
2. Zwei Indexe bauen
Erzeuge einen Inverted Index für BM25 und einen Vektorindex (z. B. Cosine oder Dot Product) für Embeddings. Speichere je Chunk ID, Titel, URL, Kategorie.
3. Query Processing
Normalisiere Kleinschreibung, entferne überflüssige Satzzeichen. Für BM25 helfen Synonymlisten bei Fachbegriffen. Für Embeddings reicht meist die rohe Query.
4. Parallel abrufen
Frage BM25 mit k1=100 ab und Embeddings mit k2=100. So verlierst du keine Kandidaten und bleibst schnell.
5. Rankings fusionieren
Berechne pro Dokument einen Fusion-Score. Ein einfacher Start ist RRF: 1/(k + Rang). Alternativ normierst du Scores und bildest eine gewichtete Summe, z. B. 0.6 * dense + 0.4 * sparse.
6. Optional: Reranking
Schicke die Top 20 in einen Cross-Encoder für ein feines Endranking. Cache Ergebnisse beliebter Queries, um Latenz zu sparen.
7. Antworten darstellen
Zeige Titel, Snippet, Quelle und markiere exakte Treffer dezent. So verstehen Nutzer, warum ein Ergebnis passt.
Parameter-Tipps – schnell gute Defaults finden
BM25
Setze k1 zwischen 0.9-1.5, b zwischen 0.5-0.9. Gewichte Titel höher als Body. Achte auf Stoppwortlisten bei kurzen Queries.
Embeddings
Wähle ein domänennahes Modell mit guter Sentence-Qualität. Nutze Cosine Similarity. Prüfe, ob Lowercasing im Preprocessing hilft. Halte Vektordimension moderat für schnelle Indizes.
Fusion
Starte mit RRF oder 0.6 dense / 0.4 sparse. Erhöhe dense, wenn Synonyme wichtig sind; erhöhe sparse, wenn exakte Begriffe zählen.
k-Werte und Latenz
BM25 k=100, Embeddings k=100, Reranking Top 20 ist ein guter Ausgangspunkt. Passe k an Korpusgröße und Budget an.
Qualität messen – ohne Overkill
Offline-Metriken
Nutze Recall@k und nDCG@k, um zu sehen, wie gut relevante Dokumente oben landen. MRR hilft bei Fragen mit einer besten Antwort. Erstelle ein kleines Golden Set mit 50-200 Beispielen aus echten Nutzerfragen.
Online-Tests
Führe A/B-Tests mit realen Nutzern durch. Beobachte CTR@1, Long Clicks und Refinements. Eine konstante Verbesserung über mehrere Tage ist zuverlässiger als ein kurzer Peak.
Häufige Fehler und wie du sie vermeidest
Zu kleine Chunks: Du verlierst Kontext. Zu große Chunks: Embeddings werden unscharf.
Nur Scores addieren ohne Normierung: Dichte Scores dominieren. Normiere vorher.
Keine Evaluation: Gefühl täuscht. Baue kleine, feste Tests.
Zu viel Reranking: Hohe Kosten ohne spürbaren Nutzen. Messe den Inkrementalen Gewinn.
Kein Fallback: Wenn Embeddings ausfallen, muss BM25 allein liefern können.
Mini-Beispiel – einfache Fusion in Pseudocode
bm25_hits = bm25.search(query, k=100) # [(doc_id, rank)]
dense_hits = vector.search(encode(query), k=100) # [(doc_id, rank)]
K = 60 # RRF-Konstante
def rrf_score(rank):
return 1.0 / (K + rank)
scores = defaultdict(float)
for i, doc in enumerate(bm25_hits, start=1):
scores[doc.id] += 0.4 * rrf_score(i)
for j, doc in enumerate(dense_hits, start=1):
scores[doc.id] += 0.6 * rrf_score(j)
results = sort_by_value_desc(scores)[:20]
# Optional: cross_encoder.rerank(query, results[:20])
Kurz, verständlich und in der Praxis leicht auf deine Tools übertragbar.
Fazit
Hybride Suche verbindet das Beste aus zwei Welten: BM25 liefert präzise Keyword-Treffer, Embeddings verstehen Bedeutungen. Mit Parallelabruf, einfacher Fusion und optionalem Reranking hebst du die Qualität sofort spürbar an. Starte mit guten Defaults, messe Recall und nDCG, teste live und justiere Gewichte behutsam. So wird deine Suche zuverlässig, schnell und für Nutzer klar nachvollziehbar.


Hinterlasse einen Kommentar
An der Diskussion beteiligen?Hinterlasse uns deinen Kommentar!