Wird geladen

BM25 lexikalische Suche

Lektion 385 Min.

Beim Aufbau einer RAG-Pipeline wirst du schnell feststellen, dass semantische Suche allein nicht immer die besten Ergebnisse liefert. Manchmal benötigst du exakte Schlüsselwort-Übereinstimmungen, die semantische Suche möglicherweise übersieht. Die Lösung besteht darin, semantische Suche mit lexikalischer Suche zu kombinieren, indem du eine Technik namens BM25 verwendest.

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 erscheinen, aber nicht tatsächlich die spezifische Information enthalten, die du benötigst.

Dies passiert, weil sich semantische Suche auf Bedeutung konzentriert und nicht auf exakte Textübereinstimmungen. Wenn du präzises Schlüsselwort-Matching benötigst, brauchst du einen anderen Ansatz.

Hybride Suchstrategie

Die Lösung besteht darin, sowohl semantische als auch lexikalische Suchen parallel auszuführen und dann die Ergebnisse zusammenzuführen. Das gibt dir das Beste aus beiden Welten:

  • Semantische Suche - Findet konzeptionell verwandte Inhalte mithilfe von Embeddings
  • Lexikalische Suche - Findet exakte Schlüsselwort-Übereinstimmungen mithilfe klassischer Textsuche
  • Zusammengeführte Ergebnisse - Kombiniert beide Ansätze für eine bessere Gesamtrelevanz

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:

  1. Die Anfrage tokenisieren - Die Frage des Nutzers in einzelne Begriffe aufteilen
  2. Begriffshäufigkeit zählen - Ermitteln, wie oft jeder Begriff in allen Dokumenten vorkommt
  3. Begriffe nach Seltenheit gewichten - Seltener verwendete Begriffe erhalten höhere Wichtigkeitswerte
  4. Dokumente bewerten - Textabschnitte finden, die mehr Instanzen der höher gewichteten Begriffe enthalten

Die zentrale Erkenntnis ist, dass seltene Begriffe wie „INC-2023-Q4-011" für die Suchrelevanz viel wichtiger sind als häufige Wörter wie „ein" oder „der".

So richtest du ein BM25-Suchsystem ein:

python
# Erstelle einen BM25-Store
store = BM25Index()

# Füge Dokumente zum Store 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 behält eine ähnliche API wie dein Vektorspeicher bei, mit den Methoden add_document() und search(). Diese Konsistenz macht es einfach, beide Systeme zusammen zu verwenden.

Bessere Suchergebnisse

Wenn du dieselbe Anfrage durch BM25 laufen lässt, die mit semantischer Suche allein fehlgeschlagen ist, erhältst du deutlich bessere Ergebnisse. Der Algorithmus priorisiert korrekt Abschnitte, die die exakte Vorfall-ID enthalten, und stuft sie höher ein als Abschnitte, die semantisch verwandt sein könnten, aber nicht den spezifischen Begriff enthalten, nach dem du suchst.

Die Suchergebnisse bringen nun korrekt den Abschnitt Software Engineering und den Abschnitt Cybersecurity zum Vorschein, die tatsächlich den Vorfall behandeln, anstatt nicht zusammenhängende Inhalte wie Financial Analysis zurückzugeben.

Nächste Schritte

Jetzt, wo du sowohl semantische als auch lexikalische Suchsysteme unabhängig voneinander funktionieren hast, besteht der nächste Schritt darin, ihre Ergebnisse zusammenzuführen. Dieser hybride Ansatz gibt dir das semantische Verständnis von Embeddings kombiniert mit der Präzision von Schlüsselwort-Matching und schafft so eine robustere Sucherfahrung für deine RAG-Pipeline.