Wird geladen

BM25-lexikalische Suche

Lektion 395 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 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:

  1. Die Anfrage tokenisieren - Die Frage des Nutzers in einzelne Begriffe zerlegen
  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. 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".

So richtest du ein BM25-Suchsystem ein:

python
# 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.