Lexikalische und semantische Suche mit Elasticsearch

In diesem Blogbeitrag werden wir verschiedene Ansätze zur Informationsbeschaffung mit Elasticsearch untersuchen, wobei wir uns auf die lexikalische und semantische Suche konzentrieren.

Von der Vektorsuche bis hin zu leistungsstarken REST-APIs bietet Elasticsearch Entwicklern das umfangreichste Such-Toolkit. Sehen Sie sich die Beispiel-Notebooks auf GitHub an, um etwas Neues testen. Sie können auch noch heute Ihre kostenlose Testversion starten oder Elasticsearch lokal ausführen.

Die Suche ist der Prozess, bei dem die relevantesten Informationen auf der Grundlage Ihrer Suchanfrage oder kombinierter Suchanfragen gefunden werden; relevante Suchergebnisse sind Dokumente, die am besten zu diesen Suchanfragen passen. Obwohl die Suche mit verschiedenen Herausforderungen und Methoden verbunden ist, bleibt das letztendliche Ziel dasselbe: die bestmögliche Antwort auf Ihre Frage zu finden.

Mit Blick auf dieses Ziel werden wir in diesem Blogbeitrag verschiedene Ansätze zur Informationsbeschaffung mit Elasticsearch untersuchen, wobei der Schwerpunkt auf der Textsuche liegt: lexikalische und semantische Suche.

Voraussetzungen

Um dies zu erreichen, werden wir Python-Beispiele bereitstellen, die verschiedene Suchszenarien auf einem Datensatz demonstrieren, der zur Simulation von E-Commerce-Produktinformationen generiert wurde.

Dieser Datensatz enthält über 2.500 Produkte, jedes mit einer Beschreibung. Diese Produkte sind in 76 verschiedene Produktkategorien unterteilt, wobei jede Kategorie eine unterschiedliche Anzahl von Produkten enthält, wie unten dargestellt:

Treemap-Visualisierung – die 22 wichtigsten Werte von category.keyword (Produktkategorien)

Für die Einrichtung benötigen Sie:

  • Python 3.6 oder höher
  • Der Elastic Python-Client
  • Elastic 8.8-Bereitstellung oder höher, mit 8 GB Arbeitsspeicher-Knoten für maschinelles Lernen
  • Das Elastic Learned Sparse EncodeR- Modell, das in Elastic vorinstalliert und auf Ihrem Bereitstellungsserver gestartet ist, ist bereits vorhanden.

Wir werden Elastic Cloud verwenden, eine kostenlose Testversion ist verfügbar.

Neben den in diesem Blogbeitrag bereitgestellten Suchanfragen führt Sie ein Python-Notebook durch die folgenden Prozesse:

  • Stellen Sie mithilfe des Python-Clients eine Verbindung zu unserer Elastic-Bereitstellung her.
  • Laden Sie ein Text-Embedding-Modell in den Elasticsearch-Cluster.
  • Erstellen Sie einen Index mit Zuordnungen zum Indizieren von Merkmalsvektoren und dichten Vektoren.
  • Erstellen Sie eine Ingest-Pipeline mit Inferenzprozessoren für Text-Embedding und Text-Expansion.

Lexikalische Suche – spärliche Suche

Die klassische Methode, mit der Elasticsearch Dokumente anhand einer Textabfrage nach Relevanz ordnet, verwendet die Lucene-Implementierung des BM25- Modells, eines Sparse-Modells für die lexikalische Suche. Diese Methode folgt dem traditionellen Ansatz der Textsuche und sucht nach exakten Übereinstimmungen der Begriffe.

Um diese Suche zu ermöglichen, wandelt Elasticsearch die Daten der Textfelder durch eine Textanalyse in ein durchsuchbares Format um.

Die Textanalyse wird von einem Analysator durchgeführt, einem Regelsatz, der den Prozess der Extraktion relevanter Token für die Suche steuert. Ein Analysator muss genau einen Tokenizer haben. Der Tokenizer empfängt einen Zeichenstrom und zerlegt ihn in einzelne Tokens (in der Regel einzelne Wörter), wie im folgenden Beispiel:

Ausgabe

In diesem Beispiel verwenden wir den Standardanalysator , der für die meisten Anwendungsfälle gut geeignet ist, da er eine auf englischer Grammatik basierende Tokenisierung bietet. Die Tokenisierung ermöglicht den Abgleich einzelner Begriffe, wobei jedes Token weiterhin wörtlich abgeglichen wird.

Wenn Sie Ihr Sucherlebnis personalisieren möchten, können Sie einen anderen integrierten Analysator auswählen. Beispielsweise wird durch die Aktualisierung des Codes zur Verwendung des Stoppwortanalysators der Text an jedem Nicht-Buchstaben-Zeichen in Tokens zerlegt, wobei die Entfernung von Stoppwörtern unterstützt wird.

Ausgabe

Wenn die integrierten Analysatoren Ihre Anforderungen nicht erfüllen, können Sie einen benutzerdefinierten Analysator erstellen, der die entsprechende Kombination aus null oder mehr Zeichenfiltern, einem Tokenizer und null oder mehr Tokenfiltern verwendet.

Im obigen Beispiel, das einen Tokenizer und Tokenfilter kombiniert, wird der Text vom Kleinbuchstabenfilter in Kleinbuchstaben umgewandelt, bevor er vom Synonym-Tokenfilter verarbeitet wird.

Lexikalische Übereinstimmung

BM25 wird die Relevanz von Dokumenten für eine bestimmte Suchanfrage anhand der Häufigkeit der Begriffe und ihrer Wichtigkeit messen.

Der unten stehende Code führt eine Match -Abfrage durch, bei der bis zu zwei Dokumente unter Berücksichtigung der Werte des Feldes "description" aus dem Index "ecommerce-search" und der Suchanfrage "Comfortable furniture for a large Balcony" gesucht werden.

Durch eine Verfeinerung der Kriterien, nach denen ein Dokument als Treffer für diese Abfrage in Betracht gezogen werden soll, kann die Genauigkeit verbessert werden. Genauere Ergebnisse gehen jedoch mit einer geringeren Toleranz gegenüber Abweichungen einher.

Ausgabe

Die Analyse der Ergebnisse zeigt, dass das relevanteste Produkt das „ Barbie Dreamhouse “ in der Kategorie „ Spielzeug “ ist. Dessen Beschreibung ist besonders relevant, da sie die Begriffe „ Möbel “, „ groß“ und „Balkon “ enthält. Es ist das einzige Produkt, dessen Beschreibung drei Begriffe enthält, die mit der Suchanfrage übereinstimmen, und es ist außerdem das einzige, dessen Beschreibung den Begriff „Balkon“ enthält.

Das zweitwichtigste Produkt ist ein „ Komfortabler Schaukelstuhl “, der unter „ Innenmöbel “ kategorisiert ist und dessen Beschreibung die Begriffe „ bequem “ und „ Möbel “ enthält. Nur 3 Produkte im Datensatz entsprechen mindestens 2 Begriffen dieser Suchanfrage, dieses Produkt ist eines davon.

Der Begriff „Komfortabel“ taucht in der Beschreibung von 105 Produkten auf, der Begriff „Möbel“ in der Beschreibung von 4 Produkten aus 4 verschiedenen Kategorien: Spielzeug, Möbel für den Innenbereich, Möbel für den Außenbereich und „Zubehör und Spielzeug für Hunde und Katzen“.

Wie Sie sehen konnten, ist das relevanteste Produkt im Hinblick auf die Suchanfrage ein Spielzeug und das zweitrelevanteste Produkt sind Möbel für den Innenbereich. Wenn Sie detaillierte Informationen über die Berechnung der Punktzahl wünschen, um zu verstehen, warum diese Dokumente übereinstimmen, können Sie den Parameter explain __query auf true setzen.

Obwohl beide Ergebnisse die relevantesten sind, sowohl hinsichtlich der Anzahl der Dokumente als auch des Vorkommens der Begriffe in diesem Datensatz, besteht die Absicht hinter der Anfrage "Bequeme Möbel für einen großen Balkon" darin, Möbel für einen tatsächlich großen Balkon zu finden, wobei unter anderem Spielzeug und Möbel für den Innenbereich ausgeschlossen werden.

Die lexikalische Suche ist relativ einfach und schnell, hat aber ihre Grenzen, da es nicht immer möglich ist, alle möglichen Begriffe und Synonyme zu kennen, ohne unbedingt die Absicht und die Suchanfragen des Benutzers zu kennen. Ein häufiges Phänomen beim Gebrauch natürlicher Sprache ist die Diskrepanz im Wortschatz. Untersuchungen zeigen, dass verschiedene Personen (Experten auf demselben Gebiet) im Durchschnitt in 80 % der Fälle ein und dasselbe Objekt unterschiedlich benennen.

Diese Einschränkungen veranlassen uns, nach anderen Bewertungsmodellen zu suchen, die semantisches Wissen einbeziehen. Transformerbasierte Modelle, die sich durch ihre Fähigkeit auszeichnen, sequentielle Eingabe-Tokens wie natürliche Sprache zu verarbeiten, erfassen die zugrundeliegende Bedeutung Ihrer Suche, indem sie mathematische Darstellungen sowohl von Dokumenten als auch von Suchanfragen berücksichtigen. Dies ermöglicht eine dichte, kontextsensitive Vektordarstellung von Texten und ist somit die Grundlage für die semantische Suche, eine verfeinerte Methode zum Auffinden relevanter Inhalte.

Semantische Suche – dichte Suche

In diesem Zusammenhang wird nach der Umwandlung Ihrer Daten in aussagekräftige Vektorwerte der k-nächste-Nachbarn-Suchalgorithmus (kNN) verwendet, um Vektordarstellungen in einem Datensatz zu finden, die einem Anfragevektor am ähnlichsten sind. Elasticsearch unterstützt zwei Methoden für die kNN-Suche: die exakte Brute-Force-kNN-Suche und die approximative kNN-Suche, auch bekannt als ANN.

Brute-Force-kNN garantiert zwar genaue Ergebnisse, skaliert aber nicht gut mit großen Datensätzen. Approximatives kNN findet effizient annähernd nächste Nachbarn, indem es etwas Genauigkeit für eine verbesserte Leistung opfert.

Durch die Unterstützung von kNN-Suche und dichten Vektorindizes durch Lucene nutzt Elasticsearch den Hierarchical Navigable Small World (HNSW)-Algorithmus, der eine starke Suchleistung über eine Vielzahl von ann-Benchmark-Datensätzen hinweg demonstriert. Eine approximative kNN-Suche kann in Python mithilfe des unten stehenden Beispielcodes durchgeführt werden.

Semantische Suche mit approximativem kNN

Dieser Codeblock verwendet Elasticsearchs kNN, um bis zu zwei Produkte mit einer Beschreibung zurückzugeben, die der vektorisierten Anfrage (query_vector_build) von "Komfortable Möbel für einen großen Balkon" ähnlich ist, wobei die Einbettungen des Feldes "description " im Produktdatensatz berücksichtigt werden.

Die Produkt-Embeddings wurden zuvor in einer Ingest-Pipeline mit einem Inferenzprozessor generiert, der das Text-Embedding-Modell "all-mpnet-base-v2" enthielt, um aus den in die Pipeline aufgenommenen Daten Inferenz zu ziehen.

Dieses Modell wurde auf Grundlage der Auswertung vortrainierter Modelle mithilfe von "sentence_transformers.evaluation" ausgewählt. wobei verschiedene Klassen verwendet werden, um ein Modell während des Trainings zu beurteilen. Das Modell „all-mpnet-base-v2“ erzielte die beste durchschnittliche Leistung gemäß dem Sentence-Transformers-Ranking und sicherte sich auch eine günstige Position im Massive Text Embedding Benchmark (MTEB) Leaderboard. Das Modell basiert auf dem vortrainierten microsoft/mpnet-base- Modell und wurde anhand eines Datensatzes mit 1 Milliarde Satzpaaren feinabgestimmt. Es bildet Sätze auf einen 768-dimensionalen dichten Vektorraum ab.

Alternativ stehen viele andere Modelle zur Verfügung, die verwendet werden können, insbesondere solche, die speziell auf Ihre domänenspezifischen Daten abgestimmt sind.

Ausgabe

Das Ergebnis kann je nach gewähltem Modell, Filtern und ungefährem kNN-Tuningvariieren.

Die kNN-Suchergebnisse befinden sich beide in der Kategorie „ Gartenmöbel “, obwohl das Wort „ Garten “ nicht explizit in der Suchanfrage erwähnt wurde. Dies unterstreicht die Bedeutung des semantischen Verständnisses im Kontext.

Die dichte Vektorsuche bietet mehrere Vorteile:

  • Aktivierung der semantischen Suche
  • Skalierbarkeit zur Verarbeitung sehr großer Datensätze
  • Flexibilität im Umgang mit einer breiten Palette von Datentypen

Die Suche in dichten Vektoren birgt jedoch auch ihre eigenen Herausforderungen:

  • Auswahl des richtigen Einbettungsmodells für Ihren Anwendungsfall
  • Sobald ein Modell ausgewählt ist, kann es notwendig sein, das Modell feinabzustimmen, um die Leistung auf einem domänenspezifischen Datensatz zu optimieren. Dieser Prozess erfordert die Einbeziehung von Domänenexperten.
  • Darüber hinaus kann die Indizierung hochdimensionaler Vektoren rechenaufwändig sein.

Semantische Suche – gelernter spärlicher Abruf

Lassen Sie uns einen alternativen Ansatz erkunden: das gelernte spärliche Retrieval, eine andere Möglichkeit, semantische Suchen durchzuführen.

Als Sparse-Modell nutzt es den Lucene-basierten invertierten Index von Elasticsearch, der von jahrzehntelangen Optimierungen profitiert. Dieser Ansatz geht jedoch über das einfache Hinzufügen von Synonymen mit lexikalischen Bewertungsfunktionen wie BM25 hinaus. Stattdessen werden gelernte Assoziationen mithilfe eines tiefergehenden sprachlichen Wissens einbezogen, um die Relevanz zu optimieren.

Durch die Erweiterung der Suchanfragen um relevante Begriffe, die in der ursprünglichen Anfrage nicht enthalten sind,verbessert der Elastic Learned Sparse Encoder die Sparse Vector Embeddings, wie Sie im folgenden Beispiel sehen können.

Suche nach dünnbesetzten Vektoren mit elastischem, gelerntem, dünnbesetztem Encoder

Ausgabe

Zu den Ergebnissen gehört in diesem Fall die Kategorie „ Gartenmöbel “, die Produkte anbietet, die den „ Outdoor-Möbeln “ sehr ähnlich sind.

Durch die Analyse von "ml.tokens", Aus dem Feld "rank_features", das die von Learned Sparse Retrieval generierten Token enthält, wird deutlich, dass sich unter den verschiedenen generierten Token Begriffe befinden, die zwar nicht Teil der Suchanfrage sind, aber dennoch eine relevante Bedeutung haben, wie zum Beispiel "relax" (bequem), "sofa" (Möbel) und "outdoor" (Balkon).

Das Bild unten hebt einige dieser Begriffe zusammen mit der Suchanfrage hervor, sowohl mit als auch ohne Begriffserweiterung.

Wie bereits erwähnt, ermöglicht dieses Modell eine kontextsensitive Suche und trägt dazu bei, das Problem der Diskrepanz zwischen Vokabular und Definition zu mindern, während es gleichzeitig besser interpretierbare Ergebnisse liefert. Es kann sogar dichte Vektormodelle übertreffen, wenn kein domänenspezifisches Nachtraining angewendet wird.

Wenn es um die Suche geht, gibt es keine Universallösung. Jede dieser Abrufmethoden hat ihre Stärken, aber auch ihre Herausforderungen. Je nach Anwendungsfall kann sich die beste Option ändern. Oftmals ergänzen sich die besten Ergebnisse verschiedener Abrufmethoden. Um die Relevanz zu erhöhen, werden wir daher versuchen, die Stärken der einzelnen Methoden zu kombinieren.

Es gibt verschiedene Möglichkeiten, eine hybride Suche zu implementieren, darunter die lineare Kombination, die Gewichtung jedes Ergebnisses und die reziproke Rangfusion (RRF), bei der die Angabe eines Gewichts nicht erforderlich ist.

In diesem Code haben wir eine hybride Suche mit zwei Abfragen durchgeführt, die den Wert "Ein Esstisch und bequeme Stühle für einen großen Balkon" hatten. Anstatt "Möbel" als Suchbegriff zu verwenden, geben wir an, wonach wir suchen, und beide Suchanfragen berücksichtigen die gleichen Feldwerte, "Beschreibung". Die Rangfolge wird durch eine lineare Kombination der BM25- und ELSER-Werte bei gleicher Gewichtung ermittelt.

Ausgabe

Im folgenden Code verwenden wir denselben Wert für die Abfrage, kombinieren aber die Ergebnisse von BM25 (Abfrageparameter) und kNN (KNN-Parameter) mithilfe der Methode der reziproken Rangfusion, um die Dokumente zu kombinieren und zu ordnen.

Die RRF-Funktionalität befindet sich in der technischen Vorschauphase. Die Syntax wird sich voraussichtlich vor der allgemeinen Verfügbarkeit ändern.

Ausgabe

Hier könnten wir auch andere Felder und Werte verwenden; einige Beispiele hierfür finden Sie im Python-Notebook.

Wie Sie sehen, bietet Elasticsearch das Beste aus beiden Welten: die traditionelle lexikalische Suche und die Vektorsuche, egal ob spärlich oder dicht, um Ihr Ziel zu erreichen und die bestmögliche Antwort auf Ihre Frage zu finden.

Wenn Sie mehr über die hier erwähnten Ansätze erfahren möchten, können Ihnen diese Blogs hilfreich sein:

Elasticsearch bietet eine Vektordatenbank sowie alle Werkzeuge, die Sie zum Erstellen von Vektorsuchen benötigen:

Fazit

In diesem Blogbeitrag haben wir verschiedene Ansätze zur Informationsbeschaffung mit Elasticsearch untersucht, wobei wir uns insbesondere auf die Text-, lexikalische und semantische Suche konzentriert haben. Um dies zu veranschaulichen, haben wir Python-Beispiele bereitgestellt, die verschiedene Suchszenarien anhand eines Datensatzes mit E-Commerce-Produktinformationen aufzeigen.

Wir haben die klassische lexikalische Suche mit BM25 überprüft und ihre Vorteile und Herausforderungen, wie z. B. Vokabeldiskrepanz, diskutiert. Wir haben die Bedeutung der Einbeziehung semantischen Wissens zur Überwindung dieses Problems hervorgehoben. Darüber hinaus haben wir die dichte Vektorsuche erörtert, die eine semantische Suche ermöglicht, und die mit dieser Abrufmethode verbundenen Herausforderungen behandelt, einschließlich des Rechenaufwands bei der Indizierung hochdimensionaler Vektoren.

Andererseits haben wir erwähnt, dass sich dünnbesetzte Vektoren außergewöhnlich gut komprimieren lassen. Daher haben wir den Learned Sparse Encoder von Elastic besprochen, der Suchanfragen erweitert, um relevante Begriffe einzubeziehen, die in der ursprünglichen Anfrage nicht enthalten sind.

Bei der Suche gibt es keine Universallösung. Jede Abrufmethode hat ihre Stärken und Schwächen. Deshalb haben wir auch das Konzept der hybriden Suche erörtert.

Wie Sie sehen konnten, bietet Elasticsearch die Vorteile beider Welten: die traditionelle lexikalische Suche und die Vektorsuche!

Bereit loszulegen? Sehen Sie sich das verfügbare Python-Notebook an und starten Sie eine kostenlose Testphase von Elastic Cloud.

Zugehörige Inhalte

Sind Sie bereit, hochmoderne Sucherlebnisse zu schaffen?

Eine ausreichend fortgeschrittene Suche kann nicht durch die Bemühungen einer einzelnen Person erreicht werden. Elasticsearch wird von Datenwissenschaftlern, ML-Ops-Experten, Ingenieuren und vielen anderen unterstützt, die genauso leidenschaftlich an der Suche interessiert sind wie Sie. Lasst uns in Kontakt treten und zusammenarbeiten, um das magische Sucherlebnis zu schaffen, das Ihnen die gewünschten Ergebnisse liefert.

Probieren Sie es selbst aus