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.
Elasticsearch wurde ursprünglich als Rezeptsuchmaschine entwickelt und ist darauf ausgelegt, eine schnelle und leistungsstarke Volltextsuche zu ermöglichen. Vor diesem Hintergrund war die Verbesserung der Textsuche eine wichtige Motivation für unsere fortlaufende Arbeit mit Vektoren. In Elasticsearch 7.0 haben wir experimentelle Feldtypen für hochdimensionale Vektoren eingeführt, und nun bietet die Version 7.3 Unterstützung für die Verwendung dieser Vektoren bei der Dokumentenbewertung.
Dieser Beitrag konzentriert sich auf eine spezielle Technik namens Textähnlichkeitssuche. Bei dieser Suchart gibt der Benutzer eine kurze Freitextanfrage ein, und die Dokumente werden anhand ihrer Ähnlichkeit zur Anfrage geordnet. Textähnlichkeit kann in einer Vielzahl von Anwendungsfällen nützlich sein:
- Frage-Antwort-Funktion: Aus einer Sammlung häufig gestellter Fragen sollen Fragen gefunden werden, die der vom Benutzer eingegebenen Frage ähnlich sind.
- Artikelsuche: In einer Sammlung von Forschungsartikeln werden Artikel zurückgegeben, deren Titel eng mit der Suchanfrage des Benutzers verwandt ist.
- Bildersuche: In einem Datensatz von Bildern mit Bildunterschriften sollen Bilder gefunden werden, deren Bildunterschrift der Beschreibung des Benutzers ähnelt.
Ein einfacher Ansatz für die Ähnlichkeitssuche wäre, Dokumente danach zu ordnen, wie viele Wörter sie mit der Suchanfrage gemeinsam haben. Ein Dokument kann der Suchanfrage jedoch auch dann ähnlich sein, wenn sie nur sehr wenige Wörter gemeinsam haben – ein robusterer Ähnlichkeitsbegriff würde auch den syntaktischen und semantischen Inhalt berücksichtigen.
Die Forschungsgemeinschaft im Bereich der natürlichen Sprachverarbeitung (NLP) hat eine Technik namens Text Embedding entwickelt, die Wörter und Sätze als numerische Vektoren kodiert. Diese Vektordarstellungen sind so konzipiert, dass sie den sprachlichen Inhalt des Textes erfassen und zur Beurteilung der Ähnlichkeit zwischen einer Suchanfrage und einem Dokument verwendet werden können.
Dieser Beitrag untersucht, wie Text-Embeddings und der dense_vector-Typ von Elasticsearch zur Unterstützung der Ähnlichkeitssuche verwendet werden können. Wir geben zunächst einen Überblick über Einbettungstechniken und gehen dann Schritt für Schritt einen einfachen Prototyp der Ähnlichkeitssuche mit Elasticsearch durch.
Hinweis: Die Verwendung von Text-Embeddings in der Suche ist ein komplexes und sich ständig weiterentwickelndes Gebiet. Dieser Blog stellt keine Empfehlung für eine bestimmte Architektur oder Implementierung dar. Hier erfahren Sie, wie Sie Ihre Sucherfahrung mit der Leistungsfähigkeit der Vektorsuche verbessern können.
Was sind Text-Embeddings?
Werfen wir einen genaueren Blick auf verschiedene Arten von Text-Embeddings und wie sie sich im Vergleich zu traditionellen Suchansätzen darstellen.
Wort-Einbettungen
Ein Wort-Embedding -Modell stellt ein Wort als dichten numerischen Vektor dar. Ziel dieser Vektoren ist es, semantische Eigenschaften des Wortes zu erfassen – Wörter, deren Vektoren nahe beieinander liegen, sollten in Bezug auf ihre semantische Bedeutung ähnlich sein. Bei einer guten Einbettung sind Richtungen im Vektorraum mit verschiedenen Aspekten der Wortbedeutung verknüpft. Beispielsweise könnte der Vektor für „Kanada“ in einer Richtung nahe an „Frankreich“ und in einer anderen Richtung nahe an „Toronto“ liegen.
Die NLP- und Suchgemeinschaften interessieren sich schon seit geraumer Zeit für Vektordarstellungen von Wörtern. In den letzten Jahren gab es ein wiedererwachtes Interesse an Wortvektoren, da viele traditionelle Aufgaben mithilfe neuronaler Netze neu angegangen wurden. Es wurden einige erfolgreiche Wort-Embedding-Algorithmen entwickelt, darunter word2vec und GloVe. Diese Ansätze nutzen große Textsammlungen und untersuchen den Kontext, in dem jedes Wort vorkommt, um seine Vektordarstellung zu bestimmen:
- Das word2vec Skip-gram-Modell trainiert ein neuronales Netzwerk, um die Kontextwörter um ein Wort in einem Satz vorherzusagen. Die internen Gewichte des Netzwerks ergeben die Wortvektoren.
- In GloVe hängt die Ähnlichkeit von Wörtern davon ab, wie häufig sie zusammen mit anderen Kontextwörtern vorkommen. Der Algorithmus trainiert ein einfaches lineares Modell anhand der Häufigkeit des gemeinsamen Auftretens von Wörtern.
Viele Forschungsgruppen verteilen Modelle, die anhand großer Textkorpora wie Wikipedia oder Common Crawl vortrainiert wurden, wodurch sie bequem heruntergeladen und in nachgelagerte Aufgaben integriert werden können. Obwohl vortrainierte Versionen manchmal direkt verwendet werden, kann es hilfreich sein, das Modell an den jeweiligen Zieldatensatz und die jeweilige Aufgabe anzupassen. Dies wird häufig durch einen Feinabstimmungsschritt am vortrainierten Modell erreicht.
Wort-Embeddings haben sich als äußerst robust und effektiv erwiesen, und es ist mittlerweile gängige Praxis, Embeddings anstelle einzelner Token in NLP-Aufgaben wie maschineller Übersetzung und Stimmungsanalyse zu verwenden.
Satzeinbettungen
In jüngerer Zeit haben sich Forscher verstärkt mit Einbettungstechniken befasst, die nicht nur einzelne Wörter, sondern auch längere Textabschnitte repräsentieren. Die meisten aktuellen Ansätze basieren auf komplexen neuronalen Netzwerkarchitekturen und beziehen manchmal während des Trainings gelabelte Daten mit ein, um die Erfassung semantischer Informationen zu erleichtern.
Nach dem Training sind die Modelle in der Lage, einen Satz zu nehmen und für jedes Wort im Kontext einen Vektor sowie einen Vektor für den gesamten Satz zu erzeugen. Ähnlich wie bei Word Embedding sind vortrainierte Versionen vieler Modelle verfügbar, sodass die Benutzer den aufwändigen Trainingsprozess überspringen können. Während der Trainingsprozess sehr ressourcenintensiv sein kann, ist der Aufruf des Modells wesentlich einfacher – Sentence Embedding Modelle sind in der Regel schnell genug, um als Teil von Echtzeitanwendungen eingesetzt zu werden.
Zu den gängigen Techniken für die Einbettung von Sätzen gehören InferSent, Universal Sentence Encoder, ELMo und BERT. Die Verbesserung von Wort- und Satz-Embeddings ist ein aktives Forschungsgebiet, und es ist wahrscheinlich, dass weitere leistungsstarke Modelle eingeführt werden.
Vergleich mit traditionellen Suchansätzen
Bei der traditionellen Informationswiedergewinnung ist es üblich, Text als numerischen Vektor darzustellen, indem man jedem Wort im Vokabular eine Dimension zuweist. Der Vektor für einen Textabschnitt basiert dann auf der Anzahl der Vorkommen jedes einzelnen Begriffs im Vokabular. Diese Art der Textdarstellung wird oft als „Bag of Words“ bezeichnet, weil wir einfach die Wortvorkommen zählen, ohne die Satzstruktur zu berücksichtigen.
Text-Embeddings unterscheiden sich in einigen wichtigen Punkten von traditionellen Vektordarstellungen:
- Die kodierten Vektoren sind dicht und relativ niedrigdimensional, oft im Bereich von 100 bis 1000 Dimensionen. Im Gegensatz dazu sind Bag-of-Words-Vektoren dünn besetzt und können mehr als 50.000 Dimensionen umfassen. Einbettungsalgorithmen kodieren den Text in einen niedrigdimensionalen Raum, um seine semantische Bedeutung zu modellieren. Im Idealfall erhalten synonyme Wörter und Ausdrücke eine ähnliche Darstellung im neuen Vektorraum.
- Bei der Bestimmung der Vektordarstellung können Satz-Embeddings die Wortreihenfolge berücksichtigen. Zum Beispiel kann der Ausdruck „tune in“ als ein ganz anderer Vektor abgebildet werden als „in tune“.
- In der Praxis lassen sich Satz-Embeddings oft nicht gut auf größere Textabschnitte übertragen. Sie werden üblicherweise nicht verwendet, um Texte darzustellen, die länger als ein kurzer Absatz sind.
Verwendung von Einbettungen für die Ähnlichkeitssuche
Nehmen wir an, wir hätten eine große Sammlung von Fragen und Antworten. Ein Benutzer kann eine Frage stellen, und wir möchten die ähnlichste Frage in unserer Sammlung abrufen, um ihm bei der Suche nach einer Antwort zu helfen.
Wir könnten Text-Embeddings verwenden, um ähnliche Fragen abrufen zu können:
- Beim Indexierungsprozess wird jede Frage durch ein Satz-Embedding-Modell geleitet, um einen numerischen Vektor zu erzeugen.
- Wenn ein Benutzer eine Suchanfrage eingibt, wird diese durch dasselbe Satz-Embedding-Modell geleitet, um einen Vektor zu erzeugen. Um die Antworten zu ordnen, berechnen wir die Vektorähnlichkeit zwischen jeder Frage und dem Anfragevektor. Beim Vergleich von Einbettungsvektoren ist es üblich, die Kosinusähnlichkeit zu verwenden.
Dieses Repository liefert ein einfaches Beispiel dafür, wie dies in Elasticsearch umgesetzt werden kann. Das Hauptskript indexiert ca. 20.000 Fragen aus dem StackOverflow-Datensatz und ermöglicht dem Benutzer anschließend, Freitextabfragen an den Datensatz zu richten.
Wir werden in Kürze jeden Teil des Skripts im Detail durchgehen, aber schauen wir uns zunächst einige Beispielergebnisse an. In vielen Fällen ist die Methode in der Lage, Ähnlichkeiten auch dann zu erfassen, wenn keine starke Wortübereinstimmung zwischen der Suchanfrage und der indizierten Frage besteht:
- "Dateien zippen" gibt "Ordner und Dateien werden komprimiert/dekomprimiert" zurück.
- "bestimmen, ob etwas eine IP-Adresse ist" gibt zurück: "Wie kann man feststellen, ob eine Zeichenkette eine IP-Adresse oder ein Hostname ist?"
- "translate bytes to doubles" gibt "Bytes in Gleitkommazahlen in Python umwandeln" zurück
Details zur Implementierung
Das Skript beginnt mit dem Herunterladen und Erstellen des Einbettungsmodells in TensorFlow. Wir haben uns für Googles Universal Sentence Encoder entschieden, aber es ist möglich, viele andere Einbettungsmethoden zu verwenden. Das Skript verwendet das Einbettungsmodell unverändert, ohne zusätzliches Training oder Feinabstimmung.
Als Nächstes erstellen wir den Elasticsearch-Index, der Zuordnungen für den Fragentitel, die Tags und auch den als Vektor kodierten Fragentitel enthält:
Bei der Zuordnung für dense_vector müssen wir die Anzahl der Dimensionen angeben, die die Vektoren enthalten sollen. Beim Indizieren eines title_vector-Feldes prüft Elasticsearch, ob es die gleiche Anzahl an Dimensionen aufweist wie in der Zuordnung angegeben.
Um Dokumente zu indexieren, leiten wir den Fragentitel durch das Einbettungsmodell, um ein numerisches Array zu erhalten. Dieses Array wird dem Dokument im Feld title_vector hinzugefügt.
Wenn ein Benutzer eine Suchanfrage eingibt, wird der Text zunächst durch dasselbe Einbettungsmodell geleitet und im Parameter query_vector gespeichert. Ab Version 7.3 bietet Elasticsearch eine Cosinusähnlichkeitsfunktion in seiner nativen Skriptsprache an. Um Fragen anhand ihrer Ähnlichkeit zur Suchanfrage des Nutzers zu ordnen, verwenden wir eine script_score-Abfrage:
Wir stellen sicher, dass wir den Abfragevektor als Skriptparameter übergeben, um zu vermeiden, dass das Skript () bei jeder neuen Abfrage neu kompiliert werden muss . Da Elasticsearch keine negativen Werte zulässt, muss zur Kosinusähnlichkeit eins addiert werden.
| Hinweis: Dieser Blogbeitrag verwendete ursprünglich eine andere Syntax für Vektorfunktionen , die in Elasticsearch 7.3 verfügbar war, aber in Version 7.6 als veraltet markiert wurde.
|
Wichtige Einschränkungen
Die script_score-Abfrage dient dazu, eine restriktive Abfrage zu umschließen und die Punktzahlen der zurückgegebenen Dokumente zu modifizieren. Wir haben jedoch eine match_all-Abfrage angegeben, was bedeutet, dass das Skript für alle Dokumente im Index ausgeführt wird. Dies ist eine aktuelle Einschränkung der Vektorähnlichkeit in Elasticsearch – Vektoren können zur Bewertung von Dokumenten verwendet werden, jedoch nicht im ersten Abrufschritt. Die Unterstützung von Retrieval-Verfahren auf Basis von Vektorähnlichkeit ist ein wichtiger Bereich laufender Forschung.
Um das Scannen aller Dokumente zu vermeiden und eine schnelle Performance zu gewährleisten, kann die match_all-Abfrage durch eine selektivere Abfrage ersetzt werden. Die richtige Suchanfrage hängt wahrscheinlich vom jeweiligen Anwendungsfall ab.
Obwohl wir oben einige ermutigende Beispiele gesehen haben, ist es wichtig zu beachten, dass die Ergebnisse auch ungenau und nicht intuitiv sein können. Beispielsweise werden beim „Komprimieren von Dateien“ auch hohe Punktzahlen für „Teilweise .csproj-Dateien“ vergeben. Dateien“ und „Wie man .pyc vermeidet Dateien?". Und wenn die Methode überraschende Ergebnisse liefert, ist es nicht immer klar, wie man das Problem beheben kann – die Bedeutung jeder Vektorkomponente ist oft undurchsichtig und entspricht keinem interpretierbaren Konzept. Mit traditionellen Bewertungsmethoden, die auf Wortüberschneidungen basieren, lässt sich die Frage „Warum wird dieses Dokument so hoch eingestuft?“ oft leichter beantworten.
Wie bereits erwähnt, ist dieser Prototyp als Beispiel dafür gedacht, wie Einbettungsmodelle mit Vektorfeldern verwendet werden könnten, und nicht als produktionsreife Lösung. Bei der Entwicklung einer neuen Suchstrategie ist es entscheidend, die Leistungsfähigkeit des Ansatzes anhand der eigenen Daten zu testen und dabei unbedingt einen Vergleich mit einer soliden Basislinie wie einer Match-Abfrage durchzuführen. Es kann erforderlich sein, größere Änderungen an der Strategie vorzunehmen, bevor solide Ergebnisse erzielt werden, einschließlich der Feinabstimmung des Einbettungsmodells auf den Zieldatensatz oder des Ausprobierens verschiedener Wege zur Einbeziehung von Einbettungen, wie z. B. der Wortebenen-Abfrageerweiterung.
Schlussfolgerungen
Einbettungstechniken bieten eine leistungsstarke Möglichkeit, den sprachlichen Inhalt eines Textes zu erfassen. Durch die Indizierung von Einbettungen und die Bewertung auf Basis der Vektordistanz können wir Dokumente anhand eines Ähnlichkeitsbegriffs vergleichen, der über die Übereinstimmung auf Wortebene hinausgeht.
Wir freuen uns darauf, weitere Funktionen basierend auf dem Vektorfeldtyp einzuführen. Die Verwendung von Vektoren für die Suche ist ein differenziertes und sich entwickelndes Gebiet – wie immer würden wir uns freuen, auf GitHub und in den Discuss-Foren von Ihren Anwendungsfällen und Erfahrungen zu hören!
Häufige Fragen
Was ist eine Textähnlichkeitssuche?
Bei der Textähnlichkeitssuche handelt es sich um eine Suchart, bei der der Benutzer eine kurze Freitextanfrage eingibt und die Dokumente anhand ihrer Ähnlichkeit mit der Anfrage geordnet werden. Es kann in einer Vielzahl von Anwendungsfällen nützlich sein, wie z. B. bei der Beantwortung von Fragen, der Artikelsuche und der Bildersuche.




