<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Relevanz - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Relevanz - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/de/search-labs/blog/category/relevance</link>
    </image>
    <link>https://www.elastic.co/de/search-labs/blog/category/relevance</link>
    <atom:link href="https://www.elastic.co/de/search-labs/rss/category/relevance.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[de]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 18:10:33 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Sicherstellung semantischer Präzision mit Mindestscore]]></title>
    <description><![CDATA[Verbessern Sie die semantische Präzision durch die Verwendung von Schwellenwerten für die Mindestscore. Der Artikel enthält konkrete Beispiele für die semantische und hybride Suche. ]]></description>
    <content:encoded><![CDATA[<p>Die semantische Suche hat eine Vielzahl von Möglichkeiten für die Suchrelevanz eröffnet. Hochwertige dünn und dicht besetzte Modelle wie ELSER, E5 und Jina Embedding v4 liefern relevante Ergebnisse, die auf der Bedeutung von Wörtern basieren und nicht auf der Übereinstimmung von Schlüsselwörtern. Allerdings liefert die semantische Suche gelegentlich irrelevante Ergebnisse am Ende der Liste oder bei Suchanfragen, für die es keine relevanten Ergebnisse im Index gibt. Diese Eigenschaft von spärlichen und dichten Modellen kann Nutzer verwirren oder wertvolle Token für große Sprachmodelle (LLMs) verschwenden.</p><p>In diesem Artikel erfahren Sie, wie Sie den Parameter „Mindestscore“ verwenden können, um die Genauigkeit Ihrer semantischen Suchergebnisse zu erhöhen. Wenn Sie die in diesem Blogbeitrag bereitgestellten Beispiele testen möchten, besuchen Sie <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/ensuring-semantic-precision-with-minimum-score/ensuring_semantic_precision_with_minimum_score.ipynb">das zugehörige Jupyter-Notizbuch</a>.</p><h2>Hintergrund: Präzision und Abruf</h2><p>In der Suchrelevanz sind <em>Präzision </em>und <em>Recall </em>Schlüsselkonzepte. Lesern, die noch nicht mit diesen Themen vertraut sind, wird dringend empfohlen, sich darüber zu informieren. Nachfolgend eine Zusammenfassung.</p><ul><li><p><strong>Genauigkeit: </strong>Der Anteil der zurückgegebenen Suchergebnisse, die für den Nutzer relevant sind.</p></li><li><p><strong>Recall: </strong>Der Anteil aller relevanten Dokumente im Korpus, die in den Suchergebnissen enthalten sind.</p></li></ul><p>Oder, mit anderen Worten, Präzision gibt <strong>nur </strong>relevante Ergebnisse zurück; und Recall gibt <strong>alle </strong>relevanten Ergebnisse zurück. Wie Sie sich vorstellen können, handelt es sich dabei oft um konkurrierende Anforderungen. Die semantische Suche weist tendenziell eine sehr hohe Trefferquote auf, hat aber mitunter Schwierigkeiten mit der Präzision. Lesen Sie weiter, um zu erfahren, wie Sie diese Eigenschaft umgehen können.</p><h2>Einführung des Mindestscore-Parameters</h2><p>Der ‘min_score’-Parameter ermöglicht es uns, die Präzision zu verbessern, indem ein Mindestscore festgelegt wird, der das Ergebnisset durch Entfernen aller Treffer mit einem Score unter dem definierten Schwellenwert kürzt. Nachfolgend ein einfaches Beispiel:</p>GET search-movies/_search
{
  "retriever": {
    "linear": {
      "min_score": 4,
      "retrievers": [
        ...
      ]
    }
  }
}<h2>Normalisierung des Scores</h2><p>Die Festlegung eines Mindestscores ist schön und gut, aber nicht alle semantischen Modelle liefern einen Score, die sich für einen statischen Schwellenwert eignet. ELSER gibt beispielsweise einen unbegrenzten Score zurück. <a href="https://huggingface.co/intfloat/e5-small#faq">Einige</a> Scores des dichten Modells sind eng gruppiert und nur im Zusammenhang mit der spezifischen Anfrage sinnvoll.</p><p>Für die meisten Fälle der semantischen Suche empfehlen wir, vor der Anwendung von „min_score“ einen Normalisierungsansatz zu verwenden. Durch die Normalisierung wird sichergestellt, dass der Dokumentenscore innerhalb eines definierten Intervalls liegt. Elasticsearch-Retriever bieten zwei solcher <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/linear-retriever#linear-retriever-normalizers">Normalisierer</a>, ‘l2_norm’ und ‘minmax’. Am häufigsten wird die „minmax“-Methode verwendet, da sie leicht verständlich ist und in vielen Szenarien gut funktioniert. Wichtige Eigenschaften von ‘minmax’ umfassen:</p><ul><li><p>Die Dokumentenscores liegen im Bereich von 0 bis 1.</p></li><li><p>Das Dokument mit der höchsten Punktzahl erhält immer den Score 1.</p></li><li><p>Das Dokument mit der niedrigsten Punktzahl erhält immer den Score 0.</p><ul><li><p>Dies kann die Eignung für die Stichwortsuche beeinträchtigen. Weitere Informationen finden Sie im Abschnitt „Hybride Suche“.</p></li></ul></li></ul><p>Im Folgenden ein Beispiel für eine normalisierte semantische Abfrage mit <code>min_score</code>. Die Größe des Ranking-Fensters wurde auf 500 erhöht, damit wir eine längere Liste von Suchergebnissen zurückgeben können, angefangen bei 100.</p>GET search-movies/_search
{
  "size": 100,
  "_source": [
    "title", "overview"
  ],
  "retriever": {
    "linear": {
      "rank_window_size": 500,
      "min_score": 0.25,
      "retrievers": [
        {
          "normalizer": "minmax",
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "overview_vector",
                  "query": "superhero movie"
                }
              }
            }
          }
        }
      ]
    }
  }
}<p>Die Größe wurde auf einen höheren Wert als in der Produktion üblich eingestellt. So können wir die Qualität der Suchergebnisse inspizieren und die Ergebnisse optimieren.</p><h2>Hybridsuche mit dem linearen Retriever</h2><p>Für die Hybridsuche ist der einfachste Ansatz, alle Scores zu normalisieren, Gewichte zuzuweisen und einen Mindestscore anzuwenden. Beachten Sie, dass Sie durch die Wahl von Gewichtungen mit einer Summe von 1 den Gesamtscore innerhalb eines Bereichs von 0 bis 1 halten. Dadurch lassen sich die Endergebnisse leicht nachvollziehen und die Melodie <code>min_score</code> stimmen. Nachfolgend ein Beispiel:</p>GET search-movies/_search
{
  "size": 100,
  "_source": ["title", "overview","keywords"],
  "retriever": {
    "linear": {
      "rank_window_size": 500,
      "min_score": 0.25,
      "retrievers": [
        {
          "weight": 0.6,
          "normalizer": "minmax",
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "overview_vector",
                  "query": "superhero movie"
                }
              }
            }
          }
        },
        {
          "weight": 0.4,
          "normalizer": "minmax",
          "retriever": {
            "standard": {
              "query": {
                "multi_match": {
                  "query": "superhero movie",
                  "fields": ["overview","keywords", "title"],
                  "type": "cross_fields",
                  "minimum_should_match": "2"
                }
              }
            }
          }
        }
      ]
    }
  }
}<h2>Hybridsuche mit RRF</h2><p>Mit BM25 steuern wir die Präzision oft durch andere Mittel, wie die Verwendung des <code>AND</code>-Operators oder <code>minimum_should_match</code>. Darüber hinaus werden Abfragen, die aus einzelnen, präzisen und seltenen Begriffen bestehen, natürlicherweise zu Suchergebnissen mit wenigen Suchergebnissen führen, die oft alle hochrelevant sind. Dies kann zu Folgendem führen:</p><ul><li><p>Ergebnisse, die weiter hinten im Ergebnis stehen, erhalten im BM25-Retriever einen niedrigen normalisierten Score, selbst wenn der absolute BM25-Score nahe an den Treffern mit den höchsten Scores liegt.</p></li><li><p>Wenn ein sehr niedriger BM25-Score zum semantischen Score hinzugefügt wird, kann die Summe als semantischer Score approximiert werden.</p></li><li><p>Das Fehlen eines BM25-Score-Beitrags kann dazu führen, dass das Dokument von <code>min_score threshold</code> verworfen wird.</p></li></ul><p>Als Lösung können wir stattdessen die reziproke Rangfusion (RRF) verwenden, um BM25- und semantische Ergebnisse zu kombinieren. RRF umgeht die Herausforderung, Scores verschiedener Suchalgorithmen zu vergleichen, indem es sich stattdessen auf die Position in jedem Ergebnis auf konzentriert. In diesem Szenario wird die <code>min_score</code> nur auf den semantischen Retriever angewendet.</p>GET search-movies/_search
{
  "_source": ["title", "overview","keywords"],
  "retriever": {
    "rrf": {
      "rank_window_size": 500,
      "retrievers": [
        {
          "linear": {
            "rank_window_size": 500,
            "min_score": 0.25,
            "retrievers": [
              {
                "normalizer": "minmax",
                "retriever": {
                  "standard": {
                    "query": {
                      "semantic": {
                        "field": "overview_vector",
                        "query": "superhero movie"
                      }
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "standard": {
            "query": {
              "multi_match": {
                "query": "superhero movie",
                "fields": ["overview", "keywords","title"],
                "type": "cross_fields",
                "minimum_should_match": "2"
              }
            }
          }
        }
      ]
    }
  }
}<h2>Fazit</h2><p>Mit <code>min_score</code> haben wir gezeigt, wie wir die Anzahl der Fehlalarme in unseren Ergebnissätzen reduzieren können, die durch den hohen Recall semantischer Suchalgorithmen verursacht werden. Um mehr über Retriever zu erfahren, siehe bitte diesen <a href="https://www.elastic.co/search-labs/blog/elasticsearch-retrievers">Blogbeitrag</a> und die <a href="https://www.elastic.co/docs/solutions/search/retrievers-overview">Elasticsearch-Dokumentation</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/semantic-precision-minimum-score</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/semantic-precision-minimum-score</guid>
    <category><![CDATA[Relevanz]]></category>
    <category><![CDATA[Hybride Suche]]></category>
    <dc:creator><![CDATA[Mattias Brunnert]]></dc:creator>
    <pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Bewertung der Relevanz von Suchanfragen mit Bewertungslisten]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie Bewertungslisten erstellen, um die Relevanz von Suchanfragen objektiv zu bewerten und Leistungsmetriken wie den Recall zu verbessern – für skalierbare Suchtests in Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Entwickler:innen, die an Suchmaschinen arbeiten, stoßen oft auf dasselbe Problem: Das Business-Team ist mit einer bestimmten Suche nicht zufrieden, weil die Dokumente, die es an erster Stelle der Suchergebnisse erwartet, an dritter oder vierter Stelle in der Ergebnisliste erscheinen.</p><p>Bei der Behebung dieses einen Problems werden jedoch versehentlich andere Abfragen beeinträchtigt, da nicht alle Fälle manuell getestet werden konnten. Aber wie können Sie oder Ihr QA-Team testen, ob eine Änderung in einer Abfrage Auswirkungen auf andere Abfragen hat? Noch wichtiger: Wie können Sie sicher sein, dass Ihre Änderungen eine Abfrage tatsächlich verbessert haben?</p><h2>In Richtung einer systematischen Bewertung</h2><p>Hier kommen Bewertungslisten ins Spiel. Anstatt bei jeder Änderung auf manuelle und subjektive Tests angewiesen zu sein, können Sie einen festen Satz von Abfragen festlegen, die für Ihren Anwendungsfall relevant sind, zusammen mit den entsprechenden Ergebnissen.</p><p>Dieser Satz wird zu Ihrer Referenzgrundlage. Bei jeder Änderung, die Sie vornehmen, nutzen Sie diese, um zu bewerten, ob sich Ihre Suche tatsächlich verbessert hat oder nicht.</p><p>Der Wert dieses Ansatzes liegt in Folgendem:</p><ul><li><p><strong>Beseitigt Unsicherheit</strong>: Sie müssen sich nicht mehr fragen, ob Ihre Änderungen andere Anfragen beeinflussen; die Daten werden es Ihnen mitteilen.</p></li><li><p><strong>Stoppt das manuelle Testen</strong>: Sobald die Bewertungssätze aufgezeichnet sind, erfolgt der Test automatisch.</p></li><li><p><strong>Unterstützt Veränderungen</strong>: Sie können klare Metriken zeigen, die die Vorteile einer Veränderung untermauern.</p></li></ul><h2>So beginnen Sie mit dem Erstellen Ihrer Bewertungsliste</h2><p>Eine der einfachsten Möglichkeiten ist die Auswahl einer repräsentativen Abfrage und die manuelle Auswahl der relevanten Dokumente. Zur Erstellung dieser Liste haben Sie zwei Möglichkeiten:</p><ul><li><p><strong>Binäre Bewertungen:</strong> Jedes Dokument, das mit einer Suchanfrage verknüpft ist, erhält ein <strong>einfaches Tag</strong>: <em>relevant</em> (in der Regel mit einer Punktzahl von „1“) und nicht relevant („0“).</p></li><li><p><strong>Abgestufte Bewertungen:</strong> Hier erhält jedes Dokument eine Punktzahl mit unterschiedlichen Stufen. Beispiel: Festlegung einer Skala von 0 bis 4, ähnlich einer <a href="https://en.wikipedia.org/wiki/Likert_scale">Likert-Skala</a>, wobei 0 = „überhaupt nicht relevant” und 4 = „vollkommen relevant” bedeutet, mit Varianten wie „relevant”, „eher relevant” usw.</p></li></ul><p>Binäre Urteile funktionieren gut, wenn die Suchintention klare Grenzen hat: Sollte dieses Dokument in den Ergebnissen enthalten sein oder nicht?</p><p>Abgestufte Bewertungen sind vor allem bei Grauzonen sinnvoll: Einige Ergebnisse sind besser als andere, sodass Sie „sehr gute“, „gute“ und „nutzlose“ Ergebnisse erhalten und Metriken verwenden können, die die Reihenfolge der Ergebnisse und das Feedback der Benutzer bewerten. Allerdings haben abgestufte Skalen auch Nachteile: Verschiedene Prüfer können die Bewertungsstufen unterschiedlich anwenden, was die Ergebnisse weniger konsistent macht. Und da bei abgestuften Metriken höhere Werte stärker gewichtet werden, kann selbst eine kleine Änderung (z. B. eine Bewertung von 3 statt 4) zu einer viel größeren Verschiebung der Metrik führen, als vom Prüfer beabsichtigt. Diese zusätzliche Subjektivität macht abgestufte Bewertungen im Laufe der Zeit unübersichtlicher und schwieriger zu verwalten.</p><h2>Muss ich die Dokumente selbst klassifizieren?</h2><p>Nicht unbedingt, da es verschiedene Möglichkeiten gibt, Ihre Bewertungsliste zu erstellen, jede mit ihren eigenen Vor- und Nachteilen:</p><ul><li><p><strong>Explizite Bewertungen:</strong> Hier gehen SMEs jede Anfrage/jedes Dokument durch und entscheiden manuell, ob (oder inwieweit) sie relevant ist. Obwohl dies Qualität und Kontrolle bietet, ist die Skalierbarkeit geringer.</p></li><li><p><strong>Implizite Bewertungen:</strong> Mit dieser Methode leiten Sie die relevanten Dokumente auf der Grundlage des tatsächlichen Nutzerverhaltens wie Klicks, Abwanderungsraten und Käufe ab. Mit diesem Ansatz können Sie Daten automatisch erfassen, allerdings könnten die Ergebnisse verzerrt sein. Zum Beispiel klicken Nutzer häufiger auf Top-Ergebnisse, auch wenn sie nicht relevant sind.</p></li><li><p><strong>KI-generierte Bewertungen:</strong> Diese letzte Option verwendet Modelle (wie LLMs), um Anfragen und Dokumente automatisch zu bewerten, oft als <a href="https://en.wikipedia.org/wiki/LLM-as-a-Judge">LLM-Jurys</a> bezeichnet. Sie lässt sich schnell und einfach skalieren, doch die Qualität der Daten hängt von der Qualität des verwendeten Modells und davon ab, wie gut die LLM-Trainingsdaten mit Ihren <a href="http://interests.as/">Geschäftsinteressen</a> übereinstimmen. Wie bei menschlichen Bewertungen können auch LLM-Jurys ihre eigenen Vorurteile oder Inkonsistenzen einbringen. Daher ist es wichtig, ihre Ergebnisse anhand einer kleineren Gruppe vertrauenswürdiger Bewertungen zu validieren. LLM-Modelle sind von Natur aus probabilistisch, daher ist es nicht ungewöhnlich, dass ein LLM-Modell dem gleichen Ergebnis unterschiedliche Bewertungen zuweist, unabhängig davon, ob <a href="https://www.ibm.com/think/topics/llm-temperature">der Temperaturparameter</a> auf 0 gesetzt wird.</p></li></ul><p>Unten finden Sie einige Empfehlungen zur Auswahl der besten Methode für die Erstellung Ihres Bewertungssatzes:</p><ul><li><p>Entscheiden Sie, wie kritisch einige Features für Sie sind, die nur Nutzer richtig bewerten können (wie Preis, Marke, Sprache, Stil und Produktdetails). Wenn diese kritisch sind, benötigen Sie <strong>explizite Bewertungen</strong> für mindestens einen Teil Ihrer <em>Bewertungsliste</em>.</p></li><li><p>Verwenden Sie <strong>implizite Bewertungen</strong>, wenn Ihre Suchmaschine bereits genügend Traffic hat, sodass Sie Metriken zu Klicks, Conversions und Verweildauer nutzen können, um Nutzungstrends zu erkennen. Sie sollten diese dennoch sorgfältig interpretieren und sie mit Ihren expliziten Bewertungssätzen vergleichen, um Verzerrungen zu vermeiden (z. B.: Nutzer neigen dazu, häufiger auf die Ergebnisse mit den höchsten Platzierungen zu klicken, auch wenn Ergebnisse mit niedrigeren Platzierungen relevanter sind)</p></li></ul><p>Um dieses Problem zu beheben, werden mithilfe von Techniken zur Positionsentzerrung Klickdaten angepasst oder neu gewichtet, um das tatsächliche Interesse der Nutzer besser widerzuspiegeln. Mögliche Ansätze hierfür sind:</p><ul><li><p><strong>Ergebnisse neu mischen</strong>: Ändern Sie die Reihenfolge der Suchergebnisse für eine Untergruppe von Nutzern, um zu schätzen, wie sich die Position auf die Klicks auswirkt.</p></li><li><p>Zu den <strong>Click-Modellen </strong>gehören<a href="https://wiki.math.uwaterloo.ca/statwiki/index.php?title=a_Dynamic_Bayesian_Network_Click_Model_for_web_search_ranking">Dynamic Bayesian Network </a><a href="https://wiki.math.uwaterloo.ca/statwiki/index.php?title=a_Dynamic_Bayesian_Network_Click_Model_for_web_search_ranking"><strong>DBN</strong></a>, <a href="https://rsrikant.com/papers/kdd10.pdf">Nutzer Browsing Model </a><a href="https://rsrikant.com/papers/kdd10.pdf"><strong>UBM</strong></a>. Diese statistischen Modelle schätzen die Wahrscheinlichkeit, dass ein Klick echtes Interesse widerspiegelt und nicht nur die Position, indem sie Muster wie Scrollverhalten, Verweildauer, Klicksequenz und Rückkehr zur Ergebnisseite verwenden.</p></li></ul><h2>Beispiel: App zur Filmbewertung</h2><h3>Voraussetzungen</h3><p>Um dieses Beispiel auszuführen, benötigen Sie einen laufenden Elasticsearch 8.x-Cluster, <a href="https://www.elastic.co/downloads/elasticsearch">lokal</a> oder <a href="https://www.elastic.co/cloud/cloud-trial-overview">Elastic Cloud Hosted</a> (gehostet oder serverlos), sowie Zugriff auf die <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis">REST API</a> oder Kibana.</p><p>Stellen Sie sich eine App vor, in der Nutzer ihre Meinungen zu Filmen hochladen und auch nach Filmen suchen können, die sie sich ansehen möchten. Da die Texte von den Nutzern selbst geschrieben werden, können sie Tippfehler und viele Ausdrucksvariationen aufweisen. Daher ist es unerlässlich, dass die Suchmaschine diese Vielfalt interpretieren und den Nutzern hilfreiche Ergebnisse liefern kann.</p><p>Um Abfragen wiederholen zu können, ohne das gesamte Suchverhalten zu beeinträchtigen, hat das Business-Team in Ihrem Unternehmen anhand der häufigsten Suchanfragen die folgenden binären Bewertungssätze erstellt:</p><p>Abfrage</p><p>DocID</p><p>Text</p><p>Leistung von DiCaprio</p><p>doc1</p><p>Die Leistung von DiCaprio in The Revenant war atemberaubend.</p><p>Leistung von DiCaprio</p><p>doc2</p><p>Inception zeigt Leonardo DiCaprio in einer seiner ikonischsten Rollen.</p><p>Leistung von DiCaprio</p><p>doc3</p><p>Brad Pitt liefert in diesem Krimi-Thriller eine solide Leistung ab.</p><p>Leistung von DiCaprio</p><p>doc4</p><p>Ein actiongeladenes Abenteuer mit atemberaubenden visuellen Effekten.</p><p>Traurige Filme, die einen zum Weinen bringen</p><p>doc5</p><p>Eine herzzerreißende Geschichte über Liebe und Verlust, bei der ich stundenlang geweint habe.</p><p>Traurige Filme, die einen zum Weinen bringen</p><p>doc6</p><p>Einer der traurigsten Filme, die je gedreht wurden – Taschentücher bereithalten!</p><p>Traurige Filme, die einen zum Weinen bringen</p><p>doc7</p><p>Eine unbeschwerte Komödie, die Sie zum Lachen bringen wird</p><p>Traurige Filme, die einen zum Weinen bringen</p><p>doc8</p><p>Ein Science-Fiction-Epos voller Action und Spannung.</p><p>Erstellung des Indexes:</p>PUT movies
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text"
      }
    }
  }
}<p>BULK-Anfrage:</p>POST /movies/_bulk
{ "index": { "_id": "doc1" } }
{ "text": "DiCaprio performance in The Revenant was breathtaking." }
{ "index": { "_id": "doc2" } }
{ "text": "Inception shows Leonardo DiCaprio in one of his most iconic roles." }
{ "index": { "_id": "doc3" } }
{ "text": "Brad Pitt delivers a solid performance in this crime thriller." }
{ "index": { "_id": "doc4" } }
{ "text": "An action-packed adventure with stunning visual effects." }
{ "index": { "_id": "doc5" } }
{ "text": "A heartbreaking story of love and loss that made me cry for hours." }
{ "index": { "_id": "doc6" } }
{ "text": "One of the saddest movies ever made -- bring tissues!" }
{ "index": { "_id": "doc7" } }
{ "text": "A lighthearted comedy that will make you laugh." }
{ "index": { "_id": "doc8" } }
{ "text": "A science-fiction epic full of action and excitement." }<p>Nachfolgend finden Sie die Elasticsearch-Abfrage, die die App verwendet:</p>GET movies/_search
{
 "query": {
   "match": {
     "text": {
       "query": "DiCaprio performance",
       "minimum_should_match": "100%"
     }
   }
 }
}<h3>Von der Bewertung zu den Metriken</h3><p>Für sich genommen liefern Bewertungslisten nicht viele Informationen; sie stellen lediglich eine Erwartung der Ergebnisse unserer Abfragen dar. Ihre wahre Stärke zeigen sie, wenn wir sie zur Berechnung objektiver Metriken zur Messung unserer Suchleistung verwenden.</p><p>Heutzutage umfassen die meisten gängigen Metriken Folgendes:</p><ul><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#k-precision"><strong>Genauigkeit</strong></a><strong>: </strong>Misst den Anteil der Ergebnisse, die innerhalb aller Suchergebnisse tatsächlich relevant sind.</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#k-recall"><strong>Recall</strong></a><strong>: </strong>Misst den Anteil relevanter Ergebnisse, die die Suchmaschine unter den x Ergebnissen gefunden hat.</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#_discounted_cumulative_gain_dcg"><strong>Discounted Cumulative Gain (DCG):</strong></a>Misst die Qualität der Rangfolge der Ergebnisse, wobei die relevantesten Ergebnisse ganz oben stehen sollten.</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#_mean_reciprocal_rank"><strong>Mean Reziprocal Rank (MRR):</strong></a> Misst die Position des ersten relevanten Ergebnisses. Je höher es in der Liste steht, desto höher ist der Score.</p></li></ul><p>Anhand derselben App zur Bewertung von Filmen berechnen wir die Recall-Metrik, um festzustellen, ob Informationen in unseren Abfragen ausgelassen werden.</p><p>In Elasticsearch können wir die <em>Bewertungslisten</em> nutzen, um Metriken über die <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval">Ranking Evaluation API</a> zu berechnen. Diese API erhält als Eingabe die Bewertungsliste, die Abfrage und die zu bewertende Metrik und gibt einen Wert zurück, der einen Vergleich des Abfrageergebnisses mit der Bewertungsliste darstellt.</p><p>Lassen Sie uns die Ergebnisliste für die beiden vorliegenden Anfragen ausführen:</p>POST /movies/_rank_eval
{
 "requests": [
   {
     "id": "dicaprio-performance",
     "request": {
       "query": {
         "match": {
           "text": {
             "query": "DiCaprio performance",
             "minimum_should_match": "100%"
           }
         }
       }
     },
     "ratings": [
       {
         "_index": "movies",
         "_id": "doc1",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc2",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc3",
         "rating": 0
       },
       {
         "_index": "movies",
         "_id": "doc4",
         "rating": 0
       }
     ]
   },
   {
     "id": "sad-movies",
     "request": {
       "query": {
         "match": {
           "text": {
             "query": "sad movies that make you cry",
             "minimum_should_match": "100%"
           }
         }
       }
     },
     "ratings": [
       {
         "_index": "movies",
         "_id": "doc5",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc6",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc7",
         "rating": 0
       },
       {
         "_index": "movies",
         "_id": "doc8",
         "rating": 0
       }
     ]
   }
 ],
 "metric": {
   "recall": {
     "k": 10,
     "relevant_rating_threshold": 1
     }
 }
}<p>Wir verwenden zwei Anfragen an _rank_eval: eine für die DiCaprio-Abfrage und eine für traurige Filme. Jede Anfrage enthält eine Fragestellung und die dazugehörige Bewertungsliste (Bewertungen). Wir müssen nicht alle Dokumente bewerten, da diejenigen, die nicht in die Bewertung einbezogen werden, als unbewertet gelten. Für die Berechnungen berücksichtigt Recall nur den „relevanten Satz“, also die Dokumente, die für die Bewertung als relevant gelten.</p><p>In diesem Fall hat die DiCaprio-Abfrage einen Recall von 1, während die traurigen Filme einen Recall von 0 haben. Das bedeutet, dass wir bei der ersten Abfrage alle relevanten Ergebnisse erhalten haben, während wir bei der zweiten Abfrage keine Ergebnisse erhalten haben. Der durchschnittliche Recall beträgt daher 0,5.</p>{
 "metric_score": 0.5,
 "details": {
   "dicaprio-performance": {
     "metric_score": 1,
     "unrated_docs": [],
     "hits": [
       {
         "hit": {
           "_index": "movies",
           "_id": "doc1",
           "_score": 2.4826927
         },
         "rating": 1
       },
       {
         "hit": {
           "_index": "movies",
           "_id": "doc2",
           "_score": 2.0780432
         },
         "rating": 1
       }
     ],
     "metric_details": {
       "recall": {
         "relevant_docs_retrieved": 2,
         "relevant_docs": 2
       }
     }
   },
   "sad-movies": {
     "metric_score": 0,
     "unrated_docs": [],
     "hits": [],
     "metric_details": {
       "recall": {
         "relevant_docs_retrieved": 0,
         "relevant_docs": 2
       }
     }
   }
 },
 "failures": {}
}<p>Vielleicht sind wir mit dem Parameter <strong>minimum_should_match </strong>zu streng, da wir durch die Forderung, dass 100 % der Wörter in der Suchanfrage in den Dokumenten vorkommen müssen, wahrscheinlich relevante Ergebnisse auslassen. Entfernen wir den Parameter <strong>minimum_should_match</strong>, damit ein Dokument als relevant angesehen wird, wenn nur ein Wort aus der Suchanfrage darin vorkommt.</p>POST /movies/_rank_eval
{
 "requests": [
   {
     "id": "dicaprio-performance",
     "request": {
       "query": {
         "match": {
           "text": {
             "query": "DiCaprio performance"
           }
         }
       }
     },
     "ratings": [
       {
         "_index": "movies",
         "_id": "doc1",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc2",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc3",
         "rating": 0
       },
       {
         "_index": "movies",
         "_id": "doc4",
         "rating": 0
       }
     ]
   },
   {
     "id": "sad-movies",
     "request": {
       "query": {
         "match": {
           "text": {
             "query": "sad movies that make you cry"
           }
         }
       }
     },
     "ratings": [
       {
         "_index": "movies",
         "_id": "doc5",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc6",
         "rating": 1
       },
       {
         "_index": "movies",
         "_id": "doc7",
         "rating": 0
       },
       {
         "_index": "movies",
         "_id": "doc8",
         "rating": 0
       }
     ]
   }
 ],
 "metric": {
   "recall": {
     "k": 10,
     "relevant_rating_threshold": 1
     }
 }
}<p>Wie Sie sehen können, erhalten wir durch Entfernen des Parameters <strong>minimum_should_match</strong> in einer der beiden Abfragen nun in beiden Fällen einen durchschnittlichen Recall von 1.</p>{
  "metric_score": 1,
  "details": {
    "dicaprio-performance": {
      "metric_score": 1,
      "unrated_docs": [],
      "hits": [
        {
          "hit": {
            "_index": "movies",
            "_id": "doc1",
            "_score": 2.0661702
          },
          "rating": 1
        },
        {
          "hit": {
            "_index": "movies",
            "_id": "doc3",
            "_score": 0.732218
          },
          "rating": 0
        },
        {
          "hit": {
            "_index": "movies",
            "_id": "doc2",
            "_score": 0.6271719
          },
          "rating": 1
        }
      ],
      "metric_details": {
        "recall": {
          "relevant_docs_retrieved": 2,
          "relevant_docs": 2
        }
      }
    },
    "sad-movies": {
      "metric_score": 1,
      "unrated_docs": [],
      "hits": [
        {
          "hit": {
            "_index": "movies",
            "_id": "doc7",
            "_score": 2.1307156
          },
          "rating": 0
        },
        {
          "hit": {
            "_index": "movies",
            "_id": "doc5",
            "_score": 1.3160692
          },
          "rating": 1
        },
        {
          "hit": {
            "_index": "movies",
            "_id": "doc6",
            "_score": 1.190063
          },
          "rating": 1
        }
      ],
      "metric_details": {
        "recall": {
          "relevant_docs_retrieved": 2,
          "relevant_docs": 2
        }
      }
    }
  },
  "failures": {}
}<p>Zusammenfassend lässt sich sagen, dass durch das Entfernen der Klausel „minimum_should_match: 100%“ eine perfekte Trefferquote für beide Abfragen erzielt werden kann.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaf4f08a8a2915180/6a170df61949f76cbfe7aaba/24d055da4348c63827ba7046fe8cafb6f47cadd8-546x628.png" alt="" /><p>Wir haben es geschafft! Richtig?</p><p>Nicht so schnell!</p><p>Durch die Verbesserung des Recalls öffnen wir die Tür zu einer größeren Bandbreite an Ergebnissen. Jede Anpassung impliziert jedoch einen Kompromiss. Deshalb ist es wichtig, vollständige Testfälle festzulegen und verschiedene Metriken zur Bewertung von Änderungen zu verwenden.</p><p>Die Verwendung von Bewertungslisten und Metriken verhindert, dass Sie Änderungen blind vornehmen, da Sie nun über Daten verfügen, die diese stützen. Die Validierung erfolgt nicht mehr manuell und wiederholt, und Sie können Ihre Änderungen in mehr als nur einem Anwendungsfall testen. Darüber hinaus können Sie mit A/B-Tests live testen, welche Konfiguration für Ihre Nutzer und Ihren Anwendungsfall am besten geeignet ist, wodurch sich der Kreis von technischen Metriken und realen Metriken schließt.</p><h2>Abschließende Empfehlungen zur Verwendung von Bewertungslisten</h2><p>Bei der Arbeit mit Bewertungslisten geht es nicht nur um das Messen, sondern auch darum, einen Rahmen zu schaffen, der es Ihnen ermöglicht, mit Zuversicht zu iterieren. Zu diesem Zweck beachten Sie folgende Empfehlungen:</p><ol><li><p><strong>Fangen Sie klein an, aber fangen Sie an</strong>. Sie benötigen keine 10.000 Anfragen mit jeweils 50 Bewertungslisten. Sie müssen lediglich die 5 bis 10 wichtigsten Suchanfragen für Ihren Anwendungsfall identifizieren und festlegen, welche Dokumente Ihrer Meinung nach ganz oben in den Ergebnissen erscheinen sollten. Damit haben Sie bereits eine Grundlage. Sie möchten in der Regel mit den Top-Suchanfragen sowie den Suchanfragen ohne Ergebnisse beginnen. Sie können auch mit einer einfach zu konfigurierenden Metrik wie Genauigkeit beginnen und sich dann in der Komplexität steigern.</p></li><li><p><strong>Validieren Sie mit Nutzern.</strong> Ergänzen Sie die Zahlen durch A/B-Tests in der Produktion. Auf diese Weise können Sie feststellen, ob Änderungen, die in den Metriken gut aussehen, auch tatsächlich Auswirkungen haben.</p></li><li><p><strong>Führen Sie die Liste weiter.</strong> Ihr Anwendungsfall wird sich weiterentwickeln. Und damit auch Ihre kritischen Fragen. Aktualisieren Sie Ihre Bewertung regelmäßig, um neue Anforderungen zu berücksichtigen.</p></li><li><p><strong>Integrieren Sie sie in Ihren Workflow.</strong> Integrieren Sie Bewertungslisten in Ihre Entwicklungs-Pipelines. Stellen Sie sicher, dass jede Konfigurationsänderung, jedes Synonym und jede Textanalyse automatisch mit Ihrer Basisliste abgeglichen wird.</p></li><li><p><strong>Verbinden Sie technisches Wissen mit Strategie.</strong> Beschränken Sie sich nicht auf die Messung technischer Metriken wie Genauigkeit oder Recall. Nutzen Sie Ihre Bewertungsergebnisse, um die Geschäftsergebnisse zu verbessern.</p></li></ol>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/judgment-lists-search-query-relevance-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/judgment-lists-search-query-relevance-elasticsearch</guid>
    <category><![CDATA[Relevanz]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <dc:creator><![CDATA[Jhon Guzmán]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcadfd2fb1cc95b4c/6a170df7acf0887798be9bd0/25478d0ffb228afd5d65d82312998ec1c299c565-700x490.png" length="0" type="image/png"/>
    <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Hybride Suche ohne Probleme: Vereinfachte hybride Suche mit Retrievern]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie die hybride Suche in Elasticsearch mit einem mehrfeldrigen Abfrageformat für lineare und RRF-Retriever vereinfachen und Abfragen erstellen können, ohne vorher Kenntnisse über Ihren Elasticsearch-Index haben zu müssen.]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/what-is/hybrid-search">Die hybride Suche</a> gilt weithin als leistungsstarker Suchansatz, der die Präzision und Geschwindigkeit der <a href="https://www.elastic.co/search-labs/blog/lexical-and-semantic-search-with-elasticsearch#lexical-search---sparse-retrieval">lexikalischen Suche</a> mit den Möglichkeiten der <a href="https://www.elastic.co/what-is/semantic-search">semantischen Suche</a> im Bereich der natürlichen Sprache kombiniert. Die praktische Anwendung gestaltet sich jedoch oft schwierig und erfordert häufig fundierte Kenntnisse über den Index sowie die Erstellung ausführlicher Abfragen mit komplexen Konfigurationen. In diesem Blogbeitrag werden wir untersuchen, wie das <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers#multi-field-query-format">Mehrfeld-Abfrageformat für lineare und RRF-Retriever die</a> hybride Suche vereinfacht und zugänglicher macht, häufige Probleme beseitigt und es Ihnen ermöglicht, ihre volle Leistungsfähigkeit leichter auszuschöpfen. Wir werden auch untersuchen, wie das Abfrageformat mit mehreren Feldern es Ihnen ermöglicht, hybride Suchanfragen durchzuführen, ohne vorher Kenntnisse über Ihren Index zu haben.</p><h2>Das Problem der Punktespanne</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3521a6558cd477ca/6a17f174445de94d3c4d0225/c8b49153c47d2cdc233c0d2e440db04711d48ca5-1600x1600.jpg" alt="" /><p>Um die Ausgangslage zu verdeutlichen, betrachten wir zunächst einen der Hauptgründe, warum die hybride Suche schwierig sein kann: die variierenden Bewertungsbereiche. Unser alter Bekannter <a href="https://www.elastic.co/elasticon/conf/2016/sf/improved-text-scoring-with-bm25">BM25</a> liefert unbegrenzte Ergebnisse. Mit anderen Worten: BM25 kann Werte generieren, die von nahe 0 bis (theoretisch) unendlich reichen. Im Gegensatz dazu liefern Abfragen gegen <code>dense_vector</code> -Felder Ergebnisse im Bereich zwischen 0 und 1. Erschwerend kommt hinzu, dass <code>semantic_text</code> den Feldtyp verschleiert, der zur Indizierung von Einbettungen verwendet wird. Daher ist es ohne detaillierte Kenntnisse über die Konfiguration Ihres Index und Inferenzendpunkts schwierig abzuschätzen, in welchem Bereich die Ergebnisse Ihrer Abfrage liegen werden. Dies stellt ein Problem dar, wenn versucht wird, lexikalische und semantische Suchergebnisse zu verschachteln, da die lexikalischen Ergebnisse Vorrang vor den semantischen haben können, selbst wenn die semantischen Ergebnisse relevanter sind. Die allgemein anerkannte Lösung für dieses Problem besteht darin, die Werte vor der Verschachtelung der Ergebnisse zu normalisieren. Elasticsearch bietet hierfür zwei Tools an: den <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/linear-retriever">linearen</a> und <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers/rrf-retriever">den RRF-</a> Retriever.
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt09ed6bf3d25066bd/6a17f1750b0bedbd70dd3686/264481268c8b6ac259e3c257b85431b513f16672-1077x586.png" alt="Vergleich der Suchergebnisse mit linearer/rrf-Funktion vs. ohne lineare/rrf-Funktion" /><p>Der <strong>RRF-</strong> Retriever wendet den <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/reciprocal-rank-fusion">RRF-Algorithmus</a> an, wobei der Dokumentenrang als Relevanzmaß verwendet und der Score verworfen wird. Da die Punktzahl nicht berücksichtigt wird, stellen Abweichungen im Punktzahlbereich kein Problem dar.</p><p>Der <strong>lineare</strong> Retriever verwendet eine lineare Kombination, um die endgültige Punktzahl eines Dokuments zu bestimmen. Dabei wird für jede einzelne Abfrage die Punktzahl der Komponenten des Dokuments ermittelt, normalisiert und anschließend summiert, um die Gesamtpunktzahl zu erhalten. Mathematisch lässt sich die Operation wie folgt ausdrücken:</p>Total Score = 𝚺(N(Sx))<p>Dabei ist <code>N</code> die Normalisierungsfunktion und SX die Punktzahl für die Anfrage X. Die Normalisierungsfunktion ist hierbei von zentraler Bedeutung, da sie die Punktzahl jeder Abfrage so transformiert, dass sie denselben Wertebereich verwendet. <a href="https://www.elastic.co/search-labs/blog/linear-retriever-hybrid-search">Hier</a> erfahren Sie mehr über den linearen Retriever.</p><h2>Aufgeschlüsselt</h2><p>Mit diesen Tools können Benutzer eine effektive Hybridsuche implementieren, dies erfordert jedoch gewisse Kenntnisse über ihren Index. Betrachten wir ein Beispiel mit dem linearen Retriever, bei dem wir einen Index mit zwei Feldern abfragen:</p>PUT linear_retriever_example
{
  "mappings": {
    "properties": {
      "semantic_text_field": { &lt;1&gt;
        "type": "semantic_text",
        "inference_id": ".multilingual-e5-small-elasticsearch"
      },
      "text_field": { &lt;2&gt;
        "type": "text"
      }
    }
  }
}<p>1. <code>semantic_text_field</code> ist ein <code>semantic_text</code> -Feld, das <a href="https://www.elastic.co/docs/explore-analyze/machine-learning/nlp/ml-nlp-e5">E5</a>, ein Text-Embedding-Modell, verwendet.</p><p>2. <code>text_field</code> ist ein Standard- <code>text</code> -Feld</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "retrievers": [
        {
          "retriever": {
            "standard": {
              "query": {
                "match": { &lt;1&gt;
                  "semantic_text_field": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        },
        {
          "retriever": {
            "standard": {
              "query": {
                "match": {
                  "text_field": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        }
      ]
    }
  }
}<p>1. Wir verwenden eine <code>match</code> -Abfrage für unser <code>semantic_text</code> -Feld, dessen <a href="https://www.elastic.co/search-labs/blog/semantic-search-match-knn-sparse-vector#we-made-match-happen-in-semantic-search!">Unterstützung wir in Elasticsearch 8.18/9.0 hinzugefügt haben.</a></p><p>
Bei der Erstellung der Abfrage müssen wir berücksichtigen, dass <code>semantic_text_field</code> ein Text-Embedding-Modell verwendet, sodass alle Abfragen darauf eine Punktzahl zwischen 0 und 1 generieren. Wir müssen außerdem wissen, dass <code>text_field</code> ein Standardfeld <code>text</code> ist und dass Abfragen darauf eine unbegrenzte Punktzahl erzeugen. Um ein Ergebnis-Set mit der richtigen Relevanz zu erstellen, müssen wir einen Retriever verwenden, der die Abfrage-Scores normalisiert, bevor er sie kombiniert. In diesem Beispiel verwenden wir den linearen Retriever mit <code>minmax</code> -Normalisierung, der den Score jeder Abfrage auf einen Wert zwischen 0 und 1 normalisiert.</p><p>Die Abfragekonstruktion in diesem Beispiel ist recht einfach, da nur zwei Felder beteiligt sind. Allerdings kann es sehr schnell kompliziert werden, wenn weitere Felder unterschiedlicher Art hinzugefügt werden. Dies zeigt, dass das Schreiben einer effektiven hybriden Suchanfrage oft ein tieferes Verständnis des abgefragten Index erfordert, damit die Punktzahlen der einzelnen Suchanfragen vor der Kombination richtig normalisiert werden. Dies stellt ein Hindernis für die breitere Akzeptanz der hybriden Suche dar.</p><h3>Abfragegruppierung</h3><p>Erweitern wir das Beispiel: Was wäre, wenn wir ein <code>text</code> -Feld und zwei <code>semantic_text</code> -Felder abfragen wollten? Wir könnten eine Abfrage wie diese erstellen:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "retrievers": [
        {
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "semantic_text_field_1",
                  "query": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        },
        {
          "retriever": {
            "standard": {
              "query": {
                "semantic": {
                  "field": "semantic_text_field_2",
                  "query": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        },
        {
          "retriever": {
            "standard": {
              "query": {
                "match": {
                  "text_field": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        }
      ]
    }
  }
}<p>Das klingt auf den ersten Blick gut, aber es gibt ein potenzielles Problem. Die Treffer im Feld <code>semantic_text</code> machen nun ⅔ der Gesamtpunktzahl aus:</p>Total Score = N(semantic_text_field_1 score) + N(semantic_text_field_2 score) + N(text_field score)<p>Das ist wahrscheinlich nicht das, was Sie wollen, denn dadurch entsteht ein unausgewogenes Ergebnis. Die Auswirkungen sind in einem Beispiel wie diesem mit nur 3 Feldern möglicherweise nicht so deutlich erkennbar, aber es wird problematisch, wenn mehr Felder abgefragt werden. Beispielsweise enthalten die meisten Indizes weitaus mehr lexikalische als semantische Felder (d. h. <code>dense_vector</code>, <code>sparse_vector</code>, oder <code>semantic_text</code>). Was wäre, wenn wir einen Index mit 9 lexikalischen Feldern und 1 semantischen Feld nach dem oben genannten Muster abfragen würden? Die lexikalischen Übereinstimmungen würden 90 % der Punktzahl ausmachen und somit die Effektivität der semantischen Suche beeinträchtigen.</p><p>Eine gängige Methode, um diesem Problem zu begegnen, besteht darin, Anfragen in lexikalische und semantische Kategorien zu gruppieren und beide gleich zu gewichten. Dadurch wird verhindert, dass eine der beiden Kategorien die Gesamtpunktzahl dominiert.</p><p>Lasst uns das in die Praxis umsetzen. Wie sähe dieser Ansatz mit gruppierten Abfragen in diesem Beispiel bei Verwendung des linearen Retrievers aus?</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "retrievers": [
        {
          "retriever": {
            "linear": {
              "retrievers": [
                {
                  "retriever": {
                    "standard": {
                      "query": {
                        "semantic": {
                          "field": "semantic_text_field_1",
                          "query": "foo"
                        }
                      }
                    }
                  },
                  "normalizer": "minmax"
                },
                {
                  "retriever": {
                    "standard": {
                      "query": {
                        "semantic": {
                          "field": "semantic_text_field_2",
                          "query": "foo"
                        }
                      }
                    }
                  },
                  "normalizer": "minmax"
                }
              ]
            }
          },
          "normalizer": "minmax"
        },
        {
          "retriever": {
            "standard": {
              "query": {
                "match": {
                  "text_field": "foo"
                }
              }
            }
          },
          "normalizer": "minmax"
        }
      ]
    }
  }
}<p>Wow, das wird aber ausführlich! Möglicherweise mussten Sie sogar mehrmals auf- und abscrollen, um die gesamte Abfrage zu prüfen! Hier verwenden wir zwei Normalisierungsebenen, um die Abfragegruppen zu erstellen. Mathematisch lässt sich dies wie folgt ausdrücken:</p>Total Score = N(N(semantic_text_field_1 score) + N(semantic_text_field_2 score)) + N(text_field score)<p>Diese zweite Normalisierungsebene stellt sicher, dass die Anfragen an die Felder <code>semantic_text</code> und <code>text</code> gleich gewichtet werden. Beachten Sie, dass wir in diesem Beispiel die Normalisierung zweiter Ebene für <code>text_field</code> weglassen, da es nur ein lexikalisches Feld gibt, wodurch Sie sich <em>noch mehr</em> Ausführlichkeit ersparen.</p><p>Diese Abfragestruktur ist schon jetzt unhandlich, und wir fragen nur drei Felder ab. Je mehr Felder man abfragt, desto unübersichtlicher wird es, selbst für erfahrene Suchmaschinenexperten.</p><h2>Das Abfrageformat mit mehreren Feldern</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5d9007d279f0da29/6a17f17714d90c39cf79b6f5/dd04e1686076a574b717c1460acfe4eb79299208-1600x1600.jpg" alt="" /><p>Um das Ganze zu vereinfachen, haben wir das <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers#multi-field-query-format">Multi-Field-Abfrageformat</a> für die linearen und RRF-Retriever in Elasticsearch 8.19, 9.1 und <a href="https://www.elastic.co/cloud/serverless">Serverless</a> hinzugefügt. Sie können die gleiche Abfrage wie oben nun mit folgendem Befehl durchführen:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "fields": [ "semantic_text_field_1", "semantic_text_field_2", "text_field" ],
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>Dadurch verkürzt sich die Abfrage von 55 Zeilen auf nur noch 9! Elasticsearch verwendet automatisch die Indexzuordnungen für:</p><ul><li><p>Ermitteln Sie den Typ jedes abgefragten Feldes.</p></li><li><p>Ordnen Sie jedes Feld einer lexikalischen oder semantischen Kategorie zu.</p></li><li><p>Jede Kategorie sollte im Endergebnis gleich gewichtet werden.</p></li></ul><p>Dies ermöglicht es jedem, eine effektive hybride Suchanfrage auszuführen, ohne Details über den Index oder die verwendeten Inferenzendpunkte kennen zu müssen.</p><p>Bei Verwendung von RRF kann das <code>normalizer</code> weggelassen werden, da der Rang als Indikator für die Relevanz dient:</p>GET rrf_retriever_example/_search
{
  "retriever": {
    "rrf": {
      "fields": [ "semantic_text_field_1", "semantic_text_field_2", "text_field" ],
      "query": "foo"
    }
  }
}<h2>Steigerung pro Spielfeld</h2><p>Bei Verwendung des linearen Retrievers können Sie eine Gewichtung pro Feld anwenden, um die Wichtigkeit von Übereinstimmungen in bestimmten Feldern anzupassen. Nehmen wir beispielsweise an, Sie fragen vier Felder ab: zwei <code>semantic_text</code> -Felder und zwei <code>text</code> -Felder:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "fields": [ "semantic_text_field_1", "semantic_text_field_2", "text_field_1", "text_field_2" ],
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>Standardmäßig wird jedes Feld innerhalb seiner Gruppe (lexikalisch oder semantisch) gleich gewichtet. Die Punkteverteilung sieht wie folgt aus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdc6e197e5ff7b68d/6a17f179505ac32834ad8c46/ba31c76189e3a1e5b1638437ccf0528aafec2598-1600x549.png" alt="Vergleich von Abfragegruppen und Feldwerten" /><p>Mit anderen Worten: Jedes Feld macht 25 % der Gesamtpunktzahl aus.</p><p>Mit der Syntax <code>field^boost</code> können wir jedem Feld einen feldbezogenen Boost hinzufügen. Wenden wir einen Boost von 2 auf <code>semantic_text_field_1</code> und <code>text_field_1</code> an:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "fields": [ "semantic_text_field_1^2", "semantic_text_field_2", "text_field_1^2", "text_field_2" ]
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>Die Aufschlüsselung der Punkte sieht nun wie folgt aus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltccc9ed7d6e865a5e/6a17f17abe6086a31d004882/de20e555d52f914bf483a048d056f54f4fece757-1600x549.png" alt="Feldgewichtung mit Referenz- und Hybridsuche geändert" /><p>Jede Abfragegruppe ist weiterhin gleich gewichtet, aber die Feldgewichtung innerhalb der Gruppen hat sich geändert:</p><ul><li><p><code>semantic_text_field_1</code> entspricht 66 % der Punktzahl der semantischen Abfragegruppe und 33 % der Gesamtpunktzahl.</p></li><li><p><code>text_field_1</code> macht 66 % der Punktzahl der lexikalischen Abfragegruppe und 33 % der Gesamtpunktzahl aus.</p></li></ul><p>ℹ️ Beachten Sie, dass sich die Gesamtpunktzahl nicht ändert, wenn ein Bonus pro Feld angewendet wird. Dies ist ein beabsichtigter Nebeneffekt der Score-Normalisierung, der sicherstellt, dass lexikalische und semantische Anfrage-Scores direkt miteinander vergleichbar bleiben.</p><p>ℹ️ Die feldbezogene Gewichtung kann auch mit dem RRF-Retriever in Elasticsearch 9.2+ verwendet werden.</p><h3>Wildcard-Auflösung</h3><p>Sie können das Platzhalterzeichen <code>*</code> im Parameter <code>fields</code> verwenden, um mehrere Felder abzugleichen. Um das obige Beispiel fortzuführen: Diese Abfrage ist funktional äquivalent zur expliziten Abfrage von s<code>emantic_text_field_1</code>, <code>semantic_text_field_2</code>, und <code>text_field_1</code> :</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "fields": [ "semantic_text_field_*", "*_field_1" ],
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>Interessanterweise passt das Muster <code>*_field_1</code> sowohl zu <code>text_field_1</code> als auch <code>semantic_text_field_1</code>. Dies wird automatisch gehandhabt; die Abfrage wird so ausgeführt, als ob jedes der Felder explizit abgefragt würde. Es ist auch in Ordnung, dass <code>semantic_text_field_1</code> beiden Mustern entspricht; alle Feldnamenübereinstimmungen werden vor der Abfrageausführung dedupliziert.</p><p>Sie können das Wildcard-Zeichen auf verschiedene Arten verwenden:</p><ul><li><p>Präfixübereinstimmung (z. B. <code>*_text_field</code>)</p></li><li><p>Inline-Matching (z. B. <code>semantic_*_field</code>)</p></li><li><p>Suffix-Matching (z. B. <code>semantic_text_field_*</code>)</p></li></ul><p>Sie können auch mehrere Platzhalter verwenden, um eine Kombination der oben genannten anzuwenden, z. B. <code>*_text_field_*</code>.</p><h3>Standardabfragefelder</h3><p>Das Abfrageformat mit mehreren Feldern ermöglicht es Ihnen auch, einen Index abzufragen, über den Sie nichts wissen. Wenn Sie den Parameter <code>fields</code> weglassen, werden alle Felder abgefragt, die durch die <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules">Indexeinstellung index.query.default_field</a> angegeben sind:</p>GET linear_retriever_example/_search
{
  "retriever": {
    "linear": {
      "query": "foo",
      "normalizer": "minmax"
    }
  }
}<p>Standardmäßig ist <code>index.query.default_field</code> auf <code>*</code> gesetzt. Dieser Platzhalter wird auf jeden Feldtyp im Index aufgelöst, der Termabfragen unterstützt, was auf die meisten zutrifft. Die Ausnahmen sind:</p><ul><li><p><code>dense_vector</code> Felder</p></li><li><p><code>rank_vector</code> Felder</p></li><li><p>Geometrische Felder: <code>geo_point</code>, <code>shape</code></p></li></ul><p>Diese Funktionalität ist besonders nützlich, wenn Sie eine hybride Suchanfrage auf einem von einem Drittanbieter bereitgestellten Index durchführen möchten. Das Abfrageformat mit mehreren Feldern ermöglicht es Ihnen, auf einfache Weise eine passende Abfrage auszuführen. Lassen Sie einfach den Parameter <code>fields</code> weg, und alle relevanten Felder werden abgefragt.</p><h2>Fazit</h2><p>Das Problem der Bewertungsbereiche kann die Implementierung einer effektiven hybriden Suche zu einer echten Herausforderung machen, insbesondere wenn nur begrenzter Einblick in den abgefragten Index oder die verwendeten Inferenzendpunkte besteht. Das Mehrfeld-Abfrageformat für die linearen und RRF-Retriever mindert dieses Problem, indem es einen automatisierten, auf Abfragegruppierung basierenden hybriden Suchansatz in einer einfachen und zugänglichen API bündelt. Zusätzliche Funktionen wie die Gewichtung einzelner Felder, die Auflösung von Platzhaltern und die Verwendung von Standardabfragefeldern erweitern den Funktionsumfang und decken viele Anwendungsfälle ab.</p><h2>Probieren Sie heute noch das Abfrageformat mit mehreren Feldern aus.</h2><p>Sie können die linearen und RRF-Retriever mit dem Multi-Field-Query-Format in vollständig verwalteten Elasticsearch <a href="https://www.elastic.co/cloud/serverless">Serverless-</a> Projekten mit einer <a href="https://www.elastic.co/docs/deploy-manage/deploy/elastic-cloud/create-serverless-project">kostenlosen Testversion</a> ausprobieren. Es ist auch in Stack-Versionen ab 8.19 und 9.1 verfügbar.</p><p>Legen Sie in wenigen Minuten in Ihrer lokalen Umgebung mit einem einzigen Befehl los:</p>curl -fsSL https://elastic.co/start-local | sh<p></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/hybrid-search-multi-field-query-retrievers-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/hybrid-search-multi-field-query-retrievers-elasticsearch</guid>
    <category><![CDATA[Hybride Suche]]></category>
    <category><![CDATA[Relevanz]]></category>
    <dc:creator><![CDATA[Mike Pellegrini]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89e066372c549595/6a17f17c3e9e457c38ba1583/4494f98ae3958bbdbc6171df9677fc4d65ec5640-1536x1024.png" length="0" type="image/png"/>
    <pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Sie wissen schon, Kontext – Teil I: Die Entwicklung von hybrider Suche und Kontextgestaltung]]></title>
    <description><![CDATA[Erfahren Sie, wie sich hybride Suche und Kontextgestaltung von lexikalischen Grundlagen weiterentwickelt haben, um die nächste Generation agentenbasierter KI-Workflows zu ermöglichen.]]></description>
    <content:encoded><![CDATA[<h2>Unsere brandneue agentische KI-Welt</h2><p>Wie viele von uns bin auch ich gleichermaßen begeistert und erstaunt über das Tempo, mit dem sich die Fähigkeiten der KI weiterentwickeln. Wir erlebten zum ersten Mal, wie große Sprachmodelle (LLMs) und die Vektorsuche uns in die semantische Revolution katapultierten, bei der wir nicht mehr mühsam mit Schlüsselwörtern herumsuchen mussten, um Dinge zu finden. Dann zeigten uns die LLMs neue Wege der Interaktion mit unseren Daten auf, indem sie Chat-Schnittstellen nutzten, um Anfragen in natürlicher Sprache in Antworten umzuwandeln, die riesige Wissensdatenbanken in leicht verständliche Zusammenfassungen destillierten. Wir jetzt (schon!) haben die Anfänge einer automatisierten LLM-gesteuerten Logik in Form von „agentischen KI“-Workflows, die eine eingehende Anfrage semantisch verstehen, über die zu unternehmenden Schritte nachdenken und dann aus den verfügbaren Werkzeugen auswählen können, um iterativ Aktionen auszuführen, um diese Ziele zu erreichen.</p><p>Das Versprechen agentenbasierter KI zwingt uns, uns von der primären Verwendung von „Prompt Engineering“ zur Gestaltung unserer generativen KI-Interaktionen hin zu einem Fokus darauf zu entwickeln, wie wir agentenbasierte Werkzeuge dabei unterstützen können, die relevantesten und effizientesten Zusatzinformationen zu erhalten, die das LLM bei der Generierung seiner Antworten berücksichtigen muss – „Context Engineering“ ist die nächste Herausforderung. Die hybride Suche ist mit Abstand das leistungsstärkste und flexibelste Mittel, um relevante Kontextinformationen zu finden, und die Search AI-Plattform von Elastic eröffnet völlig neue Möglichkeiten, Daten im Dienste des Context Engineering zu nutzen. In diesem Artikel werden wir aus zwei Blickwinkeln erörtern, wie LLMs die Welt der Informationswiedergewinnung verändert haben, und anschließend darauf eingehen, wie sie für bessere Ergebnisse zusammenarbeiten können. Es gibt noch viel zu besprechen…</p><h2>Teil I: Wie LLMs die Suche verändert haben</h2><p>Beginnen wir mit der Frage, wie LLMs die Art und Weise verändert haben, wie wir auf Informationen zugreifen und sie abrufen.</p><h3>Unser lexikalisches Erbe</h3><p>Wir alle leben schon seit langer Zeit in der etwas eingeschränkten Welt der lexikalischen Suche (ziemlich gut, so gut es eben geht). Die Suche ist das erste Werkzeug, zu dem wir greifen, wenn wir recherchieren oder ein neues Projekt beginnen, und bis vor kurzem lag es an uns, unsere Suchanfragen so zu formulieren, dass eine lexikalische Suchmaschine sie versteht. Die lexikalische Suche basiert auf dem Abgleich von Suchbegriffen mit Schlüsselwörtern in einem Dokumentenkorpus – unabhängig davon, ob der Inhalt unstrukturiert oder strukturiert ist. Damit eine lexikalische Suche ein Dokument als Treffer zurückgibt, muss dieses mit dem entsprechenden Schlüsselwort übereinstimmen (oder über ein kontrolliertes Vokabular wie eine Synonymliste oder ein Wörterbuch verfügen, um die konzeptionelle Verbindung für uns herzustellen).</p>POST my-index/_search
{
  "size": 10,
  "query": {
    "semantic": {
      "query": "machine learning applications",
      "field": "semantic-content-field"
    }
  }
}<p><em>Beispiel einer lexikalischen </em><a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-multi-match-query"></a><em> Mehrfachabfrage</em></p><p>Suchmaschinen haben zumindest die Möglichkeit, Treffer mit einer Relevanzbewertung zurückzugeben. Suchmaschinen bieten eine Fülle von Abfragesyntaxoptionen, um indizierte Daten effektiv anzusprechen, sowie integrierte Relevanzalgorithmen, die die Ergebnisse im Verhältnis zur Absicht der Abfragesyntax des Benutzers bewerten. Suchmaschinen profitieren von jahrzehntelangen Fortschritten bei Relevanz-Ranking-Algorithmen und sind dadurch eine effiziente Datenabrufplattform, die Ergebnisse liefern kann, die nach ihrer Relevanz für die Suchanfrage bewertet und sortiert sind. Datenbanken und andere Systeme, die SQL als ihre Hauptmethode zum Abrufen von Daten verwenden, sind hier im Nachteil: Es gibt kein Relevanzkonzept in einer Datenbankabfrage; sie können bestenfalls Ergebnisse alphabetisch oder numerisch sortieren. Die gute Nachricht ist, dass Sie mit diesen Schlüsselwörtern alle Treffer (Recall) erhalten, diese aber nicht unbedingt in einer hilfreichen Reihenfolge im Hinblick darauf, <em>warum</em> Sie danach gesucht haben (Präzision). Das ist ein wichtiger Punkt, wie wir gleich sehen werden…</p><h3>Betreten Sie den (semantischen) Drachen</h3><p>Das Potenzial von Vektordarstellungen von Informationen als Alternative zur Stichwortsuche wird schon seit <a href="https://www.elastic.co/search-labs/blog/introduction-to-vector-search">geraumer Zeit</a> erforscht. Vektoren bergen großes Potenzial, da sie uns aus dem rein schlüsselwortbasierten Modus des Inhaltsabgleichs herausführen – da Vektoren numerische Darstellungen von Begriffen und Gewichtungen sind, ermöglichen sie es, Konzepte mathematisch nahe beieinander zu bringen, basierend auf dem Verständnis eines Sprachmodells darüber, wie Begriffe im Trainingsbereich miteinander in Beziehung stehen. Die lange Verzögerung bei der allgemeinen Vektorsuche war darauf zurückzuführen, dass die Modelle größtenteils auf spezifische Domänen beschränkt waren; sie waren einfach nicht groß genug, um die vielen verschiedenen Konzepte, die ein Begriff in unterschiedlichen Kontexten repräsentieren könnte, ausreichend zu verstehen.</p><p>Erst mit dem Aufkommen der Large Language Models (LLMs) vor einigen Jahren, die in der Lage sind, mit viel größeren Datenmengen zu trainieren (unter Verwendung <a href="https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture)">von Transformatoren</a> und <a href="https://en.wikipedia.org/wiki/Attention_(machine_learning)">Aufmerksamkeit</a>), wurde die Vektorsuche praktikabel – die Größe und Tiefe der LLMs ermöglichten es Vektoren schließlich, genügend Nuancen zu speichern, um tatsächlich semantische Bedeutung zu erfassen. Dieser plötzliche Anstieg des Verständnisses ermöglichte es LLMs, nun eine große Anzahl von Funktionen der natürlichen Sprachverarbeitung (NLP) zu erfüllen, die zuvor gesperrt waren. Die vielleicht wirkungsvollste Funktion ist die Fähigkeit, aus dem Kontext dessen, was sich bisher in der Sequenz befindet, auf das wahrscheinlichste nächste Glied in einer Sequenz zu schließen. Inferenz ist der Prozess, der generativer KI ihre nahezu menschenähnliche Fähigkeit verleiht, Texte zu erzeugen. Der KI-generierte Text basiert auf dem Verständnis des LLM darüber, wie Begriffe in seinen Trainingsdaten miteinander in Beziehung stehen, und verwendet außerdem die Formulierung der Anfrage, um zwischen verschiedenen Kontexten, in denen die Begriffe vorkommen könnten, zu unterscheiden.</p><p>So magisch generative KI auch sein mag, es <em>gibt</em> Einschränkungen bei LLMs, die zu Fehlern in Qualität und Genauigkeit führen, die gemeinhin als Halluzinationen bezeichnet werden. Halluzinationen treten auf, wenn das LLM keinen Zugang zu den Informationen hat (oder nicht in den richtigen Kontext geführt wird), um seine Antwort auf die Wahrheit zu gründen. Stattdessen generiert es, um hilfreich zu sein, eine selbstsicher und plausibel klingende, aber erfundene Antwort. Ein Teil der Ursache liegt darin, dass LLMs zwar den Sprachgebrauch in großen Bereichen mit vielfältigen Informationen erlernen, das Training aber irgendwann beendet werden muss. Daher gibt es einen Zeitfaktor für ihr Verständnis – das heißt, das Modell kann nur das wissen, was bis zum Zeitpunkt des Trainingsstopps korrekt war. Ein weiterer Faktor für Halluzinationen ist, dass das Modell normalerweise keine Kenntnis von privat gespeicherten Daten hat (Daten, die nicht im öffentlichen Internet verfügbar sind), und das ist besonders bedeutsam, wenn diese Daten spezifische Begriffe und Nomenklatur enthalten.</p><h3>Vektordatenbanken</h3><p>LLMs vektorisieren Inhalte in ihren Modellraum mithilfe einer Technik namens Text Embedding. Dabei wird die semantische Bedeutung des Inhalts auf der Grundlage des erhaltenen Trainings in die Weltanschauung des Modells <a href="https://www.elastic.co/search-labs/blog/hybrid-search-multiple-embeddings">eingebettet</a> oder abgebildet. Zur Vorbereitung und Verarbeitung von Inhalten für die Einbettung sind einige Schritte erforderlich, darunter <a href="https://www.elastic.co/search-labs/blog/chunking-strategies-elasticsearch">Chunking</a> und Tokenisierung (sowie <a href="https://www.kaggle.com/code/danishmahdi/subword-tokenization-bpe-wordpiece-and-unigram">Subwort-Tokenisierung</a>). Das Ergebnis ist typischerweise eine Menge dichter Vektoren, die das Verständnis des Modells für die Bedeutung dieses Inhaltsabschnitts innerhalb seines Vektorraums darstellen. Chunking ist ein ungenaues Verfahren, das darauf abzielt, Inhalte an die Verarbeitungsbeschränkungen eines Modells zur Generierung von Einbettungen anzupassen und gleichzeitig verwandten Text mithilfe semantischer Konstrukte wie Satz- und Absatzindikatoren zu einem Chunk zusammenzufassen.</p><p>Die Notwendigkeit der Segmentierung kann zu einem gewissen semantischen Verlust in einem eingebetteten Dokument führen, da einzelne Segmente nicht vollständig mit anderen Segmenten aus demselben Dokument verknüpft sind. Die inhärente Undurchsichtigkeit neuronaler Netze kann diesen Verlust noch verschlimmern – ein LLM ist in Wahrheit eine „Black Box“, bei der die während des Trainings hergestellten Verbindungen zwischen Begriffen und Konzepten nicht deterministisch und für Menschen nicht interpretierbar sind. Dies führt zu Problemen mit der Erklärbarkeit, der Wiederholbarkeit, unbewussten Voreingenommenheit und möglicherweise zu einem Verlust an Vertrauen und Genauigkeit. Dennoch ist die Möglichkeit, Ideen semantisch zu verknüpfen und bei Suchanfragen nicht an bestimmte Schlüsselwörter gebunden zu sein, extrem wirkungsvoll:</p>POST my-index/_search 
{
  "size": 10, 
  "query": {
    "semantic": {
      "query": "machine learning applications",
      "field": "semantic-content-field"
    }
  }
} <p><em>Ein Beispiel für </em><a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-semantic-query"><em>eine semantische</em></a><em> Anfrage</em></p><p>Bei Vektordatenbanken gibt es noch einen weiteren Punkt zu beachten: Sie sind keine Suchmaschinen, sondern Datenbanken! Bei einer <a href="https://www.elastic.co/search-labs/blog/introduction-to-vector-search">Vektorähnlichkeitssuche</a> werden die Suchbegriffe kodiert, um einen Satz von (Einbettungs-)Koordinaten innerhalb des Vektorraums des Modells zu finden. Diese Koordinaten dienen dann als Zielscheibe, um die Dokumente zu finden, die die „nächsten Nachbarn“ der Zielscheibe sind – das heißt, der Rang eines Dokuments (oder seine Platzierung in den Ergebnissen) wird durch die berechnete <em>Ähnlichkeitsdistanz</em> der Koordinaten dieses Dokuments zu den Koordinaten der Anfrage bestimmt. In welche Richtung sollte die Rangfolge Vorrang haben, welcher der möglichen Kontexte entspricht am ehesten der Absicht des Nutzers? Das Bild, mit dem ich es vergleiche, ist eine Szene aus dem Film <a href="https://www.youtube.com/watch?v=x3h7xz558EY&amp;start=3&amp;end=86">Stargate</a>, in der wir die sechs Koordinatenpunkte haben, die sich schneiden, um uns das Ziel (die Zielscheibe) zu nennen, aber wir können es nicht erreichen, ohne das „7. Symbol“ zu kennen – die Koordinaten des Startpunkts, die die subjektive Absicht des Benutzers repräsentieren. Anstatt also die relative Rangfolge der Vektoren auf einer sich ständig erweiternden und undifferenzierten Sphäre der Ähnlichkeit zu basieren, können wir durch die Berücksichtigung der subjektiven Absicht der Anfrage mittels ausdrucksstarker Syntax und Relevanzbewertung so etwas wie einen <em>Zylinder</em> abgestufter subjektiver Relevanz erhalten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb49ae330d3de1fc1/6a17053ee8fbce089639fb46/1ddfaae0c1496d08d7d30419e6d2aeaeacfc0ea2-1600x544.png" alt="Ein Zylinder abgestufter subjektiver Relevanz." /><p>Die Inferenzfähigkeiten eines LLM können zwar helfen, den wahrscheinlichsten Kontext <em>für</em> die Anfrage zu identifizieren, das Problem besteht jedoch darin, dass <em>ohne diese Unterstützung</em> die Koordinaten der eingehenden Anfrage <em>nur</em> anhand der Art und Weise bestimmt werden können, wie das Modell ursprünglich trainiert wurde.</p><p>In gewisser Hinsicht könnte man sagen, dass Vektorähnlichkeit das entgegengesetzte Extrem darstellt als eine strikte Stichwortübereinstimmung – ihre Stärke liegt in ihrer Fähigkeit, die Probleme der Begriffsabweichung zu überwinden, aber <a href="https://medium.com/data-science/vector-embeddings-are-lossy-heres-what-to-do-about-it-4f9a8ee58bb7">fast bis zum Exzess</a>: LLMs neigen dazu, verwandte Konzepte zu vereinheitlichen, anstatt zwischen ihnen zu unterscheiden. Die Vektorähnlichkeit verbessert unsere Fähigkeit, Inhalte semantisch abzugleichen, garantiert aber keine Präzision, da sie exakte Schlüsselwörter und spezifische Details übersehen kann, die vom Modell nicht ausreichend unterschieden werden. Die Vektorähnlichkeitssuche ist an sich schon leistungsstark, aber wir brauchen Möglichkeiten, die Ergebnisse, die wir aus einer Vektordatenbank abrufen, mit Ergebnissen anderer Abrufmethoden zu korrelieren.</p><h3>Neubewertungstechniken</h3><p>An dieser Stelle sei eine allgemeine Technik namens Reranking erwähnt, bei der die Ergebnismengen neu bewertet oder normalisiert werden, um eine einheitliche Rangfolge zu erhalten. Die Notwendigkeit einer Neubewertung könnte darauf zurückzuführen sein, dass Ergebnisse aus mehreren Quellen oder Abrufmethoden unterschiedliche Bewertungsmechanismen (oder gar keine, SQL!) haben, oder die Neubewertung könnte dazu dienen, die Ergebnisse aus nicht-semantischen Quellen semantisch an die Anfrage des Benutzers anzupassen. Das Reranking ist ein zweiter Schritt, bei dem es sich um eine Reihe von Ergebnissen handelt, die durch eine <em>erste Abrufmethode</em> (z. B. Anschließend werden SQL-, lexikalische und Vektorsuchen mit einer anderen Bewertungsmethode neu geordnet.</p><p>Es stehen verschiedene Ansätze zur Verfügung, darunter <a href="https://www.elastic.co/docs/solutions/search/ranking/learning-to-rank-ltr">Learning-To-Rank (LTR)</a> und <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/reciprocal-rank-fusion">Reciprocal Rank Fusion (RRF)</a> – LTR eignet sich, um Suchergebnisse zu erfassen (Likes, Bewertungen, Klicks usw.) und diese zu nutzen, um Ergebnisse zu bewerten und zu verstärken oder zu verzerren. RRF eignet sich perfekt zum Zusammenführen von Ergebnissen, die von verschiedenen Abfragemodalitäten zurückgegeben werden (z. B. lexikalische und Vektordatenbankrecherchen) werden zu einer einzigen Ergebnisliste zusammengeführt. Elastic bietet außerdem die Flexibilität, die Ergebnisse mithilfe <a href="https://www.elastic.co/search-labs/blog/linear-retriever-hybrid-search">linearer Neubewertungsmethoden</a> anzupassen.</p><p>Eine der effektivsten Reranking-Techniken ist jedoch <a href="https://www.elastic.co/docs/solutions/search/ranking/semantic-reranking">das semantische Reranking</a>, bei dem das semantische Verständnis eines LLM genutzt wird, um die Vektoreinbettungen sowohl der Anfrage als auch der Ergebnisse gemeinsam zu analysieren und anschließend eine Relevanzbewertung/Rescoring anzuwenden, um die endgültige Reihenfolge zu bestimmen. Für das semantische Reranking ist natürlich eine Verbindung zu einem Reranking-Modell erforderlich. Elasticsearch bietet eine <a href="https://www.elastic.co/docs/api/doc/elasticsearch/group/endpoint-inference">Inference API</a> , mit der Sie <strong>Rerank-</strong> Endpunkte erstellen können, die integrierte Modelle (<a href="https://www.elastic.co/docs/explore-analyze/machine-learning/nlp/ml-nlp-rerank">Elastic Rerank</a>), <a href="https://www.elastic.co/docs/reference/elasticsearch/clients/eland/machine-learning">importierte</a> Modelle von Drittanbietern oder extern gehostete Dienste wie <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-inference-put-cohere">Cohere</a> oder <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-inference-put-googlevertexai">Google Vertex AI nutzen</a>. Anschließend können Sie mithilfe der Abstraktionssyntax <a href="https://www.elastic.co/docs/solutions/search/retrievers-overview">der Retriever</a> -Abfrage ein Reranking durchführen:</p>POST my-index/_search 
{
  "size": 10,
  "retriever": {
    "text_similarity_reranker": {
      "retriever": {
        "rrf": {
          "retrievers": [
            {
              "standard": {
                "query": {
                  "multi_match": {
                    "query": "machine learning applications",
                    "fields": ["title", "content"]
                  }
                }
              }
            },
            {
              "knn": {
                "field": "semantic-content-field",
                "k": 10,
                "num_candidates": 100,
                "query_vector_builder": {
                  "text_embedding": {
                    "model_id": "my-text-embedding-model",
                    "model_text": "machine learning applications"
                  }
                }
              }
            }
          ],
          "rank_window_size": 50,
          "rank_constant": 20
        }
      }
    },
    "field": "content",
    "inference_id": "my-reranker",
    "inference_text": "machine learning applications",
    "rank_window_size": 20
  }
}<p><em>Ein Beispiel für eine mehrstufige Retriever-Neubewertungsoperation</em></p><p>Klingt super, oder? Wir können eine Neubewertung der Ergebnisse aus unterschiedlichen Quellen durchführen und so ein nahezu vollständiges semantisches Verständnis aller Inhaltsarten erreichen… Die semantische Neubewertung kann sowohl rechenintensiv als auch zeitaufwendig sein, weshalb sie nur bei einer begrenzten Anzahl von Ergebnissen praktikabel ist. Daher ist es wichtig, <em>wie</em> die ursprünglichen Ergebnisse abgerufen werden.</p><h3>Die Methode zur Kontextabfrage ist wichtig.</h3><p>Die subjektive Intention ist ein wichtiger Faktor bei der Bestimmung der Genauigkeit eines Ergebnisses und bei der Bewertung seiner Relevanz. Ohne die Möglichkeit, die Absicht des Benutzers bei der Durchführung der Abfrage zu berücksichtigen (ausgedrückt durch eine flexible Syntax oder durch eine Neubewertung in einer zweiten Stufe), können wir nur aus den bereits im Modellraum kodierten Kontexten auswählen. Um diesem Mangel an Kontext zu begegnen, setzen wir üblicherweise Techniken wie <a href="https://en.wikipedia.org/wiki/Retrieval-augmented_generation">Retrieval Augment Generation (RAG)</a> ein. Die Funktionsweise von RAG besteht darin, dass die Koordinaten der Abfrage effektiv verschoben werden, indem zusätzliche verwandte Begriffe aus einer Vorabfrage für kontextrelevante Daten einbezogen werden. Dadurch wird die Art und Weise, wie die Engine diesen zusätzlichen Kontext bereitstellt, und <em>ihre</em> anfängliche Methode zur Datenabfrage umso wichtiger für die Genauigkeit des Kontextes!</p><p>Lassen Sie uns die verschiedenen Methoden zur Kontextabfrage und deren Einfluss auf eine RAG-Operation betrachten:</p><ul><li><p><strong>Hybride Suchabrufe ohne Suchmaschine weisen immer noch einen Mangel an subjektiver Relevanz auf.</strong> Wenn die Plattform, die RAG bereitstellt, im Wesentlichen auf SQL basiert (was auf die meisten „Data Lake“-Plattformen zutrifft), fehlt ihr die Relevanzbewertung in der ersten Abrufphase. Viele Data-Lake-Plattformen bieten ihre eigene Version des hybriden Retrieval (nicht der Suche) an, wobei in der Regel Reranking-Techniken wie semantisches Reranking und RRF auf ihren SQL-basierten Retrieval- und Vektordatenbankergebnissen kombiniert werden. Eine einfache Sortierung reicht offensichtlich nicht für eine subjektive Rangfolge aus, aber selbst wenn sie als Grundlage für eine semantische Neubewertung in einem zweiten Schritt verwendet wird, wird SQL als erste Stufe der Abfrage problematisch, wenn die semantische Neubewertung nur auf den „Top k“ Treffern durchgeführt wird – ohne eine Möglichkeit, die Ergebnisse bei der Abfrage zu bewerten, welche Garantie haben wir, dass die <em>besten</em> Ergebnisse tatsächlich unter den Top-Ergebnissen enthalten sind?</p></li><li><p><strong>Vektorähnlichkeit allein reicht für RAG nicht aus</strong>. Das liegt eigentlich an einer Reihe von sich gegenseitig verstärkenden Problemen – es ist der Verlust beim Einbetten, zusammen mit naiven Chunking-Methoden, der Art und Weise, wie Ähnlichkeit berechnet wird, und der entscheidenden fehlenden Komponente der subjektiven Absicht. Eines der Hauptziele von RAG ist es, generative KI-Interaktionen auf objektiver Wahrheit zu gründen, um sowohl Halluzinationen zu verhindern als auch das LLM über private Informationen zu informieren, von denen es während des Trainings keine Kenntnis hatte. Wir können den durch RAG bereitgestellten zusätzlichen Kontext nutzen, um LLMs einzuschränken und anzuleiten, die Verbindungen und Details zu berücksichtigen, von denen wir wissen, dass sie für die Beantwortung der jeweiligen Frage am wichtigsten sind. Dazu müssen wir <em>sowohl</em> semantische als auch lexikalische Ansätze verwenden.</p></li><li><p><strong>Dateibasierte grep/regex RAG.</strong> Einige <a href="https://www.nicolasbustamante.com/p/the-rag-obituary-killed-by-agents">Kreise</a> im Universum der agentenbasierten KI plädieren für die Verwendung stark vergrößerter Kontextfenster, die über grep und reguläre Ausdrücke für RAG auf lokale Dateien zugreifen, anstatt externe Abrufplattformen zu nutzen. Die Idee dahinter ist, dass LLMs mit einem wesentlich größeren Kontextfenster in der Lage sein werden, konzeptionelle Verbindungen innerhalb ihres eigenen Denkraums herzustellen, anstatt sich auf fragmentierte Informationen und verschiedene Abrufmethoden/Plattformen zu verlassen, um relevante Informationen zu sammeln. Theoretisch ist es zwar richtig, dass ein ganzes Dokument ein umfassenderes Bild liefert als Dokumentsegmente, dies funktioniert jedoch nur in kleinen Datenbereichen (oder beispielsweise bei der Bereitstellung von Dateien für <a href="https://en.wikipedia.org/wiki/Vibe_coding">Vibecoding</a>), und selbst dann besteht die erste Abrufmethode in einem Scan aller Dokumente mit einer reinen Stichwortübereinstimmung.</p></li></ul><p><strong>Suche ist mehr als nur Abruf.</strong></p><p>Suchmaschinen sind speziell dafür entwickelt, Suchanfragen so schnell und flexibel wie möglich zu gestalten. Intern nutzen sie spezialisierte Datenstrukturen zum Speichern und Abrufen verschiedener Datentypen, die auf diese Datentypen zugeschnitten sind. Elasticsearch bietet optimiertes Speichern und Abfragen für praktisch alle Datentypen, einschließlich unstrukturierter/Volltext-Lexikalsuche (Match, Phrase, Proximity, Multi-Match), schneller Keyword-Suche (exakte Übereinstimmung) und Filterung, numerischer Bereiche, Datumsangaben, IP-Adressen und ist sehr flexibel in der Speicherung von Dokumentstrukturen (z. B. …). verschachtelte oder flache Dokumente). Elasticsearch ist außerdem eine native Vektordatenbank, die sowohl dünnbesetzte als auch dichte Vektortypen speichern und abfragen kann, und wir erforschen weiterhin innovative Wege (zum Beispiel <a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Better Binary Quantization (BBQ)</a> &amp; <a href="https://www.elastic.co/search-labs/blog/diskbbq-elasticsearch-introduction">DiskBBQ</a>), um die Suchgenauigkeit zu erhalten und gleichzeitig die Geschwindigkeit, Skalierbarkeit und Kosten im Zusammenhang mit vektorisierten Inhalten zu verbessern. Die Elasticsearch-Plattform bietet zudem integrierte Datenstabilität und Hochverfügbarkeit und beinhaltet Funktionen für das Datenlebenszyklusmanagement wie <a href="https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore/searchable-snapshots">Searchable Snapshots</a> , mit denen Sie selten genutzte oder langfristig aufzubewahrende Daten auf kostengünstigem Objektspeicher speichern können – und diese dennoch vollständig durchsuchbar sind.</p><h3>Die Hybridsuche vereint das Beste aus allen Welten.</h3><p><a href="https://www.elastic.co/what-is/hybrid-search">Hybride Suche</a> (nicht nur hybride Abfrage!) kombiniert die Stärken der traditionellen lexikalischen Suche mit dem semantischen Verständnis von LLMs und der Vektorähnlichkeitssuche. Diese Synergie ermöglicht es, bereits in der <em>Abrufphase</em> hochrelevante Ergebnisse durch die flexiblen Abfragesyntaxoptionen einer Suchmaschine zu erzielen: absichtsgesteuerte Syntaxoptionen und Relevanzbewertung, multimodaler Datenabruf, Filterung, Aggregation und Biasing. Mit Suchsyntax wie <a href="https://www.elastic.co/docs/reference/query-languages/esql">ES|QL</a> und mehrstufigen <a href="https://www.elastic.co/docs/solutions/search/retrievers-overview">Abrufern</a> können wir die traditionelle Suche flexibel mit semantischer Suche, Filtern und mehreren Reranking-Techniken in einer einzigen Anfrage kombinieren.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ee9512910856ee3/6a17053fcdacbf2ea97d291e/f25180cb430414b99ae553d3b8eb161dbccea4d4-1920x1080.png" alt="Wie funktioniert die Hybridsuche?" /><p>Einer der größten Vorteile der hybriden Suche ist, dass Ihre Abfragen eine spezialisierte Syntax für mehrere verschiedene Datentypen gleichzeitig verwenden können. Diese unterschiedlichen Abfragesyntaxen können nicht nur zum <em>Auffinden</em> von Ergebnissen verwendet werden, sondern auch als Filter oder Aggregationen <em>der</em> Ergebnisse. Ein Beispiel hierfür ist <a href="https://www.elastic.co/docs/explore-analyze/geospatial-analysis">die Geodatenanalyse</a>, eine der häufigsten Abfragearten, die oft mit anderen Syntaxelementen kombiniert wird. Sie können beispielsweise Abfragen durchführen, um Ergebnisse zu erhalten, deren Geokoordinaten sich innerhalb einer bestimmten Entfernung von einem Punkt befinden, oder um Aggregationen Ihrer Ergebnisse nach Region anzufordern, oder um Aggregationen anzufordern, um Bewegungen in/aus einer Zone zu verfolgen und Warnungen auszugeben. Mit der Hybridsuche haben Sie die Flexibilität, Syntaxen zu kombinieren, um Ergebnisse so präzise wie möglich zu liefern und die Inhalte abzurufen, die Ihrem Kontext am nächsten kommen.</p><h2>Pause</h2><p>Dieser erste Teil erzählt die Geschichte, wie die Vektorsuche die Art und Weise verändert hat, wie wir Daten abrufen können, und bereitet den Boden für die Veränderungen, die LLMs an den Abfragemechanismen mit sich gebracht haben, mit denen wir mit Daten interagieren. Wir werden so tun, als hätten wir das in mehrere Teile aufteilen müssen, damit LLMs es verstehen können, ohne den Kontext zu verlieren… ;-) Erfahren wir mehr darüber, <em>warum das wichtig ist,</em> in <a href="https://www.elastic.co/search-labs/blog/context-engineering-llm-evolution-agentic-ai">Teil II: Agentische KI und die Notwendigkeit des Kontext-Engineerings</a>, und in Teil III kehren wir zu unserer Diskussion über die hybride Suche zurück.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/context-engineering-hybrid-search-evolution-agentic-ai</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/context-engineering-hybrid-search-evolution-agentic-ai</guid>
    <category><![CDATA[Hybride Suche]]></category>
    <category><![CDATA[Relevanz]]></category>
    <dc:creator><![CDATA[Woody Walton]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc49e39872984c8eb/6a1705410e2e49e42c419fd5/7e59a0671aa9ea32d68188a693936a66ebf48625-1000x628.png" length="0" type="image/png"/>
    <pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Hybride Suche neu betrachtet: Einführung des linearen Retrievers in Elasticsearch!]]></title>
    <description><![CDATA[Entdecken Sie, wie der lineare Retriever die hybride Suche durch die Nutzung gewichteter Scores und MinMax-Normalisierung für präzisere und konsistentere Rangfolgen verbessert, und lernen Sie, wie Sie ihn verwenden.]]></description>
    <content:encoded><![CDATA[<p>In unserem <a href="https://www.elastic.co/de/search-labs/blog/elasticsearch-retrievers-ga-8.16.0">vorherigen Blogbeitrag</a> haben wir das von Grund auf neu gestaltete Retriever-Framework vorgestellt, das die Erstellung komplexer Ranking-Pipelines ermöglicht. Wir haben auch untersucht, wie der Reciprocal Rank Fusion (RRF)-Retriever eine hybride Suche ermöglicht, indem er Ergebnisse aus verschiedenen Abfragen zusammenführt. Obwohl RRF einfach zu implementieren ist, weist es eine bemerkenswerte Einschränkung auf: Es konzentriert sich ausschließlich auf relative Ränge und ignoriert tatsächliche Punktzahlen. Dies macht die Feinabstimmung und Optimierung zu einer Herausforderung.</p><h2>Lernen Sie den Linear Retriever kennen!</h2><p>In diesem Beitrag stellen wir den <a href="https://www.elastic.co/de/docs/solutions/search/retrievers-overview#retrievers-overview-types"><code>linear</code></a> <a href="https://www.elastic.co/de/docs/solutions/search/retrievers-overview#retrievers-overview-types">Retriever</a> vor, unsere neueste Ergänzung zur Unterstützung der Hybridsuche! Im Gegensatz zu <code>rrf</code> berechnet der <code>linear</code> -Retriever eine gewichtete Summe aller Abfragen, die mit einem Dokument übereinstimmen. Dieser Ansatz bewahrt die relative Bedeutung jedes Dokuments innerhalb eines Ergebnissatzes und ermöglicht gleichzeitig eine präzise Kontrolle über den Einfluss jeder Abfrage auf das Endergebnis. Dadurch bietet es eine intuitivere und flexiblere Möglichkeit zur Feinabstimmung der Hybridsuche.</p><p>Definieren eines linearen Retrievers, bei dem die endgültige Punktzahl wie folgt berechnet wird:</p><p>Es ist so einfach wie:</p>GET linear_retriever_blog/_search
{
   "retriever": {
       "linear": {
           "retrievers": [
               {
                   "retriever": {
                       "knn": {
                          ...
                        }
                    },
                   "weight": 5
               },
                  {
                   "retriever": {
                       "standard": {
                          ...
                        }
                    },
                   "weight": 1.5
               },


           ]
        }
     }
}<p>Merken Sie, wie einfach und intuitiv es ist? (und sehr ähnlich zu <code>rrf</code>!) Mit dieser Konfiguration können Sie genau steuern, wie viel jeder Abfragetyp zum endgültigen Ranking beiträgt, im Gegensatz zu <code>rrf</code>, das sich ausschließlich auf relative Ränge stützt.</p><p>Ein Vorbehalt bleibt bestehen: <code>knn</code> -Wertungen können je nach verwendeter Ähnlichkeitsmetrik streng begrenzt sein. Beispielsweise liegen die Werte bei der Kosinusähnlichkeit oder dem Skalarprodukt einheitsnormalisierter Vektoren immer im Bereich <code>[0, 1]</code> . Im Gegensatz dazu sind <code>bm25</code> -Werte weniger vorhersehbar und haben keine klar definierten Grenzen.</p><h2>Skalierung der Ergebnisse: kNN vs. BM25</h2><p>Eine Herausforderung bei der Hybridsuche besteht darin, dass verschiedene Retriever Ergebnisse auf unterschiedlichen Skalen liefern. Stellen Sie sich beispielsweise das folgende Szenario vor:</p><p>Abfrage A-Ergebnisse:</p><p></p><p>Dokument 1</p><p>doc2</p><p>doc3</p><p>doc4</p><p>knn</p><p>0,347</p><p>0,35</p><p>0,348</p><p>0,346</p><p>bm25</p><p>100</p><p>1,5</p><p>1</p><p>0,5</p><p>Abfrage B-Ergebnisse:</p><p></p><p>Dokument 1</p><p>doc2</p><p>doc3</p><p>doc4</p><p>knn</p><p>0,347</p><p>0,35</p><p>0,348</p><p>0,346</p><p>bm25</p><p>0,63</p><p>0,01</p><p>0,3</p><p>0,4</p><p>Sie können die Ungleichheit oben sehen: <code>kNN</code> -Wertungen liegen zwischen 0 und 1, während <code>bm25</code> -Wertungen stark variieren können. Dieser Unterschied macht es schwierig, statische optimale Gewichte für die Kombination der Ergebnisse festzulegen.</p><h2>Normalisierung zur Rettung: der MinMax-Normalisierer</h2><p>Um dieses Problem zu beheben, haben wir einen optionalen <code>minmax</code> -Normalisierer eingeführt, der die Punktzahlen unabhängig für jede Abfrage mithilfe der folgenden Formel auf den <code>[0, 1]</code> -Bereich skaliert:</p><p>Dadurch bleibt die relative Wichtigkeit jedes Dokuments innerhalb des Ergebnissatzes einer Abfrage erhalten, was die Kombination von Bewertungen verschiedener Abrufer erleichtert. Durch die Normalisierung ergeben sich folgende Werte:</p><p>Abfrage A-Ergebnisse:</p><p></p><p>Dokument 1</p><p>doc2</p><p>doc3</p><p>doc4</p><p>knn</p><p>0,347</p><p>0,35</p><p>0,348</p><p>0,346</p><p>bm25</p><p>1,00</p><p>0,01</p><p>0,005</p><p>0,000</p><p>Abfrage B-Ergebnisse:</p><p></p><p>Dokument 1</p><p>doc2</p><p>doc3</p><p>doc4</p><p>knn</p><p>0,347</p><p>0,35</p><p>0,348</p><p>0,346</p><p>bm25</p><p>1,00</p><p>0,000</p><p>0,465</p><p>0,645</p><p>Alle Punktzahlen liegen jetzt im Bereich <code>[0, 1]</code> und die Optimierung der gewichteten Summe ist viel einfacher, da wir jetzt die (im Verhältnis zur Abfrage) Wichtigkeit eines Ergebnisses anstelle seiner absoluten Punktzahl erfassen und die Konsistenz über alle Abfragen hinweg aufrechterhalten.</p><h2>Beispiel für einen linearen Retriever </h2><p>Sehen wir uns nun ein Beispiel an, um zu zeigen, wie das oben genannte aussieht und wie der <code>linear</code> -Retriever einige der Mängel von <code>rrf</code> behebt. RRF basiert ausschließlich auf relativen Rängen und berücksichtigt keine tatsächlichen Punkteunterschiede. Beispielsweise bei diesen Ergebnissen:</p><p></p><p>Dokument 1</p><p>doc2</p><p>doc3</p><p>doc4</p><p>knn</p><p>0,347</p><p>0,35</p><p>0,348</p><p>0,346</p><p>bm25</p><p>100</p><p>1,5</p><p>1</p><p>0,5</p><p>RRF-Score</p><p>0,03226</p><p>0,03252</p><p>0,03200</p><p>0,03125</p><p>rrf würde die Dokumente wie folgt einstufen:</p><p>Allerdings weist doc1 einen deutlich höheren <code>bm25</code> -Score als die anderen auf, den <code>rrf</code> nicht erfasst, da nur die relativen Ränge berücksichtigt werden. Der <code>linear</code> -Retriever berücksichtigt in Kombination mit der Normalisierung sowohl die Punktzahlen als auch ihre Unterschiede korrekt und erzeugt so eine aussagekräftigere Rangfolge:</p><p></p><p>Dokument 1</p><p>doc2</p><p>doc3</p><p>doc4</p><p>knn</p><p>0,347</p><p>0,35</p><p>0,348</p><p>0,346</p><p>bm25</p><p>1</p><p>0,01</p><p>0,005</p><p>0</p><p>Wie wir oben sehen können, wird das großartige Ranking von doc1 und <code>score</code> für <code>bm25</code> richtig berücksichtigt und in den endgültigen Ergebnissen widergespiegelt. Darüber hinaus liegen jetzt alle Ergebnisse im Bereich <code>[0, 1]</code> , sodass wir sie viel intuitiver vergleichen und kombinieren können (und sogar Offline-Optimierungsprozesse erstellen können).</p><h2>Alles zusammenfügen</h2><p>Um den <code>linear</code> -Retriever mit Normalisierung optimal zu nutzen, würde die Suchanfrage folgendermaßen aussehen:</p>GET linear_retriever_blog/_search
{
   "retriever": {
       "linear": {
           "retrievers": [
               {
                   "retriever": {
                       "knn": {
                          ...
                        }
                    },
                   "weight": 5
               },
                  {
                   "retriever": {
                       "standard": {
                          ...
                        }
                    },
                   "weight": 1.5,
                   "normalizer": "minmax"
               },


           ]
       }
   }
}<p>Dieser Ansatz kombiniert das Beste aus beiden Welten: Er behält die Flexibilität und intuitive Bewertung des <code>linear</code> -Retrievers bei und gewährleistet gleichzeitig eine konsistente Bewertungsskalierung mit MinMax-Normalisierung.</p><p>Wie alle unsere Retriever kann der <code>linear</code> -Retriever in jede Ebene eines hierarchischen Retrieverbaums integriert werden und bietet Unterstützung für Erklärbarkeit, Hervorhebung von Übereinstimmungen, Ausblenden von Feldern und mehr.</p><h2>Wann Sie sich für den Linear Retriever entscheiden sollten und warum das einen Unterschied macht</h2><p>Der <code>linear</code> -Retriever:</p><ul><li><p>Bewahrt die relative Bedeutung durch die Nutzung tatsächlicher Punktzahlen und nicht nur von Rängen.</p></li><li><p>Ermöglicht eine Feinabstimmung mit gewichteten Beiträgen aus verschiedenen Abfragen.</p></li><li><p>Verbessert die Konsistenz durch Normalisierung und macht die Hybridsuche robuster und vorhersehbarer.</p></li></ul><h2>Fazit</h2><p>Der <code>linear</code> -Retriever ist bereits auf Elasticsearch Serverless und den Versionen 8.18 und 9.0 verfügbar! Weitere Beispiele und Konfigurationsparameter finden Sie auch in unserer Dokumentation. Probieren Sie es aus und sehen Sie, wie es Ihr Hybridsucherlebnis verbessern kann – wir freuen uns auf Ihr Feedback. Viel Spaß beim Suchen!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/linear-retriever-hybrid-search</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/linear-retriever-hybrid-search</guid>
    <category><![CDATA[Relevanz]]></category>
    <category><![CDATA[Hybride Suche]]></category>
    <dc:creator><![CDATA[Panagiotis Bailis]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte58a751cbcc1153d/6a17e3c76317305c4f585a10/7a07e27e3095463ff93b4cb7f8a0cf3b8e44eab0-1777x1000.png" length="0" type="image/png"/>
    <pubDate>Wed, 28 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Erstellung von Bewertungslisten mit Quepid]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie in Quepid mithilfe eines kollaborativen menschlichen Bewertungsprozesses Bewertungslisten erstellen und anhand der Benchmarks Ihre Relevanz optimieren können.]]></description>
    <content:encoded><![CDATA[<p>Die Erstellung von <a href="https://www.elastic.co/search-labs/blog/judgment-lists">Bewertungslisten</a> ist ein entscheidender Schritt zur Optimierung der Suchergebnisse, kann aber eine komplizierte und schwierige Aufgabe sein. Eine Beurteilungsliste ist eine zusammengestellte Sammlung von Suchanfragen, denen Relevanzbewertungen für die entsprechenden Ergebnisse zugeordnet sind; sie wird auch als Testsammlung bezeichnet. Die anhand dieser Liste berechneten Kennzahlen dienen als Vergleichsmaßstab für die Leistungsfähigkeit einer Suchmaschine. Um den Prozess der Erstellung von Beurteilungslisten zu vereinfachen, entwickelte das <a href="https://opensourceconnections.com/">OpenSource Connections-</a> Team <a href="https://quepidapp.com/">Quepid</a>. Die Beurteilung kann entweder explizit erfolgen oder auf implizitem Feedback von Nutzern basieren. Dieser Blog führt Sie durch die Einrichtung einer kollaborativen Umgebung in Quepid, um menschlichen Bewertern die Möglichkeit zu geben, explizite Beurteilungen vorzunehmen, was die Grundlage jeder Beurteilungsliste bildet.</p><p>Quepid unterstützt Suchteams im Prozess der Bewertung der Suchqualität:</p><ul><li><p>Abfragesätze erstellen</p></li><li><p>Erstellen Sie Beurteilungslisten</p></li><li><p>Suchqualitätsmetriken berechnen</p></li><li><p>Vergleichen Sie verschiedene Suchalgorithmen/Ranking-Systeme anhand berechneter Suchqualitätsmetriken.</p></li></ul><p>Nehmen wir für unseren Blog an, wir betreiben eine Videothek und haben das Ziel, die Qualität unserer Suchergebnisse zu verbessern.</p><h2>Voraussetzungen</h2><p>Dieser Blog verwendet die Daten und Zuordnungen aus dem <a href="https://github.com/o19s/es-tmdb">es-tmdb-Repository</a>. Die Daten stammen von <a href="https://www.themoviedb.org/">The Movie Database</a>. Um dem Beispiel zu folgen, erstellen Sie einen Index namens tmdb mit den entsprechenden Zuordnungen und indizieren Sie die Daten. Ob Sie hierfür eine lokale Instanz einrichten oder eine Elastic Cloud-Bereitstellung verwenden, spielt keine Rolle – beides funktioniert einwandfrei. Für diesen Blog gehen wir von einer Elastic Cloud-Bereitstellung aus. Informationen zur Indizierung der Daten finden Sie in der <a href="https://github.com/o19s/es-tmdb/blob/master/README.md">README-Datei des es-tmdb-Repositorys</a>.</p><p>Führen Sie eine einfache Suchabfrage im Titelfeld nach <code>rocky</code> durch, um zu bestätigen, dass Daten zum Durchsuchen vorhanden sind:</p>GET tmdb/_search
{
 "query": {
   "match": {
     "title": "rocky"
   }
 }
}<p>Es sollten 8 Ergebnisse angezeigt werden.</p>{
 "took": 2,
 "timed_out": false,
 "_shards": {
   "total": 1,
   "successful": 1,
   "skipped": 0,
   "failed": 0
 },
 "hits": {
   "total": {
     "value": 8,
     "relation": "eq"
   }
…
}<h2>Melden Sie sich bei Quepid an.</h2><p><a href="https://github.com/o19s/quepid">Quepid</a> ist ein Tool, mit dem Benutzer die Qualität von Suchergebnissen messen und Offline-Experimente durchführen können, um diese zu verbessern.</p><p>Sie können Quepid auf zwei Arten nutzen: entweder die kostenlose, öffentlich verfügbare Version unter <a href="https://app.quepid.com">https://app.quepid.com</a>, oder richten Sie Quepid auf einem Rechner ein, auf den Sie Zugriff haben. Dieser Beitrag geht davon aus, dass Sie die kostenlose gehostete Version verwenden. Wenn Sie eine Quepid-Instanz in Ihrer Umgebung einrichten möchten, folgen Sie der <a href="https://github.com/o19s/quepid/wiki/Installation-Guide">Installationsanleitung</a>.</p><p>Egal für welche Variante Sie sich entscheiden, Sie müssen ein Konto erstellen, falls Sie noch keins besitzen.</p><h2>So richten Sie ein Quepid-Ticket ein</h2><p>Quepid ist nach dem Prinzip „Fälle“ organisiert. Ein Case speichert Suchanfragen zusammen mit Relevanzeinstellungen und Informationen zur Herstellung einer Verbindung zu Ihrer Suchmaschine.</p><ul><li><p>Für Erstnutzer: Wählen Sie <strong>„Ersten Relevanzfall erstellen“</strong>.</p></li><li><p>Wiederkehrende Benutzer können im Hauptmenü <strong>„Relevanzfälle“</strong> auswählen und auf <strong>„+ Fall erstellen“</strong> klicken.</p></li></ul><p>Geben Sie Ihrem Fall einen beschreibenden Namen, z. B. „Filmsuche-Baseline“, da wir mit der Messung und Verbesserung unserer Baseline-Suche beginnen möchten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte2913d344c42cd24/6a17e6477b54f906b48b38bd/8f9e480d9aae0d706cfc5371e41f19c706dd452a-594x251.png" alt="Einrichten eines Quepid-Falls" /><p>Bestätigen Sie den Namen, indem Sie <strong>„Weiter“</strong> auswählen.</p><p>Als nächstes stellen wir eine Verbindung von Quepid zur Suchmaschine her. Quepid kann Verbindungen zu einer Vielzahl von Suchmaschinen herstellen, darunter Elasticsearch.</p><p>Die Konfiguration hängt von Ihrer Elasticsearch- und Quepid-Konfiguration ab. Um Quepid mit einer Elastic Cloud-Bereitstellung zu verbinden, müssen wir CORS für unsere Elastic Cloud-Bereitstellung aktivieren und konfigurieren und einen API-Schlüssel bereithalten. Eine detaillierte Anleitung finden Sie in der entsprechenden <a href="https://quepid-docs.dev.o19s.com/2/quepid/49/how-to-connect-quepid-to-elastic-cloud">Anleitung in der Quepid-Dokumentation</a>.</p><p>Geben Sie Ihre Elasticsearch-Endpunktinformationen (<code>https://YOUR_ES_HOST:PORT/tmdb/_search</code>) und alle weiteren Informationen ein, die für die Verbindung erforderlich sind (im Falle einer Elastic Cloud-Bereitstellung den API-Schlüssel in den <strong>erweiterten</strong> Konfigurationsoptionen), testen Sie die Verbindung, indem Sie auf <strong>„pingen“</strong> klicken, und wählen Sie <strong>„Weiter“</strong> , um zum nächsten Schritt zu gelangen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcc068309bdc094ae/6a17e6480b0bed14cddd356a/267339dfaecae2740eb2ee2739bdc971608bdb5f-588x1169.png" alt="Einrichtung eines Elasticsearch-Endpoints mit Quepid." /><p>Nun legen wir fest, welche Felder im Fall angezeigt werden sollen. Wählen Sie alle Optionen aus, die unseren menschlichen Gutachtern später helfen, die Relevanz eines Dokuments für eine bestimmte Suchanfrage zu beurteilen.</p><p>Setzen Sie <code>title</code> als <em>Titelfeld</em>, lassen Sie <code>_id</code> als <em>ID-Feld</em> und fügen Sie <code>overview, tagline, cast, vote_average, thumb:poster_path</code> als <em>zusätzliches Anzeigefeld</em> hinzu. Im letzten Eintrag werden kleine Vorschaubilder der Filme in unseren Ergebnissen angezeigt, um uns und den menschlichen Gutachtern eine visuelle Orientierung zu geben.</p><p>Bestätigen Sie die Anzeigeeinstellungen durch Auswahl der Schaltfläche <strong>„Weiter“</strong> .</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc910bdf5aa7680b3/6a17e64ae8fbce710b3a1906/02c58aae8c2ebb6d31f538b27462b4c65428fdc3-594x493.png" alt="Legen Sie fest, welche Felder für die menschlichen Bewerter von Quepid im Ticket angezeigt werden sollen." /><p>Der letzte Schritt besteht darin, Suchanfragen zum Fall hinzuzufügen. Fügen Sie die drei Suchbegriffe <em>„Star Wars“</em>, <em>„Harrison Ford“</em> und <em>„Bester Actionfilm“</em> nacheinander über das Eingabefeld hinzu und <strong>klicken Sie auf „Weiter“</strong>.</p><p>Idealerweise enthält ein Fallbeispiel Abfragen, die reale Benutzerabfragen repräsentieren und verschiedene Abfragetypen veranschaulichen. Fürs Erste können wir uns vorstellen, dass <em>„Star Wars“</em> eine Suchanfrage ist, die alle Suchanfragen nach Filmtiteln repräsentiert, <em>„Harrison Ford“</em> eine Suchanfrage, die alle Suchanfragen nach Darstellern repräsentiert, und <em>„Bester Actionfilm“</em> eine Suchanfrage, die alle Suchanfragen repräsentiert, die nach Filmen eines bestimmten Genres suchen. Dies wird üblicherweise als Query-Set bezeichnet.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt46122bb45e1063e4/6a17e64b505ac36510ad8af8/baccfe96766319aa7255e9bff08913ac87d1517f-595x326.png" alt="Hinzufügen von Suchanfragen zu einem Quepid-Ticket" /><p>In einem Produktionsszenario würden wir Anfragen aus Ereignisverfolgungsdaten stichprobenartig entnehmen, indem wir statistische Verfahren wie <a href="https://opensourceconnections.com/blog/2022/10/13/how-to-succeed-with-explicit-relevance-evaluation-using-probability-proportional-to-size-sampling/">die Wahrscheinlichkeits-proportional-zur-Größe-Stichprobe</a> anwenden, und diese Stichprobenanfragen in Quepid importieren, um Anfragen vom Anfang (häufige Anfragen) und vom Ende (seltene Anfragen) relativ zu ihrer Häufigkeit einzubeziehen, was bedeutet, dass wir häufigere Anfragen bevorzugen, ohne seltene auszuschließen.</p><p>Wählen Sie abschließend <strong>„Fertigstellen“</strong> aus. Sie werden dann zur Falloberfläche weitergeleitet, wo Sie die drei definierten Abfragen sehen.</p><h2>Anfragen und Informationsbedarf</h2><p>Um zu unserem übergeordneten Ziel einer Bewertungsliste zu gelangen, müssen menschliche Gutachter ein Suchergebnis (in der Regel ein Dokument) für eine bestimmte Suchanfrage bewerten. Dies wird als Abfrage-/Dokumentpaar bezeichnet.</p><p>Manchmal scheint es einfach zu sein, anhand der Suchanfrage zu erkennen, was ein Benutzer wollte. Die Anfrage <code>harrison ford</code> zielt darauf ab, Filme zu finden, in denen der Schauspieler Harrison Ford die Hauptrolle spielt. Und die Anfrage <code>action</code>? Ich weiß, ich wäre versucht zu sagen, dass der Nutzer Filme aus dem Action-Genre sucht. Aber welche? Die neuesten, die beliebtesten, die laut Nutzerbewertungen besten? Oder möchte der Nutzer vielleicht alle Filme finden, die als „Action“ bezeichnet werden? <a href="https://www.themoviedb.org/search/movie?query=Action">In der Movie Database gibt es mindestens 12 (!) Filme mit dem Titel „Action“</a> , die sich hauptsächlich durch die Anzahl der Ausrufezeichen im Titel unterscheiden.</p><p>Zwei menschliche Gutachter können bei der Interpretation einer Anfrage, deren Intention unklar ist, zu unterschiedlichen Ergebnissen kommen. Das Informationsbedürfnis: Ein <a href="https://en.wikipedia.org/wiki/Information_needs">Informationsbedürfnis</a> ist ein bewusstes oder unbewusstes Verlangen nach Informationen. Die Definition eines Informationsbedarfs hilft menschlichen Gutachtern bei der Beurteilung von Dokumenten im Hinblick auf eine Anfrage und spielt daher eine wichtige Rolle beim Aufbau von Beurteilungslisten. Erfahrene Anwender oder Fachexperten eignen sich gut zur Spezifizierung des Informationsbedarfs. Es ist eine gute Praxis, Informationsbedürfnisse aus der Perspektive des Nutzers zu definieren, da die Suchergebnisse dessen Bedürfnisse erfüllen sollten.</p><p>Informationsbedarf für die Suchanfragen unseres „Filmsuche-Baseline“-Szenarios:</p><ol><li><p><strong>Star Wars</strong>: Der Nutzer möchte Filme oder Serien aus dem Star Wars-Franchise finden. Möglicherweise relevant sind Dokumentarfilme über Star Wars.</p></li><li><p><strong>Harrison Ford</strong>: Der Nutzer möchte Filme finden, in denen der Schauspieler Harrison Ford mitspielt. Möglicherweise relevant sind Filme, in denen Harrison Ford eine andere Rolle spielt, zum Beispiel die des Erzählers.</p></li><li><p><strong>bester Actionfilm</strong>: Der Nutzer möchte Actionfilme finden, vorzugsweise solche mit einer hohen durchschnittlichen Nutzerbewertung.</p></li></ol><h2>So legen Sie den Informationsbedarf in Quepid fest</h2><p>Um einen Informationsbedarf in Quepid zu definieren, greifen Sie auf die Fallschnittstelle zu:</p><p>1. Öffnen Sie eine Abfrage (z. B. <em>Star Wars</em>) und wählen Sie <em>„Notizen umschalten“.</em></p><p>2. Tragen Sie im ersten Feld den Informationsbedarf und im zweiten Feld etwaige zusätzliche Anmerkungen ein:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte57395f64f6e5fab/6a17e64d6864a40fd6b68771/e01d3d5242a350d8797faa665eb3170039f5dfa2-1483x559.png" alt="Festlegung von Informations- und Abfrageanforderungen in Quepid." /><p>3. Klicken Sie auf <strong>Speichern</strong>.</p><p>Für eine Handvoll Anfragen ist dieses Vorgehen in Ordnung. Wenn Sie Ihren Fall jedoch von drei auf 100 Anfragen erweitern (Quepid-Fälle liegen oft im Bereich von 50 bis 100 Anfragen), sollten Sie die Informationsbedürfnisse außerhalb von Quepid definieren (z. B. in einer Tabellenkalkulation) und diese dann über <strong>Import</strong> hochladen und <strong>Informationsbedürfnisse</strong> auswählen.</p><h2>Erstellen Sie ein Team in Quepid und teilen Sie Ihr Ticket mit anderen</h2><p>Gemeinsame Beurteilungen verbessern die Qualität von Relevanzbewertungen. So stellen Sie ein Team zusammen:</p><p>1. Navigieren Sie im Hauptmenü zu <strong>Teams</strong> .</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45c51d1a0e05a80d/6a17e64fe8fbcede793a190f/797706e8d130b474a95d30b6fa22ecaf36f98c03-613x58.png" alt="Ein Team in Quepid zusammenstellen." /><p>2. Klicken Sie auf <strong>+ Neu hinzufügen</strong>, geben Sie einen Teamnamen ein (z. B. "Suchrelevanzbewerter") und klicken Sie auf <strong>Erstellen</strong>.</p><p>3. Fügen Sie Mitglieder hinzu, indem Sie deren E-Mail-Adressen eingeben und <strong>auf Benutzer hinzufügen</strong> klicken.</p><p>4. Wählen Sie in der Falloberfläche <strong>die Option „Fall teilen“</strong>.</p><p>5. Wählen Sie das passende Team aus und bestätigen Sie die Auswahl.</p><h2>Erstellen Sie ein Bewertungsbuch in Quepid</h2><p>Ein Buch in Quepid ermöglicht es mehreren Bewertern, Anfrage-/Dokumentpaare systematisch zu bewerten. Um einen zu erstellen:</p><p>1. Gehen Sie in der Falloberfläche zu <strong>„Urteile“</strong> und klicken Sie auf <strong>„+ Buch erstellen“</strong>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3543c00e0b834b3f/6a17e650e9ea87f57fa9c598/6a077f26225961150b7414463d7db04f090b68d6-896x365.png" alt="Erstellung eines Bewertungsbuches in Quepid." /><p>2. Konfigurieren Sie das Buch mit einem aussagekräftigen Namen, weisen Sie es Ihrem Team zu, wählen Sie eine Bewertungsmethode (z. B. DCG@10) und legen Sie die Auswahlstrategie fest (einzelner oder mehrere Bewerter). Verwenden Sie für das Buch die folgenden Einstellungen:</p><ul><li><p><strong>Name</strong>: „Filmsuche Skala 0-3“</p></li><li><p><strong>Teams, mit denen Sie dieses Buch teilen möchten</strong>: Markieren Sie das Kästchen neben dem Team, das Sie erstellt haben.</p></li><li><p><strong>Torschütze</strong>: DCG@10</p></li></ul><p>3. Klicken Sie auf <strong>„Buch erstellen“.</strong></p><p>Der Name ist beschreibend und enthält Informationen darüber, wonach gesucht wird („Filme“) sowie über die Skala der Bewertungen („0-3“). Der ausgewählte Scorer DCG@10 definiert die Berechnungsmethode der Suchmetrik. „DCG“ ist die Abkürzung für <a href="https://en.wikipedia.org/wiki/Discounted_cumulative_gain">Discounted Cumulative Gain (diskontierter kumulativer Gewinn)</a> und „@10“ ist die Anzahl der Ergebnisse von oben, die bei der Berechnung der Kennzahl berücksichtigt werden.</p><p>In diesem Fall verwenden wir eine Metrik, die den Informationsgewinn misst und ihn mit der Positionsgewichtung kombiniert. Möglicherweise gibt es andere Suchmetriken, die für Ihren Anwendungsfall besser geeignet sind, und <a href="https://opensourceconnections.com/blog/2020/02/28/choosing-your-search-relevance-metric">die Auswahl der richtigen Metrik ist schon eine Herausforderung für sich</a>.</p><h2>Füllen Sie das Buch mit Abfrage-/Dokumentpaaren.</h2><p>Um Abfrage-/Dokumentpaare für die Relevanzbewertung hinzuzufügen, befolgen Sie diese Schritte:</p><p>1. Navigieren Sie in der Fallübersicht zu „Urteile“.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e98583138535cc3/6a17e6520b0bed4f51dd3571/d717c5b06ae6cb42ed2b9e771486a12f738a9890-1041x218.png" alt="Füllen Sie das Buch mit Abfrage-/Dokumentpaaren in Quepid." /><p>2. Wählen Sie Ihr erstelltes Buch aus.</p><p>3. Klicken Sie auf „Buch füllen“ und bestätigen Sie mit der Auswahl von „Abfrage-/Dokumentpaare für Buch aktualisieren“.</p><p>Diese Aktion generiert Paare basierend auf den Top-Suchergebnissen für jede Suchanfrage, die dann von Ihrem Team ausgewertet werden können.</p><h2>Lassen Sie Ihr Team aus menschlichen Bewertern urteilen </h2><p>Die bisher abgeschlossenen Schritte waren überwiegend technischer und administrativer Natur. Nachdem diese notwendigen Vorbereitungen nun abgeschlossen sind, können wir unser Richterteam seine Arbeit machen lassen. Im Wesentlichen besteht die Aufgabe des Richters darin, die Relevanz eines bestimmten Dokuments für eine gegebene Anfrage zu bewerten. Das Ergebnis dieses Prozesses ist die Bewertungsliste, die alle Relevanzbezeichnungen für die bewerteten Abfragedokumentpaare enthält. Im Folgenden werden dieser Prozess und die zugehörige Benutzeroberfläche genauer erläutert.</p><h3>Übersicht über die Schnittstelle von Human Rating</h3><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt553afb07d8080421/6a17e654505ac30514ad8afc/be3016091b49655dab3354d84e6dc638f3468390-1283x664.png" alt="So bewerten menschliche Bewerter von Quepid Informationen in Dokumenten und Suchanfragen." /><p>Die Human Rating-Schnittstelle von Quepid ist für effiziente Bewertungen konzipiert:</p><ul><li><p><strong>Suchanfrage:</strong> Zeigt den Suchbegriff an.</p></li><li><p><strong>Informationsbedarf:</strong> Zeigt die Absicht des Nutzers.</p></li><li><p><strong>Bewertungsrichtlinien:</strong> Enthält Anweisungen für eine einheitliche Bewertung.</p></li><li><p><strong>Dokumentmetadaten:</strong> Enthält relevante Details zum Dokument.</p></li><li><p><strong>Bewertungsbuttons:</strong> Ermöglicht es den Bewertenden, Beurteilungen mithilfe entsprechender Tastenkombinationen zuzuweisen.</p></li></ul><h3>Verwendung der Human Rating-Schnittstelle</h3><p>Als menschlicher Bewerter greife ich über die Buchübersicht auf die Benutzeroberfläche zu:</p><p>1. Navigieren Sie zur Falloberfläche und klicken Sie auf <strong>Urteile</strong>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e98583138535cc3/6a17e6520b0bed4f51dd3571/d717c5b06ae6cb42ed2b9e771486a12f738a9890-1041x218.png" alt="Verwendung der Human Rating-Schnittstelle von Quepid " /><p>2. Klicken Sie auf <strong>„Weitere Urteile sind erforderlich!“</strong>.</p><p>Das System präsentiert ein Anfrage-/Dokumentpaar, das noch nicht bewertet wurde und weitere Beurteilungen erfordert. Dies wird durch die Auswahlstrategie des Buches bestimmt:</p><ul><li><p><em>Einzelbewerter</em>: Eine einzige Bewertung pro Anfrage/Dokumentenpaar.</p></li><li><p><em>Mehrere Gutachter</em>: Bis zu drei Beurteilungen pro Anfrage/Dokumentenpaar.</p></li></ul><h3>Bewertungsanfrage/Dokumentpaare</h3><p>Schauen wir uns ein paar Beispiele an. Wenn Sie dieser Anleitung folgen, werden Ihnen höchstwahrscheinlich verschiedene Filme angezeigt. Die Bewertungsgrundsätze bleiben jedoch unverändert.</p><p>Unser erstes Beispiel ist der Film „Heroes“ für die Suchanfrage <em>Harrison Ford</em>:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta248e787b5e0a670/6a17e656ec0f89612d5a65ee/c1e14b0d8b04dd579471932dbe4ff72ae5692a02-981x571.png" alt="So füllen Sie ein Buch in Quepid mit Abfrage-/Dokumentpaaren." /><p>Wir betrachten zunächst die Suchanfrage, dann den Informationsbedarf und beurteilen anschließend den Film anhand der angegebenen Metadaten.</p><p>Dieser Film ist ein relevantes Ergebnis für unsere Suchanfrage, da Harrison Ford zur Besetzung gehört. Wir mögen neuere Filme subjektiv als relevanter einstufen, aber dies entspricht nicht unserem Informationsbedürfnis. Daher bewerten wir dieses Dokument mit „Perfekt“, was einer 3 auf unserer Bewertungsskala entspricht.</p><p>Unser nächstes Beispiel ist der Film „Ford v Ferrari“ für die Suchanfrage <em>Harrison Ford</em>:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf5d86aac918a1e96/6a17e657414c64833e945152/052af7894506d7a765af156ba8e26ceec3559973-981x789.png" alt="Ein Beispiel für den Film „Ford v Ferrari (Le Mans 66 – Gegen jede Chance)“ für die Suchanfrage „Harrison Ford“ in Quepid." /><p>In Anlehnung an diese Vorgehensweise beurteilen wir diese Anfrage/dieses Dokument, indem wir die Anfrage, den Informationsbedarf und anschließend prüfen, wie gut die Metadaten des Dokuments dem Informationsbedarf entsprechen.</p><p>Das ist ein schlechtes Ergebnis. Dieses Ergebnis sehen wir wahrscheinlich deshalb, weil einer unserer Suchbegriffe, „ford“, im Titel vorkommt. Harrison Ford spielt jedoch weder in diesem Film noch in irgendeiner anderen Rolle eine Rolle. Daher bewerten wir dieses Dokument mit „Mangelhaft“, was einer 0 auf unserer Bewertungsskala entspricht.</p><p>Unser drittes Beispiel ist der Film „Action Jackson“ für die Suchanfrage <em>„bester Actionfilm“</em>:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2cee335ddd1e6a92/6a17e6596df731d1f40a0ed7/247ab862fbc7435537709f8c96619cb331133d09-985x606.png" alt="Ein Beispiel aus dem Film „Action Jackson“ für die Suchanfrage „bester Actionfilm“:" /><p>Das sieht nach einem Actionfilm aus, das Informationsbedürfnis ist also zumindest teilweise befriedigt. Der durchschnittliche Stimmenanteil liegt jedoch bei 5,4 von 10 Punkten. Und das macht diesen Film wahrscheinlich nicht zum besten Actionfilm unserer Sammlung. Dies würde mich als Richter dazu veranlassen, dieses Dokument mit „Mittelmäßig“ zu bewerten, was einer 1 auf unserer Bewertungsskala entspricht.</p><p>Diese Beispiele veranschaulichen den Prozess der Bewertung von Anfrage-/Dokumentpaaren mit Quepid im Besonderen, auf einer hohen Ebene und auch im Allgemeinen.</p><h2>Best Practices für menschliche Bewerter</h2><p>Die gezeigten Beispiele könnten den Eindruck erwecken, es sei unkompliziert, zu eindeutigen Urteilen zu gelangen. Doch die Einrichtung eines zuverlässigen menschlichen Bewertungsprogramms ist keine leichte Aufgabe. Es handelt sich um einen Prozess voller Herausforderungen, die die Qualität Ihrer Daten leicht beeinträchtigen können:</p><ul><li><p>Menschliche Bewerter können durch sich wiederholende Aufgaben ermüden.</p></li><li><p>Persönliche Vorlieben können Urteile verzerren.</p></li><li><p>Der Grad an Fachwissen variiert von Richter zu Richter.</p></li><li><p>Bewerter jonglieren oft mit mehreren Aufgaben gleichzeitig.</p></li><li><p>Die wahrgenommene Relevanz eines Dokuments entspricht möglicherweise nicht seiner tatsächlichen Relevanz für eine Suchanfrage.</p></li></ul><p>Diese Faktoren können zu uneinheitlichen und qualitativ minderwertigen Beurteilungen führen. Aber keine Sorge – es gibt bewährte Best Practices, die Ihnen helfen können, diese Probleme zu minimieren und einen robusteren und zuverlässigeren Evaluierungsprozess aufzubauen:</p><ul><li><p><strong>Konsequente Bewertung:</strong> Überprüfen Sie die Anfrage, den Informationsbedarf und die Dokumentenmetadaten der Reihe nach.</p></li><li><p><strong>Beachten Sie die Richtlinien:</strong> Verwenden Sie die Bewertungsrichtlinien, um eine einheitliche Bewertung zu gewährleisten. Die Bewertungsrichtlinien können Beispiele enthalten, wann welche Note zu vergeben ist, wodurch der Beurteilungsprozess veranschaulicht wird. Die Rücksprache mit menschlichen Gutachtern nach der ersten Bewertungsrunde erwies sich als gute Vorgehensweise, um schwierige Grenzfälle zu erkennen und herauszufinden, wo zusätzliche Unterstützung benötigt wird.</p></li><li><p><strong>Nutzen Sie die Antwortmöglichkeiten:</strong> Wenn Sie unsicher sind, verwenden Sie „Ich werde später urteilen“ oder „Ich kann es nicht sagen“ und geben Sie gegebenenfalls Erklärungen an.</p></li><li><p><strong>Machen Sie Pausen:</strong> Regelmäßige Pausen tragen dazu bei, die Urteilsfähigkeit aufrechtzuerhalten. Quepid sorgt für regelmäßige Pausen, indem es Konfetti knallen lässt, sobald ein menschlicher Bewerter eine Reihe von Beurteilungen abgeschlossen hat.</p></li></ul><p>Durch Befolgen dieser Schritte etablieren Sie einen strukturierten und kollaborativen Ansatz zur Erstellung von Beurteilungslisten in Quepid und steigern so die Effektivität Ihrer Bemühungen zur Optimierung der Suchrelevanz.</p><h2>Wie geht es weiter?</h2><p>Wie geht es nun weiter? Bewertungslisten sind nur ein grundlegender Schritt zur Verbesserung der Qualität der Suchergebnisse. Hier die nächsten Schritte:</p><h3>Berechnen Sie Metriken und beginnen Sie mit dem Experimentieren</h3><p>Sobald die Bewertungslisten verfügbar sind, ist die Nutzung der Bewertungen und die Berechnung <a href="https://opensourceconnections.com/blog/2020/02/28/choosing-your-search-relevance-metric/">von Kennzahlen zur Suchqualität</a> ein logischer nächster Schritt. Quepid berechnet die konfigurierte Metrik für den aktuellen Fall automatisch, sobald Urteile vorliegen. Metriken werden als „Scorer“ implementiert, und Sie können Ihre eigenen angeben, wenn die unterstützten Metriken Ihre bevorzugten nicht enthalten!</p><p>Gehen Sie zur Falloberfläche, navigieren Sie zu <strong>„Scorer auswählen“</strong>, wählen Sie <em>DCG@10</em> und bestätigen Sie mit einem Klick auf <strong>„Scorer auswählen“</strong>. Quepid berechnet nun DCG@10 pro Abfrage und mittelt außerdem die Gesamtzahl der Abfragen, um die Qualität der Suchergebnisse für Ihren Fall zu quantifizieren.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0d059c959b842139/6a17e65be8fbceb29b3a1913/0ff3b9918342071744d681a43d542102e927abd3-1163x551.png" alt="So quantifizieren Sie die Qualität von Suchergebnissen in Quepid. " /><p>Nachdem die Qualität Ihrer Suchergebnisse nun quantifiziert wurde, können Sie erste Experimente durchführen. Experimente beginnen mit der Aufstellung von Hypothesen. Ein Blick auf die drei Suchanfragen im Screenshot nach der Bewertung macht deutlich, dass die drei Suchanfragen hinsichtlich ihrer Suchqualitätsmetrik sehr unterschiedlich abschneiden: <em>Star Wars</em> schneidet ziemlich gut ab, <em>Harrison Ford</em> sieht in Ordnung aus, aber das größte Potenzial liegt bei <em>Best Action Movie</em>.</p><p>Durch die Erweiterung dieser Abfrage sehen wir ihre Ergebnisse und können in die Details eintauchen und untersuchen, warum Dokumente übereinstimmten und was ihre Punktzahl beeinflusst:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt35227761f4524a1e/6a17e65cb1e11325c579f25a/c45c6cae085a492198c0f8b7060a1a7204e3724e-1131x691.png" alt="Wir experimentieren mit verschiedenen Abfragen, um zu sehen, wie sie bei verschiedenen Suchmetriken in Quepid abschneiden." /><p>Durch Klicken auf „Abfrage erläutern“ und Aufrufen der Registerkarte „Parsing“ sehen wir, dass es sich bei der Abfrage um eine DisjunctionMaxxQuery handelt, die drei Felder durchsucht: <em>cast</em>, <em>overview</em> und <em>title</em>:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0966653b9ab3cc9c/6a17e65efaa913171f93c84c/4a1e1bb2a9cd28e9c48e0ba16357d17ed9d3a5cf-894x557.png" alt="Erklärung der Abfrageanalyse" /><p>Als Suchmaschinenentwickler kennen wir in der Regel einige domänenspezifische Details unserer Suchplattform. In diesem Fall wissen wir möglicherweise, dass wir ein <em>Genre-</em> Feld haben. Fügen wir das der Suchanfrage hinzu und schauen wir, ob sich die Suchqualität verbessert.</p><p>Wir verwenden die <strong>Abfrage-Sandbox</strong> , die sich öffnet, wenn man in der Fallschnittstelle <strong>„Relevanz optimieren“</strong> auswählt. Probieren Sie es aus, indem Sie das Suchfeld <em>„Genres“</em> hinzufügen:</p>{
  "query": {
    "multi_match": {
      "query": "#$query##",
      "type": "best_fields",
      "fields": [
        "title^10",
        "overview",
        "cast",
        "genres"
      ]
    }
  }
}<p>Klicken Sie auf „Meine Suchanfragen erneut ausführen“! Und sehen Sie sich die Ergebnisse an. Haben sie sich verändert? Leider nein. Wir haben nun viele Möglichkeiten zur Erkundung, im Grunde alle Abfrageoptionen, die Elasticsearch bietet:</p><ul><li><p>Wir könnten die Gewichtung des Feldes „Genres“ erhöhen.</p></li><li><p>Wir könnten eine Funktion hinzufügen, die Dokumente anhand ihres durchschnittlichen Abstimmungsergebnisses höher priorisiert.</p></li><li><p>Wir könnten eine komplexere Abfrage erstellen, die Dokumente nur dann nach ihrem Stimmendurchschnitt priorisiert, wenn eine starke Übereinstimmung der Genres vorliegt.</p></li><li><p>…</p></li></ul><p>Das Beste daran, all diese Optionen zu haben und sie in Quepid zu erkunden, ist, dass wir die Möglichkeit haben, die Auswirkungen nicht nur auf die eine Abfrage zu quantifizieren, die wir verbessern wollen, sondern auf alle Abfragen in unserem Fall. Das hindert uns daran, eine leistungsschwache Suchanfrage zu verbessern, indem wir die Qualität der Suchergebnisse für andere opfern. Wir können schnell und kostengünstig iterieren und den Wert unserer Hypothese ohne Risiko validieren, wodurch Offline-Experimente zu einer grundlegenden Fähigkeit aller Suchteams werden.</p><h3>Messung der Interrater-Zuverlässigkeit</h3><p>Selbst bei Aufgabenbeschreibungen, Informationsbedarfsdefinitionen und einer Benutzeroberfläche für menschliche Bewerter, wie sie Quepid bietet, können menschliche Bewerter unterschiedlicher Meinung sein.</p><p>Meinungsverschiedenheiten an sich sind nichts Schlechtes, ganz im Gegenteil: Die Messung von Meinungsverschiedenheiten kann Probleme aufdecken, die man angehen möchte. Relevanz kann subjektiv sein, Anfragen können mehrdeutig sein und Daten können unvollständig oder fehlerhaft sein. <a href="https://en.wikipedia.org/wiki/Fleiss%27_kappa">Fleiss' Kappa</a> ist ein statistisches Maß für die Übereinstimmung zwischen Beurteilern. In Quepid gibt es ein Beispiel-Notebook, das Sie verwenden können. Um es zu finden, wählen Sie in der Hauptnavigation <strong>„Notebooks“</strong> aus und wählen Sie das Notebook <strong>Fleiss Kappa.ipynb</strong> im Ordner <strong>„examples“</strong> aus.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt92d52b30f1fb19c1/6a17e660abe0f2224bdfe9bb/f0669ae96371368ef4d84bb28669560ef09d755c-624x61.png" alt="So finden Sie das statistische Maß Fleiss’ Kappa für die Übereinstimmung zwischen den Bewertern im Notizbuch in Quepid." /><h2>Fazit</h2><p>Mit Quepid können Sie selbst die komplexesten Herausforderungen im Bereich der Suchrelevanz bewältigen und es wird ständig weiterentwickelt: <a href="https://github.com/o19s/quepid/blob/main/CHANGELOG.md#800----2024-02-14">Ab Version 8 unterstützt Quepid KI-generierte Beurteilungen</a>, was besonders für Teams nützlich ist, die ihren Beurteilungsgenerierungsprozess skalieren möchten.</p><p>Mit Quepid-Workflows können Sie effizient skalierbare Beurteilungslisten erstellen – was letztendlich zu Suchergebnissen führt, die den Bedürfnissen der Nutzer wirklich gerecht werden. Mit den erstellten Bewertungslisten verfügen Sie über eine solide Grundlage, um die Relevanz der Suchergebnisse zu messen, Verbesserungen iterativ umzusetzen und ein besseres Nutzererlebnis zu schaffen.</p><p>Denken Sie bei Ihrem weiteren Vorgehen daran, dass die Relevanzoptimierung ein fortlaufender Prozess ist. Beurteilungslisten ermöglichen es Ihnen, Ihren Fortschritt systematisch zu bewerten, ihre größte Wirkung entfalten sie jedoch in Kombination mit Experimenten, Metrikanalysen und iterativen Verbesserungen.</p><h2>Weitere Lektüre</h2><ul><li><p>Quepid-Dokumentation:</p><ul><li><p><a href="https://quepid-docs.dev.o19s.com/2/quepid/32/relevancy-is-a-team-sport">Relevanz ist ein Teamsport</a></p></li><li><p><a href="https://quepid-docs.dev.o19s.com/2/quepid/18/quepid-for-human-raters">Quepid für menschliche Bewerter</a></p></li><li><p><a href="https://quepid-docs.dev.o19s.com/2/quepid/49/how-to-connect-quepid-to-elastic-cloud">Wie man Quepid mit Elastic Cloud verbindet</a></p></li></ul></li><li><p><a href="https://github.com/o19s/quepid">Quepid GitHub-Repository</a></p></li><li><p><a href="https://opensourceconnections.com/blog/2020/07/07/meet-pete-the-e-commerce-search-product-manager/">Lernen Sie Pete kennen, eine Blogserie zur Verbesserung der E-Commerce-Suche</a></p></li><li><p><a href="https://opensourceconnections.com/slack">Relevanz Slack</a>: Treten Sie dem Kanal #quepid bei</p></li></ul><p><strong>Arbeiten Sie mit </strong><a href="https://opensourceconnections.com/"><strong>Open Source Connections</strong></a> zusammen, um Ihre Such- und KI-Fähigkeiten zu transformieren und Ihr Team zu befähigen, diese kontinuierlich weiterzuentwickeln. Unsere Erfolgsbilanz erstreckt sich über den gesamten Globus, wobei unsere Kunden durchweg dramatische Verbesserungen in der Suchqualität, der Teamleistung und der Geschäftsperformance erzielen. <a href="https://opensourceconnections.com/contact/">Kontaktieren Sie uns noch heute,</a> um mehr zu erfahren.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/quepid-judgement-lists</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/quepid-judgement-lists</guid>
    <category><![CDATA[Relevanz]]></category>
    <dc:creator><![CDATA[Daniel Wrigley]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte6779c72c7a42a5a/6a17e6623e9e45acf0ba146b/307c1774bd31f92bb4aa7b69e1a6796240465100-1600x914.png" length="0" type="image/png"/>
    <pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Generierung von Filtern und Facetten mithilfe von maschinellem Lernen]]></title>
    <description><![CDATA[Untersuchung der Vor- und Nachteile der Automatisierung der Erstellung von Filtern und Facetten in einer Suchanwendung mithilfe von ML-Modellen im Vergleich zum klassischen, fest codierten Ansatz.]]></description>
    <content:encoded><![CDATA[<p>Filter und Facetten sind Mechanismen, die dazu dienen, Suchergebnisse zu verfeinern und Nutzern zu helfen, relevante Inhalte oder Produkte schneller zu finden. Beim klassischen Ansatz werden die Regeln manuell definiert. In einem Filmkatalog sind beispielsweise Attribute wie das Genre vordefiniert und können in Filtern und Facetten verwendet werden. Andererseits können mit KI-Modellen automatisch neue Attribute aus den Eigenschaften von Filmen extrahiert werden, wodurch der Prozess dynamischer und personalisierter wird. In diesem Blog untersuchen wir die Vor- und Nachteile jeder Methode und beleuchten deren Anwendungsbereiche und Herausforderungen.</p><h2>Filter und Facetten im Vergleich</h2><p>Bevor wir beginnen, definieren wir zunächst, was Filter und Facetten sind. <strong>Filter</strong> sind vordefinierte Attribute, die verwendet werden, um eine Reihe von Ergebnissen einzuschränken. Auf einem Marktplatz stehen beispielsweise Filter schon vor der eigentlichen Suche zur Verfügung. Der Benutzer kann vor der Suche nach <strong>„PS5“</strong> eine Kategorie auswählen, zum Beispiel <strong>„Videospiele“</strong>, und so die Suche auf eine spezifischere Teilmenge anstatt der gesamten Datenbank eingrenzen. Dadurch erhöhen sich die Chancen auf relevantere Ergebnisse erheblich.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0a77b38aae238938/6a170b821949f72a52e7aa51/5ed8868fa5017d034e1273e35c884a5430afdf3c-1600x937.png" alt="Filter" /><p><strong>Facetten</strong> funktionieren ähnlich wie Filter, sind aber erst nach der Durchführung der Suche verfügbar. Mit anderen Worten: Die Suche liefert Ergebnisse, und auf deren Grundlage wird eine neue Liste von Verfeinerungsoptionen generiert. Bei der Suche nach einer PS5-Konsole werden beispielsweise Aspekte wie <strong>Speicherkapazität</strong>, <strong>Versandkosten</strong> und <strong>Farbe</strong> angezeigt, um den Nutzern bei der Auswahl des idealen Produkts zu helfen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt166e356b80d423ef/6a170b840e2e494ca341a10f/c5633fcc5b6fbb916110faf32144d8d43572e33a-1600x937.png" alt="Facetten " /><p>Nachdem wir nun Filter und Facetten definiert haben, wollen wir die Auswirkungen der klassischen und der auf maschinellem Lernen (ML) basierenden Ansätze auf ihre Implementierung und Verwendung erörtern. Jede Methode hat Vor- und Nachteile, die die Effizienz der Suche beeinflussen.</p><h2>Klassischer Ansatz für Filter und Facetten</h2><p>Bei diesem Ansatz werden Filter und Facetten manuell anhand vordefinierter Regeln definiert. Dies bedeutet, dass die zur Verfeinerung der Suche verfügbaren Attribute festgelegt und im Voraus geplant sind, wobei die Katalogstruktur und die Bedürfnisse der Nutzer berücksichtigt werden.</p><p>Auf einem Marktplatz können beispielsweise Kategorien wie „Elektronik“ oder „Mode“ über spezifische Filter wie Marke, Format und Preisspanne verfügen. Diese Regeln werden statisch erstellt, um eine einheitliche Sucherfahrung zu gewährleisten, erfordern jedoch manuelle Anpassungen, sobald neue Produkte oder Kategorien auftauchen.</p><p>Obwohl dieser Ansatz Vorhersagbarkeit und Kontrolle über die angezeigten Filter und Facetten bietet, kann er an seine Grenzen stoßen, wenn neue Trends entstehen, die eine dynamische Anpassung erfordern.</p><p><strong>Vorteile:</strong></p><ul><li><p><strong>Vorhersagbarkeit und Kontrolle:</strong> Da Filter und Facetten manuell definiert werden, wird die Verwaltung einfacher.</p></li><li><p><strong>Geringe Komplexität:</strong> Es müssen keine Modelle trainiert werden.</p></li><li><p><strong>Wartungsfreundlichkeit:</strong> Da die Regeln vordefiniert sind, können Anpassungen und Korrekturen schnell vorgenommen werden.</p></li></ul><p><strong>Nachteile</strong>:</p><ul><li><p><strong>Neuindizierung für neue Filter erforderlich:</strong> Wenn ein neues Attribut als Filter verwendet werden soll, muss der gesamte Datensatz neu indiziert werden, um sicherzustellen, dass die Dokumente diese Information enthalten.</p></li><li><p><strong>Fehlende dynamische Anpassung:</strong> Filter sind statisch und passen sich nicht automatisch an Änderungen im Nutzerverhalten an.</p></li></ul><h3>Implementierung von Filtern/Facetten – Klassischer Ansatz</h3><p>In <strong>Dev Tools, Kibana</strong>, werden wir eine Demonstration von Filtern/Facetten mit dem <strong>klassischen Ansatz</strong> erstellen.</p><p>Zuerst definieren wir die Zuordnung zur Strukturierung des Index:</p>PUT videogames
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "brand": { "type": "keyword" },
      "storage": { "type": "keyword" },
      "price": { "type": "float" },
      "description": { "type": "text" }
    }
  }
}<p>Die Felder <strong>„Marke“</strong> und <strong>„Speicherort</strong> “ sind als <strong>Schlüsselwort</strong> festgelegt, sodass sie direkt in Aggregationen (<strong>Facetten</strong>) verwendet werden können. Das <strong>Preisfeld</strong> ist vom Typ <strong>Float</strong>, wodurch die Erstellung von <strong>Preisspannen</strong> ermöglicht wird.</p><p>Im nächsten Schritt werden die Produktdaten indexiert:</p>POST videogames/_bulk
{ "index": { "_id": 1 } }
{ "name": "Play Station 5", "brand": "Sony", "storage": "1TB", "price": 499.99, "description": "Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games." }
{ "index": { "_id": 2 } }
{ "name": "Xbox Series X", "brand": "Microsoft", "storage": "1TB", "price": 499.99, "description": "Fastest, most powerful Xbox console ever. Play thousands of titles: Every game looks and plays better on Xbox Series X. At the heart of Series X is the Xbox Velocity. Architecture, which combines a custom SSD and built-in software to significantly reduce load times in and out of game. Switch between multiple games in an instant with Quick Resume. Explore new worlds and experience the action like never before with an unparalleled 12 teraflops of graphics processing power. Enjoy 4K gaming at up to 120 frames per second, premium advanced 3D sound, and more. 4K at 120 FPS: requires compatible content and display X version - with disc drive" }
{ "index": { "_id": 3 } }
{ "name": "Nintendo Switch", "brand": "Nintendo", "storage": "512GB", "price": 299.99, "description": "SHARPER, VIBRANT VISUALS. The new 7-inch screen on the Nintendo Switch OLED takes your gaming to the next level: vibrant colors with sharp contrasts for every moment. INTEGRATED GAMEPLAY. Enjoy the console's many multiplayer modes and connect with other players. Online or locally, the fun on the Nintendo Switch is guaranteed. ENJOY IMMERSION FOR LONGER. In addition to delivering an unparalleled experience, thanks to its improved audio, the Nintendo Switch has a rechargeable battery while you play. From 4.5 hours to 9 hours of battery life. INCLUDES SUPER MARIO BROS. WONDER. Transform your world with the phenomenal flowers in this new Mario game, full of amazing adventures, power-ups and new abilities. NINTENDO SWITCH ONLINE SUBSCRIPTION. Access online games, play with friends and enjoy the exclusive benefits of the Nintendo Switch Online subscription." }
{ "index": { "_id": 4 } }
{ "name": "Steam Deck", "brand": "Valve", "storage": "512GB", "price": 399.99, "description": "You can save games, apps, photos and videos without worrying about space. High-Level Performance: The 4-core processor and graphics ensure a dynamic experience and fast responses. High-Definition Images: Smooth transitions and sharp images provide complete immersion in the game. Wireless Connectivity: Wi-Fi technology allows you to play wherever you want, without wires or cables limiting your fun" }
{ "index": { "_id": 5 } }
{ "name": "Nintendo Switch Lite", "brand": "Nintendo", "storage": "512GB", "price": 299.99, "description": "MADE TO BE PORTABLE. Nintendo Switch Lite is designed specifically for portable gaming. The console lets you jump into your favorite games wherever you are. COMPACT AND LIGHTWEIGHT. With its sleek, lightweight design, this console is ready to hit the road wherever you are. COMPATIBLE GAMES. The Nintendo Switch Lite system plays the library of Nintendo Switch games that work in handheld mode. A WORLD OF COLOR TO CHOOSE FROM. Available in a variety of vibrant and unique colors, Nintendo Switch Lite lets you bring even more personality wherever you go." }<p>Nun wollen wir klassische Aspekte herausfiltern, indem wir die Ergebnisse nach Marke, Speicherort und Preisspanne gruppieren. In der Abfrage wurde Größe:0 definiert. In diesem Szenario besteht das Ziel darin, nur die Aggregationsergebnisse abzurufen, ohne die Dokumente einzubeziehen, die der Abfrage entsprechen.</p>POST videogames/_search
{
  "size": 0,
  "aggs": {
    "brands": {
      "terms": { "field": "brand" }
    },
    "storage_sizes": {
      "terms": { "field": "storage" }
    },
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 300 },   
          { "from": 300, "to": 500 },  
          { "from": 500 }  
        ]
      }
    }
  }
}<p>Die Antwort wird Zählungen für <strong>Marke</strong>, <strong>Lager</strong> und <strong>Preis</strong> enthalten und so zur Erstellung von Filtern und Facetten beitragen.</p>"aggregations": {
   "brands": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
       {
         "key": "Microsoft",
         "doc_count": 1
       },
       {
         "key": "Nintendo",
         "doc_count": 1
       },
       {
         "key": "Sony",
         "doc_count": 1
       },
       {
         "key": "Valve",
         "doc_count": 1
       }
     ]
   },
   "storage_sizes": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
       {
         "key": "1TB",
         "doc_count": 2
       },
       {
         "key": "512GB",
         "doc_count": 2
       }
     ]
   },
   "price_ranges": {
     "buckets": [
       {
         "key": "*-300.0",
         "to": 300,
         "doc_count": 1
       },
       {
         "key": "300.0-500.0",
         "from": 300,
         "to": 500,
         "doc_count": 3
       },
       {
         "key": "500.0-*",
         "from": 500,
         "doc_count": 0
       }
     ]
   }
 }<h2>Ansatz, der auf Machine Learning/KI basiert, für Filter und Facetten</h2><p>Bei diesem Ansatz analysieren Modelle des maschinellen Lernens (ML), einschließlich Techniken der künstlichen Intelligenz (KI), Datenattribute, um relevante Filter und Facetten zu generieren. Anstatt sich auf vordefinierte Regeln zu stützen, nutzt ML/KI die Merkmale indexierter Daten. Dies ermöglicht die dynamische Entdeckung neuer Facetten und Filter.</p><p><strong>Vorteile</strong>:</p><ul><li><p><strong>Automatische Aktualisierungen:</strong> Neue Filter und Facetten werden automatisch generiert, ohne dass manuelle Anpassungen erforderlich sind.</p></li><li><p><strong>Entdeckung neuer Attribute:</strong> Es kann <strong>bisher unberücksichtigte </strong>Datenmerkmale als Filter identifizieren und so das Sucherlebnis bereichern.</p></li><li><p><strong>Reduzierter manueller Aufwand:</strong> Das Team muss keine Filterregeln mehr ständig definieren und aktualisieren, da die KI aus den verfügbaren Daten lernt.</p></li></ul><p><strong>Nachteile:</strong></p><ul><li><p><strong>Wartungsaufwand:</strong> Die Verwendung von Modellen kann eine Vorvalidierung erfordern, um die Konsistenz der generierten Filter sicherzustellen.</p></li><li><p><strong>Erfordert Expertise in den Bereichen Maschinelles Lernen und Künstliche Intelligenz:</strong> Die Lösung erfordert qualifizierte Fachkräfte, die die Modellleistung feinabstimmen und überwachen.</p></li><li><p><strong>Risiko irrelevanter Filter:</strong> Wenn das Modell nicht gut kalibriert ist, kann es Facetten generieren, die für die Benutzer nicht nützlich sind.</p></li><li><p><strong>Kosten:</strong> Der Einsatz von ML und KI kann die Inanspruchnahme von Dienstleistungen Dritter erfordern, was die Betriebskosten erhöht.</p></li></ul><p>Es ist wichtig zu beachten, dass selbst bei einem gut kalibrierten Modell und einer gut formulierten Eingabeaufforderung die generierten Facetten noch einen Überprüfungsschritt durchlaufen sollten. Diese Validierung kann manuell oder auf der Grundlage von Moderationsregeln erfolgen, um sicherzustellen, dass die Inhalte angemessen und sicher sind. Dies ist zwar nicht unbedingt ein Nachteil, aber dennoch ein wichtiger Aspekt, um die Qualität und Eignung der Facetten sicherzustellen, bevor sie den Nutzern zur Verfügung gestellt werden.</p><h3>Implementierung von Filtern/Facetten – KI-Ansatz</h3><p>In dieser Demonstration verwenden wir ein KI-Modell, um Produkteigenschaften automatisch zu analysieren und relevante Attribute vorzuschlagen. Mithilfe einer gut strukturierten Eingabeaufforderung extrahieren wir Informationen aus dem Katalog und wandeln diese in Filter und Facetten um. Im Folgenden stellen wir jeden einzelnen Schritt des Prozesses vor.</p><p>Zunächst werden wir die <strong>Inference API</strong> verwenden, um einen Endpunkt für die Integration mit einem ML-Dienst zu registrieren. Nachfolgend ein Beispiel für die Integration mit <strong>dem Dienst von OpenAI</strong>.</p>PUT _inference/completion/generate_filter_ia
{
   "service": "openai",
   "service_settings": {
       "api_key": "your-key",
       "model_id": "gpt-4o-mini"
   }
}<p>Nun definieren wir die Pipeline, um die Eingabeaufforderung auszuführen und die vom Modell generierten neuen Filter zu erhalten.</p>PUT /_ingest/pipeline/generate_filter_ai
{
   "processors": [
     {
       "script": {
         "source": """ctx.prompt = "You are an expert in data organization for search and product categorization. Your task is to analyze the following product and identify the best dynamic facets that can be used in an e-commerce search experience. Product: " + ctx.name + "description: " + ctx.description + "Instructions: - Analyze the product name and description. - Extract only the dynamic facets (technological features or product characteristics that can be inferred from the description, try to create max 3 facets by characteristics found). Put the values into an array. Using key and value, e.g. dynamic_facets: [{ \"name\": \"Gaming Experience\", \"value\": \"Haptic Feedback\" },{ \"name\": \"Gaming Experience\", \"value\": \"Adaptive Triggers\" } - Return only a JSON."
         """
       }
     },
     {
       "inference": {
         "model_id": "generate_filter_ia",
         "input_output": {
           "input_field": "prompt",
           "output_field": "result"
         }
       }
     },
     {
       "gsub": {
         "field": "result",
         "pattern": "```json",
         "replacement": ""
       }
     },
     {
       "json" : {
         "field" : "result",
         "strict_json_parsing": false,
         "add_to_root" : true
       }
     },
     {
       "remove": {
         "field": "result"
       }
     },
     {
       "remove": {
         "field": "prompt"
       }
     }
   ]
}<p>Eine Simulation dieser Pipeline für das Produkt „PlayStation 5“ wird mit folgender Beschreibung durchgeführt:</p><p><em>Atemberaubendes Spielerlebnis: Bestaunen Sie die beeindruckende Grafik und erleben Sie die Funktionen der neuen PS5.</em></p><p><em>Atemberaubendes Eintauchen: Entdecken Sie ein intensiveres Spielerlebnis mit Unterstützung für haptisches Feedback, adaptive Trigger und 3D-Audiotechnologie.</em></p><p><em>Schlankes Design: Mit der PS5 Digital Edition erhalten Gamer leistungsstarke Gaming-Technologie in einem schlanken, kompakten Design.</em></p><p><em>1 TB Speicherplatz: Dank 1 TB integriertem SSD-Speicher sind Ihre Lieblingsspiele immer griffbereit und warten nur darauf, von Ihnen gespielt zu werden.</em></p><p><em>Abwärtskompatibilität und Game Boost: Die PS5-Konsole kann über 4.000 PS4-Spiele abspielen. Mit Game Boost können Sie sogar in einigen der besten PS4-Konsolenspiele schnellere und flüssigere Bildwiederholraten genießen.</em></p><p>Betrachten wir nun die von dieser Simulation generierte Prompt-Ausgabe.</p>{
 "docs": [
   {
     "doc": {
       "_index": "index",
       "_version": "-3",
       "_id": "1",
       "_source": {
         "name": "Play Station 5",
         "result": """```json
{
 "dynamic_facets": [
   { "name": "Storage Capacity", "value": "1TB SSD" },
   { "name": "Graphics Technology", "value": "Stunning Graphics" },
   { "name": "Audio Technology", "value": "3D Audio" }
 ]
}
```""",
         "description": "Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games.",
         "model_id": "generate_filter_ia",
         "prompt": """You are an expert in data organization for search and product categorization. Your task is to analyze the following product and identify the best dynamic facets that can be used in an e-commerce search experience. Product: Play Station 5description: Stunning Gaming: Marvel at stunning graphics and experience the features of the new PS5. Breathtaking Immersion: Discover a deeper gaming experience with support for haptic feedback, adaptive triggers, and 3D Audio technology. Slim Design: With the PS5 Digital Edition, gamers get powerful gaming technology in a sleek, compact design. 1TB of Storage: Have your favorite games ready and waiting for you to play with 1TB of built-in SSD storage. Backward Compatibility and Game Boost: The PS5 console can play over 4,000 PS4 games. With Game Boost, you can even enjoy faster, smoother frame rates in some of the best PS4 console games.Instructions: - Analyze the product name and description. - Extract only the dynamic facets (technological features or product characteristics that can be inferred from the description, try create max 3 facets by characteristics found). Put the values like arrays. Using key and value, e.g. dynamic_facets: [{ "name": "Gaming Experience", "value": "Haptic Feedback" },{ "name": "Gaming Experience", "value": "Adaptive Triggers" } - Return only a JSON."""
       },
       "_ingest": {
         "timestamp": "2025-03-19T22:14:32.0161803Z"
       }
     }
   }
 ]
}<p>Nun wird dem neuen Index ein neues Feld, <strong>dynamic_facets</strong>, hinzugefügt, um die von der KI generierten Facetten zu speichern.</p>PUT videogames_1
{
 "mappings": {
   "properties": {
     "name": { "type": "text" },
     "brand": { "type": "keyword" },
     "storage": { "type": "keyword" },
     "price": { "type": "float" },
     "description": { "type": "text" },
     "dynamic_facets": { "type": "nested",
     "properties": { "name": { "type": "keyword" },
                     "value": { "type": "keyword" } } }
   }
 }
}<p>Mithilfe der <strong>Reindex API</strong> werden wir den <strong>Videospiele-</strong> Index auf <strong>videogames_1</strong> neu indizieren und dabei die <strong>generate_filter_ai-</strong> Pipeline anwenden. Diese Pipeline generiert während der Indizierung automatisch dynamische Facetten.</p>POST _reindex?wait_for_completion=false
{
 "source": {
   "index": "videogames"
 },
 "dest": {
   "index": "videogames_1",
   "pipeline": "generate_filter_ai"
 }
}<p>Nun führen wir eine Suche durch und rufen die neuen Filter ab:</p>GET videogames_1/_search
{
 "size": 0,
 "query": {
   "match": {
     "name": "nintendo"
   }
 },
 "aggs": {
   "dynamic_facets": {
     "nested": {
       "path": "dynamic_facets"
     },
     "aggs": {
       "facets": {
         "terms": {
           "field": "dynamic_facets.name"
         },
         "aggs": {
           "facets": {
             "terms": {
               "field": "dynamic_facets.value"
             }
           }
         }
       }
     }
   }
 }
}<p>Ergebnisse:</p>"aggregations": {
   "dynamic_facets": {
     "doc_count": 3,
     "facets": {
       "doc_count_error_upper_bound": 0,
       "sum_other_doc_count": 0,
       "buckets": [
         {
           "key": "Frame Rate",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "120 FPS",
                 "doc_count": 1
               }
             ]
           }
         },
         {
           "key": "Gaming Resolution",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "4K",
                 "doc_count": 1
               }
             ]
           }
         },
         {
           "key": "Graphics Processing Power",
           "doc_count": 1,
           "facets": {
             "doc_count_error_upper_bound": 0,
             "sum_other_doc_count": 0,
             "buckets": [
               {
                 "key": "12 Teraflops",
                 "doc_count": 1
               }
             ]
           }
         }
       ]
     }
   }
 }<p>Zur Veranschaulichung der Umsetzung der einzelnen Aspekte folgt unten ein einfaches Frontend:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb0d6aa40caf7a91a/6a170b86ab7f0839afdb9eb6/12b6d9d4f4d0985848d92841545fd22b7253ae6d-1600x1288.png" alt="Umsetzung der Aspekte" /><p>Der hier dargestellte UI-Code befindet sich <a href="https://gist.github.com/andreluiz1987/06d9ec1b381e942e9def0e969bd811a0">hier</a>.</p><h2>Fazit</h2><p>Beide Ansätze zur Erstellung von Filtern und Facetten haben ihre Vor- und Nachteile. Der klassische Ansatz, der auf manuellen Regeln basiert, bietet Kontrolle und niedrigere Kosten, erfordert jedoch ständige Aktualisierungen und passt sich nicht dynamisch an neue Produkte oder Funktionen an.</p><p>Andererseits automatisiert der auf KI und maschinellem Lernen basierende Ansatz die Facettenextraktion, wodurch die Suche flexibler wird und die Entdeckung neuer Attribute ohne manuelles Eingreifen ermöglicht wird. Allerdings kann dieser Ansatz in der Umsetzung und Aufrechterhaltung komplexer sein und erfordert eine Kalibrierung, um konsistente Ergebnisse zu gewährleisten.</p><p>Die Wahl zwischen klassischen und KI-basierten Ansätzen hängt von den Bedürfnissen und der Komplexität des Unternehmens ab. Bei einfacheren Szenarien, in denen die Datenattribute stabil und vorhersehbar sind, kann der klassische Ansatz effizienter und einfacher zu warten sein, wodurch unnötige Kosten für Infrastruktur und KI-Modelle vermieden werden. Andererseits kann der Einsatz von ML/KI zur Extraktion von Facetten einen erheblichen Mehrwert bieten, das Sucherlebnis verbessern und die Filterung intelligenter gestalten.</p><p>Wichtig ist es zu beurteilen, ob die Automatisierung die Investition rechtfertigt oder ob eine traditionellere Lösung die Geschäftsanforderungen bereits effektiv erfüllt.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/filters-facets-using-ml</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/filters-facets-using-ml</guid>
    <category><![CDATA[Relevanz]]></category>
    <category><![CDATA[ML-Forschung]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4084864dcdaa25d3/6a170b880c485781f901aaa9/6f196643d573614fe5124705c7e4db9bfce004b0-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 03 Apr 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[So automatisieren Sie Synonyme und laden diese mithilfe unserer Synonym-API hoch.]]></title>
    <description><![CDATA[Erfahren Sie, wie LLMs verwendet werden können, um Synonyme automatisch zu identifizieren und zu generieren, sodass Begriffe programmatisch in die Elasticsearch-Synonym-API geladen werden können.]]></description>
    <content:encoded><![CDATA[<p>Die Verbesserung der Qualität der Suchergebnisse ist unerlässlich für ein effizientes Nutzererlebnis. Eine Möglichkeit zur Optimierung von Suchanfragen besteht darin, die abgefragten Begriffe automatisch durch Synonyme zu erweitern. Dies ermöglicht eine breitere Interpretation von Anfragen, berücksichtigt sprachliche Variationen und verbessert so die Ergebnisübereinstimmung.</p><p>Dieser Blogbeitrag untersucht, wie große Sprachmodelle (LLMs) verwendet werden können, um Synonyme automatisch zu identifizieren und zu generieren, sodass diese Begriffe programmatisch in die Synonym-API von Elasticsearch geladen werden können.</p><h2>Wann verwendet man Synonyme?</h2><p>Die Verwendung von Synonymen kann im Vergleich zur Vektorsuche eine schnellere und kostengünstigere Lösung sein. Die Implementierung ist einfacher, da sie keine tiefgreifenden Kenntnisse über Einbettungen oder einen komplexen Vektor-Ingestionsprozess erfordert.</p><p>Darüber hinaus ist der Ressourcenverbrauch geringer, da die Vektorsuche für die Einbettungsindizierung und den Abruf eine größere Speicherkapazität und einen größeren Arbeitsspeicher benötigt.</p><p>Ein weiterer wichtiger Aspekt ist die Regionalisierung der Suche. Mithilfe von Synonymen ist es möglich, Begriffe an die jeweilige Sprache und die lokalen Gepflogenheiten anzupassen. Dies ist in Situationen nützlich, in denen Einbettungen möglicherweise nicht mit regionalen Ausdrücken oder länderspezifischen Begriffen übereinstimmen. Beispielsweise können manche Wörter oder Akronyme je nach Region unterschiedliche Bedeutungen haben, werden aber von den lokalen Nutzern selbstverständlich als Synonyme behandelt. In Brasilien ist das recht üblich. „Abacaxi“ und „ananás“ bezeichnen die gleiche Frucht (Ananas), wobei der zweite Begriff in einigen Regionen des Nordostens gebräuchlicher ist. Ähnlich verhält es sich mit dem im Südosten bekannten „pão francês“, das im Nordosten als „pão careca“ bekannt ist.</p><h2>Wie kann man LLMs verwenden, um Synonyme zu generieren?</h2><p>Um Synonyme automatisch zu erhalten, können wir LLMs verwenden, die den Kontext eines Begriffs analysieren und passende Variationen vorschlagen. Dieser Ansatz ermöglicht die dynamische Erweiterung von Synonymen und gewährleistet so eine umfassendere und genauere Suche, ohne auf ein festes Wörterbuch angewiesen zu sein.</p><p>In dieser Demonstration verwenden wir ein LLM, um Synonyme für E-Commerce-Produkte zu generieren. Viele Suchanfragen liefern aufgrund von Variationen in den Suchbegriffen nur wenige oder gar keine Ergebnisse. Mit Synonymen können wir dieses Problem lösen. Eine Suche nach „Smartphone“ kann beispielsweise verschiedene Modelle von Mobiltelefonen umfassen, um sicherzustellen, dass die Nutzer die Produkte finden, die sie suchen.</p><h3>Voraussetzungen</h3><p>Bevor wir beginnen, müssen wir die Umgebung einrichten und die erforderlichen Abhängigkeiten definieren. Wir werden die von Elastic bereitgestellte Lösung nutzen, um <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html">Elasticsearch und Kibana lokal in Docker auszuführen</a>. Der Code wird in Python, Version 3.9.6, mit folgenden Abhängigkeiten geschrieben:</p>pip install openai==1.59.8 elasticsearch==8.15.1<h3>Erstellung des Produktindex</h3><p>Zunächst erstellen wir einen Index der Produkte ohne Synonymunterstützung. Dies ermöglicht es uns, Abfragen zu validieren und sie dann mit einem Index zu vergleichen, der Synonyme enthält.</p><p>Um den Index zu erstellen, laden wir einen Produktdatensatz per Massenimport mit folgendem Befehl in den Kibana DevTools:</p>POST _bulk
{"index": {"_index": "products", "_id": 10001}}
{"category": "Electronics", "name": "iPhone 14 Pro"}
{"index": {"_index": "products", "_id": 10007}}
{"category": "Electronics", "name": "MacBook Pro 16-inch"}
{"index": {"_index": "products", "_id": 10013}}
{"category": "Electronics", "name": "Samsung Galaxy Tab S8"}
{"index": {"_index": "products", "_id": 10037}}
{"category": "Electronics", "name": "Apple Watch Series 8"}
{"index": {"_index": "products", "_id": 10049}}
{"category": "Electronics", "name": "Kindle Paperwhite"}
{"index": {"_index": "products", "_id": 10067}}
{"category": "Electronics", "name": "Samsung QLED 4K TV"}
{"index": {"_index": "products", "_id": 10073}}
{"category": "Electronics", "name": "HP Spectre x360 Laptop"}
{"index": {"_index": "products", "_id": 10079}}
{"category": "Electronics", "name": "Apple AirPods Pro"}
{"index": {"_index": "products", "_id": 10115}}
{"category": "Electronics", "name": "Amazon Echo Show 10"}
{"index": {"_index": "products", "_id": 10121}}
{"category": "Electronics", "name": "Apple iPad Air"}
{"index": {"_index": "products", "_id": 10127}}
{"category": "Electronics", "name": "Apple AirPods Max"}
{"index": {"_index": "products", "_id": 10151}}
{"category": "Electronics", "name": "Sony WH-1000XM4 Headphones"}
{"index": {"_index": "products", "_id": 10157}}
{"category": "Electronics", "name": "Google Pixel 6 Pro"}
{"index": {"_index": "products", "_id": 10163}}
{"category": "Electronics", "name": "Apple MacBook Air"}
{"index": {"_index": "products", "_id": 10181}}
{"category": "Electronics", "name": "Google Pixelbook Go"}
{"index": {"_index": "products", "_id": 10187}}
{"category": "Electronics", "name": "Sonos Beam Soundbar"}
{"index": {"_index": "products", "_id": 10199}}
{"category": "Electronics", "name": "Apple TV 4K"}
{"index": {"_index": "products", "_id": 10205}}
{"category": "Electronics", "name": "Samsung Galaxy Watch 4"}
{"index": {"_index": "products", "_id": 10211}}
{"category": "Electronics", "name": "Apple MacBook Pro 16-inch"}
{"index": {"_index": "products", "_id": 10223}}
{"category": "Electronics", "name": "Amazon Echo Dot (4th Gen)"}<h3>Synonyme mit LLM generieren</h3><p>In diesem Schritt verwenden wir ein LLM, um dynamisch Synonyme zu generieren. Um dies zu erreichen, werden wir die OpenAI-API integrieren und ein geeignetes Modell sowie eine entsprechende Eingabeaufforderung definieren. Der LLM erhält die Produktkategorie und den Produktnamen, wobei darauf geachtet wird, dass die Synonyme kontextuell relevant sind.</p>import json
import logging

from openai import OpenAI

def call_gpt(prompt, model):
    try:
        logging.info("generate synonyms by llm...")
        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7,
            max_tokens=1000
        )
        content = response.choices[0].message.content.strip()
        return content
    except Exception as e:
        logging.error(f"Failed to use model: {e}")
        return None

def generate_synonyms(category, products):
   synonyms = {}

   for product in products:
       prompt = f"You are an expert in generating synonyms for products. Based on the category and product name provided, generate synonyms or related terms. Follow these rules:\n"
       prompt += "1. **Format**: The first word should be the main item (part of the product name, excluding the brand), followed by up to 3 synonyms separated by commas.\n"
       prompt += "2. **Exclude the brand**: Do not include the brand name in the synonyms.\n"
       prompt += "3. **Maximum synonyms**: Generate a maximum of 3 synonyms per product.\n\n"
       prompt += f"The category is: **{category}**, and the product is: **{product}**. Return only the synonyms in the requested format, without additional explanations."

       response = call_gpt(prompt, "gpt-4o")
       synonyms[product] = response

   return synonyms<p>Aus dem erstellten Produktindex rufen wir alle Artikel der Kategorie „Elektronik“ ab und senden deren Namen an das LLM. Die erwartete Ausgabe sieht in etwa so aus:</p>{
  "iPhone 14 Pro": ["iPhone", "smartphone", "mobile", "handset"],
  "MacBook Pro 16-inch": ["MacBook", "Laptop", "Notebook", "Ultrabook"],
  "Samsung Galaxy Tab S8": ["Tab", "Tablet", "Slate", "Pad"],
  "Bose QuietComfort 35 Headphones": ["Headphones", "earphones", "earbuds", "headset"]
}<p>Mit den generierten Synonymen können wir diese mithilfe der Synonyms API in Elasticsearch registrieren.</p><h3>Synonyme mit der Synonyms-API verwalten</h3><p>Die Synonyms-API bietet eine effiziente Möglichkeit, Synonymgruppen direkt im System zu verwalten. Jedes Synonymset besteht aus Synonymregeln, nach denen eine Gruppe von Wörtern bei Suchanfragen als gleichwertig behandelt wird.</p><p><strong>Beispiel für die Erstellung eines Synonymsets</strong></p>PUT _synonyms/my-synonyms-set
{
  "synonyms_set": [
    {
      "id": "rule-1",
      "synonyms": "hello, hi"
    },
    {
      "synonyms": "bye, goodbye"
    }
  ]
}<p>
Dadurch entsteht eine Menge namens „meine-Synonyme-Menge“, in der „hello“ und „hi“ sowie „bye“ und „goodbye“ als gleichwertig behandelt werden.</p><h2>Implementierung der Synonymerstellung für den Produktkatalog</h2><p>Nachfolgend ist die Methode aufgeführt, die für den Aufbau eines Synonymsets und dessen Einfügen in Elasticsearch zuständig ist. Die Synonymregeln werden auf der Grundlage der vom LLM vorgeschlagenen Synonymzuordnung generiert. Jede Regel hat eine ID, die dem Produktnamen im Slug-Format entspricht, und die vom LLM berechnete Liste der Synonyme.</p>import json
import logging

from elasticsearch import Elasticsearch
from slugify import slugify

es = Elasticsearch(
    "http://localhost:9200",
    api_key="your_api_key"
)

def mount_synonyms(results):
   synonyms_set = [{"id": slugify(product), "synonyms": synonyms} for product, synonyms in
                   results.items()]

   try:
       response = es.synonyms.put_synonym(id="products-synonyms-set",
                                                 synonyms_set=synonyms_set)

       logging.info(json.dumps(response.body, indent=4))
       return response.body
   except Exception as e:
       logging.error(f"Error create synonyms: {str(e)}")
       return None<p>Nachfolgend die Anfragenutzlast zum Erstellen des Synonymsets:</p>{
   "synonyms_set":[
      {
         "id": "iphone-14-pro",
         "synonyms": "iPhone, smartphone, mobile, handset"
      },
      {
         "id": "macbook-pro-16-inch",
         "synonyms": "MacBook, Laptop, Notebook, Computer"
      },
      {
         "id": "samsung-galaxy-tab-s8",
         "synonyms": "Tablet, Slate, Pad, Device"
      },
      {
         "id": "garmin-forerunner-945",
         "synonyms": "Forerunner, smartwatch, fitness watch, GPS watch"
      },
      {
         "id": "bose-quietcomfort-35-headphones",
         "synonyms": "Headphones, Earphones, Headset, Cans"
      }
   ]
}<p>Nachdem im Cluster ein Synonymset erstellt wurde, können wir zum nächsten Schritt übergehen, nämlich der Erstellung eines neuen Index mit Synonymunterstützung unter Verwendung des definierten Sets.</p><p>Der vollständige Python-Code mit den von LLM generierten Synonymen und der durch die Synonyms-API definierten Erstellung von Synonymsätzen ist unten aufgeführt:</p>import json
import logging

from elasticsearch import Elasticsearch
from openai import OpenAI
from slugify import slugify

logging.basicConfig(level=logging.INFO)

client = OpenAI(
   api_key="your-key",
)

es = Elasticsearch(
    "http://localhost:9200",
    api_key="your_api_key"
)


def call_gpt(prompt, model):
   try:
       logging.info("generate synonyms by llm...")
       response = client.chat.completions.create(
           model=model,
           messages=[{"role": "user", "content": prompt}],
           temperature=0.7,
           max_tokens=1000
       )
       content = response.choices[0].message.content.strip()
       return content
   except Exception as e:
       logging.error(f"Failed to use model: {e}")
       return None


def generate_synonyms(category, products):
   synonyms = {}

   for product in products:
       prompt = f"You are an expert in generating synonyms for products. Based on the category and product name provided, generate synonyms or related terms. Follow these rules:\n"
       prompt += "1. **Format**: The first word should be the main item (part of the product name, excluding the brand), followed by up to 3 synonyms separated by commas.\n"
       prompt += "2. **Exclude the brand**: Do not include the brand name in the synonyms.\n"
       prompt += "3. **Maximum synonyms**: Generate a maximum of 3 synonyms per product.\n\n"
       prompt += f"The category is: **{category}**, and the product is: **{product}**. Return only the synonyms in the requested format, without additional explanations."

       response = call_gpt(prompt, "gpt-4o")
       synonyms[product] = response

   return synonyms


def get_products(category):
   query = {
       "size": 50,
       "_source": ["name"],
       "query": {
           "bool": {
               "filter": [
                   {
                       "term": {
                           "category.keyword": category
                       }
                   }
               ]
           }
       }
   }
   response = es.search(index="products", body=query)

   if response["hits"]["total"]["value"] &gt; 0:
       product_names = [hit["_source"]["name"] for hit in response["hits"]["hits"]]
       return product_names
   else:
       return []


def mount_synonyms(results):
   synonyms_set = [{"id": slugify(product), "synonyms": synonyms} for product, synonyms in
                   results.items()]

   try:
       es_client = get_client_es()
       response = es_client.synonyms.put_synonym(id="products-synonyms-set",
                                                 synonyms_set=synonyms_set)

       logging.info(json.dumps(response.body, indent=4))
       return response.body
   except Exception as e:
       logging.error(f"Erro update synonyms: {str(e)}")
       return None


if __name__ == '__main__':
   category = "Electronics"
   products = get_products("Electronics")
   llm_synonyms = generate_synonyms(category, products)
   mount_synonyms(llm_synonyms)<h3>Erstellen eines Index mit Synonymunterstützung</h3><p>Es wird ein neuer Index erstellt, in dem alle Daten aus dem Index <code>products</code> neu indiziert werden. Dieser Index verwendet <code>synonyms_filter</code>, der den zuvor erstellten <code>products-synonyms-set</code> anwendet.</p><p>Nachfolgend die Indexzuordnung, die für die Verwendung von Synonymen konfiguriert ist:</p>PUT products_02
{
  "settings": {
    "analysis": {
      "filter": {
        "synonyms_filter": {
          "type": "synonym",
          "synonyms_set": "products-synonyms-set",
          "updateable": true
        }
      },
      "analyzer": {
        "synonyms_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "synonyms_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "ID": {
        "type": "long"
      },
      "category": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "analyzer": "standard",
        "search_analyzer": "synonyms_analyzer"
      }
    }
  }
}<h3>Neuindizierung des Index <code>products</code></h3><p>Nun werden wir die <strong>Reindex-API</strong> verwenden, um die Daten vom Index <code>products</code> in den neuen Index <code>products_02</code> zu migrieren, der auch Synonymunterstützung beinhaltet. Der folgende Code wurde in den Kibana DevTools ausgeführt:
</p>POST _reindex
{
  "source": {
    "index": "products"
  },
  "dest": {
    "index": "products_02"
  }
}<p>Nach der Migration wird der Index <code>products_02</code> gefüllt sein und kann Suchanfragen mithilfe des konfigurierten Synonymsets validieren.</p><h3>Suche mit Synonymen validieren</h3><p>Lassen Sie uns die Suchergebnisse der beiden Indizes vergleichen. Wir werden die gleiche Abfrage auf beiden Indizes ausführen und überprüfen, ob die Synonyme verwendet werden, um Ergebnisse abzurufen.</p><h4>Suche im Index <code>products</code> (ohne Synonyme)</h4><p>Wir werden Kibana verwenden, um Suchvorgänge durchzuführen und die Ergebnisse zu analysieren. Im Menü „Analytics &gt; Discovery“ erstellen wir eine Datenansicht, um die Daten aus den von uns erstellten Indizes zu visualisieren.</p><p>Klicken Sie innerhalb von Discovery auf Datenansicht und definieren Sie einen Namen und ein Indexmuster. Für den Index "<strong>Produkte</strong>" verwenden wir das Muster "<strong>Produkte</strong> ". Anschließend wiederholen wir den Vorgang, um eine neue Datenansicht für den Index "<strong>products_02</strong>" zu erstellen, wobei wir das Muster "<strong>products_02 "</strong> verwenden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte826fd932cfeb9df/6a17fdffec0f8912aa5a6841/3ad4a6891a3905e96532a312932fdf3a8216aec2-1600x599.png" alt="" /><p>Nachdem die Datenansichten konfiguriert sind, können wir zu Analytics &gt; Discovery zurückkehren und die Validierungen starten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba3729c60068e8a0/6a17fe01e9ea87ba2aa9c82a/422c4b2b51abae6580cad25085d1b8a365fc6b9e-1294x850.png" alt="" /><p>Hier erhalten wir nach Auswahl der DataView-Produkte und einer Suche nach dem Begriff „Tablet“ keine Ergebnisse, obwohl wir wissen, dass es Produkte wie „Kindle Paperwhite“ und „Apple iPad Air“ gibt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c6a383dd4cb0157/6a17fe02577262671d1bce0c/e4ae3a785fdd93f48d7c7d204185ded149126f2c-1600x862.png" alt="" /><h4>Suche im Index <code>products_02</code> (unterstützt Synonyme)</h4><p>Bei der Durchführung derselben Abfrage in der Datenansicht "<strong>products_synonyms</strong>", die Synonyme unterstützt, wurden die Produkte erfolgreich abgerufen. Dies beweist, dass die konfigurierte Synonymgruppe korrekt funktioniert und sicherstellt, dass verschiedene Variationen der Suchbegriffe die erwarteten Ergebnisse liefern.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt986b4706e2f70014/6a17fe043e9e454edbba16d3/e609749c39e90d5c82fa846af6124679dd62bcb8-1600x526.png" alt="" /><p>Das gleiche Ergebnis lässt sich erzielen, indem man dieselbe Abfrage direkt in den Kibana DevTools ausführt. Suchen Sie einfach im Index products_02 mithilfe der Elasticsearch Search API:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbe829a3c4d7aac60/6a17fe05e8fbce03d73a1bd7/504d0d1f96dcfbceb309063dc0716bcee64ad2f8-1600x870.png" alt="" /><h2>Fazit</h2><p>Die Implementierung von Synonymen in Elasticsearch verbesserte die Genauigkeit und Abdeckung der Produktkatalogsuche. Der entscheidende Unterschied bestand in der Verwendung eines <strong>LLM</strong>, das Synonyme automatisch und kontextbezogen generierte, wodurch die Notwendigkeit vordefinierter Listen entfiel. Das Modell analysierte Produktnamen und Kategorien und stellte dabei relevante Synonyme für den E-Commerce sicher.</p><p>Darüber hinaus vereinfachte die <strong>Synonyms-API</strong> die Wörterbuchverwaltung, sodass Synonymsätze dynamisch geändert werden können. Mit diesem Ansatz wurde die Suche flexibler und besser an unterschiedliche Suchanfragen der Nutzer anpassbar.</p><p>Dieser Prozess kann durch neue Daten und Modellanpassungen kontinuierlich verbessert werden, wodurch ein immer effizienteres Forschungserlebnis gewährleistet wird.</p><h2>Referenzen</h2><p><strong>Elasticsearch lokal ausführen</strong></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/run-elasticsearch-locally.html</a></p><p><strong>Synonyms API</strong></p><p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/synonyms-apis.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/synonyms-apis.html</a></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-synonyms-automate</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-synonyms-automate</guid>
    <category><![CDATA[Relevanz]]></category>
    <category><![CDATA[Grundlagen]]></category>
    <dc:creator><![CDATA[Andre Luiz]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0f0247b9bc1d1ccd/6a17fe07ec0f891c745a6845/05a3cfeaa387561d5334ca3f1609035ddfff7481-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Skalierung von späten Interaktionsmodellen in Elasticsearch – Teil 2]]></title>
    <description><![CDATA[Dieser Artikel behandelt Techniken, mit denen sich späte Interaktionsvektoren für groß angelegte Produktions-Workloads vorbereiten lassen, beispielsweise durch Reduzierung des Festplattenspeichers und Verbesserung der Recheneffizienz.]]></description>
    <content:encoded><![CDATA[<p>In unserem <a href="https://www.elastic.co/search-labs/blog/elastiacsearch-colpali-document-search">vorherigen Blog über ColPali</a> haben wir uns mit der Erstellung visueller Suchanwendungen mit Elasticsearch befasst. Wir haben uns vor allem auf den Wert konzentriert, den Modelle wie ColPali für unsere Anwendungen bieten, allerdings weisen sie im Vergleich zur Vektorsuche mit Bi-Encodern wie E5 Leistungsnachteile auf.</p><p>Aufbauend auf den Beispielen aus <a href="https://www.elastic.co/search-labs/blog/elastiacsearch-colpali-document-search">Teil 1</a> befasst sich dieser Blog damit, wie verschiedene Techniken und das leistungsstarke Toolkit zur Vektorsuche von Elasticsearch zur Bereitstellung später Interaktionsvektoren für umfassende Produktions-Workloads genutzt werden können.</p><p>Die vollständigen Code-Beispiele finden Sie auf <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/colpali">GitHub.</a></p><h2>Herausforderungen bei späten Interaktionsmodellen</h2><p>ColPali erstellt über 1000 Vektoren pro Seite für die Dokumente in unserem Index.</p><p>Dies führt zu zwei Herausforderungen bei der Arbeit mit späten Interaktionsvektoren:</p><ol><li><p>Speicherplatz: Das Speichern all dieser Vektoren auf Festplatten wird einen erheblichen Speicherplatzbedarf verursachen, was in großem Maßstab teuer wird.</p></li><li><p>Berechnung: Wenn wir unsere Dokumente mit dem <code>maxSimDotProduct()</code>-Vergleich bewerten, müssen wir alle diese Vektoren für jedes unserer Dokumente mit den N-Vektoren unserer Abfrage vergleichen.</p></li></ol><p>Sehen wir uns einige Techniken zur Bewältigung dieser Probleme an.</p><h2>Techniken zur Optimierung von späten Interaktionsmodellen</h2><h3>Bit-Vektoren</h3><p>Um den Festplattenspeicher zu reduzieren, können wir die Bilder in Bitvektoren komprimieren. Wir können eine einfache Python-Funktion verwenden, um unsere Multivektoren in Bitvektoren umzuwandeln.</p>def to_bit_vectors(embeddings: list) -&gt; list:
    return [
        np.packbits(np.where(np.array(embedding) &gt; 0, 1, 0))
        .astype(np.int8)
        .tobytes()
        .hex()
        for embedding in embeddings
    ]<p>Das Kernkonzept der Funktion ist einfach: Werte über 0 werden zu 1 und Werte unter 0 werden zu 0. Daraus ergibt sich ein Array aus Nullen und Einsen, das wir dann in eine Hexadezimalzeichenfolge umwandeln, die unseren Bitvektor darstellt.</p><p>Für unser Index-Mapping setzen wir den Parameter <code>element_type</code> auf <code>bit</code>:</p>mappings = {
    "mappings": {
        "properties": {
            "col_pali_vectors": {
                "type": "rank_vectors",
                "element_type": "bit"
            }
        }
    }
}

es.indices.create(index=INDEX_NAME, body=mappings)<p>Nachdem wir alle unsere neuen Bitvektoren in unseren Index geschrieben haben, können wir unsere Bitvektoren mit folgendem Code bewerten:</p>query = "What do companies use for recruiting?"
query_vector = to_bit_vectors(create_col_pali_query_vectors(query))
es_query = {
    "_source": False,
    "query": {
        "script_score": {
            "query": {
                "match_all": {}
            },
            "script": {
                "source": "maxSimInvHamming(params.query_vector, 'col_pali_vectors')",
                "params": {
                    "query_vector": query_vector
                }
            }
        }
    },
    "size": 5
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcaf0c8f999d68701/6a17f46696142a6f46eb1c56/51b989446e4099745971e1eac27d147a78d13e0a-1600x480.png" alt="" /><p>Durch einen geringen Verlust an Genauigkeit können wir den Hamming-Abstand (<code>maxSimInvHamming(...)</code>) verwenden, wodurch Optimierungen wie Bitmasken oder SIMD genutzt werden können. Mehr über <a href="https://www.elastic.co/search-labs/blog/bit-vectors-in-elasticsearch">Bitvektoren und den Hamming-Abstand erfahren Sie in unserem Blog</a>.</p><p>Alternativ können wir unseren Abfragevektor nicht in Bitvektoren umwandeln und mit dem vollwertigen späten Interaktionsvektor suchen:</p>query = "What do companies use for recruiting?"
query_vector = create_col_pali_query_vectors(query)
es_query = {
    "_source": False,
    "query": {
        "script_score": {
            "query": {
                "match_all": {}
            },
            "script": {
                "source": "maxSimDotProduct(params.query_vector, 'col_pali_vectors')",
                "params": {
                    "query_vector": query_vector
                }
            }
        }
    },
    "size": 5
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2fa6c89fb451b6e0/6a17f468af47b65da9cde0d9/89f3c795c6dc44b2f7d46801320288316b47e1b2-1600x488.png" alt="Ergebnisse der Verwendung von Bitvektoren zur Optimierung von späten Interaktionsmodellen" /><p>Hierbei werden unsere Vektoren mithilfe einer asymmetrischen Ähnlichkeitsfunktion verglichen.</p><p></p><p>Betrachten wir den regulären Hamming-Abstand zwischen zwei Bitvektoren. Angenommen, wir haben einen Dokumentenvektor <em>D:</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4b6ece1ec4dedac/6a17f4694b055d248143234e/366a70a23e37d403788327b7aefc873fd4482f5e-1235x86.png" alt="" /><p>Und ein Abfragevektor <em>Q:</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7721df9c8f0d84f1/6a17f46b3e03d77cf54f2dcb/978ec31e0afbc0eaebf548a015b628c0cad84625-1247x84.png" alt="" /><p></p><p>Eine einfache binäre Quantisierung transformiert Vektoren <em>D</em> in <code>10101101</code> und <em>Q</em> in <code>11111011</code>. Um den Hamming-Abstand zu ermitteln, benötigen wir direkte Bit-Mathematik – die extrem schnell ist. In diesem Fall ist der Hamming-Abstand <code>01010110</code>, was einer Bitanzahl von 4 entspricht. Das Scoring wird also zum Kehrwert dieses Hamming-Abstands. Denken Sie daran, dass ähnlichere Vektoren einen KLEINEREN Hamming-Abstand aufweisen, sodass durch die Umkehrung ähnlichere Vektoren eine höhere Bewertung erhalten können. Konkret wäre hier der Wert 1/4 = <code>0.25</code>.</p><p>Beachten Sie jedoch, wie wir die Größenordnung jeder Dimension verlieren. Ein <code>1</code> ist ein <code>1</code>. Für <em>Q</em> verschwindet also der Unterschied zwischen <code>0.01</code> und <code>0.79</code>. Da wir lediglich gemäß <code>&gt;0</code> quantisieren, können wir einen kleinen Trick anwenden, bei dem der Q-Vektor nicht quantisiert wird. Dies ermöglicht zwar keine extrem schnellen Bitoperationen, hält aber die Speicherkosten niedrig, da D weiterhin quantisiert wird.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blted50315518e2d599/6a17f46c414c6463709452d3/508e8498ba969534d2a0131d431c75735fc27cb9-1399x611.png" alt="" /><p>Das bedeutet, dass die in <em>Q</em> enthaltenen Informationen erhalten bleiben, wodurch die Qualität der Entfernungsschätzung verbessert und der Speicherbedarf gering gehalten wird.</p><p>Durch die Verwendung von Bitvektoren können wir bei der Abfragezeit deutlich an Festplattenspeicher und Rechenaufwand sparen. Aber wir können noch mehr tun.</p><h3>Mittlere Vektoren</h3><p>Um unsere Suche auf Hunderttausende von Dokumenten auszuweiten, reichen selbst die Leistungsvorteile, die Bitvektoren bieten, nicht aus. Für die Skalierung dieser Art von Workloads werden wir die HNSW-Indexstruktur von Elasticsearch für die Vektorsuche nutzen wollen.</p><p>ColPali generiert etwa tausend Vektoren pro Dokument. Das sind zu viele, um sie zu unserem HNSW-Graph hinzuzufügen. Daher müssen wir die Anzahl der Vektoren reduzieren. Dazu können wir eine einzige Repräsentation der Bedeutung des Dokuments erstellen, indem wir den Durchschnitt aller Dokumentvektoren bilden, die von ColPali beim Einbetten unseres Bildes erzeugt werden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc053425fbfcf8de8/6a17f46f148009faf1b488aa/7c3b4dffb70bd95f67deb35f8c01e73c5286c2ab-1476x1102.png" alt="Mittlerer Vektor über alle späten Interaktionsvektoren" /><p>Aktuell ist das innerhalb von Elastic selbst nicht möglich, daher müssen wir die Vektoren vorverarbeiten, bevor wir sie in Elasticsearch ingestieren können. </p><p>Das ist mit Logstash- oder Ingest-Pipelines möglich, jedoch verwenden wir hier eine einfache Python-Funktion:</p>def to_avg_vector(vectors):
    vectors_array = np.array(vectors)
    
    avg_vector = np.mean(vectors_array, axis=0)
    
    norm = np.linalg.norm(avg_vector)
    if norm &gt; 0:
        normalized_avg_vector = avg_vector / norm
    else:
        normalized_avg_vector = avg_vector

    return normalized_avg_vector.tolist()<p>Außerdem normalisieren wir den Vektor, damit wir die Ähnlichkeit des Skalarprodukts verwenden können.</p><p>Nachdem wir alle unsere ColPali-Vektoren in mittlere Vektoren umgewandelt haben, können wir sie in unser dense_vector-Feld indexieren:</p>mappings = {
    "mappings": {
        "properties": {
            "avg_vector": {
                "type": "dense_vector",
                "dims": 128,
                "index": True,
                "similarity": "dot_product"
            },
            "col_pali_vectors": {
                "type": "rank_vectors",
                "element_type": "bit"
            }
        }
    }
}

es.indices.create(index=INDEX_NAME, body=mappings)<p>Wir müssen berücksichtigen, dass dadurch die gesamte Festplattennutzung erhöht wird, da wir neben unseren späten Interaktionsvektoren mehr Informationen speichern. Zusätzlich werden wir zusätzlichen RAM für den HNSW-Graphen verwenden, wodurch wir die Suche auf Milliarden von Vektoren skalieren können. Um den RAM-Verbrauch zu reduzieren, können wir unser beliebtes <a href="https://www.elastic.co/search-labs/blog/optimized-scalar-quantization-elasticsearch">BBQ-Feature</a> nutzen. Dadurch erhalten wir schnelle Suchergebnisse über enorme Datensätze, die sonst nicht möglich wären.</p><p>Jetzt suchen wir einfach mit der kNN-Abfrage, um unsere relevantesten Dokumente zu finden.</p>query = "What do companies use for recruiting?"
query_vector = to_avg_vector(create_col_pali_query_vectors(query))
es_query = {
    "_source": False,
    "knn": {
        "field": "avg_vector",
        "query_vector": query_vector,
        "k": 10,
        "num_candidates": 100
    },
    "size": 5
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf4ac6b7fd444f935/6a17f471a29299d76ad02dc0/a500f9907020f032c3b1c7a48ed8c759dc2a1dd4-1600x498.png" alt="" /><p>Das bisher beste Ergebnis ist leider auf Platz 3 abgerutscht.</p><p>Um dieses Problem zu beheben, können wir ein mehrstufiges Abrufen durchführen. Im ersten Schritt verwenden wir die kNN-Abfrage, um unter Millionen von Dokumenten die besten Kandidaten für unsere Abfrage zu suchen. Im zweiten Schritt ordnen wir nur die besten k (hier: 10) mit der höheren Genauigkeit der späten ColPali-Interaktionsmodelle neu. </p>query = "What do companies use for recruiting?"
col_pali_vector = create_col_pali_query_vectors(query)
avg_vector = to_avg_vector(col_pali_vector)
es_query = {
  "_source": False,
  "retriever": {
    "rescorer": {
      "retriever": {
        "knn": {
          "field": "avg_vector",
          "query_vector": avg_vector,
          "k": 10,
          "num_candidates": 100
        }
      },
      "rescore": {
        "window_size": 10,
        "query": {
          "rescore_query": {
            "script_score": {
              "query": {
                "match_all": {}
              },
              "script": {
                "source": "maxSimDotProduct(params.query_vector, 'col_pali_vectors')",
                "params": {
                  "query_vector": col_pali_vector
                }
              }
            }
          }
        }
      }
    }
  },
  "size": 5
}<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt265edd5f37be40b7/6a17f4733e9e45583dba15e6/797f490860af87fcf29f34668a5c4511419c6fd0-1600x501.png" alt="Ergebnisse der Verwendung von mittleren Vektoren zur Optimierung von späten Interaktionsmodellen" /><p>Hier verwenden wir den in 8.18 vorgestellten <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.18/retriever.html#rescorer-retriever">Rescore-Retriever</a> zum Reranking unserer Ergebnisse. Nach dem Rescoring sehen wir, dass unser bester Treffer wieder an erster Stelle steht. </p><p>Hinweis: In einer Produktionsanwendung können wir einen viel höheren Wert für k als 10 verwenden, da die Max-Sim-Funktion immer noch vergleichsweise leistungsfähig ist.</p><h3>Token-Pooling</h3><p>Token-Pooling reduziert die Sequenzlänge von Multi-Vektor-Einbettungen, indem redundante Informationen wie weiße Hintergrund-Patches gepoolt werden. Diese Technik verringert die Anzahl der Einbettungen, während der Großteil des Seitensignals erhalten bleibt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3d643e6ac908f640/6a17f4754b055d3783432352/09eae0b768f4b450e555d7e53e57561bd52de2c0-1412x1056.png" alt="Token-Pooling zur Optimierung von späten Interaktionsmodellen" /><p>Token-Pooling funktioniert, indem ähnliche Token-Einbettungen innerhalb eines Dokuments mithilfe eines Clustering-Algorithmus in Cluster gruppiert werden. Anschließend wird der Mittelwert der Vektoren in jedem Cluster berechnet, um eine einzige, aggregierte Darstellung zu erzeugen. Dieser aggregierte Vektor ersetzt die ursprünglichen Token in der Gruppe und reduziert die Gesamtzahl der Vektoren ohne nennenswerten Verlust des Dokumentsignals.</p><p>Im ColPali-Paper wird für die meisten Datensätze ein anfänglicher Pooling-Faktor von 3 vorgeschlagen, der 97,8 % der ursprünglichen Leistung beibehält und gleichzeitig die Gesamtzahl der Vektoren um 66,7 % reduziert. </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d78a15c6944a1ea/6a17f477414c64a2929452d9/343cc9eaf54af8c7a125d4115838f3c7d5659de0-1600x1007.png" alt="Poolfaktor für die Optimierung von späten Interaktionsmodellen" /><p>Aber Vorsicht ist geboten: Der Datensatz „Shift“, der sehr dichte, textlastige Dokumente mit wenig Leerzeichen enthält, zeigt eine rapide Leistungsverschlechterung bei steigenden Poolfaktoren.</p><p>Um die gepoolten Vektoren zu erstellen, können wir die Bibliothek colpali_engine verwenden:</p>from colpali_engine.compression.token_pooling import HierarchicalTokenPooler

pooler = HierarchicalTokenPooler(pool_factor=3) # test on your data for a good pool_factor

def pool_vectors(embedding: list) -&gt; list:
    tensor = torch.tensor(embedding).unsqueeze(0)
    pooled = pooler.pool_embeddings(tensor)
    return pooled.squeeze(0).tolist()<p>Wir haben nun einen Vektor, der in seinen Dimensionen um etwa 66,7 % reduziert wurde. Wir indexieren ihn wie üblich und können mit unserer <code>maxSimDotProduct()</code>-Funktion danach suchen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc460c14031814ede/6a17f4794202292bf629f72d/2412c5db7d79a590b96d42fe01f140c42f010612-1600x481.png" alt="Ergebnisse später Interaktionsmodelle" /><p>Wir erzielen gute Suchergebnisse, auch wenn die Genauigkeit der Ergebnisse dadurch etwas beeinträchtigt wird.</p><p>Tipp: Mit einem höheren pool_factor (100–200) kann man auch einen Mittelweg zwischen der mittleren Vektorlösung und der hier besprochenen Lösung finden. Bei etwa 5–10 Vektoren pro Dokument ist es sinnvoll, diese in einem verschachtelten Feld zu indizieren, um den HNSW-Index optimal zu nutzen.</p><h2>Cross-Encoder vs. späte Interaktion vs. Bi-Encoder</h2><p>Auf Grundlage unserer bisherigen Erkenntnisse stellt sich die Frage: Wo ordnen sich späte Interaktionsmodelle wie ColPali oder ColBERT im Vergleich zu anderen KI-gestützten Retrieval-Techniken ein?</p><p>Obwohl die Max-Sim-Funktion im Vergleich zu Cross-Encodern günstiger ist, erfordert sie dennoch deutlich mehr Vergleiche und Berechnungen als die Vektorsuche mit Bi-Encodern, bei denen wir einfach zwei Vektoren für jedes Abfrage-Dokumentpaar vergleichen. </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbfd97f3bba3e5b17/6a17f47be31791b0052d5943/75e1fc9e601aa7a6e88f137565c1919166c7a71c-1480x458.png" alt="Cross-Encoder vs. späte Interaktionsmodelle vs. Bi-Encoder" /><p>Aus diesem Grund empfehlen wir, späte Interaktionsmodelle generell nur für das Reranking der besten k-Suchergebnisse zu verwenden. Wir halten das auch im Namen des Feldtyps fest: rank_vectors.</p><p>Aber was ist mit dem Cross-Encoder? Sind späte Interaktionsmodelle besser, weil sie zum Zeitpunkt der Abfrage günstiger auszuführen sind? Wie so oft lautet die Antwort: Es kommt darauf an. Cross-Encoder liefern in der Regel qualitativ hochwertigere Ergebnisse, sind aber sehr rechenintensiv, da die abgefragten Dokumentenpaare das Transformatormodell vollständig durchlaufen müssen. Sie profitieren außerdem davon, dass sie keine Indizierung von Vektoren erfordern und zustandslos arbeiten können. Dies führt zu Folgendem:</p><ul><li><p>Weniger verwendeter Festplattenspeicher</p></li><li><p>Ein einfacheres System</p></li><li><p>Höhere Qualität der Suchergebnisse</p></li><li><p>Höhere Latenz und daher keine Möglichkeit, ein umfassendes Reranking vorzunehmen</p></li></ul><p>Andererseits können späte Interaktionsmodelle einen Teil dieser Berechnungen beim Indizieren auslagern, wodurch die Abfrage kostengünstiger wird. Der Preis, den wir dafür zahlen, ist, dass wir die Vektoren indizieren müssen, was unsere Indizierungspipelines komplexer macht und auch mehr Festplattenspeicher zum Speichern dieser Vektoren erfordert.</p><p>Insbesondere im Fall von ColPali ist die Analyse von Informationen aus Bildern sehr teuer, da sie viele Daten enthalten. In diesem Fall verschiebt sich der Kompromiss zugunsten eines späten Interaktionsmodells wie ColPali, da die Bewertung dieser Informationen zur Abfragezeit zu ressourcenintensiv bzw. zu langsam wäre. </p><p>Bei einem späten Interaktionsmodell wie ColBERT, das wie die meisten Cross-Encoder (z. B. elastic-rerank-v1) mit Textdaten arbeitet, könnte die Entscheidung eher zugunsten des Cross-Encoders ausfallen, um von den Festplattenspeicherersparnissen und der Einfachheit zu profitieren.</p><p>Wir empfehlen Ihnen, die Vor- und Nachteile für Ihren Anwendungsfall abzuwägen und mit den verschiedenen Tools von Elasticsearch zu experimentieren, um die besten Suchanwendungen zu entwickeln.</p><h2>Fazit</h2><p>In diesem Blog befassen wir uns mit verschiedenen Techniken zur Optimierung von späten Interaktionsmodellen wie ColPali für umfassende Vektorsuche in Elasticsearch. Während späte Interaktionsmodelle ein gutes Gleichgewicht zwischen Retrieval-Effizienz und Ranking-Qualität bieten, bringen sie auch Herausforderungen in Bezug auf Speicher und Berechnung mit sich.</p><p>Für die Bewältigung dieser Herausforderungen haben wir Folgendes untersucht:</p><ul><li><p><strong>Bitvektoren</strong> zur deutlichen Reduzierung des Festplattenspeichers bei gleichzeitiger Nutzung effizienter Ähnlichkeitsberechnungen wie dem Hamming-Abstand oder der asymmetrischen maximalen Ähnlichkeit.</p></li><li><p><strong>Mittlere Vektoren</strong> zur Komprimierung mehrerer Einbettungen in eine einzige dichte Darstellung, wodurch ein effizientes Abrufen mit HNSW-Indizierung ermöglicht wird.</p></li><li><p><strong>Token-Pooling</strong> zur intelligenten Zusammenführung redundanter Einbettungen unter Beibehaltung der semantischen Integrität, wodurch der Rechenaufwand zum Zeitpunkt der Abfrage reduziert wird.</p></li></ul><p>Elasticsearch bietet ein leistungsstarkes Toolkit zur Anpassung und Optimierung von Suchanwendungen gemäß Ihren Anforderungen. Unabhängig davon, ob Sie Retrieval-Geschwindigkeit, Ranking-Qualität oder Speichereffizienz priorisieren – mit diesen Tools und Techniken können Sie die Leistung und Qualität entsprechend den Anforderungen Ihrer Anwendungen in der Praxis aufeinander abstimmen.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/late-interaction-model-colpali-scale</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/late-interaction-model-colpali-scale</guid>
    <category><![CDATA[Relevanz]]></category>
    <category><![CDATA[Vektordatenbank]]></category>
    <dc:creator><![CDATA[Peter Straßer,Benjamin Trent]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt97a536033e6b0a56/6a17f47dfbc5f88c86491c0d/c780b78a07573f2df1cfef8b29a7109f839b0ab3-1200x628.png" length="0" type="image/png"/>
    <pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>