Beim Aufbau einer RAG-Pipeline wirst du schnell feststellen, dass semantische Suche allein nicht immer die besten Ergebnisse liefert. Manchmal benötigst du exakte Begriffsübereinstimmungen, die semantische Suche übersehen könnte. Die Lösung besteht darin, semantische Suche mit lexikalischer Suche zu kombinieren, und zwar mithilfe einer Technik namens BM25.
Das Problem mit semantischer Suche allein
Angenommen, du suchst in einem Dokument nach einer bestimmten Vorfall-ID wie „INC-2023-Q4-011". Obwohl dieser exakte Begriff mehrfach in relevanten Abschnitten vorkommt, könnte die semantische Suche nicht zusammenhängende Abschnitte zurückgeben, die semantisch ähnlich sind, aber den spezifischen Begriff, nach dem du suchst, tatsächlich nicht enthalten.

Das liegt daran, dass sich semantische Suche auf Bedeutung konzentriert und nicht auf exakte Übereinstimmungen. Wenn du präzises Begriffsmatching benötigst, brauchst du einen anderen Ansatz.
Hybride Suchstrategie
Die Lösung besteht darin, zwei Suchen parallel auszuführen und die Ergebnisse zusammenzuführen:

- Semantische Suche - Verwendet Embeddings und Vektordatenbanken für bedeutungsbasiertes Matching
- Lexikalische Suche - Verwendet klassische Textsuche für exaktes Begriffsmatching
- Ergebnisse zusammenführen - Kombiniert beide Ergebnismengen für eine bessere Abdeckung
Wie BM25 funktioniert
BM25 (Best Match 25) ist ein beliebter Algorithmus für lexikalische Suche in RAG-Pipelines. So verarbeitet er eine Suchanfrage:

Der Algorithmus folgt diesen wichtigen Schritten:
- Die Anfrage tokenisieren - Die Frage des Nutzers in einzelne Begriffe zerlegen
- Begriffshäufigkeit zählen - Ermitteln, wie oft jeder Begriff in allen Dokumenten vorkommt
- Begriffe nach Seltenheit gewichten - Seltener verwendete Begriffe erhalten höhere Wichtigkeitswerte
- Beste Übereinstimmungen finden - Chunks zurückgeben, die mehr Vorkommen der höher gewichteten Begriffe enthalten
Die zentrale Erkenntnis ist, dass seltene Begriffe wie „INC-2023-Q4-011" für die Suche viel wichtiger sind als gängige Wörter wie „ein" oder „der".
Implementierung der BM25-Suche
So richtest du ein BM25-Suchsystem ein:
# Erstelle einen BM25-Store
store = BM25Index()
# Füge dem Store Dokumente hinzu
for chunk in chunks:
store.add_document({"content": chunk})
# Durchsuche den Store
results = store.search("What happened with INC-2023-Q4-011?", 3)Die BM25-Implementierung bietet dieselbe API wie dein semantisches Suchsystem - beide verfügen über die Methoden add_document() und search(), was es einfach macht, sie gemeinsam zu verwenden.
Bessere Suchergebnisse
Wenn du dieselbe Anfrage, die mit semantischer Suche allein fehlgeschlagen ist, durch BM25 laufen lässt, erhältst du deutlich bessere Ergebnisse. Statt irrelevante Abschnitte zurückzugeben, priorisiert BM25 die Abschnitte, die tatsächlich deine spezifischen Suchbegriffe enthalten.
Der Algorithmus erkennt korrekt, dass „INC-2023-Q4-011" ein seltener, wichtiger Begriff ist, und bewertet Dokumente, die ihn enthalten, deutlich höher als Dokumente, die nur gängige Wörter aus der Anfrage enthalten.
Nächste Schritte
Jetzt, wo du sowohl semantische als auch lexikalische Suchsysteme hast, die unabhängig voneinander funktionieren, besteht der nächste Schritt darin, ihre Ergebnisse zusammenzuführen. Dieser hybride Ansatz bietet dir das Beste aus beiden Welten - das kontextuelle Verständnis der semantischen Suche kombiniert mit der Präzision des exakten Begriffsmatchings der lexikalischen Suche.

Beide Suchsysteme verwenden ähnliche APIs, was es unkompliziert macht, beide parallel abzufragen und ihre Ergebnisse zu einer einzigen, umfassenderen Ergebnismenge zu kombinieren.