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 Verwendung von Einbettungen zur Verbesserung der Relevanz und Genauigkeit der Informationswiedergewinnung hat im Laufe der Jahre deutlich zugenommen. Tools wie Elasticsearch wurden weiterentwickelt, um diese Art von Daten durch spezialisierte Feldtypen wie dichte Vektoren, dünnbesetzte Vektoren und semantischen Text zu unterstützen. Um jedoch gute Ergebnisse zu erzielen, ist es unerlässlich zu verstehen, wie man Embeddings den verfügbaren Elasticsearch-Feldtypen semantic_text, dense_vector und sparse_vector korrekt zuordnet.
In diesem Artikel werden wir diese Feldtypen, ihre jeweiligen Anwendungsbereiche und ihren Zusammenhang mit Strategien zur Einbettungsgenerierung und -nutzung sowohl bei der Indizierung als auch bei der Abfrage besprechen.
Dichter Vektortyp
Der Feldtyp dense_vector in Elasticsearch dient zur Speicherung dichter Vektoren, die numerische Darstellungen von Daten wie Text, Bildern und Audio darstellen, wobei nahezu alle Dimensionen relevant sind. Diese Vektoren werden mithilfe von Einbettungsmodellen generiert, die von Plattformen wie OpenAI, Cohere oder Hugging Face bereitgestellt werden, und sind so konzipiert, dass sie die Gesamtsemantik der Daten erfassen, auch wenn diese keine exakten Begriffe mit anderen Dokumenten teilen.
In Elasticsearch können dichte Vektoren je nach verwendetem Modell bis zu 4096 Dimensionen haben. Das Modell all-MiniLM-L6-v2 erzeugt beispielsweise Vektoren mit 384 Dimensionen, während das Modell text-embedding-ada-002 von OpenAI Vektoren mit 1536 Dimensionen erzeugt.
Das Feld dense_vector wird üblicherweise als Standardtyp für die Speicherung dieser Art von Einbettungen verwendet, wenn eine größere Kontrolle erforderlich ist, z. B. durch die Verwendung vorab generierter Vektoren, die Anwendung benutzerdefinierter Ähnlichkeitsfunktionen oder die Integration mit externen Modellen.
Wann und warum sollte man dense_vector-Typ verwenden?
Dichte Vektoren eignen sich hervorragend, um semantische Ähnlichkeiten zwischen Sätzen, Absätzen oder ganzen Dokumenten zu erfassen. Sie eignen sich hervorragend, wenn es darum geht, die Gesamtbedeutung von Texten zu vergleichen, selbst wenn diese nicht dieselben Begriffe verwenden.
Das dichte Vektorfeld ist ideal, wenn Sie bereits eine externe Embedding-Generierungspipeline mit Modellen von Plattformen wie OpenAI, Cohere oder Hugging Face verwenden und diese Vektoren nur manuell speichern und abfragen möchten. Dieser Feldtyp bietet eine hohe Kompatibilität mit Einbettungsmodellen und volle Flexibilität bei der Generierung und Abfrage, sodass Sie steuern können, wie die Vektoren erzeugt, indiziert und während der Suche verwendet werden.
Darüber hinaus unterstützt es verschiedene Formen der semantischen Suche, mit Abfragen wie k-NN oder script_score für Fälle, in denen es notwendig ist, die Ranking-Logik anzupassen. Diese Möglichkeiten machen den dichten Vektor ideal für Anwendungen wie RAG (Retrieval-Augmented Generation), Empfehlungssysteme und personalisierte Suchen auf der Grundlage von Ähnlichkeit.
Schließlich ermöglicht Ihnen das Feld, die Relevanzlogik anzupassen, indem Sie Funktionen wie cosineSimilarity, dotProduct oder l2norm verwenden, um das Ranking an die Bedürfnisse Ihres Anwendungsfalls anzupassen.
Dichte Vektoren bleiben die beste Option für diejenigen, die Flexibilität, Anpassungsmöglichkeiten und Kompatibilität mit fortgeschrittenen Anwendungsfällen wie den oben genannten benötigen.
Wie verwendet man die Abfrage für den Datentyp „dichter Vektor“?
Bei Suchen in Feldern, die als dense_vector definiert sind, wird die k-nächste-Nachbarn-Abfrage verwendet. Diese Abfrage dient dazu, Dokumente zu finden, deren Dichtevektor dem Abfragevektor am nächsten kommt. Nachfolgend ein Beispiel für die Anwendung einer k-NN-Abfrage auf ein dichtes Vektorfeld:
Zusätzlich zur k-NN-Abfrage besteht die Möglichkeit, bei Bedarf die Dokumentenbewertung anzupassen, indem man die script_score-Abfrage verwendet und sie mit Vektorvergleichsfunktionen wie cosineSimilarity, dotProduct oder l2norm kombiniert, um die Relevanz kontrollierter zu berechnen. Siehe das Beispiel:
Wer tiefer in die Materie einsteigen möchte, dem empfehle ich den Artikel „Wie man die Vektorsuche in Elasticsearch einrichtet“.
Sparse Vektortyp
Der Feldtyp sparse_vector dient zum Speichern von dünnbesetzten Vektoren. Dabei handelt es sich um numerische Darstellungen, bei denen die meisten Werte null sind und nur wenige Terme ein signifikantes Gewicht haben. Dieser Vektortyp ist in termbasierten Modellen wie SPLADE oder ELSER (Elastic Learned Sparse EncodeR) üblich.
Wann und warum sollte man den Sparse-Vektor-Typ verwenden?
Sparse Vektoren sind ideal, wenn Sie eine präzisere Suche in lexikalischen Begriffen benötigen, ohne dabei semantische Intelligenz einzubüßen. Sie stellen den Text als Token/Wert-Paare dar und heben nur die relevantesten Begriffe mit zugehörigen Gewichtungen hervor, was für Klarheit, Kontrolle und Effizienz sorgt.
Dieser Feldtyp ist besonders nützlich, wenn Sie Vektoren auf der Grundlage von Begriffen generieren, wie beispielsweise in den Modellen ELSER oder SPLADE, die jedem Token unterschiedliche Gewichte zuweisen, basierend auf seiner relativen Bedeutung im Text.
Für den Fall, dass Sie den Einfluss bestimmter Wörter in der Suchanfrage steuern möchten, ermöglichen Ihnen Sparse-Vektor-Typen, die Gewichtung der Begriffe manuell anzupassen, um die Rangfolge der Ergebnisse zu optimieren.
Zu den wichtigsten Vorteilen zählen die Transparenz bei der Suche, da klar ersichtlich ist, warum ein Dokument als relevant eingestuft wurde, und die Speichereffizienz, da nur Token mit einem Wert ungleich Null gespeichert werden, im Gegensatz zu dichten Vektoren, die alle Dimensionen speichern.
Darüber hinaus sind dünnbesetzte Vektoren die ideale Ergänzung in hybriden Suchstrategien und können sogar mit dichtbesetzten Vektoren kombiniert werden, um lexikalische Präzision mit semantischem Verständnis zu verbinden.
Wie verwendet man die Abfrage für den Datentyp „dünnbesetzter Vektor“?
Mit der sparse_vector -Abfrage können Sie nach Dokumenten auf Basis eines Abfragevektors im Token/Wert-Format suchen. Nachfolgend finden Sie ein Beispiel für die Abfrage:
Falls Sie ein trainiertes Modell bevorzugen, können Sie einen Inferenzendpunkt verwenden, der den Abfragetext automatisch in einen Sparse-Vektor umwandelt:
Um dieses Thema weiter zu vertiefen, empfehle ich die Lektüre von „Understanding sparse vector embeddings with trained ML models“.
Semantischer Texttyp
Der Feldtyp semantic_text ist die einfachste und unkomplizierteste Möglichkeit, die semantische Suche in Elasticsearch zu nutzen. Die Generierung von Einbettungen erfolgt automatisch sowohl zur Indexierungs- als auch zur Abfragezeit über einen Inferenz-Endpunkt. Das bedeutet, dass Sie sich keine Gedanken über das manuelle Generieren oder Speichern von Vektoren machen müssen.
Wann und warum sollte man semantischen Text verwenden?
Das Feld semantic_text ist ideal für diejenigen, die mit minimalem technischem Aufwand und ohne manuelle Vektorbearbeitung beginnen möchten. Dieses Feld automatisiert Schritte wie die Generierung von Einbettungen und die Vektorsuche, wodurch die Einrichtung schneller und bequemer wird.
Sie sollten die Verwendung semantic_text in Betracht ziehen, wenn Sie Wert auf Einfachheit und Abstraktion legen, da dadurch die Komplexität der manuellen Konfiguration von Mappings, Embedding-Generierung und Ingestion-Pipelines entfällt. Wählen Sie einfach das Inferenzmodell aus, und Elasticsearch kümmert sich um den Rest.
Zu den wichtigsten Vorteilen gehören die automatische Generierung von Einbettungen, die sowohl während der Indizierung als auch während der Abfrage erfolgt, und das sofort einsatzbereite Mapping, das vorkonfiguriert ist, um das ausgewählte Inferenzmodell zu unterstützen.
Darüber hinaus bietet das Feld native Unterstützung für die automatische Aufteilung langer Texte (Text Chunking), wodurch große Texte in kleinere Abschnitte unterteilt werden können, von denen jeder seine eigene Einbettung hat, was die Suchgenauigkeit verbessert. Dies steigert die Produktivität enorm, insbesondere für Teams, die schnell Mehrwert liefern wollen, ohne sich mit der zugrundeliegenden Technik der semantischen Suche auseinandersetzen zu müssen.
Allerdings bietet semantic_text zwar Geschwindigkeit und Einfachheit, hat aber auch einige Einschränkungen. Es ermöglicht die Verwendung marktüblicher Modelle, sofern diese als Inferenzendpunkte in Elasticsearch verfügbar sind. Es unterstützt jedoch keine extern generierten Einbettungen, wie es mit dem Feld dense_vector möglich ist.
Wenn Sie mehr Kontrolle darüber benötigen, wie Vektoren generiert werden, Ihre eigenen Einbettungen verwenden möchten oder mehrere Felder für fortgeschrittene Strategien kombinieren müssen, bieten die Felder dense_vector und sparse_vector die Flexibilität, die für individuellere oder domänenspezifische Szenarien erforderlich ist.
Wie man die Abfrage für semantischen Texttyp verwendet
Vor semantic_text war es notwendig, je nach Art der Einbettung (dicht oder dünn) eine andere Abfrage zu verwenden. Für dünn besetzte Felder wurde eine sparse_vector -Abfrage verwendet, während für dense_vector -Felder KNN-Abfragen erforderlich waren.
Bei der semantischen Textsuche wird die Suche mithilfe der semantischen Abfrage durchgeführt, die automatisch den Abfragevektor generiert und ihn mit den Einbettungen der indizierten Dokumente vergleicht. Mit dem Typ semantic_text können Sie einen Inferenzendpunkt definieren, um die Abfrage einzubetten. Wenn jedoch kein Endpunkt angegeben wird, wird derselbe Endpunkt, der während der Indizierung verwendet wurde, auf die Abfrage angewendet.
Um mehr zu erfahren, empfehle ich die Lektüre des Artikels Elasticsearch new semantic_text mapping: Simplifying semantic search.
Fazit
Bei der Auswahl der Methode zum Mapping von Embeddings in Elasticsearch ist es wichtig zu verstehen, wie Sie die Vektoren generieren möchten und welchen Grad an Kontrolle Sie darüber benötigen. Wenn Sie Wert auf Einfachheit legen, ermöglicht das semantische Textfeld eine automatische und skalierbare semantische Suche und ist damit ideal für viele erste Anwendungsfälle. Wenn mehr Kontrolle, feinabgestimmte Leistung oder die Integration mit benutzerdefinierten Modellen erforderlich ist, bieten die dichten Vektorfelder und die dünnbesetzten Vektorfelder die notwendige Flexibilität.
Der ideale Feldtyp hängt von Ihrem Anwendungsfall, der verfügbaren Infrastruktur und dem Reifegrad Ihres Machine-Learning-Stacks ab. Am wichtigsten ist jedoch, dass Elastic die Werkzeuge bietet, um moderne und hochgradig anpassungsfähige Suchsysteme zu entwickeln.




