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.

0 Kommentare

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert