Neuronale Suche

Neuronale Suche mit Dense Vector Search in Apache Solr

Die Entwicklung von Natural Language Processing und Machine Learning in den letzten Jahren bietet faszinierende Möglichkeiten im Bereich des Information Retrievals. Vor allem für das Erkennen von semantischen Zusammenhängen wird Neural Language Processing auch in der Suche (oft als neuronale Suche bezeichnet) eingesetzt. Neuronale Suche wurde im Jahr 2022 mit der Version 9.0 auch in Apache Solr eingeführt und bietet die Möglichkeit, eine Dense Vector Search in Solr durchzuführen. Dense Vector Search ist ein Feature von Apache Solr, das die Indexierung und die Suche von Dense Numerical Vektoren ermöglicht. Sowohl die Query als auch die Dokumente werden dabei als Vektoren repräsentiert. Deep Learning Modelle können verwendet werden, um diese Repräsentation zu schaffen. Dense Vector Search von Apache Solr gehört zu den sogenannten neural-network-based Methoden, die ein Teil des Neural Information Retrievals sind. In diesem Blogbeitrag möchte ich Ihnen gerne folgendes Thema vorstellen: Wie man eine Dense Vector Search unter der Verwendung von Python auf Apache Solr ermöglichen kann und wie sich die Suchergebnisse von klassischen Suchen unterscheiden.

Was ist eine Vektorsuche?

Damit ein Computer menschenlesbaren Text verstehen kann, muss man den Text in ein maschinenlesbares Format umwandeln. Eine Vektorsuche ist eine Methode, die in Data Retrieval und Information Retrieval-Systemen verwendet wird, um Elemente oder Dokumente zu finden, die einem bestimmten Suchvektor ähnlich oder eng mit ihm verbunden sind. Bei der Vektorsuche ist es möglich, verschiedene Datenpunkte wie Bilder, Texte sowie Audio-Dateien als Vektoren zu repräsentieren. Das Ziel der Vektorsuche ist es, effizient die relevantesten Vektoren zu finden, die einem Suchvektor ähnlich bzw. am ähnlichsten sind und diese abzurufen.

Unterschied zwischen Sparse und Dense Vektoren

Der größte Unterschied zwischen Sparse und Dense Vektoren ist, dass die ersten viele Null-Einträgen enthalten, während die zweiten mehrere Einträge beinhalten, die nicht „null“ sind. Das hat einen großen Einfluss auf das Suchergebnis.

Mit Sparse Vektoren werden alle Dimensionen durchsucht, um unter Tausenden Nullen ein paar Einsen (=relevante Informationen) zu finden.  Ein traditioneller, invertierter Index speichert den Text auf Sparse Vektoren mit großer Anzahl an Dimensionen. Sogenannte Tokenizer können verwendet werden, um Sparse Vektoren direkt aus dem Text zu generieren. Alle üblichen, in Solr verfügbaren Query Parser können dann für die (textuelle) Suche verwendet werden.

In Dense Vektoren hingegen werden semantische Informationen (=Informationen über die Bedeutung des Textes) mit einer festen oder begrenzten Anzahl von Dimensionen gespeichert. Die Generierung von Dense Vektoren ist komplexer, da Deep Learning Modelle (wie BERT) dafür zurate gezogen werden müssen. Auch die Suche in Solr erfordert einen gesonderte Query Parser: knn (k-neareast neigbors). Dieser Query Parser findet zu einer Sucheingabe in Vektorformat die k Dokumente, deren gespeicherte Dense Vektoren dem Such-Vektor am ähnlichsten sind. Wie das in Solr genau funktioniert, wird im Folgenden anhand eines Beispiels im Detail beschrieben.

Dense Vector Search auf Apache Solr mit Python

Was innerhalb von Solr gemacht werden muss

Wir verwenden für das folgende Beispiel die Solr-Version 9.4.1. Um Dense Vector Search in Solr zu ermöglichen, muss als erstes das Schema (meist in der Datei „managed-schema“ oder „schema.xml“ zu finden) angepasst werden. Im Schema muss ein neues Feld und der passende Feld-Typ hinzugefügt werden:

<fieldType name="knn_vector" class="solr.DenseVectorField" vectorDimension="384" omitNorms="true"/>
<field name="vector" type="knn_vector" indexed="true" stored="true" multiValued="false"/> 

Der neue Feld-Typ „knn_vector“ verwendet die Klasse DenseVectorField mit 384 Dimensionen. Je nach Modell kann die Anzahl an benötigten Dimensionen variieren. Für unser Beispiel benötigen wir insgesamt drei Felder: „id“ (die ID des Dokuments), „text“ und „vector“. In „text“ speichern wir den entsprechenden Text und im Vector-Feld dann die dafür generierten Vektor Embeddings.

Diese Konfiguration nutzen wir nun, um eine Collection in Solr zu erstellen.

Was außerhalb von Solr gemacht werden muss

  1. Zuerst muss das richtige Modell ausgewählt werden, um die Vektor Embeddings zu generieren. Für diesen Zweck stellt die Open-Source-Plattform für Künstliche Intelligenz (KI) „Hugging Face“, zahlreiche, vortrainiert State Of The Art Modelle zur Verfügung. Wir verwenden das Modell „all-MiniLM-L12-v2“ vom SentenceTransformers Framework, das auf mehr als einer Billion von Trainingsinstanzen trainiert wurde. Es handelt sich um ein Natural Language Processing Modell, dass auf dem BERT Modell basiert ist und Sätze in Vektor Embeddings mit fester Anzahl von 384 Dimensionen umwandelt.
  2. Nachdem das Modell ausgewählt wurde, muss die Python-Umgebung dementsprechend konfiguriert werden. Die Frameworks und Packages, die benötigt werden, sind: torch, sentence_transformers, pysolr, und pandas (optional für die Vorverarbeitung der Daten). Mit Hilfe von diesen Frameworks kann man mit Python die Textdaten in Vektor Embeddings transformieren und die Embeddings in einer Datei speichern. Pysolr ist ein leichter Python-Wrapper, der eine Verbindung zwischen Python und Apache Solr herstellen kann. Diese Verbindung nutzen wir für die Indexierung der Textdokumente und der Vektor Embeddings in Solr. Für das Beispiel haben wir 200 Dokumente mit entsprechenden Vektoren indexiert.
  3. Wenn man die Textdokumente und ihre Vektor Embeddings indexiert hat, ist der nächste Schritt, die Queries, die man für die Suche verwenden möchte, ebenfalls in Vektor Embeddings zu transformieren. Dieser Schritt ist notwendig, da Solr selbst noch keine Möglichkeit bietet, den Text der Suchanfrage automatisch in Vektoren zu transformieren.

Die Daten

Wir haben die Daten, die wir für dieses Beispiel verwenden, mit ChatGPT generieren lassen. Wir haben ChatGPT gebeten, Kundenbewertungen von verschiedenen Produkten wie Kameras, Handys und Laptops (auf Englisch) zu generieren. Das Ergebnis waren 200 positive und negative Kundenbewertungen, die wir für unsere experimentelle, neuronale Suche verwendet haben. Damit Sie eine Idee bekommen wie die Daten aussehen: In Abbildung 1.1 sehen Sie 10 Sätze von unserer Datensammlung und Abbildung 1.2 zeigt einen Teil von den generierten Embeddings.

Automatisch generierte Bewertungen von ChatGPT
Abbildung 1.1: Automatisch generierte Bewertungen von ChatGPT
Dense Vektor Repräsentation von den Textbeispielen
Abbildung 1.2: Dense Vektor Repräsentation von den Textbeispielen

Vergleich zwischen lexikalischer Suche und Dense Vector Search

Nachdem die Dokumente in Solr indexiert wurden, können wir mit einer Neuronale Suche loslegen. Zuerst formulieren wir eine lexikalische Suche, ohne das Dense Vector Feld zu verwenden, und beobachten das Ergebnis. Wir haben unsere Daten untersucht und wir wissen, dass das Wort „excited“ in einem Dokument vorkommt. Unsere Query ist „am excited“. Die lexikalische Suche liefert folgende Ergebnisse zurück (Abbildung 1.3).

Lexikalische Suche für die Query „am excited“
Abbildung 1.3: Lexikalische Suche für die Query „am excited“

Der Solr Parser versucht Dokumente zu finden, in denen die Begriffe von unserer Suche vorkommen, und findet wie erwartet das eine Dokument, in dem „am excited“ enthalten ist.

Aber welche Ergebnisse findet nun dieselbe Query („am excited“), wenn wir stattdessen die Dense Vector Search verwenden? Für die Suche verwenden wir nun keinen Text, sondern die Vektor Embeddings Repräsentation der Query in Kombination mit dem knn-Query Parser. In Abbildung 1.4 sehen Sie einen Ausschnitt der Query.

Query für ein Dense Vektor Suche in Apache Solr
Abbildung 1.4: Query für ein Dense Vektor Suche in Apache Solr

Der „knn“ Query Parser findet die k nächsten Dokumente zum Zielvektor, „f“ legt das DenseVectorField (hier „vector“) fest, in dem gesucht werden soll, und „topK“ definiert wie viele Ergebnisse zurückgegeben werden sollen. Danach folgt der transformierten Query Vektor (der wie oben erwähnt, außerhalb von Solr erstellt werden muss). In Abbildung 1.5 sehen Sie die Ergebnisse der Dense Vector Search für die Query „am excited“.

Dense Vector Search für die Query „am excited“
Abbildung 1.5: Dense Vector Search für die Query „am excited“

Die Dense Vector Search liefert auch das Dokument mit dem Wort „excited“ als Ergebnis an erster Position. Im Gegensatz zur lexikalischen Suche berücksichtigt die Dense Vector Search aber auch den Kontext des Suchbegriffes im Satz. Das zeigt sich in den anderen beiden Ergebnissen, welche die liefert. Der knn Query Parser gibt Dokumente zurück, die genau wie „am excited“ eine besonders positive Bewertung wie „ecstatic“, „amazed“ oder „impressed“ beinhalten.

Unten sehen Sie noch die Ergebnisse von einem Vergleichsbeispiel zwischen einer lexikalischen Suche und einem Dense Vector Search für die Query „refund“. Es gibt in unseren Daten ein Dokument, das das Wort „refund“ beinhaltet, und insgesamt zwei Dokumente, in denen die Wortkombination „money back“ vorkommt.

Lexikalische Suche für die Query „refund“
Abbildung 1.6: Lexikalische Suche für die Query „refund“

Wie Sie in Abbildung 1.6 sehen, findet die lexikalische Suche hat das Dokument mit dem Wort „refund“. Abbildung 1.7 zeigt die Ergebnisse der Dense Vector Search.

Dense Vector Search für die Query „refund“
Abbildung 1.7: Dense Vector Search für die Query „refund“

Die Dense Vector Search hat sowohl das Dokument mit dem Wort „refund“ gefunden als auch die zwei Dokumente, in denen von „money back“ gesprochen wird. Auch in diesem Beispiel liefert die Dense Vector Search also zusätzlich zu den textuell passenden Ergebnissen auch solche, die semantisch zur Sucheingabe passen.

Fazit

Die Nutzung von Solr für die textbasierte Suche ist sehr weit verbreitet. Die Neuronale Suche auf Basis von Dense Vektoren wird hingegen noch nicht so häufig verwendet. Dass die Dense Vector Search in Solr eine sehr gute Möglichkeit ist, die Suchergebnisse semantisch zu verbessern, konnten wir hoffentlich in unserem Beitrag zeigen. Darüber hinaus können die Dense Vektoren in Solr aber auch für andere Aufgaben aus dem Machine Learning genutzt werden, wie Clustering, Klassifikation oder Regression. Lassen Sie uns gerne zusammen evaluieren, wie sich Ihre Solr-Suche mit Hilfe der Dense Vektoren auf das nächste Level heben lässt.

Haben Sie Fragen zu Apache Solr oder der Dense Vector Search? Nehmen Sie gleich Kontakt auf!
Portrait Lazaros Koutsianos

Lazaros Koutsianos

...hat sein Computer Linguistik Studium an der Ludwig-Maximilians-Universität in München abgeschlossen. Schwerpunkt seines Studiums war die Verarbeitung natürlicher Sprache unter der Verwendung von Machine Learning Algorithmen. Im Rahmen seiner Bachelorarbeit hat er mit großen Datenmengen gearbeitet und Machine Learning Modelle an Daten verschiedener Sprachen (unter anderem Brasilianische, Portugiesisch und Hindi) angewendet. Während seines Studiums arbeitete er bereits als Werkstudent im Verlagswesen und hat dort vielfältige Tätigkeiten und Verantwortungen sowohl in der Programmierung als auch der Kundenbetreuung übernommen. Seit Januar 2024 ist er Mitglied des Search & Analytics Teams bei der SHI GmbH. Lieblingsdateiformat: .py und .txt.