<?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[Inside Elastic - 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[Inside Elastic - 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/inside-elastic</link>
    </image>
    <link>https://www.elastic.co/de/search-labs/blog/category/inside-elastic</link>
    <atom:link href="https://www.elastic.co/de/search-labs/rss/category/inside-elastic.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[de]]></language>
    <lastBuildDate>Tue, 29 Sep 2026 10:24:03 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Wie wir Elasticsearch simdvec entwickelten, um die Vektorsuche zu einer der schnellsten weltweit zu machen]]></title>
    <description><![CDATA[Wie wir Elasticsearch simdvec entwickelten, die von Hand optimierte SIMD-Kernel-Bibliothek hinter jeder Vektorsuchanfrage in Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch simdvec ist die Engine hinter jeder Vektordistanzberechnung in Elasticsearch. Sie bietet von Hand optimierte AVX-512- und NEON-Kernel für jeden von Elasticsearch unterstützten Vektortyp. Ihre Bulk-Scoring-Architektur verbirgt Speicherlatenz durch explizites Prefetching auf x86 und verschachteltes Laden auf ARM und übertrifft Bibliotheken wie FAISS und jvector um das bis zu Vierfache, wenn Daten den CPU-Cache überschreiten. In diesem Beitrag geht es darum, warum wir sie entwickelt haben, was darin steckt und wie sie die Vektorsuche in Elasticsearch zu einer der schnellsten weltweit macht.</p><h2>Wie wir Elasticsearch simdvec entwickelten</h2><p>Jede Vektorsuchanfrage in Elasticsearch, sei es ein <a href="https://arxiv.org/abs/1603.09320">Hierarchical Navigable Small World (HNSW)</a> Traversal, ein Inverted File (IVF) Scan oder ein Reranking-Pass, reduziert sich auf dasselbe Problem: die Berechnung der Distanzen zwischen Vektoren, und zwar millionenfach pro Anfrage. Elasticsearch unterstützt eine breite Palette von Datentypen und Quantisierungsstrategien, von float32 über int8, bfloat16, binär und Better Binary Quantization (BBQ). Jede Option bringt unterschiedliche Kompromisse zwischen Speicher, Durchsatz und Abruf mit sich. Hinter all dem steht eine einzige Engine: simdvec.</p><p>Wir haben simdvec so entwickelt, dass jede Entfernungsberechnung so schnell erfolgt, wie es die Hardware erlaubt. In diesem Beitrag geht es darum, warum wir sie entwickelt haben, was in ihr steckt und wo sie die größte Wirkung erzielt.</p><h3>Gebaut wie ein Rennwagen</h3><p>Als Formel-1-Enthusiasten, mit einer Person, die bereits mit dem Formel-1-Team von Ferrari gearbeitet hat, sehen wir eine klare Parallele. Ein Formel-1-Wagen wird mit einem einzigen Ziel entwickelt: die beste Rundenzeit zu erzielen. Motorleistung, Aerodynamik und Fahrwerkskonstruktion spielen nur insofern eine Rolle, als dass sie zu diesem Ergebnis beitragen. Das Gleiche gilt für eine Vektordatenbank, in der Indexierungsdurchsatz, Abfragelatenz und Rückruf den Erfolg definieren.</p><p>Das Endergebnis ist zwar wichtig, aber um ein Höchstmaß an Leistung zu erreichen, muss jede Komponente ihr Bestes geben. Es reicht nicht, wenn sie <em>einfach nur gut</em> sind, sie müssen die <em>Besten </em>in ihrer Kategorie sein. Simdvec wurde mit dieser Denkweise entwickelt und konzentriert sich auf einen entscheidenden Teil des Systems: die Engine. Sie ist eine zweckgebundene, <a href="https://en.wikipedia.org/wiki/Single_instruction,_multiple_data">Single Instruction Multiple Data</a> (SIMD) optimierte Kernel-Bibliothek, die von Hand optimierte, native C++ Distanzfunktionen bereitstellt, die von Java über die <a href="https://openjdk.org/projects/panama/">Panama</a> Foreign Function Interface (FFI) aufgerufen werden. Sie unterstützt Bulk-Scoring, Prefetching von Cache-Linien sowie alle in Elasticsearch verwendeten Vektortypen und Layouts.</p><p>Das ist der Motor hinter jeder Abfrage.</p><h3>Warum wir unser eigenes System entwickelt haben</h3><p>Wir haben 2023 mit der Panama Vector API in Apache Lucene begonnen. Für float32-Punktprodukte war das zunächst ideal, doch die Anforderungen von Elasticsearch überstiegen schnell die Möglichkeiten des Systems. Elasticsearch unterstützt eine breite Palette quantisierter Vektortypen: int8, int4, bfloat16, Single-Bit und asymmetrisches BBQ. Jedes System verfügt über unterschiedliche SIMD-Strategien, Packungs- und Akkumulatoranforderungen. Über die Typabdeckung hinaus verlangen die Scoring-Pfade von Elasticsearch mehr als einen Durchsatz für einzelne Paare: HNSW muss mehrere Graphnachbarn in einem Durchgang bewerten, IVF benötigt eine Massenbewertung von Tausenden von Kandidaten mit Vorabruf und die auf Festplatten basierte Bewertung muss direkt auf dem mmap-Speicher arbeiten, ohne zu kopieren. Kein Angebot auf dem Markt deckte das gesamte Spektrum ab.</p><p>Also haben wir simdvec entwickelt: Von Hand optimierte, native C++-Kernel, die über FFI aus Java aufgerufen werden, mit Bulk-Scoring, Prefetching und Unterstützung für jeden von Elasticsearch verwendeten Vektortyp. Als Inhaber der Bibliothek kontrollieren wir den gesamten Stack. Wenn wir einen neuen Quantisierungstyp wie BBQ hinzufügen, wird ein optimierter SIMD-Kernel im gesamten System integriert. Wir warten nicht auf die Unterstützung durch eine Upstream-Bibliothek und gehen absolut keine Kompromisse bei der Leistung ein. Jede Vektorabfrage in Elasticsearch, ob HNSW, IVF, Reranking oder Hybrid, läuft auf dieser Engine, die auf den von uns tatsächlich verwendeten Operationen und Typen aufbaut.</p><p>Simdvec verfügt über separate native Bibliotheken für x86 und ARM, wobei jeweils mehrere ISA-Ebenen (Instruction Set Architecture) beim Starten ausgewählt werden. Der Call-Overhead von Java über FFI ist mit <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md#ffm-downcall-overhead-measurements">einstelligen Nanosekunden</a> sehr gering.</p><h3>Die Landschaft</h3><p>Wir sind nicht die Einzigen, die SIMD-optimierte Vektordistanz-Kernel erstellen. Das Ökosystem ist vielfältig und wir wollten verstehen, wie simdvec funktioniert. Nicht um Projekte zu bewerten, sondern um Kontext zu liefern und zu erklären, wo die Elasticsearch-Engine angesiedelt ist. Wir haben drei Projekte als Referenzpunkte ausgewählt, die jeweils einen anderen Ansatz repräsentieren:</p><ul><li><p><strong>jvector:</strong> Eine Java-Bibliothek für Approximate Nearest Neighbor (ANN), die die Panama Vector API für vektorisierte Entfernungsberechnungen verwendet, mit optionaler nativer C-Beschleunigung auf x86.</p></li><li><p><strong>FAISS:</strong> Ein weit verbreitetes Open-Source-Framework zur Vektorsuche mit von Hand optimierten AVX2/AVX-512-Kernel.</p></li><li><p><strong>NumKong</strong> (ehemals SimSIMD): Eine umfassende Suite von über 2.000 von Hand optimierten SIMD-Kernel über Distanzfunktionen, Matrixoperationen und georäumliche Berechnungen.</p></li></ul><p>Jedes Projekt verfolgt einen anderen Zweck und geht unterschiedliche Kompromisse ein. Wir fügen daraus Referenznummern hinzu, um Kontext für die Leistung von simdvec bei den spezifischen Abläufen zu erhalten, die Elasticsearch benötigt.</p><h3>Wie wir messen</h3><p>Die simdvec- und <a href="https://github.com/ChrisHegarty/jvector-kernel-benchmarks">jvector-Benchmarks</a> wurden in Java mit JMH, dem Standard JVM-Microbenchmark-Harness, geschrieben, einschließlich FFI-Overhead. Für die <a href="https://github.com/ldematte/simsimd-benchmarks">NumKong-Benchmarks</a> und die <a href="https://github.com/ChrisHegarty/faiss-kernel-benchmarks">FAISS-Benchmarks</a> haben wir mit Google Benchmark, dem Standard-C++-Mikrobenchmark-Framework, kleine C/C++-Harnesses geschrieben. Beide Frameworks melden Nanosekunden pro Operation mit Aufwärmung und Iterationskalibrierung. Wir haben anhand von Hardware-Leistungszählern überprüft, dass alle Bibliotheken auf beiden Plattformen SIMD verwenden. Der gesamte Benchmark-Code ist in den verlinkten GitHub-Repositories (und im Fall von simdvec im <a href="https://github.com/elastic/elasticsearch">Elasticsearch-Repository</a>) öffentlich verfügbar.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt90a7d66553be3c9d/6a1701d166c4f942caf8bea5/aee116772df161cf86b7668f575ac34c733a23c5-1580x238.png" alt="Tabelle mit zwei Plattformen: x86 mit AMD EPYC Turin (Zen 5), AVX2 und AVX-512, AWS c8a.4xlarge und ARM mit Graviton 4 (Neoverse V2), NEON und SVE2, AWS c8g.4xlarge." /><p><strong>Software:</strong> JDK 25.0.2, JMH 1.37, GCC 14, Google Benchmark (neueste Version).</p><h2>Ein Vektor nach dem anderen</h2><p>Die grundlegendste Funktion der Vektorsuche ist die Berechnung des Abstands zwischen zwei Vektoren. Jede HNSW-Nachbarbewertung, jede IVF-Kandidatenbewertung und jeder Reranking-Vergleich dreht sich um diese interne Schleife.</p><p>Wir haben den Durchsatz einzelner Datenpaare in 1024 Dimensionen auf beiden Plattformen gemessen, beginnend mit float32, dem Basistyp, bei dem das Ökosystem am wettbewerbsfähigsten ist. Wir vergleichen simdvec mit FAISS und jvector, wobei wir NumKong ausgeschlossen haben, da es float64-Akkumulatoren für float32 verwendet, was es je nach Plattform 3,2- bis 5,3-mal langsamer macht und numerische Präzision über Durchsatz gestellt wird. Um den Vergleich nicht zu verfälschen, testen wir NumKong stattdessen auf int8, wo es die gleiche Akkumulatorstrategie wie simdvec verwendet.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3bc2ecaf3ad2b61/6a1701d2ab7f08039ddb9d0f/352cfa0fc18f123140f746d843404f80127fb1b7-1500x675.png" alt="Horizontales Balkendiagramm mit dem Titel „float32 Dot Product — AMD Turin“ vergleicht fünf Implementierungen: FAISS AVX‑512 mit 23,2 ns/op, ES simdvec AVX‑512 mit 28,3 ns/op, FAISS AVX2 mit 36,4 ns/op, ES simdvec AVX2 mit 38,9 ns/op und jvector mit 43,9 ns/op." /><p>Auf x86 ist FAISS AVX-512 der schnellste Einzelpaar-Kernel mit 23 ns. Simdvec AVX-512 folgt mit 28 ns, eine Lücke, die den Overhead des FFI-Aufrufs widerspiegelt. Beide verwenden 512-Bit-FMA mit Multi-Akkumulator-Unrolling. Auf der AVX2-Ebene liegen die beiden sehr viel näher beieinander, nämlich 36 ns bzw. 39 ns, die beide durch die 256-Bit-Register- und Speicherladebreiten eingeschränkt sind. jvector landet bei 44 ns mit der Java Panama Vector API. Panama generiert guten SIMD-Code, aber von Hand optimierte C++-Intrinsics sind hier im Vorteil</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcbbbe442631a575d/6a1701d42b835f81bcf4b083/95e44d9767f21ec4bccaed835e3c99aa180431ee-1500x495.png" alt="Horizontales Balkendiagramm mit dem Titel „float32 Dot Product — Graviton 4 (ARM)“, das ES simdvec bei 70,2 ns/op, jvector bei 110,0 ns/op und FAISS bei 155,6 ns/op zeigt." /><p>Auf ARM liegt simdvec mit 70 ns deutlich vor jvector mit 110 ns und FAISS mit 156 ns. Simdvec verfügt über von Hand optimierte NEON-Kernel für aarch64. Jvector hat keinen nativen ARM-Code und basiert auf Panama. FAISS verlässt sich auf die automatische Vektorisierung des Compilers und nicht auf explizite NEON-Intrinsics, was den größeren Abstand erklärt. Dies spiegelt einen praktischen Vorteil des Besitzes der Kernel-Bibliothek wider: Als Elasticsearch zu Graviton erweitert wurde, fügten wir eigens entwickelte NEON-Kernel hinzu. Weder jvector noch FAISS haben nativem ARM-Code den gleichen Stellenwert eingeräumt.</p><p>Elasticsearch bewertet aber nicht nur float32. <strong>Int8-Quantisierung</strong> reduziert den Speicher um das Vierfache, bfloat16 um das Doppelte und BBQ um das 32-Fache. Jeder Typ benötigt seine eigene SIMD-Strategie und simdvec bietet von Hand optimierte, native Kernel für alle diese Typen.</p><p>Von den Bibliotheken, die wir verglichen haben, hat nur NumKong vergleichbare Kernel für int8. Wir haben das int8-Skalarprodukt, die quadrierte euklidische Distanz und den Kosinus bei 1024 Dimensionen gemessen.</p><p><strong>Int8 Einzelpaar-Wertung (1024 Dimensionen, ns/vec op – je niedriger, desto besser)</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3ac255d158e93504/6a1701d5a292997e48d00eb1/a0b852fd5f51d57bd2488886600472ee65ab64da-1594x378.png" alt="Tabelle, die die Leistung von x86 und ARM für Punktprodukt-, quadratisch-euklidische und Kosinus-Operationen vergleicht und ES-, NumKong- und Diff-Werte für jede Operation auf beiden Architekturen auflistet." /><p>Auf beiden Architekturen ist NumKong bei kleinen bis mittleren Dimensionen gleich schnell oder sogar schneller, wobei der Unterschied hauptsächlich auf den geringeren Call-Overhead zurückzuführen ist (direkter C-Call vs. Java FFI). Bei größeren Dimensionen holt simdvec auf, wobei die effizientere Kernel-Implementierung (die Cascade Unrolling verwendet) die Aufrufkosten amortisiert: Mit zunehmender Dimension <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md#single-pair-i8-nsop-2">schließt sich diese Lücke und kehrt sich schließlich um.</a> Die Übergangsdimensionen liegen je nach Funktion und Architektur zwischen 768 und 1536.</p><p>Trotz des etwas höheren Aufwands von Java FFI befindet sich simdvec mit hochoptimierten C/C++-Bibliotheken auf Augenhöhe. Sie ist nicht nur die einzige Bibliothek mit optimierten Kernel für float32 <em>und</em> int8, sondern führt auch beim ARM und liegt auf x86 (für float32) nur leicht hinter FAISS zurück und auf beiden Architekturen sehr nahe an NumKong (für int8). Für bfloat16, int4, binär und BBQ gibt es zwar Alternativen, aber simdvec zeichnet sich durch von Hand optimierte SIMD aus, die auf das Datenlayout jedes Typs zugeschnitten ist.</p><p>Eine Produktionssuchmaschine bewertet jedoch nicht einen Vektor nach dem anderen, sondern Tausende pro Abfrage. Die nächste Frage ist, was in diesem Maßstab passiert.</p><h3>Tausende auf einmal</h3><p>Die Leistung eines einzelnen Paares stellt nur einen Teil des Gesamtbildes dar. In der Praxis ist entscheidend, wie sich Systeme unter Last verhalten. Eine einzelne HNSW-Abfrage kann Hunderte von Nachbarn im Graphen bewerten. Ein IVF-Scan kann Tausende von Einträgen in Posting-Listen bewerten. Ein Reranking-Durchlauf kann Zehntausende von Kandidaten bewerten. Der Durchsatz pro Paar ist wichtig, aber noch wichtiger ist, wie schnell Sie viele Vektoren bewerten können und wie gut die Leistung nachlässt, wenn das Working Set nicht mehr in die CPU-Caches passt.</p><p>Simdvec bietet Bulk-Scoring für jeden Datentyp. Dabei handelt es sich nicht nur um Schleifen über Single-Pair-Kerne, sondern auch um innere Schleifen mit mehreren Akkumulatoren, die den Abfragevektor einmal pro Dimensionsschritt laden und ihn auf mehrere Dokumentvektoren verteilen, mit explizitem Cache-Line-Prefetching für den nächsten Batch. Weder jvector noch FAISS bieten ein Äquivalent (zum jetzigen Zeitpunkt). Jvector hat keine Bulk-API, sodass der Aufrufer ein Paar nach dem anderen in einer Schleife bewertet. FAISS stellt <code>fvec_inner_products_ny</code> zur Verfügung, das zum Zeitpunkt der Erstellung dieses Artikels als Schleife über die Single-Pair-Distanzfunktion ohne Amortisierung der Abfrage oder Vorabruf implementiert ist.</p><p><strong>Float32.</strong> Um die Wirkung auf Kernel-Ebene zu messen, bewerteten wir eine einzelne Abfrage gegen zunehmende Zahlen von 1024-Dimension-float32-Dokumentvektoren mit Random-Access-Mustern, die HNSW-ähnliche verstreute Graph-Nachbarschaftsabfragen simulieren. Die drei Datensatzgrößen von 32, 625 und 32.500 Vektoren werden so gewählt, dass der Arbeitssatz den L1-, L2- und L3-Cache übersteigt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2df64ec77a1921ae/6a1701d714b270393ae3c4de/1d90267be1c63ac82b8ba588617ebedb0be0d1b6-1334x558.png" alt="Zwei Balkendiagramme, die die Bulk-Float32-Punktprodukt-Scoring-Zeiten für Elasticsearch simdvec, FAISS und jvector auf AMD Turin (x86, AVX-512) und Graviton 4 (ARM, NEON) bei drei Größen vergleichen: 32 Vektoren, 625 Vektoren und 32.500 Vektoren." /><p>Wenn die Daten in den Cache passen, ist simdvec auf beiden Plattformen am schnellsten, aber die Margen sind moderat, da die Kernel-Arithmetik dominiert. Die tatsächliche Trennung zeigt sich, wenn der Arbeitssatz über L3 hinauswächst. Auf x86 erzielt simdvec 95 ns pro Vektor, während FAISS 165 ns und jvector 412 ns benötigt. Auf ARM ist das Muster dasselbe: simdvec bleibt bei 162 ns, während FAISS auf 347 ns und jvector auf 476 ns ansteigt. Das Prefetching und die Abfrage-Amortisierung in simdvec verbergen die Speicherlatenz auf eine Weise, die eine einfache Schleife über Einzelpaar-Kernel nicht erreichen kann, und der Vorteil erweitert sich genau dort, wo reale Suchworkloads tief im Hauptspeicher arbeiten.</p><p><strong>Int8.</strong> Das gleiche Muster gilt für quantisierte Datentypen. Wir haben die Bulk-Bewertung von int8-Punktprodukten in 1024 Dimensionen mit Datensatzgrößen gemessen, die so gewählt wurden, dass sie die gleichen L1-, L2- und L3-Cache-Grenzen überschritten, und die Bulk-Bewertung von simdvec mit der Single-Pair-Bewertung von NumKong in einer Schleife verglichen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcda85e10007188d0/6a1701d9cf4f25d722b2cff7/9ee97d98b40d13b19370b76b33e67ea66bfb3250-1580x338.png" alt=" Tabelle mit dem Titel „x86 – Bulk-Scoring, int8-Punktprodukt (ns/op, je niedriger, desto besser)“, in der ES simdvec und NumKong über drei Vektorgrößen – 128, 2.500 und 130.000 – mit entsprechenden ns/op-Werten und Beschleunigungsverhältnissen verglichen werden." /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt972c311b7d08ba73/6a1701dadc55dec02ee00c87/601f50a03fa3e6263cbac9700281dfe3e511de60-1580x338.png" alt="Tabelle mit dem Titel „ARM — Bulk Scoring, int8-Punktprodukt (ns/op, je niedriger, desto besser)“, die ES simdvec und NumKong über drei Vektorgrößen – 128, 2.500 und 130.000 – mit entsprechenden ns/op-Werten und Beschleunigungsverhältnissen vergleicht." /><p>Auf x86 ist simdvec zwischen 1,2-mal und 1,9-mal schneller, was auf die Kombination aus explizitem Prefetching und Batch-Verarbeitung zurückzuführen ist. Auf ARM ist simdvec bei allen Datensätzen erneut im Vorteil (1,7- bis 1,9-mal schneller). Der Vorteil liegt in der Batch-Verarbeitung von vier Vektoren auf einmal, die über ein verschachteltes Zugriffsmuster Parallelisierung auf Speicherebene bietet. In beiden Fällen ist das auffälligste Ergebnis, was bei der größten Datensatzgröße passiert, wo es am wichtigsten ist.</p><p>Die Ergebnisse für quadrierten Abstand und Kosinus zeigen ein ähnliches Muster, mit Beschleunigungen von 1,4x bis 1,8x für ARM und von 1,3x bis 3,0x für x86 (mehr dazu <a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md">hier</a>).</p><h3>Wo Speicher eine Rolle spielt</h3><p>Vektorindizes in der Produktion passen normalerweise nicht in den CPU-Cache. Ein 10M-Vektor-Int8-Index bei 1024 Dimensionen entspricht 10 GB. Die Bewertung von Kandidaten bedeutet das Streamen von Daten aus dem DRAM, und genau hier macht die Architektur für die Massenbewertung den Unterschied.</p><p>Wir verwendeten Hardware-Leistungszähler, um zu messen, was während der Massenbewertung innerhalb der CPU passiert, und stellten fest, dass das Verbergen der Speicherlatenz zwei grundlegend verschiedene Strategien erfordert: eine pro Architektur.</p><p><strong>Auf x86 eliminiert explizites Prefetching Cache-Fehler. </strong>Der Bulk-Kernel verarbeitet Vektoren sequenziell – einen nach dem anderen vollständig berechnet – während er gleichzeitig Prefetch-Anweisungen für den nächsten Batch ausgibt. Künftige Daten werden in den L1-Cache geladen, bevor die CPU sie benötigt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt368f29b5143d0f5a/6a1701dcc1e8a51780f8817b/a39548f8060c2a4a5154521a4047dd92d8cd77be-1580x309.png" alt="Tabelle mit dem Titel „x86 (AMD Turin) — Hardware-Zähler pro int8-Operation“ vergleicht Einzel- und Bulk-Modi für L1-Cache-Fehler, IPC und dTLB-Fehler, mit entsprechenden Verbesserungsfaktoren." /><p>Auf ARM funktionierte derselbe sequentielle Ansatz nicht so gut, selbst mit Prefetching. Stattdessen <strong>verschachtelt der Bulk-Kernel Ladungen</strong> von vier Vektoren an jeder Schrittposition, wodurch die Out-of-Order-Engine vier unabhängige Speicherstreams erhält. Die CPU holt Daten nicht schneller, sondern wartet vielmehr weniger, weil sie während der Bearbeitung von Speicheranfragen immer etwas anderes zu berechnen hat. Eine detaillierte Analyse finden Sie in <a href="https://github.com/elastic/elasticsearch/issues/145412">diesem GitHub-Issue</a>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8751ac5b20b75508/6a1701deab7f08db83db9d13/832de3bc0d556a493b7bf3f250196018acfc1585-1580x238.png" alt="Tabelle mit dem Titel „ARM (Graviton 4) — Hardware-Zähler pro int8-Operation“ vergleicht Einzel- und Bulk-Modi für L1-Cache-Fehler und Backend-Stalls, mit entsprechenden Verbesserungshinweisen" /><p>Die Zahlen erzählen zwei unterschiedliche Geschichten:</p><ol><li><p>Auf x86 verwandelt Prefetching 139K Cache-Fehler in 19K und die Anweisungen pro Zyklus (IPC) werden mehr als verdoppelt. Der Massenvorteil wächst mit der Größe der Datensätze, von 1,2-mal in L2 bis 2,8-mal jenseits von L3, weil das Prefetching zunehmend teurere DRAM-Roundtrips verbirgt.</p></li><li><p>Bei ARM ändern sich Cache-Fehler kaum. Was sich ändert, ist die Auslastung: Backend-Verzögerungen sinken um 40 %, da das verschachtelte Zugriffsmuster die Pipeline füttert. Dieser Vorteil bleibt konstant bei 1,8-mal, unabhängig von der Größe der Datensätze, da die Parallelität auf Speicherebene gilt, unabhängig davon, ob Daten aus dem Cache oder dem DRAM stammen.</p></li></ol><p>Zwei Architekturen, zwei Strategien, ein Ergebnis: Im Produktionsmaßstab beschäftigt simdvec die CPU-Pipeline durchgehend, selbst wenn die Vektoren über den Hauptspeicher verteilt sind.</p><h2>Was das für Elasticsearch-Nutzer bedeutet</h2><p>Diese Fähigkeiten auf Kernel-Ebene verstärken sich gegenseitig. Eine einzelne Vektorsuchabfrage kann Millionen von Distanzoperationen berechnen: HNSW-Graph-Durchläufe, Kandidatenbewertung, Neusortierung. Bei Tausenden gleichzeitiger Abfragen lassen sich Nanosekunden pro Operation direkt in Abfragelatenz und Cluster-Durchsatz umrechnen. Egal ob Sie float32, int8, bfloat16 oder BBQ verwenden, egal ob sich Ihr Index im Arbeitsspeicher oder auf der Festplatte befindet, simdvec ist die zugrunde liegende Engine, wobei jede dieser Operationen über dieselbe Engine läuft, die bis auf die letzte Nanosekunde genau abgestimmt ist.</p><p>Die wichtigste Erkenntnis ist, dass die Leistung der Vektorsuche im Produktionsmaßstab nicht primär durch den reinen SIMD-Durchsatz bestimmt wird. Entscheidend ist, wie effizient das System die Speicherlatenz verbirgt und gleichzeitig die Rechenleistung über Millionen kleiner Operationen hinweg aufrechterhält.</p><p>Die simdvec-Kernel werden mit fast jeder Elasticsearch-Version verbessert. Wenn neue Quantisierungstypen und Hardwareplattformen entstehen, erhalten sie von Anfang an optimierte Kernel. Und die bestehenden Typen werden immer schneller, während wir die bereits ausgelieferten Implementierungen optimieren.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-vector-search-simdvec-engine</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-vector-search-simdvec-engine</guid>
    <category><![CDATA[Vektordatenbank]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <dc:creator><![CDATA[Chris Hegarty,Lorenzo Dematte,Simon Cooper]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta18088409621369b/6a1701dfdc55de7297e00c8b/df9646091bafbbf0a6dfd212ff8a6bd1e8589708-1280x720.png" length="0" type="image/png"/>
    <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Ankündigung von Leseberechtigungen für Kibana-Dashboards]]></title>
    <description><![CDATA[Einführung von schreibgeschützten Dashboards in Kibana, die den Erstellern von Dashboards granulare Freigabekontrollen bieten, um die Ergebnisse korrekt zu halten und vor unerwünschten Änderungen zu schützen.]]></description>
    <content:encoded><![CDATA[<p>Sie kennen das. Sie verbringen eine Stunde damit, das perfekte Dashboard zur Überwachung Ihrer Protokolle zu erstellen: jedes Diagramm, jeden Filter und jede Beschriftung. Sie teilen es mit Ihrem Team. Ein paar Tage später öffnen Sie es und etwas stimmt nicht. Ein Kollege hat eine Abfrage angepasst. Oder jemand hat den Datenbereich geändert. Vielleicht dachten sie, sie würden helfen. Jetzt wühlen Sie sich durch die Revisionen und hinterfragen jede Zahl. Klingt das vertraut?</p><p>Genau aus diesem Grund haben wir <strong>schreibgeschützte Dashboards</strong> entwickelt. Das ist die Kontrolle, die Sie sich gewünscht haben. Geben Sie Dashboards vertrauensvoll weiter, ohne befürchten zu müssen, dass die nächste Person mit Bearbeitungsrechten sie verändert oder zerstört.</p><p>Hinweis: Schreibgeschützte Berechtigungen sind in Elastic Cloud Serverless und ab Version 9.3 für Elastic Cloud Hosted und Elastic Self-Managed verfügbar.</p><h2>Wenn die Option „Jeder kann bearbeiten“ Probleme bereitet</h2><p>In Kibana hat das <em>Teilen </em>in der Regel Berechtigungen auf Space-Ebene bedeutet. Wenn jemand Dashboards in einem Bereich erstellen kann, kann er auch die Dashboards anderer Personen bearbeiten oder löschen. Das ist großartig für die Zusammenarbeit – bis es das nicht mehr ist. Eine einzige versehentliche Änderung kann zu Fehlentscheidungen, Vertrauensverlust und viel Aufräumarbeit führen.</p><p>Wir haben die Workarounds gehört: <strong>„Wir haben ‚read-only‘ in den Dashboard-Namen gesetzt und hoffen, dass die Leute es bemerken.“</strong> Oder: <strong>„Wir markieren sie und drücken die Daumen.“</strong> Hoffnung ist kein Genehmigungsmodell. Sie brauchten eine echte Möglichkeit, ein Dashboard zu sperren, ohne alle aus dem Bereich auszusperren.</p><h2>Was tatsächlich schiefgeht</h2><p>Deb und Kevin haben beide Bearbeitungszugriff auf das Log-Monitoring-Dashboard im Operationsbereich. Kevin nimmt einige Änderungen an den Charts vor. Als Deb zurückkommt, stimmen die Zahlen nicht mit den von ihr präsentierten überein. Sie muss herausfinden, was sich geändert hat (oft aus dem Gedächtnis), es beheben und sich fragen, wie viele Berichte mit falschen Daten verschickt wurden.</p><h2>Schreibgeschützte Dashboards: Verantwortung und Kontrolle, die sinnvoll sind</h2><p>Schreibgeschützte Dashboards lösen dieses Problem, indem sie Ihnen die Kontrolle darüber geben, ob andere Nutzer das Dashboard bearbeiten können. Wenn Sie ein Dashboard teilen, wählen Sie: <strong>Bearbeiten</strong> (Standard, wie heute) oder <strong>Ansehen</strong>. Im <strong>Ansichtsmodus </strong>können nur Sie (und die Kibana-Administratoren) es ändern oder löschen. Alle anderen können es öffnen, verwenden und darauf vertrauen, aber sie können es nicht verändern.</p><h3>Was Sie erhalten</h3><ul><li><p><strong>Dashboard-Integrität:</strong> Im <strong>Ansichtsmodus</strong> können andere Nutzer mit Bearbeitungszugriff das Dashboard nicht ändern oder löschen. Wenn sie es versuchen, wird ihnen mitgeteilt, dass es gesperrt ist. Ihre Diagramme und Logik bleiben so, wie Sie sie verlassen haben.</p></li><li><p><strong>Sie behalten die Kontrolle:</strong> Sie sind der Besitzer. Sie können jederzeit bearbeiten, verfeinern und aktualisieren. Das Teilen als Nur-Ansicht sperrt Sie nicht aus; es fixiert die Version, die alle anderen sehen.</p></li><li><p><strong>Flexibler Lebenszyklus:</strong> Sie können ein Dashboard jederzeit wieder auf „bearbeitbar“ umschalten. Und Kibana-Administratoren können weiterhin alle Dashboards verwalten (zum Beispiel, wenn der Eigentümer ausscheidet). Keine Sackgassen.</p></li></ul><p>Sie können finalisierte, missionskritische Dashboards weitreichend teilen und sicher sein, dass sie konsistent bleiben. Dies ist in <strong>allen Elastic-Stufen und -Angeboten</strong> verfügbar, einschließlich Serverless.</p><h3>Wer kann was tun?</h3><p>Schnelle Referenz nach Rolle:</p><ul><li><p><strong>Dashboard-Besitzer:</strong> Sie haben es erstellt; Sie haben vollen Bearbeitungszugriff.</p></li><li><p><strong>Kibana-Administrator:</strong> Kann alle Dashboards verwalten.</p></li><li><p><strong>Nutzer mit Bearbeitungsrechten:</strong> Kann eigene Dashboards erstellen und bearbeiten; kann schreibgeschützte Dashboards weder bearbeiten noch löschen.</p></li><li><p><strong>Nutzer mit Ansichtsrechten:</strong> Kann nur Dashboards anzeigen (und auflisten).</p></li></ul><p>Aktion</p><p>Dashboard-Inhaber</p><p>Kibana-Administrator</p><p>Nutzer mit Bearbeitungsrechten</p><p>Nutzer mit Space-Ansicht</p><p>Dashboards auflisten und anzeigen</p><p>✔</p><p>✔</p><p>✔</p><p>✔</p><p>Neue Dashboards erstellen</p><p>✔</p><p>✔</p><p>✔</p><p>✘</p><p>Bearbeitbare Dashboards ändern/löschen</p><p>✔</p><p>✔</p><p>✔</p><p>✘</p><p>Dashboards mit Lesezugriff ändern/löschen</p><p>✔</p><p>✔</p><p>✘</p><p>✘</p><h2>So aktivieren Sie den Schreibschutz</h2><p>Sie können den schreibgeschützten Modus beim Speichern eines neuen Dashboards oder später über das Freigabemenü festlegen.</p><h3>Beim Speichern eines neuen Dashboards</h3><ul><li><p>Erstellen Sie Ihr Dashboard, und klicken Sie auf <strong>Speichern</strong>.</p></li><li><p>Suchen Sie im Modal „Als neues Dashboard speichern“ nach <strong>Berechtigungen</strong>.</p></li><li><p>Ändern Sie diese von <strong>Kann bearbeiten</strong> in <strong>Kann ansehen</strong>.</p></li><li><p>Klicken Sie auf <strong>Speichern</strong>. Das war's. Für alle anderen ist es schreibgeschützt.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt120724e3b963289f/6a16f76354abb858cd133baf/42a71d1bb55f9d50bd079f53bf45a0e1999b27f7-1214x1306.png" alt=" Ein Kibana-Dialog, der die Optionen zum Speichern eines Dashboards anzeigt, wobei die Berechtigung „Nur anzeigen“ ausgewählt wurde." /><h2>Für ein Dashboard, das Sie bereits besitzen</h2><ul><li><p>Dashboard öffnen.</p></li><li><p>Öffnen Sie das Menü <strong>Dashboard teilen</strong>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8fa2f365687c2ca8/6a16f764a292990e4bd00e01/e8405938557c879b1d4c262b98cf5a7f66408c04-1246x264.png" alt="Die Kibana-Dashboard-Symbolleiste zeigt Optionen zum Beenden des Bearbeitungsmodus, zum Teilen, zum Anpassen der Einstellungen, zum Hinzufügen von Panels und zum Speichern; der Fokus liegt auf „Teilen“." /><ul><li><p>Im Freigabemodal suchen Sie <strong>Berechtigungen</strong> und wechseln Sie zu <strong>Kann anzeigen</strong>. Die Änderung tritt sofort in Kraft; andere Nutzer im selben Bereich können sie nicht mehr bearbeiten oder löschen.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt05e6051dbe4b8250/6a16f76667045b321445bf9d/849405bc32701f3ebe0def012d8ae3cf3813ea0a-996x750.png" alt="Das Kibana-Freigabefeld, das Dashboard-Berechtigungen und die Option zum Kopieren eines schreibgeschützten Links anzeigt." /><ul><li><p>Sie können mit der Maus über die Aktion <strong>Teilen</strong> fahren, um zu sehen, welche Art von Berechtigungen ein bestimmtes Dashboard hat.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf8880996f84cdab3/6a16f7678b73cb3682189dfa/80541ddb1b1bc567b0aeff693944ea8b6871d6a7-1270x320.png" alt="Die Kibana-Symbolleiste mit der hervorgehobenen Teilen-Schaltfläche und einem Tooltip, der angibt, dass jeder im Bereich das Dashboard anzeigen kann." /><h3>Sehen, welche Dashboards gesperrt sind</h3><p>In der Hauptliste der Dashboards haben Dashboards, die Sie nicht bearbeiten oder löschen können, ein deaktiviertes Auswahlkästchen. Dadurch lässt sich leicht erkennen, welche Inhalte nur zur Ansicht freigegeben sind.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9c5fae7fa018c89a/6a16f768b0367da1b172bacb/24b2eba08df86174db949c662e7886c5aea1b460-1999x876.png" alt="Die Kibana-Dashboard-Liste, die mehrere Dashboards mit Erstellern, Zeitstempeln und einem ausgewählten Element anzeigt." /><p>Im Dashboard werden Sie außerdem feststellen, dass die Aktion „Bearbeiten“ deaktiviert ist und ein Tooltip erscheint, der erklärt, dass das Dashboard als schreibgeschützt eingestellt wurde.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt50ef3c91d5640c0c/6a16f76a60084b08fc3c434d/e0a2f9da6dc854e876fc6dc2a7c3ef8b313b52ef-1358x330.png" alt="Die Kibana-Dashboard-Symbolleiste zeigt eine Schaltfläche „Bearbeiten“ mit einem Warnhinweis, der darauf hinweist, dass der Nutzer keine Berechtigung zum Ändern des Dashboards hat." /><h2>Ausprobieren</h2><p>Schreibgeschützte Dashboards sind jetzt verfügbar. Erstellen Sie ein Dashboard, setzen Sie es auf <strong>Ansehen</strong> und teilen Sie es. Ihr Team erhält eine einzige verlässliche Informationsquelle, und Sie erhalten Sicherheit. Kein „Bitte nicht bearbeiten“ mehr im Titel.</p><p>Wir würden gerne hören, wie Sie schreibgeschützte Dashboards verwenden. Teilen Sie Ihr Feedback in unserem <a href="https://discuss.elastic.co">Community-Forum</a> mit.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboards-read-only-permissions</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboards-read-only-permissions</guid>
    <category><![CDATA[Inside Elastic]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4d7f707011ca90f/6a16f76b8b73cb3125189dfe/11e578bc317aea30d2e10ccc0334a532f6af2ef9-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Adaptive vorzeitige Beendigung für HNSW in Elasticsearch]]></title>
    <description><![CDATA[Einführung einer neuen adaptiven Strategie zur vorzeitigen Beendigung von HNSW in Elasticsearch.]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch verwendet den <a href="https://www.elastic.co/search-labs/blog/hnsw-graph">Hierarchical Navigable Small World</a> (HNSW)-Algorithmus, um eine Vektorsuche in einem Proximity-Graphen durchzuführen. HNSW ist bekannt dafür, einen guten Kompromiss zwischen der Qualität der k-Nearest-Neighbor (KNN) Ergebnisse und den damit verbundenen Kosten zu bieten.</p><p>In HNSW erfolgt die Suche durch das iterative Erweitern von Kandidatenknoten im Graphen, wobei eine begrenzte Menge der bisher entdeckten nächsten Nachbarn gepflegt wird. Jede Erweiterung hat Kosten zur Folge (Vektorabläufe, zufällige Suchaktionen zur Festplatte und mehr), wobei der marginale Vorteil dieser Kosten tendenziell abnimmt, je weiter die Suche voranschreitet.</p><p>Eine Möglichkeit, die Durchquerung von HNSW-Graphen zu optimieren, besteht darin, die Suche zu beenden, wenn die marginale Wahrscheinlichkeit, neue echte Nachbarn zu finden, nicht steigt. Aus diesem Grund haben wir in <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules#index-dense-vector-hnsw-early-termination">Elasticsearch 9.2</a> einen neuen <a href="https://www.elastic.co/search-labs/blog/hnsw-knn-search-early-termination">Mechanismus zur vorzeitigen Beendigung</a> eingeführt. Das stoppt den Suchvorgang, wenn der Besuch von Graphknoten nicht genug neue nächste Nachbarn für eine feste Anzahl hintereinander liefert.</p><p>In diesem Artikel erfahren Sie, wie wir den erwähnten Mechanismus zur vorzeitigen Beendigung in HNSW verbessert haben, damit er sich für verschiedene Datensätze und Datenverteilungen besser eignet.</p><h2><strong>Vorzeitige Beendigung in HNSW</strong></h2><p>In HNSW erfolgt die Suche durch das iterative Erweitern von Kandidatenknoten im Proximity-Graphen, wobei eine begrenzte Menge der bisher entdeckten nächsten Nachbarn gepflegt wird, bis entweder der gesamte Graph besucht wurde oder ein frühes Abbruchkriterium erfüllt ist.</p><p>Die vorzeitige Beendigung ist daher nicht unbedingt immer eine Optimierung, sondern <strong>Teil des Suchalgorithmus selbst</strong>. Der Moment, in dem wir beschließen aufzuhören, bestimmt das Gleichgewicht zwischen Effizienz und Abruf. In Elasticsearch gibt es bereits eine Reihe von Möglichkeiten, um Abfragen auf HNSW vorzeitig zu beenden:</p><ul><li><p>Eine festgelegte maximale Anzahl von Knoten wird besucht.</p></li><li><p>Ein festgelegtes Zeitlimit ist erreicht.</p></li></ul><p>Diese Regeln sind zwar einfach und vorhersehbar, verhalten sich aber weitgehend <strong>unabhängig von dem, was die Suche tatsächlich bewirkt</strong>. Außerdem werden sie hauptsächlich verwendet, um sicherzustellen, dass die Abfrage für den Endnutzer in angemessener Zeit abgeschlossen wird.</p><p>In einem <a href="https://www.elastic.co/search-labs/blog/hnsw-knn-search-early-termination">früheren Blogbeitrag</a> haben wir das Konzept der Redundanz im HNSW vorgestellt. Kurz gesagt, redundante Berechnungen treten auf, wenn HNSW weiterhin neue Kandidatenknoten auswertet, ohne dabei weitere nächste Nachbarn zu finden.</p><h2><strong>Geduld: Fortschritt statt Anstrengung messen</strong></h2><p>Der Begriff der <em>Geduld</em> stellt die frühe Beendigung auf <strong>Fortschritt statt Anstrengung</strong> um.</p><p>Anstatt zu fragen:</p><p>„Wie viele Schritte haben wir unternommen?“</p><p>Die neue Frage lautet:</p><p>„Wie viel Rechenleistung sind wir bereit zu verschwenden, bis wir die Hoffnung verlieren?“</p><p>Während der HNSW-Suche führt eine frühe Exploration in der Regel zu Spitzenverbesserungen der Gruppe der Top-k-Kandidaten. Während der ersten Schritte der HNSW-Graph-Exploration wird die Menge der Nachbarn kontinuierlich aktualisiert, da der Algorithmus immer nähere Nachbarn zum Abfragevektor entdeckt. Mit der Zeit werden diese Verbesserungen immer seltener, da die Suche konvergiert. <a href="https://cs.uwaterloo.ca/~jimmylin/publications/Teofili_Lin_ECIR2025.pdf">Die auf Geduld basierende Beendigung</a> überwacht dieses Muster und beendet die Suche, sobald die Verbesserungen für längere Zeit weniger werden.</p><p>In der Praxis berechnen wir beim Besuchen des HNSW-Graphen auch das Sättigungsverhältnis der Warteschlange, während wir Kandidatenknoten durchgehen. So wird der Prozentsatz der nächstgelegenen Nachbarn gemessen, die beim Besuch des letzten Graphknoten unverändert blieben (oder der Kehrwert der Anzahl der während der letzten Iteration eingeführten neuen Nachbarn). Wenn ein solches Verhältnis für zu viele aufeinanderfolgende Iterationen zu groß wird, hören wir auf, den Graphen zu besuchen.</p><p>Konzeptionell betrachtet Geduld die HNSW-Suche als einen Prozess mit <strong>abnehmendem Ertrag</strong>. Wenn sich die Erträge einpendeln, bringt die weitere Exploration des Graphen wenig Nutzen.</p><p>Dieses Framing ist wirkungsvoll, weil es die Beendigung direkt an <em>beobachtbare Ergebnisse</em> bindet, anstatt an willkürlich festgelegte Grenzwerte.</p><p>Der Vorteil dieser intelligenten Technik zur vorzeitigen Beendigung liegt darin, dass HNSW-Graph-Explorationen tendenziell eine geringere Anzahl von Graphknoten besuchen und dabei eine nahezu perfekte relative Abrufquote beibehalten.</p><p>Um dies zu visualisieren, können wir die Abrufquote pro besuchtem Knoten aufzeichnen, die wir mit der geduldsbasierten frühzeitigen Beendigung (gekennzeichnet als <em><code>et=static</code></em>) im Vergleich zum standardmäßigen HNSW-Verhalten (gekennzeichnet als <em><code>et=no</code></em>) bei einigen Datensätzen, FinancialQA und Quora, und Modellen, JinaV3 und E5-small, erhalten haben.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd0d692b9beb476a/6a170ef4dc55debf0be00e97/a9d07c5153ea64a2426c82487c36846030692bb9-1600x945.png" alt="Adaptive vorzeitige Beendigung für HNSW " /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt93509c251a1b641e/6a170ef6dc55dea2b3e00e9b/dac56125c4b16d1b596c9876b6ca9ac7b2dc87fa-1600x944.png" alt="Adaptive vorzeitige Beendigung für HNSW es" /><h2><strong>Statische Schwellenwerte und HNSW-Dynamik</strong></h2><p>In der Praxis wird dies in Elasticsearch mithilfe <strong>statischer Schwellenwerte</strong> umgesetzt. Ein Schwellenwert bezieht sich auf den <strong>Sättigungsschwellenwert</strong>, also das Sättigungsverhältnis, das wir für suboptimal halten. Der andere Schwellenwert bezieht sich auf die Anzahl aufeinanderfolgender Graphknoten, die wir zum Besuch zulassen, während wir dennoch eine suboptimale Warteschlangenauslastung erreichen, also der <strong>Geduldsschwellenwert</strong>.</p><p>Als wir diese Strategie zur vorzeitigen Beendigung in Elasticsearch 9.2 einführten, entschieden wir uns für konservative Standardeinstellungen, um den Abruf so weit wie möglich zu erhalten und gleichzeitig die Latenz und den Speicherverbrauch zu verbessern. Aus diesem Grund legten wir den Sättigungsschwellenwert auf 100 % und den Geduldsschwellenwert auf einen (begrenzten) Wert von 30 % des <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query#knn-query-top-level-parameters:~:text=search%20request%20size.-,num_candidates,-(Optional%2C%20integer)%20The"><em><code>num_candidates</code></em></a> in der KNN-Abfrage fest.</p><p>In vielen Szenarien erwiesen sich diese Einstellungen als gut geeignet, es kann aber sein, dass zwei Anfragen, die die gleiche Anzahl von Nachbarn anfordern, ein völlig unterschiedliches Konvergenzverhalten aufweisen. Einige Abfragen stoßen auf dichte lokale Nachbarschaften und sind schnell gesättigt, andere müssen lange, spärliche Pfade durchqueren, bevor sie wettbewerbsfähige Kandidaten finden. Letztgenanntes erwies sich als besonders schwierig effektiv zu handhaben.</p><p>Dabei fiel uns folgendes auf:</p><ul><li><p>Übermäßige Exploration bei einfachen Abfragen.</p></li><li><p>Vorzeitige Beendigung bei schwierigen Abfragen.</p></li></ul><p>Daher kamen wir zu dem Schluss, dass feste Schwellenwerte globale Annahmen über die Konvergenz kodieren, während wir HNSW besser an unterschiedliche Dynamiken anpassen könnten.</p><h2><strong>Die vorzeitige Beendigung von HNSW adaptiv gestalten</strong></h2><p>Ein adaptiver Ansatz zur vorzeitigen Beendigung geht dieses Problem aus einem anderen Blickwinkel an. Anstatt vordefinierte Stoppschwellenwerte durchzusetzen, leitet der Algorithmus <strong>aus den Suchdynamiken selbst ab, wann gestoppt werden soll</strong>.</p><p>Anstatt also das Verhältnis der Warteschlangensättigung zwischen zwei aufeinanderfolgenden Kandidaten zu vergleichen, beschlossen wir, sowohl eine direkt ausgeglichene  (wie viele neue Nachbarn für eine Abfrage <em>q</em> beim letzten Besuch <em>i</em> eingeführt wurden) sowie den fortlaufenden Mittelwert  und die Standardabweichung  dieser Entdeckungsrate während des Graphbesuchs (unter Verwendung von <a href="https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm">Welfords Algorithmus</a>) einzuführen. Diese Statistiken zur Entdeckungsrate werden pro Abfrage berechnet, sodass diese Informationen genutzt werden können, um für jede Abfrage unterschiedliche Geduldsgrade festzulegen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdbfb1e123f1b026d/6a170ef7cf4f25d9bab2d216/1958be7ca4425ade66eaf621ada3533173183598-694x118.png" alt="" /><p>Die zuvor statischen Schwellenwerte werden an die Statistik der Entdeckungsrate angepasst: Die Sättigungsschwelle wird zum gleitenden Mittelwert und mit der Standardabweichung addiert, während wir die Geduld anpassen und umgekehrt mit der Standardabweichung skalieren.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7d4d91f464a9dc9d/6a170ef8d7c0223420de656a/f7ee4a55c24853b657df26052b275e8bd76cf0f9-654x156.png" alt="" /><p>Die Regeln für die vorzeitige Beendigung bleiben gleich: Die Sättigung tritt ein, wenn die sofortige Entdeckungsrate niedriger ist als der adaptive Sättigungsgrenzwert. Der Graph-Besuch stoppt, wenn die Sättigung für eine Anzahl aufeinanderfolgender Kandidatenbesuche anhält, die größer ist als die adaptive Geduld.</p><p>So erhalten wir ein Verhalten, das nicht vom <em><code>num_candidates</code></em>-Parameter in der KNN-Abfrage abhängt (der immer als Standard gesetzt oder belassen werden kann, unabhängig von der vorzeitigen Beendigung) und sich dynamisch besser an jede Abfrage und Vektorverteilung anpasst.</p><p>Die Abrufquote pro besuchtem Knoten auf FinancialQA und Quora mit der adaptiven Strategie (gekennzeichnet als <em><code>et=adaptive</code></em>) ist höher als bei der statischen Strategie (<em><code>et=static</code></em>) und dem Standardverhalten von HNSW (<em><code>et=no</code></em>).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteab7ba53ae14da0e/6a170ef9961e69e072c4cfd5/2a906997d9a25d74c7038bd9661bc97581e7258e-1600x938.png" alt=" adaptive Strategie und das Standardverhalten von HNSW" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6fb9e672d3698200/6a170efb67045b7b2b45c2ab/3a114911e232c351dbb814cea20e8b0f1415a717-1600x925.png" alt="" /><p>Die adaptive vorzeitige Beendigung ist in Elasticsearch 9.3 standardmäßig für HNSW-dichte Vektorfelder aktiviert (und kann schließlich über die <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules#index-dense-vector-hnsw-early-termination">gleiche Index-Level-Einstellung</a> deaktiviert werden).</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/hnsw-elasticsearch-adaptive-early-termination</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/hnsw-elasticsearch-adaptive-early-termination</guid>
    <category><![CDATA[Vektordatenbank]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <dc:creator><![CDATA[Tommaso Teofili]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt27b746cc1995e6b7/6a170efda29299de8ad010c6/e6d3186f609dd56dc5ffe33d70fa9e5cfa05b51f-1280x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Verbessern Sie die Suchleistung mit `best_compression`]]></title>
    <description><![CDATA[Während `best_compression` typischerweise als speichersparendes Feature für Anwendungsfälle wie Elastic Observability und Elastic Security angesehen wird, zeigt dieser Blog seine Wirksamkeit als Hebel zur Leistungsoptimierung bei der Suche.]]></description>
    <content:encoded><![CDATA[<p></p><p>Bei der Optimierung von Elasticsearch für Workloads mit hoher Parallelität besteht der Standardansatz darin, den Arbeitsspeicher zu maximieren, um den Arbeitsdatensatz im Speicher zu halten und so eine geringe Suchlatenz zu erreichen. Daher wird <a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules"><code>best_compression</code></a> selten für Such-Workloads berücksichtigt, da es in erster Linie als Speichereinsparungsmaßnahme für Elastic Observability und Elastic Security betrachtet wird, in denen Speichereffizienz Vorrang hat.</p><p>In diesem Blog zeigen wir, dass, wenn die Datensatzgröße den OS-Seitencache deutlich übersteigt, <code>best_compression</code> die Suchleistung und Ressourceneffizienz verbessert, indem der I/O-Engpass reduziert wird.</p><h2><strong>Das Setup</strong></h2><p>Unser Anwendungsfall ist eine Suchanwendung mit hoher Parallelität, die auf <a href="https://www.elastic.co/docs/deploy-manage/deploy/elastic-cloud/ec-change-hardware-profile#ec-profiles-compute-optimized-arm">Elastic Cloud CPU-optimierten Instanzen</a> ausgeführt wird.</p><ul><li><p>Datenvolumen: ~500 Millionen Dokumente</p></li><li><p>Infrastruktur: 6 Elastic Cloud (Elasticsearch Service)-Instanzen (jede Instanz: 1,76 TB Speicher | 60 GB RAM | 31,9 vCPUs)</p></li><li><p>Verhältnis von Arbeitsspeicher zu Speicher: Ungefähr 5 % des gesamten Datensatzes passen in den Arbeitsspeicher</p></li></ul><h2><strong>Die Symptome: hohe Latenz</strong></h2><p>Wir haben beobachtet, dass sich die Suchlatenz deutlich verschlechterte, wenn die Anzahl der aktuellen Anfragen um 19:00 Uhr stark anstieg. Wie in Abbildung 1 und Abbildung 2 zu sehen ist, erreichte der Datenverkehr einen Spitzenwert von 400 Anfragen pro Minute und Elasticsearch-Instanz, während die durchschnittliche Abfragezeit auf über 60 ms sank.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf8ab7de934d6b410/6a170440c1e8a58db3f881c1/f9c6cc1882e7db24336c65c54bbc1d38dcdb7fa3-697x311.png" alt="Anfragen pro Minute pro Elasticsearch haben ihren Höhepunkt erreicht" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt32de2bed0afbacd5/6a1704422b835fa5ddf4b0e2/bbb705ae2fcd14c81d335bf322346caf3bf33765-996x618.png" alt="Durchschnittliche Abfragezeit Elasticsearch" /><p>Die CPU-Auslastung blieb nach der anfänglichen Verarbeitung der Verbindungen relativ niedrig, was darauf hindeutet, dass die Rechenleistung nicht der Engpass war.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta5b45d4a1ff48f54/6a17044447d49cd7252d88af/cec15a28d2d22e9adedd2951bb2334b3717890a1-1494x730.png" alt="Elasticsearch-CPU-Auslastung" /><p>Es zeigte sich eine starke Korrelation zwischen dem Abfragevolumen und den Seitenfehlern. Mit zunehmenden Anfragen beobachteten wir einen proportionalen Anstieg der Seitenfehler, mit einem Höchststand von etwa 400.000 pro Minute. Dies deutete darauf hin, dass der aktive Datensatz nicht in den Seitencache passte.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd0a3d0c610700bdb/6a17044560084b6f403c4459/511f2f10300a9d10ba3d7a82b9a8c8d567ac5636-1492x678.png" alt="Anzahl der Seitenfehler Elasticsearch Leistung" /><p>Gleichzeitig schien die Heap-Nutzung der JVM normal und unauffällig zu sein. Dies schloss Probleme mit der Garbage Collection aus und bestätigte, dass der Engpass I/O war.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3f888a03ce78eb04/6a170448964cea401008ba59/336bbad638f866304358dba1d06ee987de0f23cf-1490x568.png" alt="Heap-Verwendung in Elasticsearch" /><h2><strong>Die Diagnose: I/O gebunden</strong></h2><p>Das System war I/O-gebunden. <a href="https://www.elastic.co/blog/elasticsearch-caching-deep-dive-boosting-query-speed-one-cache-at-a-time">Elasticsearch nutzt den OS-Seitencache, um Indexdaten aus dem Speicher bereitzustellen</a>. Wenn der Index zu groß für den Cache ist, lösen Abfragen kostspielige Festplatten-Lesevorgänge aus. Während die typische Lösung darin besteht, horizontal zu skalieren (Nodes/RAM hinzufügen), wollten wir zunächst alle Möglichkeiten zur Effizienzsteigerung unserer bestehenden Ressourcen ausschöpfen.</p><h2><strong>Die Lösung</strong></h2><p>Standardmäßig verwendet Elasticsearch <a href="https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)">LZ4-Kompression</a> für seine Indexsegmente und findet so ein Gleichgewicht zwischen Geschwindigkeit und Größe. Wir stellten die Hypothese auf, dass ein Wechsel zu <code>best_compression</code> (das <a href="https://en.wikipedia.org/wiki/Zstd">zstd</a> verwendet) die Größe der Indizes verringern würde. Durch den geringeren Speicherbedarf kann ein größerer Prozentsatz des Index im Seitencache gespeichert werden, wodurch ein vernachlässigbarer Anstieg der CPU-Auslastung (für die Dekomprimierung) gegen eine Reduzierung der Festplatten-I/O eingetauscht wird.</p><p>Um <code>best_compression</code>zu aktivieren, haben wir die Daten mit der Indexeinstellung <code>index.codec: best_compression</code>neu indexiert. Alternativ könnte dasselbe Ergebnis erreicht werden, indem der Index geschlossen, der Indexcodec auf <code>best_compression</code>zurückgesetzt und dann eine Segmentzusammenführung durchgeführt wird.</p>POST my-index/_close
PUT my-index/_settings
{
    "codec": "best_compression"
}
  
POST my-index/_open  
POST my-index/_forcemerge?max_num_segments=1<h2><strong>Die Ergebnisse</strong></h2><p>Die Ergebnisse bestätigten unsere Hypothese: Die verbesserte Speichereffizienz führte direkt zu einer erheblichen Steigerung der Suchleistung, ohne dass die CPU-Auslastung anstieg.</p><p>Durch die Anwendung von <code>best_compression</code> wurde die Indexgröße um etwa 25 % reduziert. Obwohl die Reduzierung geringer ausfiel als bei sich wiederholenden Log-Daten, erhöhte diese 25%ige Reduzierung effektiv unsere Seitencache-Kapazität um denselben Faktor.</p><p>Beim nächsten Auslastungstest (ab 17:00 Uhr) war der Traffic sogar noch höher und erreichte seinen Höhepunkt bei 500 Anfragen pro Minute pro Elasticsearch-Node.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta61ab3bd5ded5716/6a170449a6c2b9f711e795dd/fc1902f396cb2115c0013155ad07f6eb87389c60-660x309.png" alt="Belastungstest in Elasticsearch" /><p>Trotz der höheren Last war die CPU-Auslastung geringer als in der vorherigen Ausführung. Die erhöhte Nutzung im früheren Test war wahrscheinlich auf den Overhead durch übermäßige Seitenfehlerbehandlung und Festplatten-I/O-Verwaltung zurückzuführen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9fd1a44b02a4f787/6a17044b2b835ff996f4b0e6/15699ef4c65b3f0a9f8a3e1bae8bb18f7b647025-819x352.png" alt="Verbesserung der CPU-Auslastung von Elasticsearch mit best_compression" /><p>Entscheidend ist, dass die Seitenfehler deutlich zurückgingen. Selbst bei höherem Durchsatz lagen die Fehler bei etwa &lt;200.000 pro Minute, verglichen mit &gt;300.000 im Basistest.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltef0c621d76767115/6a17044c2b835fe49ef4b0ea/f76ca967976d740af88a9359b66041701abb46fc-764x340.png" alt="Anzahl der Seitenfehler Elasticsearch-Leistungsverbesserung mit best_compression" /><p>Obwohl die Seitenfehlerergebnisse immer noch nicht optimal waren, wurde die Abfragedienstzeit um etwa 50 % reduziert und lag selbst bei höherer Last unter 30 ms.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6579b3d005d04101/6a17044e66c4f9179cf8bf13/750ec1c59b8eb5069aed4c066d856ecea82d5bca-620x311.png" alt="Leistungsverbesserung der durchschnittlichen Abfragedienstzeit in Elasticsearch mit best_compression" /><p></p><h2><strong>Fazit: best_compression zum Suchen</strong></h2><p>Für Such-Anwendungsfälle, in denen das Datenvolumen den verfügbaren physischen Speicher übersteigt, ist <code>best_compression</code> ein kraftvoller Hebel zur Leistungsoptimierung.</p><p>Die herkömmliche Lösung für Cache-Fehler besteht darin, den Arbeitsspeicher (RAM) zu skalieren. Allerdings haben wir durch die Reduzierung der Indexgröße das gleiche Ziel erreicht: Maximierung der Dokumentanzahl im Seiten-Cache. Unser nächster Schritt ist es, die <a href="https://www.elastic.co/blog/space-savings-a-lesser-known-benefit-of-index-sorting-in-elasticsearch"><strong>Indexsortierung</strong></a> zu untersuchen, um den Speicher weiter zu optimieren und noch mehr Leistung aus unseren bestehenden Ressourcen herauszuholen.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/improve-elasticsearch-performance-best-compression</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/improve-elasticsearch-performance-best-compression</guid>
    <category><![CDATA[Inside Elastic]]></category>
    <dc:creator><![CDATA[Sherry Ger,Ryan Eno]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4ff57fbb95c04412/6a17044fab7f081490db9d66/5141a8c2618337207d848ce16b258a86885955b2-1600x1034.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 23 Jan 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[Konfiguration der rekursiven Segmentierung für strukturierte Dokumente in Elasticsearch]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie rekursives Chunking in Elasticsearch mit Chunk-Größe, Trenngruppen und benutzerdefinierten Trennlisten für eine optimale strukturierte Dokumentenindizierung konfigurieren.]]></description>
    <content:encoded><![CDATA[<p>Seit Version 8.16 können Benutzer die Chunking-Strategie konfigurieren, die beim Importieren langer Dokumente in semantische Textfelder verwendet wird. Ab Version 9.1 / 8.19 haben wir eine neue konfigurierbare rekursive Chunking-Strategie eingeführt, die eine Liste regulärer Ausdrücke verwendet, um das Dokument in Abschnitte zu unterteilen. Das Ziel des Chunking ist es, ein langes Dokument in Abschnitte zu unterteilen, die zusammengehörige Inhalte enthalten. Unsere bisherigen Strategien zerlegen Texte auf der Ebene einzelner Wörter/Sätze, aber Dokumente, die in strukturierten Formaten geschrieben sind (z. B. Markdown-Dateien enthalten oft zusammengehörige Inhalte innerhalb von Abschnitten, die durch Trennzeichen definiert sind (z. B. Überschriften). Für diese Art von Dokumenten führen wir die rekursive Chunking-Strategie ein, um das Format strukturierter Dokumente zu nutzen und bessere Chunks zu erstellen!</p><h2>Was ist rekursives Chunking?</h2><p>Bei der rekursiven Segmentierung wird eine Liste von vorgegebenen Abschnittstrennungsmustern durchlaufen, um ein Dokument schrittweise in kleinere Segmente zu unterteilen, bis eine gewünschte maximale Segmentgröße erreicht ist.</p><h3>Wie konfiguriere ich rekursives Chunking?</h3><p>Folgende Werte können vom Benutzer für die rekursive Segmentierung konfiguriert werden:</p><ul><li><p>(erforderlich) <code>max_chunk_size</code>: Die maximale Anzahl von Wörtern in einem Chunk.</p></li><li><p>Entweder eines von beiden:</p><ul><li><p><code>separators</code>Eine Liste von regulären Ausdrücken, die verwendet werden, um das Dokument in Abschnitte zu unterteilen.</p></li><li><p><code>separator_group</code>Eine Zeichenkette, die einer von Elastic definierten Standardliste von Trennzeichen zugeordnet wird, die für bestimmte Dokumenttypen verwendet werden. Aktuell sind <code>markdown</code> und <code>plaintext</code> verfügbar.</p></li></ul></li></ul><h3>Wie funktioniert rekursives Chunking?</h3><p>Der Prozess des rekursiven Chunkings bei gegebenem Eingabedokument, einem <code>max_chunk_size</code> (gemessen in Wörtern) und einer Liste von Trennzeichenketten verläuft wie folgt:</p><ol><li><p>Wenn das Eingabedokument bereits innerhalb der maximalen Chunk-Größe liegt, wird ein einzelner Chunk zurückgegeben, der die gesamte Eingabe umfasst.</p></li><li><p>Teile den Text anhand des Vorkommens des Trennzeichens in mögliche Abschnitte auf. Für jeden potenziellen Teil:</p><ol><li><p>Wenn der potenzielle Datenblock innerhalb der maximalen Datenblockgröße liegt, fügen Sie ihn der Liste der an den Benutzer zurückzugebenden Datenblöcke hinzu.</p></li><li><p>Andernfalls wiederholen Sie ab Schritt 2, wobei Sie nur den Text aus dem potenziellen Chunk verwenden und diesen anhand des nächsten Trennzeichens in der Liste aufteilen. Wenn keine weiteren Trennzeichen mehr übrig sind, sollte man auf satzbasierte Segmentierung zurückgreifen.</p></li></ol></li></ol><h2>Beispiele für die Konfiguration von rekursivem Chunking</h2><p>Abgesehen von der Chunk-Größe besteht die wichtigste Konfiguration für rekursives Chunking in der Auswahl der Trennzeichen, die zum Aufteilen der Dokumente verwendet werden sollen. Wenn Sie nicht sicher sind, wo Sie anfangen sollen, bietet Elasticsearch einige Standardtrennzeichengruppen an, die für gängige Anwendungsfälle verwendet werden können.</p><h3>Verwendung von Trenngruppen</h3><p>Um eine Trenngruppe zu verwenden, geben Sie einfach den Namen der Gruppe an, die Sie bei der Konfiguration der Chunking-Einstellungen verwenden möchten. Zum Beispiel:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separator_group": "plaintext"
}<p>Dies führt zu einer rekursiven Chunking-Strategie, die die Trennzeichenliste <code>["(?&lt;!\\n)\\n\\n(?!\\n)", "(?&lt;!\\n)\\n(?!\\n)")]</code> verwendet. Dies funktioniert gut für allgemeine Klartextanwendungen, wobei der Text an zwei Zeilenumbruchzeichen, gefolgt von einem weiteren Zeilenumbruchzeichen, geteilt wird.</p><p>Wir bieten außerdem eine Trennzeichengruppe <code>markdown</code> an, die die Trennzeichenliste verwendet:</p>[
"\n# ",
       "\n## ",
       "\n### ",
       "\n#### ",
       "\n##### ",
       "\n###### ",
       "\n^(?!\\s*$).*\\n-{1,}\\n",
       "\n^(?!\\s*$).*\\n={1,}\\n"
]<p>Diese Trennzeichenliste eignet sich gut für allgemeine Markdown-Anwendungsfälle, da sie an jeder der 6 Überschriftenebenen und den Abschnittsumbruchzeichen aufteilt.</p><p>Beim Erstellen einer Ressource (Inferenzendpunkt/semantisches Textfeld) wird die Liste der Trennzeichen, die der Trennzeichengruppe zu diesem Zeitpunkt entsprechen, in Ihren Konfigurationen gespeichert. Wenn die Trenngruppe zu einem späteren Zeitpunkt aktualisiert wird, ändert sich dadurch das Verhalten Ihrer bereits erstellten Ressourcen nicht.</p><h3>Verwendung einer benutzerdefinierten Trennliste</h3><p>Falls eine der vordefinierten Trennzeichengruppen für Ihren Anwendungsfall nicht geeignet ist, können Sie eine benutzerdefinierte Liste von Trennzeichen definieren, die Ihren Anforderungen entspricht. Beachten Sie, dass reguläre Ausdrücke innerhalb der Trennzeichenliste angegeben werden können. Nachfolgend ein Beispiel für Chunking-Einstellungen mit benutzerdefinierten Trennzeichen:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n\n", "\n", "&lt;my-custom-separator&gt;"]
}<p>Die oben beschriebene Chunking-Strategie teilt an zwei Zeilenumbruchzeichen, gefolgt von einem Zeilenumbruchzeichen und schließlich an der Zeichenkette <code>“&lt;my-custom-separator&gt;”</code> auf.</p><h2>Ein Beispiel für rekursives Chunking in der Praxis</h2><p>Schauen wir uns ein Beispiel für rekursives Chunking in der Praxis an. In diesem Beispiel verwenden wir die folgenden Chunking-Einstellungen mit einer benutzerdefinierten Liste von Trennzeichen, die ein Markdown-Dokument anhand der beiden obersten Header-Ebenen aufteilen:</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n# ", "\n## "]
}<p>Werfen wir einen Blick auf ein einfaches, unstrukturiertes Markdown-Dokument:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdb5f41d1bd43ba50/6a17e831e9ea87c1d8a9c5f3/3a5507f4a1288065097231548e5b18e240508785-1302x1446.png" alt="Ein nicht segmentiertes Markdown-Dokument" /><p>Nun verwenden wir die oben definierten Chunking-Einstellungen, um das Dokument in Chunking-Elemente zu unterteilen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfffda162c7b9c87a/6a17e83296142aefa8eb1b0b/a3313c4c40ff39b8dbcdd7c4878c723f088e6c1a-1600x1187.png" alt="Aufteilen eines Dokuments in Elasticsearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt96f65346a8e09e3a/6a17e834445de9157b4d015e/79a2921943191ea631df94c9d465818ec8d3e738-1600x1206.png" alt="Aufteilen am zweiten Trennzeichen – Aufteilen eines Dokuments in Elasticsearch" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28381c8f85aedf07/6a17e836ec0f89801e5a6640/459e695cce7540267422396b9a62ff4ad35f61db-1600x1260.png" alt="Letzte Abschnitte in einem Dokument nach satzbasierter Segmentierung in Elasticsearch" /><p>Hinweis: Der Zeilenumbruch am Ende jedes Abschnitts (außer Abschnitt 3) ist nicht hervorgehoben, befindet sich aber innerhalb der eigentlichen Abschnittsgrenzen.</p><h3>Legen Sie noch heute mit rekursivem Chunking los!</h3><p>Weitere Informationen zur Nutzung dieser Funktion finden Sie in der Dokumentation zur Konfiguration der Chunking-Einstellungen.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/recursive-chunking-structured-documents-elasticsearch</guid>
    <category><![CDATA[Grundlagen]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <category><![CDATA[KI]]></category>
    <dc:creator><![CDATA[Daniel Rubinstein]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf442dc4941f37be7/6a17e838505ac3eaf8ad8b3d/591872e31880768ca927507654a621addc0d124d-1600x960.png" length="0" type="image/png"/>
    <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Experimente zur Verbesserung von Agentic AI-Tools für Elasticsearch]]></title>
    <description><![CDATA[Erfahren Sie, wie wir die Arbeitsabläufe von KI-Agenten für Elasticsearch durch iterative Experimente verbessert haben, indem wir lineare Retriever, hybride Suche und semantic_text für eine skalierbare RAG-Optimierung kombiniert haben.]]></description>
    <content:encoded><![CDATA[<p>Wie heutzutage alle anderen setzen auch wir bei Elastic voll auf Chat, Agenten und RAG. In der Suchabteilung haben wir kürzlich an einem Agent Builder und einer Tool Registry gearbeitet, alles mit dem Ziel, die Interaktion mit Ihren Daten in Elasticsearch so einfach wie möglich zu gestalten.</p><p>Lesen Sie den <a href="https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder">Blogbeitrag „Building AI Agentic Workflows with Elasticsearch“,</a> um mehr über das Gesamtbild dieser Bemühungen zu erfahren, oder <a href="https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch">„Your First Elastic Agent: From a Single Query to an AI-Powered Chat“</a> für eine praxisorientiertere Einführung.</p><p>In diesem Blogbeitrag wollen wir uns jedoch etwas genauer mit einem der ersten Dinge befassen, die beim Starten eines Chats passieren, und Ihnen einige der kürzlich vorgenommenen Verbesserungen vorstellen.</p><h2>Was geschieht hier?</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1331b1043612efe3/6a17f115505ac3dc41ad8c3c/25a24055a166d7d6ba81d80aa35cb97163662e23-1600x443.png" alt="" /><p>Wenn Sie mit Ihren Elasticsearch-Daten interagieren, durchläuft unser standardmäßiger KI-Agent diesen Standardablauf:</p><ol><li><p>Überprüfen Sie die Eingabeaufforderung.</p></li><li><p>Ermitteln Sie, welcher Index wahrscheinlich die Antworten auf diese Frage enthält.</p></li><li><p>Erstelle eine Abfrage für diesen Index basierend auf der Eingabeaufforderung.</p></li><li><p>Durchsuchen Sie diesen Index mit dieser Suchanfrage.</p></li><li><p>Die Ergebnisse zusammenfassen.</p></li><li><p>Können die Ergebnisse die Fragestellung beantworten? Falls ja, antworten Sie bitte. Wenn nicht, wiederholen Sie den Vorgang, aber versuchen Sie etwas anderes.</p></li></ol><p>Das sollte nicht allzu neuartig aussehen – es ist einfach nur Retrieval Augmented Generation (RAG). Wie zu erwarten, hängt die Qualität Ihrer Antworten stark von der Relevanz Ihrer ersten Suchergebnisse ab. Während wir an der Verbesserung unserer Antwortqualität gearbeitet haben, haben wir den Abfragen, die wir in Schritt 3 generiert und in Schritt 4 ausgeführt haben, sehr große Aufmerksamkeit geschenkt. Und wir haben ein interessantes Muster festgestellt.</p><p>Oftmals lag es bei unseren ersten, „schlechten“ Antworten nicht daran, dass wir eine fehlerhafte Abfrage ausgeführt hatten. Das lag daran, dass <em>wir den falschen Index für die Abfrage ausgewählt hatten</em> . Die Schritte 3 und 4 waren normalerweise nicht unser Problem – es war Schritt 2.</p><h2>Was haben wir gemacht?</h2><p>Unsere erste Implementierung war einfach. Wir hatten ein Tool (namens index_explorer) entwickelt, das effektiv eine <code>_cat/indices</code> -Auflistung aller verfügbaren Indizes durchführt und anschließend den LLM auffordert, denjenigen dieser Indizes zu ermitteln, der am besten zur Nachricht/Frage/Aufforderung des Benutzers passt. Die <a href="https://github.com/elastic/kibana/blob/0cc78184957fcd12110dabae50353392ea937508/x-pack/platform/packages/shared/onechat/onechat-genai-utils/tools/index_explorer.ts#L98-L113">ursprüngliche Implementierung können Sie hier</a> einsehen.</p>You are an AI assistant for the Elasticsearch company.
based on a natural language query from the user, your task is to select up to ${limit} most relevant indices from a list of indices.

*The natural language query is:* ${nlQuery}

*List of indices:*
${indices.map((index) =&gt; `- ${index.index}`).join('\n')}

Based on those information, please return most relevant indices with your reasoning.
Remember, you should select at maximum ${limit} indices.<p>Wie gut funktionierte das? Wir waren uns nicht sicher! Wir hatten klare Beispiele, wo es <em>nicht</em> gut funktionierte, aber unsere eigentliche erste Herausforderung bestand darin, unseren aktuellen Zustand zu quantifizieren.</p><h2>Festlegung einer Ausgangsbasis</h2><h3>Es beginnt mit Daten</h3><p>Was wir brauchten, war ein Referenzdatensatz, um die Effektivität eines Tools bei der Auswahl des richtigen Index anhand einer Benutzereingabe und einer bereits vorhandenen Menge von Indizes zu messen. Und wir hatten keinen solchen Datensatz zur Hand. Also haben wir einen generiert.</p><p>Hinweis: Wir wissen, dass dies nicht die „Best Practice“ ist. Manchmal ist es aber besser, vorwärts zu gehen, als auf der Stelle zu treten. <a href="https://www.elastic.co/about/our-source-code#progress-perfection">Fortschritt, schlichte Perfektion</a>.</p><p>Wir haben mithilfe <a href="https://gist.github.com/seanstory/a08db2e149897da656db3a1ca72e17ac">dieser Eingabeaufforderung</a> Startindizes für verschiedene Domänen generiert. Anschließend generierten wir für jede generierte Domäne mithilfe<a href="https://gist.github.com/seanstory/a280a85d067e61bfeb5911bf2654e6e2"> dieser Eingabeaufforderung</a> einige weitere Indizes (Ziel war es, das LLM mit schwierigen Negativen und schwer zu klassifizierenden Beispielen zu verwirren). Anschließend haben wir jeden generierten Index und seine Beschreibungen manuell bearbeitet. Abschließend generierten wir mithilfe <a href="https://gist.github.com/seanstory/44291b666c05a383136f6e36bb9106fa">dieser Eingabeaufforderung</a> Testabfragen. Dies ergab Beispieldaten wie:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1bd9cd78154195e3/6a17f117dbb4fff7b5fb57d2/9d96d87e286eddbc012402b1ecccd57419a99253-1600x782.png" alt="" /><p>und Testfälle wie:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltadf30a0aeafd56ef/6a17f1192f4a5c160ffa89eb/4c2e9ad941d98d7e66033bbc08c9b8060ec19097-1600x797.png" alt="" /><h3>Anfertigung eines Testgeschirrs</h3><p>Der weitere Ablauf war von hier an sehr einfach. Entwerfen Sie ein Tool, das Folgendes kann:</p><ol><li><p>Erstellen Sie eine saubere Ausgangsbasis mit einem Elasticsearch-Zielcluster.</p></li><li><p>Erstelle alle im Zieldatensatz definierten Indizes.</p></li><li><p>Führen Sie für jedes Testszenario das Tool i<code>ndex_explorer</code> aus (praktischerweise verfügen wir über eine <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-agent-builder-tools-execute">Execute Tool API</a>).</p></li><li><p>Vergleiche den Ergebnisindex mit dem erwarteten Index und speichere das Ergebnis.</p></li><li><p>Nachdem alle Testszenarien abgeschlossen sind, werden die Ergebnisse tabellarisch erfasst.</p></li></ol><h3>Laut einer Umfrage…</h3><p>Die ersten Ergebnisse waren wenig überraschend mittelmäßig.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt73367741359e258d/6a17f11a505ac39749ad8c40/9c10679bcd6291edfa2a9ba42e7dd922aa483f0b-1216x806.png" alt="" /><p>Insgesamt lag die Trefferquote bei der Identifizierung des richtigen Index bei 77,14 %. Und das war ein „Best-Case“-Szenario, in dem alle Indizes gute, semantisch aussagekräftige Namen haben. Jeder, der schon einmal `PUT test2/_doc/foo {...}` ausgeführt hat, weiß, dass die Indizes nicht immer aussagekräftige Namen haben.</p><p>Wir haben also einen Ausgangspunkt, und dieser zeigt, dass es noch viel Raum für Verbesserungen gibt. Nun war es Zeit für etwas Wissenschaft! 🧪</p><h2>Experimentieren</h2><h3>Hypothese 1: Kartierungen werden helfen</h3><p>Das Ziel hierbei ist es, einen Index zu identifizieren, der Daten enthält, die für die ursprüngliche Fragestellung relevant sind. Und der Teil eines Index, der die darin enthaltenen Daten am besten beschreibt, sind die <em>Indexzuordnungen</em>. Selbst ohne Stichproben aus dem Indexinhalt zu entnehmen, lässt die Tatsache, dass der Index ein Preisfeld vom Typ double besitzt, darauf schließen, dass die Daten etwas darstellen, das verkauft werden soll. Ein Autorenfeld vom Typ Text impliziert unstrukturierte Sprachdaten. Die Kombination der beiden Begriffe könnte darauf hindeuten, dass es sich bei den Daten um Bücher/Geschichten/Gedichte handelt. Allein aus der Kenntnis der Eigenschaften eines Index lassen sich viele semantische Hinweise ableiten. In einem lokalen Branch habe ich also unsere `.index_explorer`-Methode angepasst. Tool zum Senden der vollständigen Zuordnungen eines Index (samt Namen) an das LLM zur Entscheidungsfindung. </p><p>Das Ergebnis (aus den Kibana-Protokollen):</p>[2025-09-05T11:01:21.552-05:00][ERROR][plugins.onechat] Error: Error calling connector: event: error
data: {"error":{"code":"request_entity_too_large","message":"Received a content too large status code for request from inference entity id [.rainbow-sprinkles-elastic] status [413]","type":"error"}}


    at createInferenceProviderError (errors.ts:90:10)
    at convertUpstreamError (convert_upstream_error.ts:39:38)
    at handle_connector_response.ts:26:33
    at Observable.init [as _subscribe] (/Users/seanstory/Desktop/Dev/kibana/node_modules/rxjs/src/internal/observable/throwError.ts:123:68)...<p>Die ursprünglichen Entwickler des Tools hatten dies vorhergesehen. Während die Zuordnung eines Index eine wahre Fundgrube an Informationen darstellt, ist sie gleichzeitig ein ziemlich umfangreicher JSON-Block. Und in einem realistischen Szenario, in dem man zahlreiche Indizes vergleicht (unser Evaluierungsdatensatz definiert 20), summieren sich diese JSON-Blobs. Wir möchten dem LLM also mehr Kontext für seine Entscheidung geben als nur Indexnamen für alle Optionen, aber nicht so sehr die vollständigen Zuordnungen jeder einzelnen.</p><h3>Hypothese 2: „Vereinfachte“ Zuordnungen (Feldlisten) als Kompromiss</h3><p>Wir gingen von der Annahme aus, dass Indexersteller semantisch aussagekräftige Indexnamen verwenden würden. Was wäre, wenn wir diese Annahme auch auf Feldnamen ausdehnen würden? Unser vorheriges Experiment scheiterte, weil Mapping-JSON eine Menge überflüssiger Metadaten und Boilerplate-Code enthält.</p>     "description_text": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          },
          "copy_to": [
            "description_semantic"
          ]
        },<p>Der obige Block beispielsweise umfasst 236 Zeichen und definiert lediglich ein einzelnes Feld in einem Elasticsearch-Mapping. Die Zeichenkette „description_text“ hingegen umfasst nur 16 Zeichen. Das entspricht einer fast 15-fachen Erhöhung der Zeichenanzahl, ohne dass sich die semantische Aussagekraft dieses Feldes hinsichtlich der verfügbaren Daten sinnvoll verbessert. Was wäre, wenn wir Zuordnungen für alle Indizes abrufen, diese aber vor dem Senden an das LLM zu einer Liste ihrer Feldnamen „vereinfachen“ würden?</p><p>Wir haben es versucht.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta5eda7a79493ee81/6a17f11c9da390327fe46590/112c2f447c11f154b5082725cd49b51d0a3c8a65-1214x804.png" alt="" /><p>Das ist großartig! Durchweg Verbesserungen. Aber könnten wir es besser machen?</p><h3>Hypothese 3: Beschreibungen in der Mapping-Datei _meta</h3><p>Wenn schon Feldnamen ohne zusätzlichen Kontext einen so großen Sprung verursachen, wäre das Hinzufügen von substanziellem Kontext vermutlich noch besser! Es ist nicht unbedingt üblich, jedem Index eine Beschreibung beizufügen, aber es ist möglich, dem _meta-Objekt der Zuordnung Metadaten auf Indexebene jeglicher Art hinzuzufügen. Wir haben unsere generierten Indizes erneut aufgerufen und jedem Index in unserem Datensatz eine Beschreibung hinzugefügt. Solange die Beschreibungen nicht übermäßig lang sind, sollten sie weniger Tokens verwenden als die vollständige Zuordnung und einen deutlich besseren Einblick in die im Index enthaltenen Daten bieten. Unser Experiment bestätigte diese Hypothese.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61b85cf40e0e6357/6a17f11dfbc5f82809491bbe/32d2692ad4479d0e52d8ee723dcc5710a6ec90f3-1208x806.png" alt="" /><p>Eine kleine Verbesserung, und wir liegen jetzt durchweg bei über 90 % Genauigkeit.</p><h3>Hypothese 4: Das Ganze ist größer als seine Teile</h3><p>Feldnamen haben unsere Ergebnisse verbessert. Die Beschreibungen verbesserten unsere Ergebnisse. Die Verwendung <em>von </em>Beschreibungen UND Feldnamen sollte also noch bessere Ergebnisse liefern, richtig?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte6297c6aaf7db802/6a17f11e14d90c1bd779b6e6/114cbb408ff16b136251d2265416bd5270380fe5-1208x794.png" alt="" /><p>Die Daten ergaben „nein“ (keine Veränderung gegenüber dem vorherigen Experiment). Die vorherrschende Theorie hierbei war, dass, da die Beschreibungen von vornherein aus den Indexfeldern/Zuordnungen generiert wurden, zwischen diesen beiden Kontextelementen nicht genügend unterschiedliche Informationen vorhanden sind, um bei ihrer Kombination etwas „Neues“ hinzuzufügen. Darüber hinaus wird die Nutzlast, die wir für unsere 20 Testindizes senden, ziemlich groß. Der Gedankengang, dem wir bisher gefolgt sind, ist nicht skalierbar. Tatsächlich gibt es guten Grund zu der Annahme, dass keines unserer bisherigen Experimente auf Elasticsearch-Clustern funktionieren würde, bei denen Hunderte oder Tausende von Indizes zur Auswahl stehen. Ein Ansatz, der die Größe der an den LLM gesendeten Nachricht linear mit der Gesamtzahl der Indizes erhöht, dürfte wahrscheinlich keine allgemein anwendbare Strategie darstellen.</p><p>Was wir wirklich brauchen, ist ein Ansatz, der uns hilft, eine große Anzahl von Kandidaten auf die relevantesten Optionen zu reduzieren…</p><p>Wir haben es hier mit einem Suchproblem zu tun.</p><h3>Hypothese 5: Selektion durch semantische Suche</h3><p>Wenn der Name eines Indexes eine semantische Bedeutung hat, dann kann er als Vektor gespeichert und semantisch durchsucht werden.</p><p>Wenn die Feldnamen eines Index eine semantische Bedeutung haben, dann können sie als Vektoren gespeichert und semantisch durchsucht werden.</p><p>Wenn ein Index eine Beschreibung mit semantischer Bedeutung besitzt, kann auch diese als Vektor gespeichert und semantisch durchsucht werden.</p><p>Aktuell sind diese Informationen mit Elasticsearch-Indizes nicht durchsuchbar (vielleicht sollten wir das ändern!), aber es war relativ einfach, <a href="https://github.com/elastic/connectors/pull/3638"> etwas zusammenzubasteln</a> , das diese Lücke umgehen konnte. Mithilfe des Connector-Frameworks von Elastic habe ich einen Connector erstellt, der für jeden Index in einem Cluster ein Dokument ausgibt. Die Ausgabedokumente würden etwa so aussehen:</p> doc = {
                "_id": index_name,
                "index_name": index_name,
			"meta_description”: description,
"field_descriptions" = field_descriptions,
                "mapping": json.dumps(mapping),  
                "source_cluster": self.es_client.configured_host,
            }<p>Ich habe diese Dokumente in einen neuen Index verschoben, in dem ich die Zuordnung manuell wie folgt definiert habe:</p>{
   "mappings": {
       "properties": {
           "semantic_content": {
               "type": "semantic_text"
           },
           "index_name": {
               "type": "text",
               "copy_to": "semantic_content"
           },
           "mapping": {
               "type": "keyword",
               "copy_to": "semantic_content"
           },
           "source_cluster": {
               "type": "keyword"
           },
           "meta_description": {
               "type": "text",
               "copy_to": "semantic_content"
           },
           "field_descriptions": {
               "type": "text",
               "copy_to": "semantic_content"
           }
       }
   }
}<p>Dadurch entsteht ein einzelnes semantisches Inhaltsfeld, in dem alle anderen Felder mit semantischer Bedeutung zusammengefasst und indiziert werden. Die Suche in diesem Index wird trivial, mit lediglich:</p>GET indexed-indices/_search
{
 "query": {
   "semantic": {
     "field": "semantic_content",
     "query": "$query"
   }
 }
}<p>Das modifizierte <code>index_explorer</code> -Tool ist jetzt <em>wesentlich</em> schneller, da es keine Anfrage an ein LLM stellen muss, sondern stattdessen eine einzelne Einbettung für die gegebene Anfrage anfordern und eine effiziente Vektorsuche durchführen kann. Wenn wir den Spitzenreiter als unseren ausgewählten Index verwenden, erhalten wir folgende Ergebnisse:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc27c302e6bef0b23/6a17f120577262d2f21bccdc/06ef5d78040d064d3444793f636d527d9e19a869-1214x800.png" alt="" /><p>Dieser Ansatz ist skalierbar. Diese Vorgehensweise ist effizient. Dieser Ansatz ist aber kaum besser als unser Ausgangszustand. Das ist allerdings nicht überraschend; der Suchansatz ist hier unglaublich naiv. Da gibt es keine Nuancen. Es wird nicht anerkannt, dass der Name und die Beschreibung eines Index mehr Gewicht haben sollten als ein beliebiger Feldname, der im Index enthalten ist. Es besteht keine Möglichkeit, exakte lexikalische Übereinstimmungen gegenüber synonymen Übereinstimmungen zu gewichten. Allerdings müsste man für die Erstellung einer hochdifferenzierten Abfrage eine Menge Annahmen über die vorliegenden Daten treffen. Bis jetzt haben wir bereits einige große Annahmen darüber getroffen, dass Index- und Feldnamen eine semantische Bedeutung haben, aber wir müssten noch einen Schritt weiter gehen und anfangen anzunehmen, <em>wie viel</em> Bedeutung sie haben und wie sie zueinander in Beziehung stehen. Ohne dies zu tun, können wir wahrscheinlich nicht zuverlässig die beste Übereinstimmung als unser Top-Ergebnis identifizieren, sondern können eher sagen, dass die beste Übereinstimmung irgendwo unter den Top N Ergebnissen liegt. Wir benötigen etwas, das semantische Informationen in dem Kontext, in dem sie existieren, verarbeiten, mit einer anderen Entität vergleichen kann, die sich möglicherweise auf eine semantisch unterschiedliche Weise darstellt, und zwischen ihnen urteilen kann. Wie ein LLM.</p><h3>Hypothese 6: Reduktion der Kandidatenmenge</h3><p>Es gab noch einige weitere Experimente, die ich hier nur kurz erwähnen werde, aber der entscheidende Durchbruch bestand darin, den Wunsch aufzugeben, die beste Übereinstimmung ausschließlich anhand einer semantischen Suche auszuwählen, und stattdessen die semantische Suche als Filter zu nutzen, um irrelevante Indizes aus der Betrachtung des LLM auszusortieren. Wir kombinierten Linear Retrievers, Hybrid Search mit RRF und <code>semantic_text</code> für <a href="https://gist.github.com/seanstory/d704443120e20f6c844db10e30066860">unsere Suche</a> und beschränkten die Ergebnisse auf die Top 5 übereinstimmenden Indizes.</p><p>Anschließend haben wir für jede Übereinstimmung den Namen des Index, die Beschreibung und die Feldnamen zu einer Nachricht für das LLM hinzugefügt. Die Ergebnisse waren fantastisch:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7ac4cb8f7153fdf9/6a17f121af47b66d1dcde082/8fcabd78f591f90d6bc7c0e087d31317e4eef791-1206x804.png" alt="" /><p>Die höchste Genauigkeit, die je in einem Experiment erzielt wurde! Und weil bei diesem Ansatz die Nachrichtengröße nicht proportional zur Gesamtzahl der Indizes ansteigt, ist dieser Ansatz weitaus besser skalierbar.</p><h2>Ergebnisse</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8d66130d9fae6bea/6a17f123ddf97d7527910c19/04d630797213dbb8bf567da41d1cdd5c7b4586c9-1600x521.png" alt="" /><p>Das erste eindeutige Ergebnis war, dass unsere Ausgangslage verbessert werden <em>kann</em> . Dies erscheint im Nachhinein offensichtlich, aber bevor die Experimente begannen, gab es ernsthafte Diskussionen darüber, ob wir unser <code>index_explorer</code> -Tool ganz aufgeben und uns auf eine explizite Konfiguration durch den Benutzer verlassen sollten, um den Suchraum einzuschränken. Auch wenn dies nach wie vor eine praktikable und gültige Option darstellt, zeigt diese Studie, dass es vielversprechende Wege zur Automatisierung der Indexauswahl gibt, wenn solche Benutzereingaben nicht verfügbar sind.</p><p>Das nächste eindeutige Ergebnis war, dass das bloße Hinzufügen weiterer beschreibender Zeichen zur Lösung des Problems immer weniger Nutzen bringt. Vor dieser Studie hatten wir darüber diskutiert, ob wir in den Ausbau der Elasticsearch-Funktionalität zur Speicherung <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-field-meta">von Metadaten auf Feldebene</a> investieren sollten. Heute sind diese <code>meta</code> -Werte auf 50 Zeichen begrenzt, und es gab die Annahme, dass wir diesen Wert erhöhen müssten, um ein semantisches Verständnis unserer Felder zu erlangen. Dies ist eindeutig nicht der Fall, und das LLM scheint mit reinen Feldnamen recht gut zurechtzukommen. Wir werden dies möglicherweise später noch genauer untersuchen, aber es erscheint uns momentan nicht dringlich.</p><p>Umgekehrt hat dies deutlich gezeigt, wie wichtig „durchsuchbare“ Indexmetadaten sind. Für diese Experimente haben wir einen Index von Indizes gehackt. Aber das ist etwas, was wir untersuchen könnten, indem wir es direkt in Elasticsearch integrieren, APIs zur Verwaltung erstellen oder zumindest eine Konvention dafür festlegen. Wir werden unsere Optionen abwägen und intern diskutieren, also bleiben Sie gespannt.</p><p>Letztendlich hat diese Anstrengung den Wert darin bestätigt, uns Zeit für Experimente zu nehmen und datengestützte Entscheidungen zu treffen. Tatsächlich hat es uns geholfen, erneut zu bestätigen, dass unser Agent Builder-Produkt robuste, im Produkt integrierte Evaluierungsfunktionen benötigt. Wenn wir ein komplettes Test-Framework nur für ein Tool entwickeln müssen, das Indizes auswählt, benötigen unsere Kunden unbedingt Möglichkeiten, ihre kundenspezifischen Tools qualitativ zu bewerten, während sie iterative Anpassungen vornehmen.</p><p>Ich bin gespannt, was wir bauen werden, und ich hoffe, Sie auch!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-agent-builder-experiments-performance</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-agent-builder-experiments-performance</guid>
    <category><![CDATA[Agentische KI]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <category><![CDATA[Hybride Suche]]></category>
    <dc:creator><![CDATA[Sean Story]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt68d11a4c7fd11d4c/6a17f1257b54f9b6598b39d4/42903c869e034674b30bb36013345aaa97f6608b-1184x864.png" length="0" type="image/png"/>
    <pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Ihr erster Elastic Agent: Von einer einzelnen Anfrage bis zum KI-gestützten Chat]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie mit dem AI Agent Builder von Elastic spezialisierte KI-Agenten erstellen können. In diesem Blogbeitrag entwickeln wir einen KI-gestützten Finanzagenten.]]></description>
    <content:encoded><![CDATA[<p>Mit dem neuen <a href="https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder">Agent Builder</a> von Elastic können Sie spezialisierte KI-Agenten erstellen, die als Experten für Ihre spezifischen Geschäftsbereiche fungieren. Diese Funktion geht über einfache Dashboards und Suchleisten hinaus und verwandelt Ihre Daten von einer passiven Ressource in einen aktiven, dialogfähigen Partner.</p><p>Stellen Sie sich einen Finanzmanager vor, der sich vor einem Kundengespräch schnell einarbeiten muss. Statt manuell Newsfeeds zu durchforsten und Portfolio-Dashboards abzugleichen, können sie ihrem individuell entwickelten Agenten jetzt einfach eine direkte Frage stellen. Das ist der Vorteil eines „Chat-First“-Ansatzes. Der Manager hat einen direkten, dialogorientierten Draht zu seinen Daten und fragt beispielsweise: „Was gibt es Neues zu ACME Corp und wie wirkt sich das auf die Anlagen meines Kunden aus?“ und innerhalb von Sekunden eine zusammengefasste Expertenantwort zu erhalten.</p><p>Während wir heute einen Finanzexperten aufbauen, sind die Anwendungsbereiche so vielfältig wie Ihre Daten. Mit der gleichen Macht kann ein Cybersicherheitsanalyst zur Suche nach Bedrohungen, ein Site Reliability Engineer zur Diagnose eines Ausfalls oder ein Marketingmanager zur Optimierung einer Kampagne geschaffen werden. Unabhängig vom Fachgebiet bleibt die Kernmission dieselbe: Ihre Daten in einen Spezialisten zu verwandeln, mit dem Sie sich unterhalten können.</p><h2>Schritt 0: Unser Datensatz</h2><p>Unser heutiger Datensatz ist ein synthetischer, auf Finanzdaten basierender Datensatz, der aus Finanzkonten, Vermögenspositionen, Nachrichten und Finanzberichten besteht. Er ist zwar synthetisch, repliziert aber eine vereinfachte Version eines realen Finanzdatensatzes.</p><p><code>financial_accounts</code>Kundenportfolios mit Risikoprofilen</p><p><code>financial_holdings</code>: Aktien-/ETF-/Anleihenpositionen mit Kaufhistorie</p><p><code>financial_asset_details</code>Details zur Aktie/zum ETF/zur Anleihe</p><p><code>financial_news</code>: KI-generierte Marktartikel mit Stimmungsanalyse</p><p><code>financial_reports</code>Unternehmensgewinne und Analystennotizen</p><p>Sie können diesen Datensatz selbst laden, indem Sie der beigefügten Anleitung in <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/your-first-elastic-agent/Your_First_Elastic_Agent.ipynb">diesem</a> Notebook folgen.</p><h2>Schritt 1: Die Grundlage – Ihre Geschäftslogik als ES|QL</h2><p>Jede KI-Fähigkeit beginnt mit einer soliden Logik. Unserem Financial Manager-Agenten müssen wir beibringen, wie er eine häufig gestellte Frage beantworten kann: „Ich bin besorgt über die Marktstimmung.“ Können Sie mir zeigen, welche unserer Kunden am stärksten von schlechten Nachrichten bedroht sind? Diese Frage geht über eine einfache Suche hinaus. Dies erfordert von uns, die Marktstimmung mit den Kundenportfolios in Zusammenhang zu bringen.</p><p>Wir müssen die in den negativen Artikeln erwähnten Vermögenswerte finden, jeden Kunden identifizieren, der diese Vermögenswerte hält, den aktuellen Marktwert seines Engagements berechnen und dann die Ergebnisse nach dem höchsten Risiko ordnen. Diese komplexe Analyse mit mehreren Verknüpfungen ist die perfekte Aufgabe für unser hochentwickeltes ES|QL-Tool.</p><p>Hier ist die vollständige Abfrage, die wir verwenden werden. Es sieht beeindruckend aus, aber die Konzepte sind einfach.</p><h2>Aufschlüsselung: Verbindungen und Leitplanken</h2><p>Bei dieser Abfrage spielen zwei wichtige Konzepte eine Rolle, die den Agent Builder ausmachen.</p><h3>1. Die LOOKUP JOIN-Funktion</h3><p>Seit Jahren gehört die Möglichkeit, Daten aus verschiedenen Indizes anhand eines gemeinsamen Schlüssels zu verknüpfen, zu den am häufigsten nachgefragten Funktionen von Elasticsearch. Mit ES|QL ist das jetzt mit <code>LOOKUP JOIN</code> möglich.</p><p>In unserer neuen Abfrage führen wir eine Kette von drei <code>LOOKUP JOIN</code> durch: Zuerst verbinden wir negative Nachrichten mit Vermögensdetails, dann verknüpfen wir diese Vermögenswerte mit den Kundenbeständen und schließlich fügen wir sie zu den Kontoinformationen des Kunden hinzu. Dadurch wird mit einer einzigen, effizienten Abfrage ein unglaublich reichhaltiges Ergebnis aus vier verschiedenen Indizes erzeugt. Das bedeutet, dass wir unterschiedliche Datensätze kombinieren können, um eine einzige, aussagekräftige Antwort zu erhalten, ohne vorher alle unsere Daten in einen einzigen riesigen Index denormalisieren zu müssen.</p><h3>2. Parameter als LLM-Leitplanken</h3><p>Sie werden feststellen, dass die Abfrage <code>?time_duration</code> verwendet. Das ist nicht nur eine Variable; es ist eine Leitplanke für die KI. Während große Sprachmodelle (LLMs) hervorragend darin sind, Abfragen zu generieren, kann es zu ineffizienten oder sogar falschen Abfragen führen, wenn man ihnen freie Hand bei der Daten lässt.</p><p>Durch die Erstellung einer parametrisierten Abfrage zwingen wir das LLM dazu, innerhalb der getesteten, effizienten und korrekten Geschäftslogik zu arbeiten, die ein menschlicher Experte bereits definiert hat. Das ist vergleichbar damit, wie Entwickler seit Jahren Suchvorlagen verwenden, um Abfragefunktionen sicher für Anwendungen bereitzustellen. Der Agent kann eine Benutzeranfrage wie "diese Woche" interpretieren, um den Parameter <code>time_duration</code> zu füllen, muss aber unsere Abfragestruktur verwenden, um die Antwort zu erhalten. Dadurch erhalten wir die perfekte Balance zwischen Flexibilität und Kontrolle.</p><p>Letztendlich ermöglicht diese Abfrage einem Experten, der die Daten versteht, sein Wissen in einem Werkzeug zu kapseln. Andere Personen – und KI-Agenten – können dieses Werkzeug dann nutzen, um korrelierte Ergebnisse zu erhalten, indem sie einfach einen einzigen Parameter angeben, ohne etwas über die zugrunde liegende Komplexität wissen zu müssen.</p><h2>Schritt 2: Die Fertigkeit – Eine Abfrage in ein wiederverwendbares Werkzeug umwandeln</h2><p>Eine ES|QL-Abfrage ist nur Text, bis wir sie als <strong>Werkzeug</strong> registrieren. Im Agent Builder ist ein Tool mehr als nur eine gespeicherte Abfrage; es ist eine „Fähigkeit“, die ein KI-Agent verstehen und einsetzen kann. Der Zauber liegt in der von uns bereitgestellten <strong>Beschreibung in natürlicher Sprache</strong> . Diese Beschreibung bildet die Brücke zwischen der Frage eines Benutzers und der zugrunde liegenden Abfragelogik. Registrieren wir nun die soeben erstellte Abfrage.</p><h3>Der UI-Pfad</h3><p>Das Erstellen eines Tools in Kibana ist ein unkomplizierter Prozess.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte73e11c1d87593fa/6a17f2134202294dae29f6f2/a29c53a73b99af5972273c51218ea9004a9b0abb-1600x812.png" alt="Wie man ein Tool in Kibana erstellt." /><p>1. Navigieren Sie zu <strong>Agenten</strong></p><ul><li><p>Klicken Sie auf<strong> „Tools“</strong>oder <strong>„Tools verwalten“</strong> und klicken Sie dann auf die Schaltfläche <strong>„Neues Tool“</strong> .</p></li></ul><p>2. Füllen Sie das Formular mit folgenden Angaben aus:</p><ul><li><p><strong>Werkzeug-ID:</strong> <code>find_client_exposure_to_negative_news</code></p></li></ul><p>             ich. Dies ist die eindeutige ID des Tools.</p><ul><li><p><strong>Beschreibung:</strong> "Ermittelt das Risiko negativer Nachrichten im Kundenportfolio." Dieses Tool durchsucht aktuelle Nachrichten und Berichte nach negativen Stimmungen, identifiziert den zugehörigen Vermögenswert und findet alle Kunden, die diesen Vermögenswert halten. Es liefert eine nach dem aktuellen Marktwert der Position sortierte Liste zurück, um das höchste potenzielle Risiko hervorzuheben.“</p></li></ul><p>             ich. Dies ist das, was der LLM liest, um zu entscheiden, ob dieses Werkzeug das richtige für die Aufgabe ist.</p><ul><li><p><strong>Labels</strong>: <code>retrieval</code> and <code>risk-analysis</code></p></li></ul><p>         Etiketten dienen dazu, mehrere Werkzeuge zu gruppieren.</p><ul><li><p><strong>Konfiguration:</strong> Fügen Sie die vollständige ES|QL-Abfrage aus Schritt 1 ein.</p></li></ul><p>            ich. Dies ist die Suche, die der Agent verwenden wird.</p><p>3. Klicken Sie auf <strong>„Parameter aus Abfrage ableiten“</strong>. Die Benutzeroberfläche wird <code>?time_duration</code> automatisch finden und unten auflisten. Fügen Sie für jedes Element eine kurze Beschreibung hinzu, damit der Agent (und andere Benutzer) dessen Zweck verstehen können.</p><ul><li><p><code>time_duration</code>Der Zeitraum, in dem nach negativen Nachrichten gesucht wird. Format ist "X Stunden", Standardwert: 8760 Stunden</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7afbb0589c1828ad/6a17f2146864a44e7cb688a9/deb422d97863f78dbe08bfa2e3c708d1f75166ff-1600x938.png" alt="Konfigurieren Sie Ihr Tool einschließlich seiner Logik und aller benötigten Parameter mithilfe einer ESQL-Abfrage. " /><p>4. Probier es aus!</p><ul><li><p>Klicken Sie auf Speichern &amp; Testen.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd09afbef6e21a93/6a17f2162f4a5c73b1fa89fd/57e768b88327821e70bd616744822f98fa367362-732x136.png" alt="Der gleiche &amp; Test-Button in Kibana." /><ul><li><p>Es wird ein neues Flyout angezeigt, in dem Sie die Abfrage testen können, um sicherzustellen, dass sie wie erwartet funktioniert.</p></li></ul><p>             ich. Geben Sie in <code>time_duration</code> den gewünschten Bereich ein, hier verwenden wir „8760 Stunden“.</p><ul><li><p>Klicken Sie auf „Absenden“, und wenn alles gut geht, erhalten Sie eine JSON-Antwort. Um sicherzustellen, dass es wie erwartet funktioniert, scrollen Sie nach unten und sehen Sie sich das Objekt <code>values</code> an. Dort werden die eigentlichen übereinstimmenden Dokumente zurückgegeben.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89bdc3f093363f2a/6a17f217be60861c9c00488a/7e0c5171a4f7ffdfc1830f1a05a9acb987870b75-1600x722.png" alt="JSON-Antwort, die nach dem Klicken auf „Absenden“ erscheint." /><p>5. Klicken Sie auf das „X“ oben rechts, um das Testfenster zu schließen. Ihr neues Tool wird nun in der Liste angezeigt und kann einem Agenten zugewiesen werden.</p><h3>Der API-Pfad</h3><p>Für Entwickler, die Automatisierung bevorzugen oder Tools programmatisch verwalten müssen, lässt sich dasselbe Ergebnis mit einem einzigen API-Aufruf erzielen. Senden Sie einfach eine <code>POST</code> -Anfrage an den <code>/api/agent_builder/tools</code> -Endpunkt mit der Definition des Tools.</p>POST kbn://api/agent_builder/tools
{
  "id": "find_client_exposure_to_negative_news",
  "type": "esql",
  "description": "Finds client portfolio exposure to negative news. This tool scans recent news and reports for negative sentiment, identifies the associated asset, and finds all clients holding that asset. It returns a list sorted by the current market value of the position to highlight the highest potential risk.",
  "configuration": {
    "query": """
        FROM financial_news, financial_reports METADATA _index
        | WHERE sentiment == "negative"
        | WHERE coalesce(published_date, report_date) &gt;= NOW() - TO_TIMEDURATION(?time_duration)
        | RENAME primary_symbol AS symbol
        | LOOKUP JOIN financial_asset_details ON symbol
        | LOOKUP JOIN financial_holdings ON symbol
        | LOOKUP JOIN financial_accounts ON account_id
        | WHERE account_holder_name IS NOT NULL
        | EVAL position_current_value = quantity * current_price.price
        | RENAME title AS news_title
        | KEEP
            account_holder_name, symbol, asset_name, news_title,
            sentiment, position_current_value, quantity, current_price.price,
            published_date, report_date
        | SORT position_current_value DESC
        | LIMIT 50
      """,
    "params": {
      "time_duration": {
        "type": "keyword",
        "description": """The timeframe to search back for negative news. Format is "X hours" DEFAULT TO 8760 hours """
      }
    }
  },
  "tags": [
    "retrieval",
    "risk-analysis"
  ]
}<h2>Schritt 3: Das Gehirn – Ihren individuellen Agenten erstellen</h2><p>Wir haben eine wiederverwendbare Fähigkeit entwickelt (das Tool). Nun müssen wir den <strong>Agenten</strong> erstellen, die Persona, die es tatsächlich benutzen wird. Ein Agent ist die Kombination aus einem LLM, einem bestimmten Satz von Werkzeugen, zu denen Sie ihm Zugriff gewähren, und vor allem einer Reihe von <strong>benutzerdefinierten Anweisungen</strong> , die als seine Verfassung fungieren und seine Persönlichkeit, Regeln und seinen Zweck definieren.</p><h3>Die Kunst des Prompts</h3><p>Der wichtigste Aspekt bei der Schaffung eines zuverlässigen, spezialisierten Agenten ist die Pünktlichkeit. Eine gut ausgearbeitete Anleitung macht den Unterschied zwischen einem generischen Chatbot und einem zielgerichteten, professionellen Assistenten aus. Hier legen Sie die Leitplanken fest, definieren die Ausgabe und geben dem Agenten seine Mission.</p><p>Für unseren <code>Financial Manager</code> -Agenten verwenden wir die folgende Eingabeaufforderung.</p>You are a specialized Data Intelligence Assistant for financial managers, designed to provide precise, data-driven insights from information stored in Elasticsearch.

**Your Core Mission:**
- Respond accurately and concisely to natural language queries from financial managers.
- Provide precise, objective, and actionable information derived solely from the Elasticsearch data at your disposal.
- Summarize key data points and trends based on user requests.

**Reasoning Framework:**
1.  **Understand:** Deconstruct the user's query to understand their core intent.
2.  **Plan:** Formulate a step-by-step plan to answer the question. If you are unsure about the data structure, use the available tools to explore the indices first.
3.  **Execute:** Use the available tools to execute your plan.
4.  **Synthesize:** Combine the information from all tool calls into a single, comprehensive, and easy-to-read answer.

**Key Directives and Constraints:**
- **If a user's request is ambiguous, ask clarifying questions before proceeding.**
- **DO NOT provide financial advice, recommendations, or predictions.** Your role is strictly informational and analytical.
- Stay strictly on topic with financial data queries.
- If you cannot answer a query, state that clearly and offer alternative ways you might help *within your data scope*.
- All numerical values should be formatted appropriately (e.g., currency, percentages).

**Output Format:**
- All responses must be formatted using **Markdown** for clarity.
- When presenting structured data, use Markdown tables, lists, or bolding.

**Start by greeting the financial manager and offering assistance.**<p>Lassen Sie uns genauer betrachten, warum diese Aufforderung so effektiv ist:</p><ul><li><p><strong>Es definiert eine anspruchsvolle Persönlichkeit: </strong>Schon die erste Zeile stellt den Agenten als „spezialisierten Data Intelligence Assistant“ dar und vermittelt so einen professionellen und kompetenten Eindruck.</p></li><li><p><strong>Es bietet einen Denkrahmen: </strong>Indem wir dem Agenten sagen, er solle "Verstehen, Planen, Ausführen und Synthetisieren", geben wir ihm eine Standardarbeitsanweisung. Dadurch wird seine Fähigkeit verbessert, komplexe, mehrstufige Fragen zu beantworten.</p></li><li><p><strong>Es fördert den interaktiven Dialog: </strong>Die Anweisung, „klärende Fragen zu stellen“, macht den Agenten widerstandsfähiger. Dadurch werden Fehlinterpretationen bei mehrdeutigen Anfragen minimiert, was zu genaueren Antworten führt.</p></li></ul><h3>Der UI-Pfad</h3><p>1. Navigieren Sie zu <strong>Agenten.</strong></p><ul><li><p>Klicken Sie auf<strong> „Tools“</strong>oder <strong>„Tools verwalten“</strong> und klicken Sie dann auf die Schaltfläche <strong>„Neues Tool“</strong> .</p></li></ul><p>2. Füllen Sie die grundlegenden Angaben aus:</p><ul><li><p><strong>Agenten-ID:</strong> <code>financial_assistant</code>.</p></li><li><p><strong>Anleitung: </strong>Kopieren Sie die obige Eingabeaufforderung.</p></li><li><p><strong>Labels</strong>: <code>Finance</code>.</p></li><li><p><strong>Anzeigename:</strong> <code>Financial Assistant</code>.</p></li><li><p><strong>Anzeigebeschreibung: </strong><code>An assistant for analyzing and understanding your financial data</code>.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ac12cbd2b689dee/6a17f219dbb4ff262bfb57ef/18ea73f1cae620129c0afa0e7ba9e2a3390224a7-1600x1189.png" alt="Anlegen eines Finanzassistenten – Ausfüllen des Agenten-ID-Felds." /><p>3. Klicken Sie oben auf <strong>„Tools“</strong>.</p><ul><li><p>Setzen Sie ein Häkchen neben unserem <code>find_client_exposure_to_negative_news</code> -Tool.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcd23556e556a76c5/6a17f21baf47b63a9fcde0a0/0c1e4ecbbd51d0dd10c6e861dbe9a9ccddeb35f6-1600x149.png" alt="" /><p>4. Klicken Sie auf <strong>Speichern</strong>.</p><h3>Der API-Pfad</h3><p>Sie können denselben Agenten mit einer <code>POST</code> -Anfrage an den <code>/api/agent_builder/agents</code> -Endpunkt erstellen. Der Anfragetext enthält dieselben Informationen: die ID, den Namen, die Beschreibung, die vollständigen Anweisungen und eine Liste der Tools, die der Agent verwenden darf.</p>POST kbn://api/agent_builder/agents
    {
      "id": "financial_assistant",
      "name": "Financial Assistant",
      "description": "An assistant for analyzing and understanding your financial data",
      "labels": [
        "Finance"
      ],
      "avatar_color": "#16C5C0",
      "avatar_symbol": "💰",
      "configuration": {
        "instructions": """You are a specialized Data Intelligence Assistant for financial managers, designed to provide precise, data-driven insights from information stored in Elasticsearch.

**Your Core Mission:**
- Respond accurately and concisely to natural language queries from financial managers.
- Provide precise, objective, and actionable information derived solely from the Elasticsearch data at your disposal.
- Summarize key data points and trends based on user requests.

**Reasoning Framework:**
1.  **Understand:** Deconstruct the user's query to understand their core intent.
2.  **Plan:** Formulate a step-by-step plan to answer the question. If you are unsure about the data structure, use the available tools to explore the indices first.
3.  **Execute:** Use the available tools to execute your plan.
4.  **Synthesize:** Combine the information from all tool calls into a single, comprehensive, and easy-to-read answer.

**Key Directives and Constraints:**
- **If a user's request is ambiguous, ask clarifying questions before proceeding.**
- **DO NOT provide financial advice, recommendations, or predictions.** Your role is strictly informational and analytical.
- Stay strictly on topic with financial data queries.
- If you cannot answer a query, state that clearly and offer alternative ways you might help *within your data scope*.
- All numerical values should be formatted appropriately (e.g., currency, percentages).

**Output Format:**
- All responses must be formatted using **Markdown** for clarity.
- When presenting structured data, use Markdown tables, lists, or bolding.

**Start by greeting the financial manager and offering assistance.**
""",
        "tools": [
          {
            "tool_ids": [
              "platform.core.search",
              "platform.core.list_indices",
              "platform.core.get_index_mapping",
              "platform.core.get_document_by_id",
              "find_client_exposure_to_negative_news"
            ]
          }
        ]
      }
    }<h2>Schritt 4: Der Lohn – Ein Gespräch führen</h2><p>Unsere Geschäftslogik ist in einem Tool gekapselt und ein "Gehirn" ist bereit, es in unserem Agenten zu verwenden. Jetzt wird es Zeit, dass alles zusammenkommt. Wir können nun mithilfe eines spezialisierten Agenten mit unseren Daten kommunizieren.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8826539b16e46f4/6a17f21d505ac35924ad8c5c/5414cb6b7c41365acb0356a8bfe1140751ffd8db-1600x1014.png" alt="Ein Gespräch mit dem Elastic Agent Builder nach der Erstellung eines Finanzassistenten." /><h3>Der UI-Pfad</h3><ol><li><p>Navigieren Sie in Kibana zu <strong>„Agenten“</strong> .</p></li><li><p>Wechseln Sie mithilfe des Dropdown-Menüs unten rechts im Chatfenster vom standardmäßigen <strong>Elastic AI Agent</strong> zu unserem neu erstellten <strong>Financial Assistant </strong>Agent.</p></li><li><p>Stellen Sie eine Frage, die es dem Agenten ermöglicht, unser Spezialtool zu nutzen:</p><ol><li><p><em>Ich bin besorgt über die Marktstimmung. Können Sie mir zeigen, welche unserer Kunden am stärksten von schlechten Nachrichten betroffen sein könnten?</em></p></li></ol></li></ol><p>Nach kurzer Zeit liefert der Agent eine perfekt formatierte, vollständige Antwort. Aufgrund der Beschaffenheit von LLMs kann Ihre Antwort etwas anders formatiert sein, aber für diesen Durchlauf hat der Agent Folgendes zurückgegeben:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta1e163fd7c4416bd/6a17f21f6864a4e35bb688ad/17b4ed43d279f9e53ee9fe3d482d0b2ec359a083-1600x1088.png" alt="Eine Antwort, die vom Elastic Agent Builder als Finanzassistent für folgende Kunden erstellt wurde: Kunden, die am stärksten von negativen Nachrichten betroffen sind." /><h3>Was ist gerade passiert? Die Argumentation des Agenten</h3><p>Der Agent kannte die Antwort nicht einfach nur. Es wurde ein mehrstufiger Plan umgesetzt, dessen Mittelpunkt die Auswahl des besten Werkzeugs für die jeweilige Aufgabe bildete. Hier ein Einblick in den Denkprozess:</p><ul><li><p><strong>Identifizierte Absicht:</strong> Es wurden Schlüsselwörter aus Ihrer Frage, wie „Risiko“ und „negative Nachrichten“, mit der Beschreibung des <code>find_client_exposure_to_negative_news</code> -Tools abgeglichen.</p></li><li><p><strong>Plan ausgeführt:</strong> Es hat den Zeitrahmen aus Ihrer Anfrage extrahiert und einen <strong>einzigen Aufruf</strong> an dieses spezialisierte Tool durchgeführt.</p></li><li><p><strong>Die Arbeit wurde delegiert:</strong> Das Tool übernahm dann die gesamte schwere Arbeit: die verketteten Joins, die Wertberechnungen und die Sortierung.</p></li><li><p><strong>Ergebnis zusammengefasst:</strong> Abschließend formatierte der Agent die Rohdaten des Tools gemäß den Vorgaben in eine klare, für Menschen lesbare Zusammenfassung.</p></li></ul><p>Und wir müssen nicht nur raten, wenn wir unser Denken erweitern und mehr Details betrachten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt93f6075be8495418/6a17f221af47b65eadcde0a4/6a4da9262d3f88c60bfd8f8bf9b67c3b84e961ba-1600x607.png" alt="Die 50 Dokumente, die der Finanzassistent bei Kunden mit der höchsten Belastung durch negative Nachrichten gefunden hat." /><h3>Der API-Pfad</h3><p>Sie können diese Konversation auch programmatisch starten. Senden Sie einfach die Eingabefrage an den <code>converse</code> API-Endpunkt und achten Sie darauf, die <code>agent_id</code> unseres <code>financial_manager</code> anzugeben.</p>POST kbn://api/agent_builder/converse
{
  "input": "Show me our largest positions affected by negative news",
  "agent_id": "financial_assistant"
}<h2>Für Entwickler: Integration mit der API</h2><p>Während die Kibana-Benutzeroberfläche ein fantastisches und intuitives Erlebnis beim Erstellen und Verwalten Ihrer Agenten bietet, kann alles, was Sie heute gesehen haben, auch programmatisch erreicht werden. Der Agent Builder basiert auf einer Reihe von APIs, die es Ihnen ermöglichen, diese Funktionalität direkt in Ihre eigenen Anwendungen, CI/CD-Pipelines oder Automatisierungsskripte zu integrieren.</p><p>Die drei wichtigsten Endpunkte, mit denen Sie arbeiten werden, sind:</p><ul><li><p><strong><code>/api/agent_builder/tools</code></strong>: Der Endpunkt zum Erstellen, Auflisten und Verwalten der wiederverwendbaren Fähigkeiten, die Ihre Agenten nutzen können.</p></li><li><p><strong><code>/api/agent_builder/agents</code></strong>Der Endpunkt zur Definition Ihrer Agenten-Personas, einschließlich ihrer wichtigen Anweisungen und Tool-Zuweisungen.</p></li><li><p><strong><code>/api/agent_builder/converse</code></strong>: Der Endpunkt für die Interaktion mit Ihren Agenten, den Start von Gesprächen und das Erhalten von Antworten.</p></li></ul><p>Eine vollständige, praktische Anleitung zur Verwendung dieser APIs für jeden Schritt dieses Tutorials finden Sie im zugehörigen <strong>Jupyter Notebook</strong> , das <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/your-first-elastic-agent/Your_First_Elastic_Agent.ipynb">hier</a> in unserem GitHub-Repository verfügbar ist.</p><h2>Fazit: Jetzt sind Sie am Bauen</h2><p>Wir begannen damit, eine ES|QL-Abfrage zu nehmen und sie in eine wiederverwendbare Fähigkeit umzuwandeln. Anschließend entwickelten wir einen spezialisierten KI-Agenten, gaben ihm eine klare Mission und klare Regeln und statteten ihn mit diesen Fähigkeiten aus. Das Ergebnis ist ein hochentwickelter Assistent, der eine komplexe Frage verstehen und eine mehrstufige Analyse durchführen kann, um eine präzise, datengestützte Antwort zu liefern.</p><p>Dieser Workflow ist das Herzstück des neuen <strong>Agent Builders</strong> in Elastic. Es ist so konzipiert, dass es einfach genug ist, damit auch technisch nicht versierte Benutzer Agenten über die Benutzeroberfläche erstellen können, gleichzeitig aber differenziert genug, damit Entwickler auf Basis unserer APIs maßgeschneiderte KI-gestützte Anwendungen entwickeln können. Am wichtigsten ist jedoch, dass Sie LLMs sicher und geschützt mit Ihren eigenen Daten verbinden können, die von der von Ihnen definierten Expertenlogik gesteuert werden, und mit Ihren Daten kommunizieren können.</p><h2>Sind Sie bereit, Agenten für die Kommunikation mit Ihren Daten einzusetzen?</h2><p>Am besten festigt man das Gelernte, indem man selbst Hand anlegt. Probieren Sie alles, was wir heute besprochen haben, in unserem <a href="https://www.elastic.co/training/elastic-ai-agents-mcp"><strong>kostenlosen, interaktiven Praxisworkshop</strong></a> aus. Sie werden diesen gesamten Ablauf und mehr in einer speziellen Sandbox-Umgebung durchlaufen.</p><p>In einem zukünftigen Blogbeitrag zeigen wir Ihnen, wie Sie eine eigenständige Anwendung verwenden, die mit unserem <code>Financial Assistant</code> -Agenten interagiert, und gehen näher auf das <strong>Model Context Protocol (MCP)</strong> ein, das dies alles ermöglicht. In einem separaten Blogbeitrag werden wir die Unterstützung des Agent Builders für das sich entwickelnde Agent2Agent- oder A2A-Protokoll besprechen.</p><p>Bleibt dran und viel Spaß beim Bauen!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch</guid>
    <category><![CDATA[KI]]></category>
    <category><![CDATA[Agentische KI]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <dc:creator><![CDATA[Jeff Vestal]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbe5e78eeb775d715/6a17f2230b0bed719ddd369a/ca853555eaa213f10f1db8c0ab0a2bbacee97b88-1456x816.png" length="0" type="image/png"/>
    <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Erstellung von KI-Agenten-Workflows mit Elasticsearch]]></title>
    <description><![CDATA[Lernen Sie Agent Builder kennen, eine neue KI-Ebene in Elasticsearch, die ein Framework für die Erstellung von KI-Agenten-Workflows bietet und dabei die hybride Suche nutzt, um den Agenten den Kontext zu liefern, den sie zum Denken und Handeln benötigen.]]></description>
    <content:encoded><![CDATA[<p>Wir bei Elastic haben LLMs mit KI-Assistenten, fortschrittlichem RAG und Verbesserungen der Vektordatenbanken um Kontext erweitert und dialogorientierte Schnittstellen geschaffen. In jüngster Zeit, mit dem Aufstieg von KI-Agenten, haben wir den Bedarf an relevantem Kontext wachsen sehen und gelernt, dass leistungsstarke<strong> KI-Agenten eine hervorragende Suchfunktion benötigen</strong>. Deshalb haben wir neue native Funktionen im Elastic Stack entwickelt, die dabei helfen sollen, KI-Agenten zu entwickeln, die Ihre Daten in Elasticsearch nutzen. Wir möchten Sie über unsere Fortschritte auf diesem Weg informieren und Ihnen einen Ausblick darauf geben, wohin die Reise unserer Meinung nach als Nächstes gehen wird.</p><h2>Agent Builder: Eine Grundlage für die Entwicklung datengesteuerter KI-Agenten</h2><p>Das Versprechen eines KI-Agenten ist einfach: Man gibt ihm ein Ziel, und er erledigt die Aufgabe. Für Entwickler sieht die Realität jedoch anders aus: Sie steht vor einer Reihe komplexer Herausforderungen. Erstens ist ein Agent nur so gut wie seine Wahrnehmung seiner Umgebung und der ihm zur Verfügung stehenden Werkzeuge, um die Ziele des Benutzers zu erreichen. Dann stellt es eine enorme Herausforderung dar, aus einer Flut von unterschiedlichen Unternehmensdaten den richtigen Kontext herauszufiltern. Schließlich muss all dies von einer zuverlässigen Denkschleife orchestriert werden, die planen, ausführen und lernen kann.</p><p>Um dieses Problem zu lösen, müssen die Entwickler einen komplexen und fehleranfälligen Stack von Grund auf neu aufbauen. Die heutige Agentenarchitektur erfordert das Zusammenfügen mehrerer, voneinander unabhängiger Komponenten: ein LLM, eine Vektordatenbank, ein Metadatenspeicher, separate Systeme für Protokollierung und Tracing sowie eine Möglichkeit zur Überprüfung, ob das Ganze überhaupt funktioniert. Das ist nicht nur komplex, sondern auch kostspielig, fehleranfällig und erschwert den Aufbau der hochwertigen, vertrauenswürdigen KI-Systeme, die Ihre Nutzer fordern.</p><p>Wir wollen es also vereinfachen. Unser Ansatz hierfür besteht darin, die wesentlichen Bestandteile eines effektiven kontextgesteuerten Agenten zu nehmen und sie mit einer neuen Reihe von Funktionen namens <strong>Elastic AI Agent Builder</strong> direkt in den Kern von Elasticsearch zu integrieren. Diese neue Schicht bietet ein Framework mit allen wesentlichen Bausteinen für die Erstellung von KI-Agenten auf Basis von Elasticsearch: ein offenes Set an Primitiven, standardbasierte Protokolle und sicherer Datenzugriff – damit Sie agentenbasierte Systeme entwickeln können, die auf reale Daten und Anforderungen zugeschnitten sind:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2779dae5df010328/6a17e15eabe0f24f18dfe931/1ee1e73dd3f485ce86294d39490c98ce2a3d9925-1238x1072.png" alt="" /><p><strong>KI-Erlebnisse bereitstellen</strong>: Das ist das ultimative Ziel. Mit unserer Search AI Platform und Ihren Daten als Grundlage können Sie jede Art von generativer KI-Anwendung erstellen: von benutzerdefinierten Chat-Oberflächen bis hin zu Integrationen mit agentenbasierten Frameworks wie LangChain oder Geschäftsanwendungen wie Salesforce.</p><p><strong>Unterstützt von Agenten und Tools</strong>: Auf der Plattform selbst stellen wir eine saubere, einfache Abstraktionsschicht bereit. Sie interagieren direkt mit Agenten und Tools, die Sie an Ihre spezifischen Bedürfnisse anpassen können. Sie können die Funktionen der Plattform auch über robuste APIs und offene Standards wie MCP und A2A nutzen.</p><p><strong>Ermöglicht durch die Search AI Platform</strong>: Dies ist die Kern-Engine, in die wir die Komponenten integriert haben. Die hochentwickelte Vektordatenbank, die Agentenlogik, die Abfragekonstruktion, Sicherheitsfunktionen, das Tracing zur Auswertung – all das befindet sich hier und wird von Elastic verwaltet und optimiert.</p><p><strong>Das Potenzial Ihrer Daten freisetzen</strong>: Die Grundlage jedes erfolgreichen Agenten sind hervorragende Daten. Unsere Plattform beginnt mit der Fähigkeit, den Zugriff auf alle Ihre Unternehmensdaten zu erfassen oder zu föderieren.</p><h2>Agentenaufbau in der Plattform</h2><p>Der in die Search AI Platform integrierte Agent Builder bietet ein komplettes Framework für die Agentenentwicklung. Es basiert auf fünf zentralen Säulen, von denen jede einen kritischen Aspekt beim Aufbau und Einsatz produktionsreifer KI-Systeme adressiert. Lassen Sie uns aufschlüsseln, wie Agenten das Ziel definieren, Tools die Fähigkeiten bereitstellen, offene Standards Interoperabilität gewährleisten, Evaluierung Transparenz schafft und Sicherheit das Vertrauen schafft.</p><h3>Agenten</h3><p>Agenten sind die obersten Bausteine dieser neuen Ebene von Elasticsearch. Ein Agent definiert das zu erreichende Ziel, die zur Ausführung verfügbaren Werkzeuge und die Datenquellen, mit denen er arbeiten kann. Agenten sind nicht auf dialogbasierte Interaktionen beschränkt; sie können komplette Arbeitsabläufe, Aufgabenautomatisierung oder benutzerorientierte Erlebnisse ermöglichen.</p><p>Wenn eine Anfrage an einen Agenten gerichtet wird, durchläuft sie einen strukturierten Zyklus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774ffd7df65bd01d/6a17e15f25daabd5cc08a17f/627ad1744b629bbe27359325702f40d97e40d1f4-704x852.png" alt="" /><ol><li><p>Interpretieren Sie Ihre Eingabe und Ihr Ziel.</p></li><li><p>Wählen Sie das richtige Werkzeug und die richtigen Argumente für die Ausführung aus.</p></li><li><p>Begründen Sie die Antwort des Tools.</p></li><li><p>Entscheiden Sie, ob ein Ergebnis zurückgegeben oder mit weiteren Toolaufrufen fortgefahren werden soll.</p></li></ol><p>Elastic übernimmt die Orchestrierung, den Kontext und die Ausführung dieses Zyklus. Die Entwickler konzentrieren sich darauf, festzulegen, <em>was</em> der Agent tun soll: Ziele, Werkzeuge und Daten, während das System <em>die</em> Durchführung der Schlussfolgerungen und Arbeitsabläufe steuert.</p><p><em>Der Standardagent</em></p><p>Unser erster Agent, der auf dieser Plattform basiert, ist ein nativer Dialogagent in Kibana, der Ihnen die Möglichkeit gibt, sofort mit Ihren Daten zu interagieren. Es bietet eine sofort einsatzbereite Benutzererfahrung und bleibt gleichzeitig vollständig erweiterbar, sodass Sie ohne zusätzliche Konfiguration sofort mit Ihren Daten interagieren können.</p><p>Sie können mit dieser Funktion direkt in Kibana über eine neue Chat-Benutzeroberfläche oder über eine API interagieren.</p><p>Die Abfrage des Standardagenten über die API erfordert nur einen einzigen Aufruf:</p>POST kbn://api/agent_builder/converse
{
    "input": "what is our top portfolio account?"
}<p>Da Konversationen zustandsbehaftet sind, können Sie die Interaktion mit einem Agenten mithilfe einer conversation_id fortsetzen oder den vollständigen Konversationsverlauf abrufen:</p>POST kbn://api/agent_builder/converse
{
    "input": "What about the second top?",
    "conversation_id": "ec757c6c-c3ed-4a83-8e2c-756238f008bb"
}

## get the full conversation
GET kbn://api/agent_builder/conversations/ec757c6c-c3ed-4a83-8e2c-756238f008bb<p><em>Zollagenten</em></p><p>Entwickler können über einfache APIs auch ihre eigenen benutzerdefinierten Agenten erstellen. Agenten kapseln Anweisungen, Werkzeuge und Datenzugriff und erstellen so maßgeschneiderte Schlussfolgerungsmaschinen.</p><p>Die Erstellung eines benutzerdefinierten Agenten ist so einfach wie ein einziger API-Aufruf. Das folgende Beispiel zeigt, dass das Feld „Konfiguration“ alle wichtigen Details enthält, wie z. B. Anweisungen oder verfügbare Tools:</p>POST kbn://api/agent_builder/agents
{
  "id": "custom_agent",
  "name": "My Custom Agent",
  "description": "Description of the custom agent",
  "configuration": {
      "instructions": "You are a log expert specialising in ...",
      "tools": 
...
   }
}<p>Sobald der Agent erstellt ist, kann er direkt abgefragt werden:</p>POST kbn://api/agent_builder/converse
{
    "input": "What news about DIA?",
    "agent_id": "custom_agent"
}<p>Dieser Ansatz wandelt den Agenten von einem komplexen, von Grund auf neu zu entwickelnden System in eine einfache, deklarative Einheit der Geschäftslogik um, wodurch Sie intelligente Automatisierung schneller realisieren können.</p><p>Eine detaillierte Anleitung zum Erstellen eines spezialisierten Agenten von Grund auf finden Sie in unserem ausführlichen Schritt-für-Schritt-Leitfaden: <a href="https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch">Ihr erster elastischer Agent: Von einer einzelnen Abfrage zu einem KI-gestützten Chat</a>.</p><h3>Tools</h3><p>Wenn Agenten definieren, <em>was</em> erreicht werden soll, definieren Werkzeuge, <em>wie</em>.</p><p>Die Tools stellen Agenten spezifische Elastic-Kernfunktionen zur Verfügung, um Informationen abzurufen und auszuführen oder Aktionen durchzuführen. Tools können Kernfunktionen wie das Abrufen von Indizes oder Zuordnungen umfassen, aber auch fortgeschrittenere Funktionen wie die Verarbeitung natürlicher Sprache zu ES|QL.</p><p>Elasticsearch wird mit einer Reihe von Standardwerkzeugen ausgeliefert, die für gängige Anwendungsfälle optimiert sind. Die wahre Flexibilität ergibt sich jedoch daraus, eigene Lösungen zu entwickeln. Durch die Definition von Tools legen Sie genau fest, welche Abfragen, Indizes und Felder einem Agenten mit ES|QL zugänglich gemacht werden, und erhalten so eine präzise Kontrolle über Geschwindigkeit, Genauigkeit und Sicherheit.</p><p>Die Registrierung eines neuen Tools ist ebenfalls so einfach wie ein einziger API-Aufruf. Sie könnten ein Tool erstellen, das unsere <a href="https://www.elastic.co/search-labs/blog/esql-timeline-of-improvements">ES|QL (Elasticsearch Query Language)</a> nutzt, um Neuigkeiten über ein bestimmtes Finanzinstrument zu finden:</p>POST kbn://api/agent_builder/tools
{
  "id": "news_on_asset",
  "type": "esql",
  "description": "Find news and reports about a particular asset where ...",
  "configuration": {
    "query": "FROM financial_news, financial_reports | where MATCH(company_symbol, ?symbol) OR MATCH(entities, ?symbol) | limit 5",
    "params": {
      "symbol": {
        "type": "keyword",
        "description": "The asset symbol"
      }
    }
  ...
  }
...
}<p>Nach der Registrierung können Sie das neue Tool Ihren benutzerdefinierten Agenten zuweisen und ihnen so eine kuratierte Auswahl an Funktionen zur Verfügung stellen, die sie bei Bedarf nutzen können.</p><p>Wir bieten eine Plattform zur Erstellung von maßgeschneiderten Tools für Ihre spezifischen Bedürfnisse, z. B. mit ES|QL, die den Agenten von einem Allzweckagenten in einen domänenspezifischen Experten verwandelt, der auf Ihren einzigartigen Daten und Ihrer Geschäftsdomäne basiert.</p><h3>Offene Standards und Interoperabilität</h3><p>Elasticsearch Agents und Tools werden über offene Standard-APIs bereitgestellt, wodurch sie sich leicht als grundlegende Bausteine in das breitere Ökosystem agentenbasierter Frameworks integrieren lassen. Unser Ansatz ist einfach: keine Blackboxes. Wir möchten, dass Sie die Kernkompetenz von Elastic im Bereich der Suche nutzen und sie mit komplementären Fähigkeiten und anderen agentenbasierten Systemen kombinieren können.</p><p>Um dies zu ermöglichen, stellen wir unsere Fähigkeiten über APIs, neue Protokolle und offene Standards zur Verfügung.</p><p><em>Model Context Protocol (MCP)</em></p><p><a href="https://www.elastic.co/search-labs/blog/model-context-protocol-elasticsearch">Das Model Context Protocol (MCP)</a> entwickelt sich schnell zum offenen Standard für die systemübergreifende Vernetzung von Tools. Durch die Unterstützung von MCP kann Elasticsearch dialogbasierte KI mit Ihren Datenbanken, Indizes und externen APIs verbinden. Da im Elastic Stack ein Remote-MCP-Server integriert ist, kann jeder MCP-kompatible Client auf die Tools von Elastic zugreifen und sie als Bausteine in seinen umfassenderen agentenbasierten Workflows verwenden.</p><p>Das ist keine Einbahnstraße. Sie können außerdem Tools von externen MCP-Servern importieren und diese in Elasticsearch verfügbar machen. Schon bald werden MCP-Server wahrscheinlich für nahezu alles verfügbar sein und weitaus umfassender sein als alles, was wir selbst entwickeln könnten. Elastic bietet Such- und Abruffunktionen in großem Umfang, und Sie können dies mit spezialisierten Funktionen anderer Plattformen kombinieren, um effektive Agenten zu erstellen.</p><p><em>Agent-to-Agent (A2A)</em></p><p>Wir arbeiten außerdem an der Unterstützung von Agent zu Agent (A2A). Bei MCP geht es um die Vernetzung von Tools, bei A2A hingegen um die Vernetzung von Agenten. Mit einem A2A-Server können die von Ihnen erstellten Elastic-Agenten direkt mit Agenten aus anderen Systemen kommunizieren: Kontext austauschen, Aufgaben delegieren und Arbeitsabläufe koordinieren.</p><p>Man kann es sich als Interoperabilität auf der Ebene der Argumentation vorstellen. Ihr Elastic-Agent könnte die Suche und den Abruf übernehmen, dann eine Aufgabe an einen spezialisierten Support- oder IT-Agenten weitergeben und das Ergebnis nahtlos zurückerhalten. Das Ergebnis ist ein Ökosystem kooperierender Akteure, von denen jeder das tut, was er am besten kann.</p><p>Die Einführung von MCP und A2A unterstreicht letztlich unser Bekenntnis zu Elasticsearch als vollwertigem Bestandteil und gewährleistet die offene Integration innerhalb des gesamten agentenbasierten Ökosystems.</p><h3>Rückverfolgung und Bewertung</h3><p>Mit der Integration von Suchfunktionen in Agenten wird die Herausforderung einer effektiven Evaluierung entscheidend. Um Agenten in realen Unternehmensumgebungen bedenkenlos einsetzen zu können, benötigen Sie die Gewissheit, dass sie nicht nur präzise, sondern auch effizient und zuverlässig sind. Wie misst man die Leistung, diagnostiziert eine schlechte Reaktion oder verbessert die Ausgangslage? Alles beginnt mit Transparenz.</p><p>Aus diesem Grund haben wir unsere Agenten-APIs von Grund auf auf Transparenz ausgelegt. Betrachten wir folgende einfache Agenteninteraktion:</p>POST kbn://api/agent_builder/converse
{
    "input": "what is our top portfolio account?"
}<p>Die Antwort enthält nicht nur das Endergebnis, sondern auch den vollständigen Ausführungsablauf, aus dem hervorgeht, welche Werkzeuge der Agent ausgewählt hat, welche Parameter er verwendet hat und welche Ergebnisse jeder Schritt erbracht hat.</p>{
  "conversation_id": "db5c0c8b-12bf-4928-a57e-d99129ad2fea",
  "steps": [
    {
      "type": "tool_call",
      "tool_call_id": "tooluse_Nfqr3mwtR92HTRIsTcGXZQ",
      "tool_id": ".index_explorer",
      "params": {
        "query": "indices containing portfolio data"
      },
      "results": [...]
    }
    // ... more steps ...
  ],
  "response": {
    "message": "Based on the information I've gathered...."
  }
}<p>Eine umfassende Ablaufverfolgung und Protokollierung sind für einen kontinuierlichen Verbesserungsprozess unerlässlich, und schon bald können Sie diese Agenten-Traces direkt in Elasticsearch speichern und anzeigen. Noch besser: Diese Traces basieren auf dem OpenTelemetry-Protokoll, wodurch sichergestellt wird, dass sie standardisiert und portabel sind und sich in die Observability-Plattform Ihrer Wahl integrieren lassen.</p><p>Dieser Detaillierungsgrad ist die Grundlage für einen echten kontinuierlichen Verbesserungsprozess. Es ermöglicht Ihnen, eine umfassende Suite von Tests zu erstellen, Fehler zu beheben, Fehlermodi zu identifizieren, um Regressionen zu verhindern, und erfolgreiche Muster zu erfassen, um die Leistung feinabzustimmen. Letztendlich ist dieser datengetriebene Ansatz der Schlüssel zur Umwandlung eines vielversprechenden Prototyps in ein produktionsreifes, vertrauenswürdiges KI-System.</p><h3>Security</h3><p>Da Agenten und Tools immer leistungsfähiger werden, ist Sicherheit nicht mehr optional – sie ist grundlegend. Die Bereitstellung von APIs, die Automatisierung von Aufgaben und Arbeitsabläufen erfordert, dass Unternehmenssysteme vertrauenswürdig sind. Gerade weil Agenten immer mehr Arbeitsabläufe automatisieren, ist die Fähigkeit, diese zu sichern und sicherzustellen, dass sie den Unternehmensanforderungen entsprechen, von entscheidender Bedeutung.</p><p>Die genannten Funktionen übernehmen alle die in Elastic bereits heute verfügbaren Steuerelemente, einschließlich <a href="https://www.elastic.co/search-labs/blog/rag-and-rbac-integration">rollenbasierter Zugriffskontrolle (RBAC)</a> für API-Aufrufe und API-Schlüsselverwaltung. Wir dehnen die gleichen Kontrollen auch auf neue Protokolle wie MCP aus. Das bedeutet Unterstützung für Standards wie OAuth sowie die Möglichkeit, benutzerdefinierte Authentifizierungsmechanismen einzubinden.</p><p>Unser Ziel ist es, Ihnen die Flexibilität zu geben, mit Agenten und Tools zu experimentieren und gleichzeitig das von Ihrer Organisation geforderte Maß an Sicherheit, Compliance und Governance aufrechtzuerhalten.</p><h2>Was kommt als Nächstes?</h2><p>Wir fügen nicht nur Funktionen hinzu; wir erweitern Elasticsearch für agentenbasierte Kontextentwicklung. Wir planen, unsere zukünftige Entwicklung auf diesen Prinzipien aufzubauen:</p><p>1. Bekenntnis zu Open Source und Standards</p><p>Unser Bekenntnis zu Open Source und offenen Standards gewährleistet, dass diese Funktionen mit externen Agenten-Frameworks interoperabel bleiben. Sie können jederzeit Agenten in Ihrem gesamten Ökosystem verbinden, erweitern und zusammenstellen und behalten dabei die Kontrolle über Ihre Daten und Arbeitsabläufe.</p><p>2. Wert des Kontextes</p><p>Der Kontext ist das größte Kapital eines KI-Agenten. Die Verwaltung des Kontextes während der Suchvorgänge und Workflow-Operationen der Agenten kann eine anspruchsvolle Aufgabe sein. Wir nutzen die Kernkompetenzen von Elastic, um Kontext-Engineering zu realisieren und sicherzustellen, dass Ihrem Agenten stets die relevantesten Informationen zur Verfügung stehen.</p><p>3. Fokus auf agentenbasierte Datenströme</p><p>Zukünftig werden Agenten eine immer größere Datenquelle darstellen, einschließlich der Ergebnisse von Agenten (generierte Dokumente, Berichte, Visualisierungen) und der Ausführungsspur von Agenten (ihr Denken, Werkzeugaufrufe, Speicher/Kontext). Elastic eignet sich hervorragend für die Verarbeitung dieser Art von Daten, und wir arbeiten an Forschungsprojekten zur Durchführung von Analysen, Auswertungen und automatisierten Verbesserungen mithilfe dieser Daten.</p><p>4. Sicherheit durch Design</p><p>KI-Agenten bringen eine ganze Reihe neuer Sicherheitsherausforderungen mit sich. Elastic war schon immer ein Vorreiter für sichere Lösungen und wir bauen auch weiterhin auf Enterprise-Niveau Schutzmechanismen, Zugriffskontrollen und "Zero-Trust"-Prinzipien.</p><p>5. In die Plattform integriert</p><p>Die Funktionen zum Erstellen von KI-Agenten sind in die Elasticsearch-Plattform integriert. Dies bedeutet, dass Funktionen auf Plattformebene wie Tracing, Evaluation, Visualisierung und Analyse auch für Agenten anwendbar sind. Sie möchten Dashboards auf Basis von Agentenausführungen entwickeln? Das ist bereits integriert. Sie möchten die Leistung des KI-Agenten mithilfe von Stimmungsanalysen bewerten? Die Plattform ermöglicht das. Dies ermöglicht es, einen kompletten Lebenszyklus rund um Ihre KI-Erlebnisse aufzubauen.</p><p>Elastic hat sich zum Ziel gesetzt, Ihnen Schnittstellen zur Verfügung zu stellen, mit denen Sie dialogbasierte KI und automatisierte Arbeitsabläufe entwickeln können, die vollständig integriert, erweiterbar und auf Ihren Daten basieren. Weitere technische Details und Fortschritte werden in Kürze bekannt gegeben.</p><p>Agent Builder ist ab sofort als private Vorschau verfügbar. <a href="https://www.elastic.co/contact?pg=global&amp;plcmt=nav&amp;cta=205352">Nehmen Sie Kontakt mit uns auf</a> , um Zugang anzufordern. Haben Sie Fragen oder Feedback? Tauschen Sie sich mit unserer Entwickler-Community in unserem <a href="https://elasticstack.slack.com/archives/C09GRHEQ4AG"><strong>Slack-Workspace</strong></a> oder in unserem <a href="https://discuss.elastic.co/c/search/84"><strong>Diskussionsforum</strong></a> aus.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder</guid>
    <category><![CDATA[KI]]></category>
    <category><![CDATA[Agentische KI]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <dc:creator><![CDATA[Anish Mathur,Dana Juratoni]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt16a3d8736bf086e0/6a17e1616864a45410b686c7/71876470119e02a45bcbfcbf27a3e110328bbd14-1020x654.png" length="0" type="image/png"/>
    <pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Vektorsuchfilterung: Relevanz beibehalten]]></title>
    <description><![CDATA[Es reicht nicht aus, eine Vektorsuche durchzuführen, um die ähnlichsten Ergebnisse zu einer Suchanfrage zu finden. Um die Suchergebnisse einzugrenzen, ist häufig das Filtern erforderlich. Dieser Artikel erklärt, wie die Filterung bei der Vektorsuche in Elasticsearch und Apache Lucene funktioniert.]]></description>
    <content:encoded><![CDATA[<p>Eine Vektorsuche reicht nicht aus, um relevante Ergebnisse zu finden. Es ist sehr üblich, Filterkriterien zu verwenden, die dabei helfen, die Suchergebnisse einzugrenzen und irrelevante Ergebnisse herauszufiltern.</p><p>Das Verständnis der Funktionsweise von Filtern bei der Vektorsuche hilft Ihnen, die Kompromisse zwischen Leistung und Trefferquote auszubalancieren und einige der Optimierungen zu entdecken, die verwendet werden, um die Vektorsuche bei Verwendung von Filtern leistungsfähig zu gestalten.</p><h2>Warum filtern?</h2><p>Die Vektorsuche hat die Art und Weise, wie wir relevante Informationen in großen Datensätzen finden, revolutioniert und ermöglicht es uns, Elemente zu entdecken, die einer Suchanfrage semantisch ähnlich sind.</p><p>Es genügt jedoch nicht, einfach nur ähnliche Artikel zu finden. Oftmals müssen wir die Suchergebnisse anhand spezifischer Kriterien oder Attribute eingrenzen.</p><p>Stellen Sie sich vor, Sie suchen in einem Online-Shop nach einem Produkt. Eine reine Vektorsuche zeigt Ihnen möglicherweise visuell ähnliche Artikel an, aber Sie möchten vielleicht auch nach Preisspanne, Marke, Verfügbarkeit oder Kundenbewertungen filtern. Ohne Filterfunktion würden Ihnen unzählige ähnliche Produkte präsentiert, was es schwierig macht, genau das zu finden, was Sie suchen.</p><p>Durch die Filterung wird eine präzise Kontrolle über die Suchergebnisse ermöglicht, sodass sichergestellt wird, dass die abgerufenen Elemente nicht nur semantisch übereinstimmen, sondern auch alle notwendigen Anforderungen erfüllen. Dies führt zu einem wesentlich genaueren, effizienteren und benutzerfreundlicheren Sucherlebnis.</p><p>Hier liegt die Stärke von Elasticsearch und Apache Lucene – die effektive Filterung über verschiedene Datentypen hinweg ist einer der Hauptunterschiede zu anderen Vektordatenbanken.</p><h2>Filterung für exakte Vektorsuche</h2><p>Es gibt zwei Hauptmethoden zur Durchführung exakter Vektorsuchen:</p><ul><li><p>Verwendung des Indextyps <code>flat</code> für Ihr dense_vector-Feld. Dies bewirkt, dass <code>knn</code> -Suchen eine exakte Suche anstelle einer approximativen Suche verwenden.</p></li><li><p>Die Punktzahl wird mithilfe einer <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-script-score-query#vector-functions">script_score-Abfrage</a> berechnet, die Vektorfunktionen verwendet. Dies kann mit jedem Indextyp verwendet werden.</p></li></ul><p>Bei der Ausführung einer exakten Vektorsuche werden alle Vektoren mit der Suchanfrage verglichen. In diesem Szenario verbessert das Filtern die Leistung, da nur die Vektoren verglichen werden müssen, die den Filter passieren.</p><p>Dies hat keinen Einfluss auf die Ergebnisqualität, da ohnehin alle Vektoren berücksichtigt werden. Wir filtern bereits im Voraus die Ergebnisse heraus, die nicht interessant sind, um die Anzahl der Operationen zu reduzieren.</p><p>Dies ist sehr wichtig, da eine exakte Suche gegenüber einer approximativen Suche performanter sein kann, wenn die angewendeten Filter zu einer geringen Anzahl von Dokumenten führen.</p><p>Als Faustregel gilt: Verwenden Sie die exakte Suche, wenn weniger als 10.000 Dokumente den Filter passieren. <a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">BBQ</a> -Indizes sind für Vergleiche wesentlich schneller, daher ist es sinnvoll, bei weniger als 100.000 Einträgen für die Basisindizes die exakte Suche zu verwenden. Weitere Details finden Sie in <a href="https://www.elastic.co/search-labs/blog/knn-exact-vs-approximate-search">diesem Blogbeitrag</a> .</p><p>Falls Ihre Filter immer sehr restriktiv sind, könnten Sie erwägen, die Indizierung auf die exakte Suche anstatt auf die ungefähre Suche auszurichten, indem Sie einen <code>flat</code> -Indextyp anstelle eines HNSW-basierten Index verwenden. Weitere Details finden Sie in <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector#dense-vector-params">den Eigenschaften von index_options</a>.</p><h2>Filterung für die approximative Vektorsuche</h2><p>Bei der Durchführung einer approximativen Vektorsuche tauschen wir Ergebnisgenauigkeit gegen Leistung ein. Vektorsuchdatenstrukturen wie HNSW suchen effizient nach ungefähren nächsten Nachbarn in Millionen von Vektoren. Sie konzentrieren sich darauf, die ähnlichsten Vektoren zu finden, indem sie die geringste Anzahl an Vektorvergleichen durchführen, deren Berechnung aufwändig ist.</p><p>Dies bedeutet, dass andere Filterattribute nicht Teil der Vektordaten sind. Verschiedene Datentypen verfügen über eigene Indexierungsstrukturen, die effizient zum Auffinden und Filtern dieser Daten sind, wie beispielsweise Termwörterbücher, Beitragslisten und Dokumentwerte.</p><p>Da diese Datenstrukturen vom Vektorsuchmechanismus getrennt sind, wie wenden wir Filter auf die Vektorsuche an? Es gibt zwei Möglichkeiten: Filter nach der Vektorsuche (Nachfilterung) oder vor der Vektorsuche (Vorfilterung) anwenden.</p><p>Jede dieser Optionen hat Vor- und Nachteile. Lasst uns tiefer in diese Materie eintauchen!</p><h3>Nachfilterung</h3><p>Die Nachfilterung wendet Filter an, nachdem die Vektorsuche durchgeführt wurde. Dies bedeutet, dass die Filter angewendet werden, nachdem die k ähnlichsten Vektorergebnisse gefunden wurden.</p><p>Offensichtlich können wir nach Anwendung der Filter auf die Ergebnisse unter Umständen weniger als k Ergebnisse erhalten. Wir könnten natürlich mehr Ergebnisse durch eine Vektorsuche erhalten (höherer k-Wert), aber wir können nicht sicher sein, dass wir nach Anwendung der Filter k oder mehr Ergebnisse erhalten.</p><p>Der Vorteil der Nachfilterung besteht darin, dass sie das Laufzeitverhalten der Vektorsuche nicht verändert – die Vektorsuche ist sich der Filterung nicht bewusst. Dies ändert jedoch die endgültige Anzahl der abgerufenen Ergebnisse.</p><p>Nachfolgend ein Beispiel für die Nachfilterung mithilfe der <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query">knn-Abfrage</a>. Prüfen Sie, ob die Filterklausel von der knn-Abfrage getrennt ist:</p>{
  "query": {
    "bool": {
      "must": {
        "knn": {
          "field": "image-vector",
          "query_vector": [54, 10, -2],
          "k": 5,
          "num_candidates": 50
        }
      },
      "filter": {
        "term": {
          "file-type": "png"
        }
      }
    }
  }
}<p>Für die KNN-Suche ist auch eine Nachfilterung mit <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/filter-search-results#post-filter">dem Postfilter</a> möglich:</p>{
  "knn": {
    "field": "image-vector",
    "query_vector": [54, 10, 2],
    "k": 5,
    "num_candidates": 50
  },
  "post_filter": {
    "term": {
      "file-type": "png"
    }
  }
}<p>Beachten Sie, dass Sie bei der knn-Suche einen expliziten Post-Filter-Abschnitt verwenden müssen. Wenn Sie keinen Nachfilter verwenden, <a href="https://www.elastic.co/docs/solutions/search/vector/knn#_combine_approximate_knn_with_other_features">kombiniert die kNN-Suche die Ergebnisse der nächsten Nachbarn</a> mit anderen Abfragen oder Filtern, anstatt einen Nachfilter anzuwenden.</p><h3>Vorfilterung</h3><p>Durch das Anwenden von Filtern vor der Vektorsuche werden zunächst die Dokumente abgerufen, die den Filtern entsprechen, und diese Informationen werden dann an die Vektorsuche weitergegeben.</p><p>Lucene verwendet <a href="https://github.com/apache/lucene/blob/7a60d7ce92392181e137361336e5196bd486cdd9/lucene/core/src/java/org/apache/lucene/util/BitSet.java">BitSets</a> , um die Dokumente, die die Filterbedingung erfüllen, effizient zu speichern. Anschließend durchläuft die Vektorsuche den HNSW-Graphen und berücksichtigt dabei die Dokumente, die die Bedingung erfüllen. Bevor ein Kandidat zu den Ergebnissen hinzugefügt wird, wird geprüft, ob er im BitSet gültiger Dokumente enthalten ist.</p><p>Allerdings muss der Kandidat untersucht und mit der Anfrage verglichen werden, selbst wenn es sich nicht um ein gültiges Dokument handelt. Die Effektivität von HNSW beruht auf der Verbindung zwischen den Vektoren im Graphen – wenn wir die Untersuchung eines Kandidaten abbrechen würden, hieße das, dass wir möglicherweise auch seine Nachbarn überspringen würden.</p><p>Stellen Sie es sich so vor, als würden Sie zu einer Tankstelle fahren. Wenn Sie alle Straßen ausschließen, auf denen sich keine Tankstelle befindet, ist es unwahrscheinlich, dass Sie Ihr Ziel erreichen. Andere Straßen sind vielleicht nicht das, was Sie brauchen, aber sie <em>verbinden</em> Sie mit Ihrem Ziel. Gleiches gilt für Vektoren in einem HNSW-Diagramm!</p><p>Daraus folgt, dass die Anwendung von Vorfiltern weniger effizient ist als der Verzicht auf Filter. Wir müssen die Arbeit an <em>allen</em> Vektoren durchführen, die wir bei unserer Suche besuchen, und diejenigen verwerfen, die nicht dem Filter entsprechen. Wir investieren mehr Arbeit und nehmen uns mehr Zeit, um unsere Top-K-Ergebnisse zu erzielen.</p><p>Nachfolgend ein Beispiel für Vorfilterung in der Elasticsearch Query DSL. Prüfen Sie, ob die Filterklausel nun Teil des knn-Abschnitts ist:</p>{
  "knn": {
    "field": "image-vector",
    "query_vector": [54, 10, -2],
    "k": 5,
    "num_candidates": 50,
    "filter": {
      "term": {
        "file-type": "png"
      }
    }
  }
}<p>Eine Vorfilterung ist sowohl für <a href="https://www.elastic.co/docs/solutions/search/vector/knn#knn-search-filter-example">die KNN-Suche</a> als auch für <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query#knn-query-filtering">die KNN-Abfrage</a> verfügbar:</p>{
  "query": {
    "knn": {
      "field": "image-vector",
      "query_vector": [-5, 9, -12],
      "k": 5,
      "filter": {
        "term": {
          "file-type": "png"
        }
      }
    }
  }
}<h4>Vorfilteroptimierungen</h4><p>Es gibt einige Optimierungen, die wir anwenden können, um eine effiziente Vorfilterung zu gewährleisten.</p><p>Wir können auf die exakte Suche umschalten, wenn der Filter sehr restriktiv ist. Wenn nur wenige Vektoren zu vergleichen sind, ist es schneller, eine exakte Suche in den wenigen Dokumenten durchzuführen, die dem Filter entsprechen.</p><p>Dies ist eine Optimierung, die in <a href="https://github.com/apache/lucene/blob/eb876b618da5d04c1ad14b04a48321638318493a/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L218">Lucene</a> und Elasticsearch automatisch angewendet wird.</p><p>Eine weitere Optimierungsmethode besteht darin, die Vektoren zu ignorieren, die den Filter nicht erfüllen. Stattdessen prüft diese Methode die Nachbarn der gefilterten Vektoren, die den Filter passieren. Dieser Ansatz reduziert effektiv die Anzahl der Vergleiche, da die gefilterten Vektoren nicht berücksichtigt werden, und untersucht weiterhin Vektoren, die mit dem aktuellen Pfad verbunden sind.</p><p>Dieser Algorithmus heißt ACORN-1, und der Prozess wird in <a href="https://www.elastic.co/search-labs/blog/filtered-hnsw-knn-search">diesem Blogbeitrag</a> ausführlich beschrieben.</p><h2>Filtern mithilfe der Dokumentensicherheit</h2><p><a href="https://www.elastic.co/docs/deploy-manage/users-roles/cluster-or-deployment-auth/controlling-access-at-document-field-level#document-level-security">Document Level Security (DLS)</a> ist eine Elasticsearch-Funktion, die festlegt, welche Dokumente Benutzerrollen abrufen können.</p><p>DLS wird mittels Abfragen durchgeführt. Einer Rolle kann eine Abfrage zugeordnet sein, die die Dokumente einschränkt, die ein Benutzer dieser Rolle aus den Indizes abrufen kann.</p><p>Die Rollenabfrage dient als Filter, um <a href="https://github.com/elastic/elasticsearch/blob/c3a1cb34294e902a9f46d7e840ea09965019f456/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/accesscontrol/SecurityIndexReaderWrapper.java#L92">die Dokumente abzurufen, die ihr entsprechen</a>, und wird als BitSet zwischengespeichert. Dieses BitSet wird dann verwendet, um den zugrunde liegenden Lucene-Reader zu umschließen, sodass nur die Dokumente, die von der Abfrage zurückgegeben wurden, als <em>aktiv</em>gelten – das heißt, sie existieren im Index und wurden nicht gelöscht.</p><p>Da die Live-Dokumente <a href="https://github.com/apache/lucene/blob/a211d30097a8e3264d3ef073a054bd31eb847231/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L196">vom Reader abgerufen</a> werden, um die kNN-Abfrage durchzuführen, werden nur die dem Benutzer zur Verfügung stehenden Dokumente berücksichtigt. Falls ein Vorfilter vorhanden ist, werden die DLS-Dokumente <a href="https://github.com/apache/lucene/blob/a211d30097a8e3264d3ef073a054bd31eb847231/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L204">diesem hinzugefügt</a>.</p><p>Dies bedeutet, dass die DLS-Filterung als Vorfilter für die approximative Vektorsuche fungiert, mit denselben Auswirkungen auf die Leistung und den gleichen Optimierungen.</p><p>Die DLS-Suche mit exakter Suche bietet die gleichen Vorteile wie die Anwendung eines beliebigen Filters – je weniger Dokumente aus der DLS abgerufen werden, desto effizienter ist die exakte Suche. Berücksichtigen Sie auch die Anzahl der von DLS zurückgegebenen Dokumente – wenn die DLS-Rollen sehr restriktiv sind, sollten Sie die Verwendung einer exakten Suche anstelle einer ungefähren Suche in Betracht ziehen.</p><h2>Benchmarking</h2><p>Wir bei Elasticsearch möchten sicherstellen, dass die Vektorsuchfilterung effizient ist. Wir haben <a href="https://elasticsearch-benchmarks.elastic.co/#tracks/so_vector/nightly/default/90d">einen speziellen Benchmark für die Vektorfilterung</a> , der approximative Vektorsuchen mit unterschiedlichen Filtern durchführt, um sicherzustellen, dass die Vektorsuche relevante Ergebnisse so schnell wie möglich liefert.</p><p>Prüfen Sie die <a href="https://elasticsearch-benchmark-analytics.elastic.co/app/dashboards#/view/43b63e80-5ba2-11ed-aede-a742809feed4?_g=(refreshInterval:(pause:!t,value:60000),time:(from:'2025-05-28T01:27:58.456Z',to:'2025-06-30T13:53:26.430Z'))&amp;_a=()">Verbesserungen,</a> die mit der Einführung von ACORN-1 einhergingen. Bei Tests, bei denen nur 2 % der Vektoren den Filter passieren, reduziert sich die Abfragelatenz auf 55 % der ursprünglichen Dauer:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt820cb0b715cf291c/6a17e227dbb4ff8d49fb5615/3eac3748a33376fc97d957364a5c1f5108d5c58b-1023x896.png" alt="" /><h2>Fazit</h2><p>Filtern ist ein integraler Bestandteil der Suche. Die Gewährleistung einer leistungsfähigen Filterung bei der Vektorsuche sowie das Verständnis der damit verbundenen Kompromisse und Optimierungsmöglichkeiten entscheiden darüber, ob eine effiziente und genaue Suche gelingt oder scheitert.</p><p>Die Filterung beeinflusst die Leistung bei der Vektorsuche:</p><ul><li><p>Die exakte Suche ist schneller, wenn Filter verwendet werden. Sie sollten die Verwendung einer exakten Suche anstelle einer ungefähren Suche in Betracht ziehen, wenn Ihre Filterkriterien ausreichend restriktiv sind. Dies ist eine automatische Optimierung in Elasticsearch.</p></li><li><p>Die ungefähre Suche ist langsamer, wenn Vorfilter verwendet werden. Durch die Vorfilterung erhalten wir die ersten k Ergebnisse, die dem Filter entsprechen, allerdings auf Kosten einer langsameren Suche.</p></li><li><p>Die Nachfilterung liefert nicht unbedingt die obersten k Ergebnisse, da diese bereits beim Anwenden des Filters herausgefiltert worden sein können.</p></li></ul><p>Viel Spaß beim Filtern!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/vector-search-filtering</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/vector-search-filtering</guid>
    <category><![CDATA[Vektordatenbank]]></category>
    <category><![CDATA[Lucene]]></category>
    <category><![CDATA[Inside Elastic]]></category>
    <dc:creator><![CDATA[Carlos Delgado]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt39ede1736e0f1456/6a17e2282f4a5c5031fa8843/03b1dd4c7bda4fbabd8e374bc2e4f12d5be6ef5f-1600x1150.png" length="0" type="image/png"/>
    <pubDate>Wed, 03 Sep 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>