<?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[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[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/jp/search-labs/blog/category/inside-elastic</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/blog/category/inside-elastic</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/category/inside-elastic.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 12:33:02 GMT</lastBuildDate>
  <item>
    <title><![CDATA[ベクトル検索を世界最速のものにするためにElasticsearch simdvecを構築した方法]]></title>
    <description><![CDATA[Elasticsearchのすべてのベクトル検索クエリの基盤となる、手作業で調整されたSIMDカーネルライブラリElasticsearch simdvecの構築方法。]]></description>
    <content:encoded><![CDATA[<p>Elasticsearch simdvecは、Elasticsearch内のすべてのベクトル距離計算のエンジンです。Elasticsearchがサポートするすべてのベクトルタイプに手動で調整されたAVX-512とNEONカーネルを提供します。そのバルクスコアリングアーキテクチャは、x86では明示的なプリフェッチ、ARMではインターリーブロードによってメモリレイテンシを隠蔽し、データがCPUキャッシュを超える場合、FAISSやjvectorなどのライブラリを最大4倍上回るパフォーマンスを発揮します。この記事では、これを構築した理由、その内部構造、そしてこれがElasticsearchのベクトル検索を世界最速の1つにしている理由について説明します。</p><h2>Elasticsearch simdvecの構築方法</h2><p>Elasticsearchにおけるすべてのベクトル検索クエリは、<a href="https://arxiv.org/abs/1603.09320">Hierarchical Navigable Small World（HNSW）</a>トラバーサル、転置ファイル（IVF）スキャン、再ランキングパスのいずれであっても、結局は同じ問題に帰着します。すなわち、クエリごとにベクトル間の距離を何百万回も計算しなければならないということです。Elasticsearchは、float32からint8、bfloat16、バイナリ、Better Binary Quantization（BBQ）まで、幅広いデータ型と量子化戦略をサポートしています。それぞれにメモリ、スループット、リコールのトレードオフが異なります。そのすべての背後にあるのは、simdvecという単一のエンジンです。</p><p>私たちは、ハードウェアが許す限りすべての距離計算を高速に行うためにsimdvecを構築しました。この記事では、simdvecを構築した理由、その内部構造、そしてどのような場面で最も効果を発揮するのかを説明します。</p><h3>レースカーのような構造</h3><p>F1愛好家として（当社チームには以前フェラーリのF1チームで勤務経験があるメンバーもいます）明確な類似点を見いだせます。F1カーは、最高のラップタイムを達成するという唯一の目的のために設計されています。エンジンのパワー、空力性能、シャーシ設計は、その結果に貢献する限りにおいてのみ重要です。ベクトルデータベースについても同様で、インデキシングのスループット、クエリのレイテンシ、リコールが成功を定義します。</p><p>最終結果は重要ですが、最高レベルのパフォーマンスを達成するには、各コンポーネントが最高の状態である必要があります。<em>必要十分</em>ではなく、そのカテゴリーで<em>最高</em>でなければなりません。simdvecはその考え方で構築されており、システムの重要な部分であるエンジンに焦点を当てています。これは、専用に構築された、<a href="https://en.wikipedia.org/wiki/Single_instruction,_multiple_data">単一命令多重データ</a>（SIMD）最適化カーネルライブラリで、Javaから<a href="https://openjdk.org/projects/panama/">Panama</a>外部関数インターフェース（FFI）を介して呼び出される、手動で調整されたネイティブC++距離関数を提供します。一括スコアリング、キャッシュラインのプリフェッチ、Elasticsearchで使用されるすべてのベクトルの種類とレイアウトをサポートしています。</p><p>それがすべてのクエリの背後にあるエンジンです。</p><h3>自社開発した理由</h3><p>当社は2023年にApache LuceneのPanama Vector APIを使用してスタートしました。float32の内積計算にはうまく機能しましたが、すぐにその機能ではElasticsearchのニーズには対応できなくなりました。Elasticsearchは、int8、int4、bfloat16、シングルビット、非対称BBQなど、幅広い量子化されたベクトルタイプをサポートしています。それぞれにSIMD戦略、パッキングレイアウト、アキュムレータの要件が異なります。型カバレッジに加えて、Elasticsearchのスコアリングパスは単一ペアのスループット以上のものを要求します。HNSWは1回のパスで複数のグラフ隣接ノードをスコアリングする必要があり、IVFはプリフェッチを使用して数千の候補を一括スコアリングする必要があり、ディスクベースのスコアリングはコピーせずにmmapされたメモリ上で直接動作する必要があります。入手可能なものを調べてみましたが、すべての条件を満たすものは見つかりませんでした。</p><p>そこで、simdvecを構築しました。これは、JavaからFFI経由で呼び出される手作業で調整されたネイティブC++カーネルで、一括スコアリング、プリフェッチ、Elasticsearchが使用するすべてのベクトルタイプをサポートしています。ライブラリを所有することで、私たちはフルスタックを制御できます。BBQのような新しい量子化タイプを追加すると、システム全体にわたって調整されたSIMDカーネルが組み込まれます。上流のライブラリがそれをサポートするのを待つ必要はなく、いかなる型においてもパフォーマンスに妥協することはありません。Elasticsearchにおけるすべてのベクトルクエリ（HNSW、IVF、リランキング、ハイブリッドなど）は、実際に使用する操作とタイプに基づいて構築されたこのエンジン上で実行されます。</p><p>simdvecには、x86とARMそれぞれに対応したネイティブライブラリが用意されており、起動時に複数の命令セットアーキテクチャ（ISA）階層を選択できます。FFIを介したJavaからの呼び出しオーバーヘッドは非常に低く、<a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md#ffm-downcall-overhead-measurements">1桁ナノ秒</a>です。</p><h3>ランドスケープ</h3><p>SIMD最適化されたベクトル距離カーネルを構築しているのは私たちだけではありません。このエコシステムは豊かで、私たちはsimdvecがどのように動作するのかを理解したいと考えました。プロジェクトの優劣を決めるのではなく、背景情報を提供し、Elasticsearchエンジンの位置づけを説明することが目的です。私たちは異なるアプローチを表す3つのプロジェクトを基準点として選びました。</p><ul><li><p><strong>jvector：</strong>ベクトル化された距離計算にPanama Vector APIを使用するJava近似最近傍探索（ANN）ライブラリ。x86上ではオプションでネイティブCアクセラレーションが可能。</p></li><li><p><strong>FAISS：</strong>手作業で調整されたAVX2/AVX-512カーネルを備えた、広く展開されているオープンソースのベクトル検索フレームワーク。</p></li><li><p><strong>NumKong</strong> （旧称 SimSIMD）：距離関数、行列演算、地理空間計算など、2,000種類以上の手作業で調整されたSIMDカーネルを網羅した包括的なスイート。</p></li></ul><p>各プロジェクトは異なる目的を持ち、異なるトレードオフをもたらします。Elasticsearchが必要とする特定の操作におけるsimdvecのパフォーマンスのコンテキストを提供するために、それらからの参照番号を含めています。</p><h3>測定方法</h3><p>simdvecと<a href="https://github.com/ChrisHegarty/jvector-kernel-benchmarks">jvectorのベンチマーク</a>は、FFIオーバーヘッドを含めた標準JVMマイクロベンチマークハーネスであるJMHを使用してJavaで記述されています。<a href="https://github.com/ldematte/simsimd-benchmarks">NumKongベンチマーク</a>と<a href="https://github.com/ChrisHegarty/faiss-kernel-benchmarks">FAISSベンチマーク</a>については、標準的なC++マイクロベンチマークフレームワークであるGoogle Benchmarkを使って小さなC/C++ハーネスを作成しました。どちらのフレームワークも、ウォームアップと反復キャリブレーションを含めた1操作あたりのナノ秒数の精度を報告しています。ハードウェアパフォーマンスカウンターを介して、すべてのライブラリが両方のプラットフォームでSIMDを使用していることを確認しました。ベンチマークコードはすべて、リンク先のGitHubリポジトリ（およびsimdvecの場合は<a href="https://github.com/elastic/elasticsearch">elasticsearch</a>リポジトリ）で公開されています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt90a7d66553be3c9d/6a1701d166c4f942caf8bea5/aee116772df161cf86b7668f575ac34c733a23c5-1580x238.png" alt="表には、2つのプラットフォームが示されています。AMD EPYC Turin（Zen 5）、AVX2およびAVX-512を搭載したx86アーキテクチャAWS c8a.4xlarge、もう1つは、Graviton 4（Neoverse V2）、NEONおよびSVE2を搭載したARMアーキテクチャAWS c8g.4xlargeです。" /><p><strong>ソフトウェア：</strong> JDK 25.0.2、JMH 1.37、GCC 14、Google Benchmark（最新版）。</p><h2>一度に1つのベクトル</h2><p>ベクトル検索における最も基本的な操作は、2つのベクトル間の距離を計算することです。すべてのHNSW近隣評価、すべてのIVF候補スコア、すべての再ランク比較は、この内側のループに還元されます。</p><p>両プラットフォームで1024次元における単一ペアのスループットを測定しました。まず、ベースラインとなる型であり、エコシステムの競争が最も激しいfloat32から評価を開始しました。simdvecをFAISSおよびjvectorと比較しました。NumKongはfloat32にfloat64アキュムレータを使用するため、スループットよりも数値精度を優先し、処理速度が3.2倍から5.3倍遅くなる（プラットフォームによって異なる）ため、比較対象から除外しました。比較を同じように保つために、代わりにint8でNumKongのベンチマークを行います。ここでは、simdvecと同じアキュムレータ戦略を使用しています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3bc2ecaf3ad2b61/6a1701d2ab7f08039ddb9d0f/352cfa0fc18f123140f746d843404f80127fb1b7-1500x675.png" alt="「float32 Dot Product — AMD Turin」と題された横棒グラフで、5つの実装を比較しています：FAISS AVX-512：23.2 ns/op、ES simdvec AVX-512：28.3 ns/op、FAISS AVX2：36.4 ns/op、ES simdvec AVX2：38.9 ns/op、jvector：43.9 ns/op。" /><p>x86アーキテクチャーでは、FAISS AVX-512が23ナノ秒と最速のシングルペアカーネルです。simdvec AVX-512は28ナノ秒で続きますが、この差はFFI呼び出しのオーバーヘッドを反映したものです。どちらもマルチアキュムレータアンローリングを備えた512ビットFMAを使用しています。AVX2レベルでは、両者の性能差ははるかに小さく、それぞれ36ナノ秒と39ナノ秒で、どちらも256ビットのレジスタとメモリのロード幅によって制約されています。jvectorはJava Panama Vector APIを使用して44ナノ秒で到達します。Panamaは優れたSIMDコードを生成しますが、手作業で調整されたC++ intrinsicsが優位を保っています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcbbbe442631a575d/6a1701d42b835f81bcf4b083/95e44d9767f21ec4bccaed835e3c99aa180431ee-1500x495.png" alt="「float32 Dot Product・Graviton 4（ARM）」と題された横棒グラフ。ES simdvecが70.2 ns/op、jvectorが110.0 ns/op、FAISSが155.6 ns/opを示しています。" /><p>ARMでは、simdvecは70ナノ秒でリードしており、110ナノ秒のjvectorと156ナノ秒のFAISSをはるかに上回っています。simdvecはaarch64向けにNEONカーネルを独自にチューニングしました。JvectorにはネイティブのARMコードがなく、Panamaに依存しています。FAISSは明示的なNEON組み込み関数ではなく、コンパイラの自動ベクトル化に依存しているため、差が大きくなっています。これは、カーネルライブラリを所有することによる実用的な利点を反映しています。ElasticsearchがGravitonに拡張された際、専用に構築されたNEONカーネルを追加しました。jvectorもFAISSも、ARMネイティブコードを同程度に優先しているわけではありません。</p><p>しかし、Elasticsearchはfloat32だけを評価するわけではありません。<strong>Int8</strong>の量子化はメモリ使用量を4分の1に削減し、bfloat16は2分の1に、BBQは32分の1に削減します。それぞれのタイプには独自のSIMD戦略が必要であり、simdvecはすべてのタイプ向けに手動チューニングされたネイティブカーネルを提供しています。</p><p>比較したライブラリの中で、int8用の同等のカーネルを備えているものはNumKongのみでした。int8ドット積、二乗ユークリッド、余弦を1024次元で測定しました。</p><p><strong>Int8シングルペアスコアリング（1024次元、ns/vec 演算 - 数値が小さいほど良い）</strong></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3ac255d158e93504/6a1701d5a292997e48d00eb1/a0b852fd5f51d57bd2488886600472ee65ab64da-1594x378.png" alt="ドット積、二乗ユークリッド距離、コサイン演算におけるx86とARMのパフォーマンスを比較した表。各演算について、両アーキテクチャにおけるES、NumKong、およびdiffの値が示されています。" /><p>どちらのアーキテクチャでも、NumKongは小～中次元では同等かより高速です。その差は主に呼び出しのオーバーヘッドが少ないことに起因します（Cの直接呼び出しとJavaのFFI）。より大きな次元では、simdvecが追いつき、より効率的なカーネル実装（カスケードアンローリングを使用する）が呼び出しコストを償却します。次元が増えるにつれて、<a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md#single-pair-i8-nsop-2">このギャップは閉じ、最終的には逆転します</a>。クロスオーバーのサイズは、機能や構造によって768から1536の間となります。</p><p>Java FFIのオーバーヘッドが若干高いにもかかわらず、simdvecは高度に最適化されたC/C++ライブラリと同等の性能を発揮します。float32<em>と</em>int8の両方に対応した最適化されたカーネルを備えた唯一のライブラリであるだけでなく、ARMアーキテクチャではトップクラスの性能を誇り、x86アーキテクチャではFAISSにわずかに劣る程度（float32の場合）、そして両アーキテクチャにおいてNumKongに非常に近い性能（int8の場合）を実現しています。また、bfloat16、int4、binary、BBQについては、代替手段は存在するものの、simdvecは各型のデータレイアウトに合わせて手作業で調整されたSIMDによって差別化を図っています。</p><p>しかし、実際の検索エンジンは一度に1つのベクトルを評価するのではなく、クエリごとに数千のベクトルを評価します。次の質問は、そのスケールで何が起こるかということです。</p><h3>一度に数千件</h3><p>シングルペアのパフォーマンスは全体の一部に過ぎません。実際には、システムが負荷時にどのように動作するかが重要です。単一のHNSWクエリは数百のグラフ近傍をスコアリングすることがあります。IVFスキャンは、数千件の投稿リストエントリーをスコアリングすることがあります。リランクパスは数万の候補をスコアリングすることがあります。シングルペアのスループットは重要ですが、より重要なのは、多くのベクトルをどれだけ速くスコアリングできるか、そして作業セットがCPUキャッシュから溢れ出すにつれてパフォーマンスがどれだけスムーズに低下するかです。</p><p>simdvecは、あらゆるデータタイプに対して一括スコアリング機能を提供します。これらは単なる単一ペアカーネル上のループではなく、クエリベクトルを1次元ストライドごとに1回ロードし、複数のドキュメントベクトル間で共有するマルチアキュムレータ内部ループを使用します。次のバッチに対しては、明示的なキャッシュラインプリフェッチが行われます。jvectorもFAISSも同等の機能を提供していません（執筆時点では）。Jvectorには一括処理APIがないため、呼び出し元はループ内で一度に1組ずつスコアを計算します。FAISSは<code>fvec_inner_products_ny</code>を公開していますが、執筆時点では、クエリ償却やプリフェッチを行わずに、シングルペア距離関数のループとして実装されています。</p><p><strong>Float32。</strong>カーネルレベルでのインパクトを測定するために、HNSWのような散在グラフの近傍検索をシミュレートするランダムアクセスパターンを用いて、1024次元float32ドキュメントベクトルの数を増やしながら単一のクエリのスコアを計算しました。3つのデータセットサイズ（32、625、32,500ベクトル）は、それぞれL1、L2、L3キャッシュを超えるように選択されています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2df64ec77a1921ae/6a1701d714b270393ae3c4de/1d90267be1c63ac82b8ba588617ebedb0be0d1b6-1334x558.png" alt="AMD Turin（x86、AVX-512）とGraviton 4（ARM、NEON）におけるElasticsearch simdvec、FAISS、jvectorのバルクFloat32ドット積スコアリング時間を3つのサイズで比較した2つの棒グラフ。サイズは32ベクトル、625ベクトル、32,500ベクトル。" /><p>データがキャッシュに収まる場合、simdvecはどちらのプラットフォームでも最速ですが、カーネル演算が支配的であるため、マージンは控えめです。実際の分離は、ワーキングセットがL3を超えるにつれて現れます。x86では、simdvecのスコアは1ベクトルあたり95ナノ秒ですが、FAISSは165ナノ秒、jvectorは412ナノ秒です。ARM上でも同様の傾向が見られ、simdvecは162ナノ秒で安定しているのに対し、FAISSは347ナノ秒、jvectorは476ナノ秒に上昇します。simdvecのプリフェッチとクエリの償却により、シングルペアカーネル上の単純なループでは対応できない方法でメモリの待ち時間が隠され、メインメモリの奥深くで実際の検索ワークロードが動作する場所でその利点が広がります。</p><p><strong>Int8。</strong>同じパターンは量子化された型にも当てはまります。int8ドット積の一括スコアリングを1024次元で測定し、データセットのサイズが同じL1、L2、L3キャッシュ境界を超えるように選択して、simdvecのバルクスコアリングをループ内のNumKongシングルペアスコアリングと比較しました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcda85e10007188d0/6a1701d9cf4f25d722b2cff7/9ee97d98b40d13b19370b76b33e67ea66bfb3250-1580x338.png" alt=" 「x86 — Bulk scoring, int8 dot product (ns/op, lower is better)」と題された表は、ES simdvecとNumKongを3つのベクトルサイズ（128、2,500、130,000）で比較したもので、対応するns/op値とスピードアップ比率が示されています。" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt972c311b7d08ba73/6a1701dadc55dec02ee00c87/601f50a03fa3e6263cbac9700281dfe3e511de60-1580x338.png" alt="「ARM — Bulk scoring, int8 dot product (ns/op, lower is better)」と題し、ES simdvecとNumKongを3つのベクトルサイズ（128、2,500、130,000）で比較し、対応するns/op値とスピードアップ比を比較しました。" /><p>x86では、simdvecは1.2倍～1.9倍高速で、これは明示的なプリフェッチとバッチ処理の組み合わせによってもたらされます。ARM環境では、すべてのデータセットサイズにおいて、simdvecが再び優位に立ちました（1.7倍から1.9倍高速）。その利点は、4つのベクトルを一度にバッチ処理することで、インターリーブアクセスパターンを介してメモリレベルの並列処理を実現することにあります。いずれの場合も、最も顕著な結果は最大のデータセットサイズで何が起こるかであり、それが最も重要な場所です。</p><p>結果は、二乗距離とコサインで同様のパターンを示し、ARMでは1.4倍から1.8倍、x86では1.3倍から3.0倍の速度向上が見られました（詳細は<a href="https://github.com/ldematte/simsimd-benchmarks/blob/main/COMPARISON.md">こちら</a>）。</p><h3>メモリが重要となる場合</h3><p>本番環境のベクトルインデックスは通常、CPUキャッシュに収まりません。1024次元の10Mベクトルint8インデックスは10GBです。候補のスコアリングとは、DRAMからデータをストリーミングすることを意味し、そこでバルクスコアリングアーキテクチャが大きな違いを生むのです。</p><p>バルクスコアリング中のCPU内部で何が起こるかを測定するためにハードウェアパフォーマンスカウンターを使用し、メモリーレイテンシを隠すためには、アーキテクチャごとに根本的に異なる2つの戦略が必要であることを発見しました。</p><p><strong>x86アーキテクチャでは、明示的なプリフェッチによってキャッシュミスが解消されます。</strong>バルクカーネルはベクトルを逐次的に処理し、次のベクトルを処理する前に1つのベクトルを完全に計算しながら、次のバッチのためのプリフェッチ命令を発行します。将来のデータはCPUが必要とする前にL1に取り込まれます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt368f29b5143d0f5a/6a1701dcc1e8a51780f8817b/a39548f8060c2a4a5154521a4047dd92d8cd77be-1580x309.png" alt="「x86 (AMD Turin) — Hardware counters per int8 operation」というタイトルの表では、L1キャッシュミス、IPC、dTLBミスのシングルモードとバルクモードを比較し、それに対応する改善要因を示しています。" /><p>ARMアーキテクチャでは、プリフェッチを使用しても、同じ逐次的なアプローチではパフォーマンスが低下しました。代わりに、<strong>バルクカーネルが4つのベクターからすべてのストライド位置でロードをインターリーブ</strong>し、アウトオブオーダーエンジンに4つの独立したメモリストリームを提供します。CPUのデータの取得速度が速くなったわけではなく、メモリ要求の処理中に常に別の計算処理を行うことで、待ち時間を短縮しているのです。詳細な分析については<a href="https://github.com/elastic/elasticsearch/issues/145412">こちらのGitHubイシュー</a>をご覧ください。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8751ac5b20b75508/6a1701deab7f08db83db9d13/832de3bc0d556a493b7bf3f250196018acfc1585-1580x238.png" alt="表「ARM (Graviton 4) — Hardware counters per int8 operation」は、L1 キャッシュミスとバックエンドのストールについて、シングルモードとバルクモードを比較し、対応する改善点を示しています。" /><p>数字は2つの異なる物語を語っています。</p><ol><li><p>x86アーキテクチャでは、プリフェッチによって139,000回のキャッシュミスが19,000回に減り、1サイクルあたりの命令実行数（IPC）が2倍以上になります。データセットのサイズが大きくなるにつれてプリフェッチによってコストのかかるDRAM往復処理が徐々に隠蔽されるため、データ量の増加によるメリットは大きくなり、L2レベルでは1.2倍、L3レベルを超えると2.8倍になります。</p></li><li><p>ARMではキャッシュミスはほとんど変わりません。変化するのは利用率です。インターリーブアクセスパターンによってパイプラインへの供給が維持されるため、バックエンドの停止時間が40%減少します。この利点は、データセットのサイズに関係なく一貫して1.8倍です。これは、データがキャッシュまたはDRAMから来ているかに関係なく、メモリレベルの並列処理が適用されるためです。</p></li></ol><p>2つのアーキテクチャ、2つの戦略、結果は1つ：本番環境規模では、simdvecはベクトルがメインメモリ全体に分散している場合でも、CPUパイプラインを常にフル稼働させます。</p><h2>Elasticsearchユーザーへの影響</h2><p>これらのカーネルレベルの能力は相乗効果を発揮します。単一のベクトル検索クエリでは、HNSWグラフの走査、候補のスコアリング、再ランキングなど、数百万もの距離演算が計算される場合があります。数千回の同時クエリにおいて、1回の操作でナノ秒単位がクエリ遅延やクラスタスループットに直接変換されます。float32、int8、bfloat16、BBQのいずれを使用する場合でも、インデックスがメモリ上にあるかディスク上にあるかに関わらず、simdvecが基盤となるエンジンであり、これらのすべての操作は同じエンジンを通して実行され、ナノ秒単位まで最適化されています。</p><p>重要なポイントは、本番規模では、ベクトル検索のパフォーマンスは主に生のSIMDスループットによって決まるわけではないということです。システムのパフォーマンスは、数百万もの小さな演算処理において計算能力を維持しながら、メモリの遅延をいかに効率的に隠蔽できるかに大きく左右されます。</p><p>simdvecカーネルは、ほぼすべてのElasticsearchリリースで改善されています。新しい量子化タイプやハードウェアプラットフォームが登場すると、初日からチューニング済みのカーネルが提供されます。また、既に出荷されている実装を改良していくにつれて、既存の型もますます高速化していきます。</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[Vector Database]]></category>
    <category><![CDATA[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[Kibanaのダッシュボードに読み取り専用権限を追加]]></title>
    <description><![CDATA[Kibanaに読み取り専用のダッシュボードを導入し、ダッシュボード作成者に詳細な共有制御を提供して、結果の正確性を保ち、不要な変更から保護します。]]></description>
    <content:encoded><![CDATA[<p>こんな経験はありませんか。ログを監視するための完璧なダッシュボードを作成するのに1時間ほど費やし、すべてのグラフ、すべてのフィルター、すべてのラベルを設定します。ダッシュボードをチームと共有します。数日後、開いてみると何かがおかしいようです。同僚がクエリを微調整したか、誰かが日付範囲を変えたのかもしれません。よかれと思ってのことかもしれませんが、加えられた修正をひとつひとつ調べることになり、すべての数値が怪しく思えてきます。実によくある話です。</p><p>そこで、Elasticは<strong>読み取り専用のダッシュボード</strong>を開発しました。求めていたコントロールが獲得でき、安心してダッシュボードを共有できます。編集アクセス権を持つ別の人が変更したり壊したりすることを心配する必要はありません。</p><p>注：読み取り専用の権限は、Elastic Cloud ServerlessおよびElastic Cloud Hosted、Elastic Self-Managedのバージョン9.3以降で利用可能です。</p><h2>「すべてのユーザーが編集可能」権限が妨げになる場合</h2><p>Kibanaにおいて、<em>共有</em>は通常、スペースレベルの権限を意味していました。誰かがスペースでダッシュボードを作成できる場合、他の人のダッシュボードも編集または削除できます。コラボレーションにとっては便利ですが、場合によってはそうとも言い切れません。たった一度の意図しない編集が、誤った判断、信頼の喪失、そして多大な後始末へと連鎖的に影響を及ぼす可能性があります。</p><p><strong>ダッシュボード名に「read-only」と入れて皆が気づくことを期待する</strong>とか、<strong>タグを付けてうまくいくことを祈る</strong>といった回避策もあるにはありますが、期待と権限モデルはイコールではありません。必要なのは、スペースから全員を締め出すことなくダッシュボードをロックするための現実的な手段でした。</p><h2>問題の実例</h2><p>DebとKevinはどちらも、オペレーションスペース内のログ監視ダッシュボードへの編集権限を持っています。Kevinがチャートにいくつか変更を加えます。Debがダッシュボードに戻ると、数字は彼女が提示したものと一致しませんでした。彼女は（多くの場合記憶を頼りに）何が変更されたのかを突き止め、それを修正し、どれだけの報告書が誤ったデータで送信されたのかを考えなければならなくなります。</p><h2>読み取り専用ダッシュボード：理にかなった所有権と制御</h2><p>読み取り専用のダッシュボードでは、他のユーザーがダッシュボードを編集できるかどうかを管理できます。ダッシュボードを共有する際、<strong>編集</strong>（デフォルト：従来どおり）または<strong>閲覧</strong>を選択します。<strong>閲覧</strong>モードでは、あなた（とKibana管理者）のみが変更または削除できます。他のユーザーは開いて利用できますが、変更することはできません。</p><h3>手に入るもの</h3><ul><li><p><strong>ダッシュボードの整合性：</strong><strong>閲覧</strong>モードでは、スペースで編集アクセス権を持つ他のユーザーはダッシュボードを変更または削除できません。操作を試みると、ロックされているというメッセージが表示されます。グラフとロジックは設定した状態のまま維持されます。</p></li><li><p><strong>コントロールを維持：</strong>コントロールは所有者が維持し、いつでも編集、改良、更新が可能です。閲覧専用として共有しても、自分がアクセスできなくなるわけではありません。他の全員が表示できるバージョンが固定されるだけです。</p></li><li><p><strong>柔軟なライフサイクル：</strong> ダッシュボードはいつでも「編集可能」に戻すことができます。また、Kibanaの管理者は引き続きすべてのダッシュボードを管理できます（所有者が退職した場合など）。行き止まりになることはありません。</p></li></ul><p>最終決定済みの、業務上極めて重要なダッシュボードを広く共有しても、その一貫性が維持されることが保証されます。これは、Serverlessを含む<strong>すべてのElasticのティアとサービス</strong>で利用可能です。</p><h3>役割と可能な操作</h3><p>クイックリファレンス（役割別）：</p><ul><li><p><strong>ダッシュボードの所有者：</strong>作成者として、完全な編集権限があります。</p></li><li><p><strong>Kibana管理者：</strong>すべてのダッシュボードを管理できます。</p></li><li><p><strong>スペース編集権限を持つユーザー：</strong>ダッシュボードの作成と編集が可能ですが、閲覧専用のダッシュボードの編集や削除はできません。</p></li><li><p><strong>スペース閲覧権限を持つユーザー：</strong>ダッシュボードの表示と一覧表示のみが可能です。</p></li></ul><p>操作</p><p>ダッシュボード所有者</p><p>Kibana管理者</p><p>スペース編集権限を持つユーザー</p><p>スペース閲覧権限を持つユーザー</p><p>ダッシュボードの一覧表示と表示</p><p>✔</p><p>✔</p><p>✔</p><p>✔</p><p>新規ダッシュボードの作成</p><p>✔</p><p>✔</p><p>✔</p><p>✘</p><p>編集可能なダッシュボードの変更/削除</p><p>✔</p><p>✔</p><p>✔</p><p>✘</p><p>読み込み専用ダッシュボードの変更/削除</p><p>✔</p><p>✔</p><p>✘</p><p>✘</p><h2>読み取り専用にする方法</h2><p>新しいダッシュボードを保存する際、または後で共有メニューから「閲覧のみ」に設定できます。</p><h3>新しいダッシュボードを保存する際</h3><ul><li><p>ダッシュボードを作成し、「<strong>保存</strong>」をクリックします。</p></li><li><p>「新しいダッシュボードとして保存」モーダルで、「<strong>権限</strong>」を探します。</p></li><li><p><strong>「編集可能」</strong>から<strong>「閲覧可能」</strong>に変更します。</p></li><li><p><strong>［保存］</strong>をクリックします。これで完了です。他のユーザーにとっては閲覧専用となります。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt120724e3b963289f/6a16f76354abb858cd133baf/42a71d1bb55f9d50bd079f53bf45a0e1999b27f7-1214x1306.png" alt=" 閲覧専用の権限が選択された場合に、ダッシュボードを保存するためのオプションを表示するKibanaのダイアログ。" /><h2>既に所有しているダッシュボードの場合</h2><ul><li><p>ダッシュボードを開いてください。</p></li><li><p>「<strong>ダッシュボードを共有</strong>」メニューを開きます。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8fa2f365687c2ca8/6a16f764a292990e4bd00e01/e8405938557c879b1d4c262b98cf5a7f66408c04-1246x264.png" alt="編集モードの終了、共有、設定の調整、パネルの追加、保存のオプションを示すKibanaのダッシュボードのツールバー。" /><ul><li><p>共有モーダルで、「<strong>権限</strong>」を見つけて「<strong>閲覧可能</strong>」に切り替えます。変更はすぐに適用されます。そのスペースの他のユーザーは、編集や削除ができなくなります。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt05e6051dbe4b8250/6a16f76667045b321445bf9d/849405bc32701f3ebe0def012d8ae3cf3813ea0a-996x750.png" alt="ダッシュボードの権限と閲覧専用リンクをコピーするオプションが表示されたKibana共有パネル。" /><ul><li><p><strong>共有</strong>アクションにマウスを合わせると、特定のダッシュボードが持つ権限の種類を確認できます。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf8880996f84cdab3/6a16f7678b73cb3682189dfa/80541ddb1b1bc567b0aeff693944ea8b6871d6a7-1270x320.png" alt="Kibanaツールバーの「共有」ボタンがハイライト表示され、ツールチップにスペース内の全員がダッシュボードを閲覧できることが示されています。" /><h3>どのダッシュボードがロックされているかを確認する</h3><p>メインのダッシュボードリストでは、編集または削除できないダッシュボードの選択用チェックボックスは無効化されています。これにより、閲覧専用の項目を簡単に見分けられます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9c5fae7fa018c89a/6a16f768b0367da1b172bacb/24b2eba08df86174db949c662e7886c5aea1b460-1999x876.png" alt="Kibanaダッシュボードリストには、作成者、タイムスタンプ、および1つの項目が選択された複数のダッシュボードが表示されます。" /><p>ダッシュボードでは、編集アクションも無効になっており、ツールチップが表示され、ダッシュボードが閲覧専用に設定されていることが説明されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt50ef3c91d5640c0c/6a16f76a60084b08fc3c434d/e0a2f9da6dc854e876fc6dc2a7c3ef8b313b52ef-1358x330.png" alt="Kibanaのダッシュボードのツールバーに、ユーザーにダッシュボードを変更する権限がないことを示す警告ツールチップ付きの編集ボタンが表示されています。" /><h2>試してみる</h2><p>読み取り専用ダッシュボードが利用可能になりました。ダッシュボードを作成し、「<strong>閲覧可能</strong>」に切り替えて共有します。チームは信頼できる唯一の情報源を得ることができ、あなたは安心感を得られます。タイトルに「編集しないでください」という文言を入れる必要はもうありません。</p><p>読み取り専用ダッシュボードをどのように活用されているか、ぜひお聞かせください。<a href="https://discuss.elastic.co">コミュニティフォーラム</a>でご意見をお聞かせください。</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[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[ElasticsearchにおけるHNSWの適応的早期終了]]></title>
    <description><![CDATA[ElasticsearchにHNSWの新しい適応的早期終了戦略を導入します。]]></description>
    <content:encoded><![CDATA[<p>Elasticsearchは、<a href="https://www.elastic.co/search-labs/blog/hnsw-graph">Hierarchical Navigable Small World</a>（HNSW）アルゴリズムを使用して、近接グラフ上でベクトル検索を実行します。HNSWは、k近傍法（KNN） の結果の品質と関連コストの間で適切なトレードオフを提供することが知られています。</p><p>HNSWでは、グラフ内の候補ノードを反復的に拡張し、これまでに発見された最も近い近傍の制限されたセットを維持することで検索が進行します。各拡張にはコスト（ベクトル演算、ディスクへのランダムシークなど）がかかり、そのコストに対する限界効用は検索が進むにつれて減少する傾向があります。</p><p>HNSWグラフのトラバーサルを最適化する1つの方法は、新しい真の近傍を見つける周辺尤度が増加しない場合に検索を停止することです。このため、<a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules#index-dense-vector-hnsw-early-termination">Elasticsearch 9.2</a>では、新しい<a href="https://www.elastic.co/search-labs/blog/hnsw-knn-search-early-termination">早期終了メカニズム</a>を導入しました。これは、グラフノードを訪問しても一定回数連続して十分な数の新しい最近傍が提供されない場合に、検索プロセスを停止するものです。</p><p>この記事では、HNSWの前述の早期終了メカニズムを改良して、さまざまなデータセットやデータ分布に適したものにする方法について説明します。</p><h2><strong>HNSWでの早期終了</strong></h2><p>HNSW では、近接グラフ内の候補ノードを反復的に拡張し、これまでに発見された最も近い近傍の制限されたセットを維持して、グラフ全体を訪問するか、早期終了基準を満たすまで、検索が続行されます。</p><p>したがって、早期終了は必ずしも最適化ではなく、<strong>検索アルゴリズム自体の一部</strong>です。停止を決定する瞬間が、効率性と再現率のバランスを決定します。Elasticsearchでは、HNSWのクエリを早期終了させる方法がすでにいくつか存在します。</p><ul><li><p>固定された最大数のノードが訪問されます。</p></li><li><p>一定のタイムアウトに達した場合。</p></li></ul><p>これらのルールは単純かつ予測可能ですが、<strong>検索が実際に何をしているかにはほとんど関係がありません</strong>。また、これらは主に、クエリがエンドユーザーにとって妥当な時間内に完了することを確認するために使用されます。</p><p>前回の<a href="https://www.elastic.co/search-labs/blog/hnsw-knn-search-early-termination">ブログ投稿</a>ではHNSWにおける冗長性の概念を紹介しました。つまり、HNSWが新しい候補ノードを評価し続けても、さらに最も近い近傍が見つからない場合、冗長な計算が発生します。</p><h2><strong>忍耐度：努力ではなく進歩を測る</strong></h2><p><em>忍耐度</em>という概念は、<strong>努力ではなく進歩</strong>を中心に早期終了を再構築します。</p><p>次のように尋ねる代わりに</p><p>「何ステップ進んだ？」</p><p>新たに次のように問いかけます。</p><p>「希望を失うまでに受け入れられる無駄な計算はどれだけかな？」</p><p>HNSW検索では、通常、初期の探索によっ上位k候補セットの最高の改善がもたらされます。HNSWグラフ探索の最初のステップでは、アルゴリズムがクエリベクトルにますます近い近傍を検出し続けるため、近傍のセットは継続的に更新されます。時間が経ち、検索が収束するにつれて、これらの改善はまれになります。<a href="https://cs.uwaterloo.ca/~jimmylin/publications/Teofili_Lin_ECIR2025.pdf">忍耐度ベースの終了</a>はこのパターンを監視し、改善が一定期間停止した時点で検索を終了します。</p><p>実際には、HNSWグラフを訪問する際、候補ノードをホップしながらキューの飽和比も計算します。これは、最新のグラフノードを訪問中に変更されなかった最も近い近傍の割合（または最後の反復中に導入された新しい近傍の数の逆数）を測定します。このような比率が連続した反復処理で大きくなりすぎると、グラフの訪問を停止します。</p><p>概念的には、忍耐度はHNSWの検索を<strong>収穫逓減</strong>プロセスとして扱います。リターンが平坦になると、グラフの調査を継続してもほとんど利益は得られません。</p><p>この枠組みは、終了を恣意的な固定された制限ではなく、<em>観察可能な結果</em>に直接結び付けるため、強力です。</p><p>このスマートな早期終了手法を使用する利点は、HNSWグラフ探索では、ほぼ完璧な相対再現率を維持しながら、より少数のグラフノードを訪問する傾向があることです。</p><p>これを視覚化するために、FinancialQAとQuoraという2つのデータセットと、JinaV3とE5-smallというモデルで、忍耐度に基づく早期終了（ <em><code>et=static</code></em>とラベル付け）で取得した訪問ノードあたりの再現量を、デフォルトのHNSW動作（ <em><code>et=no</code></em>とラベル付け）と比較してプロットすることができます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd0d692b9beb476a/6a170ef4dc55debf0be00e97/a9d07c5153ea64a2426c82487c36846030692bb9-1600x945.png" alt="HNSWの適応的早期終了 " /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt93509c251a1b641e/6a170ef6dc55dea2b3e00e9b/dac56125c4b16d1b596c9876b6ca9ac7b2dc87fa-1600x944.png" alt="HNSWの適応的早期終了 es" /><h2><strong>静的しきい値とHNSWのダイナミクス</strong></h2><p>実際には、Elasticsearchでは<strong>静的しきい値</strong>を使用してこれが実装されます。1つのしきい値は、<strong>飽和しきい値</strong>、つまり、最適ではないと判断される飽和度の比率を指します。もう1つのしきい値は、最適ではないキュー飽和を維持しながら連続して訪問できるグラフノードの数、つまり<strong>忍耐しきい値</strong>を指します。</p><p>Elasticsearch 9.2でこの早期終了戦略を導入したとき、レイテンシーとメモリ消費の面でメリットを得ながら再現率を可能な限り高められるように、保守的なデフォルトを選択することにしました。このため、KNNクエリでは飽和しきい値を100%に、忍耐しきい値を <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> の（有界の）30%に設定しています。</p><p>多くのシナリオでは、これらの設定はうまく機能しますが、同じ数の近傍を要求する2つのクエリでは、収束動作が根本的に異なる可能性があります。あるクエリは密集した局所的な近傍に遭遇し、すぐに飽和します。他のクエリは競争力のある候補を見つけるまでに、長くまばらな経路を通過しなければなりません。後者は、効果的に処理するのが最も困難であることが判明しました。</p><p>その結果、次のようなことに気付くことがありました。</p><ul><li><p>簡単なクエリに対する過度の探索。</p></li><li><p>難しいクエリに対する時期尚早の終了。</p></li></ul><p>したがって、固定されたしきい値は収束に関する全体的な仮定をエンコードしますが、HNSWをさまざまなダイナミクスに適応させることができると考えました。</p><h2><strong>HNSWの早期終了を適応的に</strong></h2><p>適応的早期終了は、この問題に異なる角度からアプローチします。事前に定義された停止しきい値を強制する代わりに、アルゴリズムが<strong>検索のダイナミクス自体からいつ停止するかを推測します</strong>。</p><p>したがって、2つの連続した候補間のキュー飽和比を比較する代わりに、即時平滑化発見率 （クエリ<em>q</em>の最後の訪問<em>i</em>で導入された新しい隣接ノードの数）と、グラフ訪問中のそのような発見率の移動平均と標準偏差を導入することにしました（<a href="https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm">ウェルフォードのアルゴリズム</a>を使用）。これらの発見率に関する統計はクエリごとに計算されるため、この情報をもとに各クエリの忍耐度を判断できます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdbfb1e123f1b026d/6a170ef7cf4f25d9bab2d216/1958be7ca4425ade66eaf621ada3533173183598-694x118.png" alt="" /><p>以前は静的であったしきい値は、発見率の統計に対して適応的になります。飽和しきい値はローリング平均と標準偏差の合計になり、一方で忍耐力は標準偏差に反比例して適応およびスケーリングされます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7d4d91f464a9dc9d/6a170ef8d7c0223420de656a/f7ee4a55c24853b657df26052b275e8bd76cf0f9-654x156.png" alt="" /><p>早期終了ルールは変わらず、飽和は即時発見率が適応飽和しきい値より低い場合に発生します。適応的忍耐度よりも大きい連続候補訪問回数にわたって飽和が継続する場合、グラフ訪問は停止します。</p><p>こうすることで、KNNクエリの <em><code>num_candidates</code></em> パラメーターに依存しない動作（早期終了に関係なく、常に設定されるか、デフォルトのままになる場合がある）が得られ、各クエリとベクトル分布に動的に適応しやすくなります。</p><p>適応型戦略（ <em><code>et=adaptive</code></em>とラベル付け）を使用したFinancialQAおよびQuoraでの訪問ノードあたりの再現率は、静的戦略（ <em><code>et=static</code></em> ）およびデフォルトのHNSW動作（ <em><code>et=no</code></em> ）と比較した場合、高くなっています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteab7ba53ae14da0e/6a170ef9961e69e072c4cfd5/2a906997d9a25d74c7038bd9661bc97581e7258e-1600x938.png" alt=" 適応戦略とデフォルトのHNSWの動作" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6fb9e672d3698200/6a170efb67045b7b2b45c2ab/3a114911e232c351dbb814cea20e8b0f1415a717-1600x925.png" alt="" /><p>適応的早期終了はElasticsearch 9.3ではHNSWの高密度ベクトルフィールドに対してデフォルトでオンになっています（最終的には<a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules#index-dense-vector-hnsw-early-termination">同じインデックスレベルの</a>設定でオフにすることができます）。</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[Vector Database]]></category>
    <category><![CDATA[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[「best_compression」で検索パフォーマンスを向上]]></title>
    <description><![CDATA[「best_compression」は通常、Elastic ObservabilityおよびElastic Securityのユースケースにおけるストレージ節約機能として認識されていますが、このブログでは、検索のパフォーマンスチューニング手段としての有効性について説明します。]]></description>
    <content:encoded><![CDATA[<p></p><p>同時実行性の高いワークロード向けにElasticsearchをチューニングする場合の標準的なアプローチは、RAMを最大化してドキュメントのワーキングセットをメモリに保持し、検索レイテンシを低くすることです。結果として、<a href="https://www.elastic.co/docs/reference/elasticsearch/index-settings/index-modules"><code>best_compression</code></a>は検索ワークロードにはほとんど考慮されません。これは主に、ストレージ効率が優先されるElastic ObservabilityおよびElastic Securityのユースケースでのストレージ節約対策として見なされているためです。</p><p>このブログでは、データセットのサイズがOSページキャッシュを大幅に超える場合、<code>best_compression</code>がI/Oボトルネックを軽減することで検索パフォーマンスとリソース効率を向上させることを示します。</p><h2><strong>セットアップ</strong></h2><p>ユースケースは、<a href="https://www.elastic.co/docs/deploy-manage/deploy/elastic-cloud/ec-change-hardware-profile#ec-profiles-compute-optimized-arm">Elastic CloudのCPUに最適化されたインスタンス</a>上で実行される高同時性検索アプリケーションです。</p><ul><li><p>データ量：ドキュメント約5億件</p></li><li><p>インフラ：6つのElastic Cloud（Elasticsearch Service）インスタンス（各インスタンス：1.76 TBのストレージ | 60 GB RAM | 31.9 vCPU）</p></li><li><p>メモリとストレージの比率：総データセットの約5％がRAMに収まる</p></li></ul><h2><strong>課題：高いレイテンシ</strong></h2><p>19:00頃に現在のリクエスト数が急増すると、検索のレイテンシが大幅に悪化することが確認されました。図1と図2に示すように、Elasticsearchインスタンスあたりのトラフィックはピーク時で毎分400リクエスト程度でしたが、平均クエリサービス時間は60ミリ秒以上に低下しました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf8ab7de934d6b410/6a170440c1e8a58db3f881c1/f9c6cc1882e7db24336c65c54bbc1d38dcdb7fa3-697x311.png" alt="Elasticsearchごとの1分あたりのリクエスト数がピークに到達" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt32de2bed0afbacd5/6a1704422b835fa5ddf4b0e2/bbb705ae2fcd14c81d335bf322346caf3bf33765-996x618.png" alt="平均クエリサービス時間 Elasticsearch" /><p>初期の接続処理後、CPU使用率は比較的低いままであり、コンピューティングがボトルネックではなかったことを示しています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta5b45d4a1ff48f54/6a17044447d49cd7252d88af/cec15a28d2d22e9adedd2951bb2334b3717890a1-1494x730.png" alt="Elasticsearch CPU使用率" /><p>クエリボリュームとページフォールトの間の強い相関関係が明らかになりました。リクエストが増加するにつれて、ページフォールトも比例して増加し、ピークは約40万件/分に達しました。これは、アクティブなデータセットがページキャッシュに収まらなかったことを示しています。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd0a3d0c610700bdb/6a17044560084b6f403c4459/511f2f10300a9d10ba3d7a82b9a8c8d567ac5636-1492x678.png" alt="ページフォールトの数 Elasticsearchのパフォーマンス" /><p>同時に、JVMヒープの使用量は正常かつ健全であるように見えました。これにより、ガベージコレクションの問題が排除され、ボトルネックが I/O であることが確認されました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3f888a03ce78eb04/6a170448964cea401008ba59/336bbad638f866304358dba1d06ee987de0f23cf-1490x568.png" alt="Elasticsearchのヒープ使用量" /><h2><strong>診断：I/Oバウンド</strong></h2><p>システムはI/Oバウンド状態でした。<a href="https://www.elastic.co/blog/elasticsearch-caching-deep-dive-boosting-query-speed-one-cache-at-a-time">Elasticsearchは、メモリからインデックスデータを提供するためにOSページキャッシュに依存します</a>。インデックスがキャッシュに対して大きすぎる場合、クエリによってコストのかかるディスク読み取りがトリガーされます。一般的な解決策は水平方向に拡張すること（ノード/RAMの追加）ですが、まずは既存のリソースの効率改善を最大限に図りたいと考えました。</p><h2><strong>修正</strong></h2><p>デフォルトでは、Elasticsearchはインデックスセグメントに<a href="https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)">LZ4</a>圧縮を使用し、速度とサイズのバランスをとります。<code>best_compression</code> （<a href="https://en.wikipedia.org/wiki/Zstd">zstd</a>を使用）に切り替えるとインデックスのサイズが小さくなるという仮説を立てました。フットプリントが小さいほど、ページキャッシュに収まるインデックスの割合が大きくなり、CPUのわずかな増加（解凍用）と引き換えにディスクI/Oが削減されます。</p><p><code>best_compression</code>を有効にするために、インデックス設定<code>index.codec: best_compression</code>でデータを再インデックスしました。あるいは、インデックスを閉じ、インデックスコーデックを<code>best_compression</code>にリセットしてから、セグメントのマージを実行することで、同じ結果を得ることができます。</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>結果</strong></h2><p>結果は、ストレージ効率の向上は、CPU使用率の増加を伴わずに検索パフォーマンスの大幅な向上に直接つながるという私たちの仮説を裏付けました。</p><p><code>best_compression</code>を適用するとインデックスの大きさは約25％減少しました。反復ログデータで確認された削減よりは少ないものの、この25%の削減により、ページキャッシュ容量が同じだけ実質的に増加しました。</p><p>次のロードテスト（17:00から）では、トラフィックはさらに増加し、Elasticsearchノードあたり1分あたり500リクエストでピークに達しました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta61ab3bd5ded5716/6a170449a6c2b9f711e795dd/fc1902f396cb2115c0013155ad07f6eb87389c60-660x309.png" alt="Elaticsearchでの負荷テスト" /><p>負荷が高まったにもかかわらず、CPU使用率は前回の実行時よりも低くなりました。前のテストで使用率が高かったのは、過剰なページフォールト処理とディスクI/O管理のオーバーヘッドが原因である可能性があります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9fd1a44b02a4f787/6a17044b2b835ff996f4b0e6/15699ef4c65b3f0a9f8a3e1bae8bb18f7b647025-819x352.png" alt="best_compressionによるElasticsearchのCPU使用率パフォーマンスの向上" /><p>重要なのは、ページフォールトが大幅に減少したことです。ベースラインテストの30万件超に比較して、より高いスループットでもフォールトは1 分あたり20万件未満に留まりました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltef0c621d76767115/6a17044c2b835fe49ef4b0ea/f76ca967976d740af88a9359b66041701abb46fc-764x340.png" alt="ページフォールトの数 best_compressionによるElasticsearchのパフォーマンスの向上" /><p>ページフォールトの結果はまだ最適とは言えませんでしたが、クエリサービス時間は約50％削減され、負荷が高まった場合でも30ミリ秒未満に留まりました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6579b3d005d04101/6a17044e66c4f9179cf8bf13/750ec1c59b8eb5069aed4c066d856ecea82d5bca-620x311.png" alt="best_compressionによるElasticsearchの平均クエリサービス時間パフォーマンスの向上" /><p></p><h2><strong>結論：検索にはbest_compressionを</strong></h2><p>データ量が利用可能な物理メモリを超える検索ユースケースでは、 <code>best_compression</code>は強力なパフォーマンス調整手段となります。</p><p>キャッシュミスに対する従来の解決策はスケールアウトしてRAMを増やすことですが、インデックスのフットプリントを削減することで、ページ キャッシュ内のドキュメント数を最大化するという同じ目標を達成しました。次のステップは、<a href="https://www.elastic.co/blog/space-savings-a-lesser-known-benefit-of-index-sorting-in-elasticsearch"><strong>インデックスの並べ替え</strong></a>を探求し、ストレージをさらに最適化し、既存のリソースからさらにパフォーマンスを引き出すことです。</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[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[判断リストによる検索クエリの関連性の評価]]></title>
    <description><![CDATA[Elasticsearchで検索クエリの関連性を客観的に評価し、リコールなどのパフォーマンス指標を改善するための判断リストの構築方法を探ります。スケーラブルな検索のテストの拡張性についても学びます。]]></description>
    <content:encoded><![CDATA[<p>検索エンジンに取り組んでいる開発者は、同じ問題によく遭遇します。それは、検索結果の上位に表示されると予想していたドキュメントが結果リストの3番目か4番目に表示されるため、ビジネスチームが特定の検索に満足してくれないという問題です。</p><p>ただし、この 1 つの問題を修正すると、すべてのケースを手動でテストすることができないため、他のクエリが誤って壊れてしまいます。しかし、1つのクエリの変更が他のクエリに波及効果をもたらすかどうかを、開発者やQAチームはどのようにテストできるでしょうか。さらに重要なのは、変更によってクエリが実際に改善されたことをどうやって確認できるかということです。</p><h2>体系的な評価に向けて</h2><p>ここで役に立つのが判断リストです。変更を加えるたびに手動の主観的なテストに頼るのではなく、ビジネスケースに関連するクエリの固定セットと、関連する結果を定義できます。</p><p>このセットが基準となります。変更を実装するたびに、それを使用して検索が実際に改善されたかどうかを評価します。</p><p>このアプローチの価値は、次の点にあります。</p><ul><li><p><strong>不確実性の排除</strong>：変更が他のクエリに影響を与えるかどうかを心配する必要はなくなり、データが教えてくれます。</p></li><li><p><strong>手動テストの停止</strong>：判断セットが記録されると、テストは自動化されます。</p></li><li><p><strong>変更を支援</strong>：変更のメリットを裏付ける明確な指標を示すことができます。</p></li></ul><h2>判断リストの作成方法</h2><p>最も簡単な方法の1つは、代表的なクエリを取得して、関連するドキュメントを手動で選択することです。このリストを作成するには2つの方法があります。</p><ul><li><p><strong>バイナリ判定：</strong>クエリに関連付けられた各ドキュメントに<em>関連</em>（通常「1」のスコア）とと非関連（「0」）の<strong>シンプルなタグ</strong>が付けられます。</p></li><li><p><strong>段階的な判断：</strong>ここでは、各ドキュメントに異なるレベルのスコアが付けられます。例えば、0から4の尺度を設定します。これは<a href="https://en.wikipedia.org/wiki/Likert_scale">ライカート尺度</a>に似ており、0は「全く関連しない」、4は「完全に関連する」を意味し、「関連する」、「やや関連する」などのバリエーションがあります。</p></li></ul><p>検索意図に明確な制限がある場合、つまり「このドキュメントは結果に含まれるべきかどうか」という場合には、バイナリ判断がうまく機能します。</p><p>段階的な判断は、グレーゾーンがある場合により役立ちます。一部の結果は他の結果よりも優れているため、「非常に良い」、「良い」、「役に立たない」という結果を取得し、結果の順序とユーザーのフィードバックを評価する指標を使用できます。ただし、段階的な評価尺度には欠点もあります。評価者によってスコアリングレベルの使い方が異なり、判断の一貫性が失われることがある点です。また、評価基準では高得点により重み付けされるため、小さな変更（評価を4ではなく3にするなど）でも、レビュー担当者の意図よりもはるかに大きな変化が評価基準に生じる可能性があります。この主観性が加わることで、段階的な判断はノイズが多くなり、時間の経過とともに管理が難しくなります。</p><h2>書類を自分で分類する必要がありますか？</h2><p>必ずしもそうとは限りません。なぜなら、判断リストを作成する方法はいくつかあり、それぞれに利点と欠点があるからです。</p><ul><li><p><strong>明示的な判断：</strong>ここでは、SMEが各クエリやドキュメントに目を通し、関連性があるかどうか（あるいはどの程度関連性があるか）を手動で判断します。これにより品質と管理は提供されますが、拡張性は低くなります。</p></li><li><p><strong>暗黙的な判断：</strong>この方法では、クリック、直帰率、購入などの実際のユーザーの行動に基づいて関連するドキュメントを推測します。このアプローチにより、データを自動的に収集できますが、バイアスがかかる可能性があります。例えば、ユーザーは関連性がなくても上位の結果をクリックする傾向があります。</p></li><li><p><strong>AI生成の判断：</strong>この最後のオプションでは、モデル（LLMなど）を使用してクエリとドキュメントを自動的に評価します。これは、<a href="https://en.wikipedia.org/wiki/LLM-as-a-Judge">LLM審査員</a>とも呼ばれます。スケーリングは高速かつ簡単ですが、データの品質は、使用しているモデルの品質と、LLMトレーニングデータがビジネス上の<a href="http://interests.as/">利益</a>とどの程度一致しているかによって異なります。人間の採点者と同様に、LLM審査員も独自のバイアスや不整合を導入する可能性があるため、信頼できる判断の小さなセットに対してその出力を検証することが重要です。LLMモデルは本質的に確率的であるため、 <a href="https://www.ibm.com/think/topics/llm-temperature">温度</a> パラメータを0に設定しても同じ結果に対して異なる評価を与えるLLMモデルがよく見られます。</p></li></ul><p>判断セットを作成するための最適な方法を選択するための推奨事項を以下に示します。</p><ul><li><p>ユーザーのみが適切に判断できる特徴（価格、ブランド、言語、スタイル、製品詳細など）の重要性を決定します。これらが重要な場合は、<strong>判断リスト</strong>の少なくとも一部について<em>明示的な判断が</em>必要です。</p></li><li><p>検索エンジンにすでに十分なトラフィックがある場合は、<strong>暗黙的な判断</strong>を使用して、クリック、コンバージョン、滞在時間の指標を使用して使用傾向を検出できます。これらの結果は人間が注意深く解釈し、明示的な判断セットと対比させて、バイアスを防御する必要があります（例：ユーザーは、たとえ低いランクの結果がより関連性が高くても、上位にランクされた結果をクリックする傾向があります）。</p></li></ul><p>これに対処するために、位置バイアス除去技術はクリックデータを調整または再重み付けして、実際のユーザーの関心をより適切に反映します。アプローチには以下のようなものがあります。</p><ul><li><p><strong>結果のシャッフル</strong>：一部のユーザーの検索結果の順序を変更し、位置がクリックにどのように影響するかを推定します。</p></li><li><p><strong>クリックモデルには</strong><a href="https://wiki.math.uwaterloo.ca/statwiki/index.php?title=a_Dynamic_Bayesian_Network_Click_Model_for_web_search_ranking">ダイナミックベイジアンネットワーク</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">ユーザーブラウジングモデル</a><a href="https://rsrikant.com/papers/kdd10.pdf"><strong>（UBM）が含まれます。</strong></a>これらの統計モデルは、スクロール、滞在時間、クリックシーケンス、結果ページへの戻りなどのパターンを使用して、クリックが単なる位置ではなく実際の関心を反映している可能性を推定します。</p></li></ul><h2>例：映画評価アプリ</h2><h3>要件</h3><p>この例を実行するには、稼働しているElasticsearch 8.xクラスター、<a href="https://www.elastic.co/downloads/elasticsearch">ローカル</a>または<a href="https://www.elastic.co/cloud/cloud-trial-overview">Elastic Cloud</a>（HostedまたはServerless）、<a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis">REST API</a>またはKibanaへのアクセスが必要です。</p><p>ユーザーが映画についての意見をアップロードしたり、見たい映画を検索したりできるアプリを考えてみてください。ユーザー自身がテキストを書くため、タイプミスや表現の多様性がある可能性があります。そのため、検索エンジンがその多様性を解釈し、ユーザーにとって有益な結果を提供できることが不可欠です。</p><p>全体的な検索動作に影響を与えずにクエリを反復処理できるようにするために、会社のビジネスチームは、最も頻繁に実行される検索に基づいて、次のバイナリ判定セットを作成しました。</p><p>クエリ</p><p>DocID</p><p>テキスト</p><p>ディカプリオの演技</p><p>doc1</p><p>『レヴェナント：蘇えりし者』でのディカプリオの演技は息を呑むほど素晴らしかった。</p><p>ディカプリオの演技</p><p>doc2</p><p>『インセプション』ではレオナルド・ディカプリオが最も象徴的な役柄の一つを演じています。</p><p>ディカプリオの演技</p><p>doc3</p><p>ブラッド・ピットはこの犯罪スリラーで堅実な演技を見せています。</p><p>ディカプリオの演技</p><p>doc4</p><p>見事な視覚効果を備えたアクション満載の冒険。</p><p>泣ける悲しい映画</p><p>doc5</p><p>何時間も泣いてしまった、愛と喪失の悲痛な物語。</p><p>泣ける悲しい映画</p><p>doc6</p><p>史上最も悲しい映画の1つです。ティッシュが必須。</p><p>泣ける悲しい映画</p><p>doc7</p><p>笑える軽快なコメディ</p><p>泣ける悲しい映画</p><p>doc8</p><p>アクションと興奮に満ちたSF大作。</p><p>インデックスの作成：</p>PUT movies
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text"
      }
    }
  }
}<p>一括リクエスト：</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>以下は、このアプリが使用しているElasticsearchクエリです。</p>GET movies/_search
{
 "query": {
   "match": {
     "text": {
       "query": "DiCaprio performance",
       "minimum_should_match": "100%"
     }
   }
 }
}<h3>判断から指標へ</h3><p>判断リスト自体は、多くの情報を提供しません。これは、クエリから得られる結果の期待値にすぎません。これらが真価を発揮するのは、検索パフォーマンスを測定するための客観的な指標の計算に使用するときです。</p><p>現在、人気の指標のほとんどには以下が含まれます。</p><ul><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#k-precision"><strong>精度</strong></a><strong>：</strong>すべての検索結果の中で本当に関連性の高い結果の割合を測定します。</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#k-recall"><strong>リコール</strong></a><strong>：</strong>検索エンジンがx件の結果の中で見つけた関連する結果の割合を測定します。</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#_discounted_cumulative_gain_dcg"><strong>割引累積利得（DCG）</strong></a><strong>：</strong>最も関連性の高い結果が上位にあるべきであることを考慮して、結果のランキングの品質を測定します。</p></li><li><p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval#_mean_reciprocal_rank"><strong>平均逆順位（MRR）：</strong></a>最初の関連結果の位置を測定します。リストの上位にあるほど、スコアも高くなります。</p></li></ul><p>同じ映画評価アプリを例に使い、リコール指標を計算して、クエリに抜け落ちている情報がないかを確認します。</p><p>Elasticsearchでは、<a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/search-rank-eval">Ranking Evaluation API</a>を通じて<em>判断リスト</em>を使って指標を計算できます。このAPIは、判断リスト、クエリ、および評価する指標をインプットとして受け取り、クエリ結果と判断リストを比較した値を返します。</p><p>次の2つのクエリの判断リストを実行してみましょう。</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>_rank_evalには 2 つのリクエストを使用します。1つはディカプリオクエリ用、もう1つは悲しい映画用です。各リクエストには、クエリと判断リスト（評価）が含まれています。評価に含まれていない文書は判断対象外とみなされるため、すべての文書に等級を付ける必要はありません。計算を行うために、リコールは評価において関連性があると見なされるドキュメントである「関連セット」のみを考慮します。</p><p>この場合、ディカプリオのクエリのリコールは1ですが、悲しい映画のリコールは0です。つまり、最初のクエリでは関連する結果をすべて取得できましたが、2 番目のクエリでは何も取得できませんでした。したがって、平均リコールは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>クエリ内の単語の100%がドキュメント内で見つかることを要求することで、おそらく関連する結果が除外されるため、<strong>minimum_should_match</strong>パラメータを厳しすぎるのかもしれません。<strong>minimum_should_match</strong>パラメーターを削除して、クエリで1つの単語しか見つかっていない文書が関連性があると見なされるようにしましょう。</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>ご覧のように、2つのクエリのうちの1つで<strong>minimum_should_match</strong>パラメーターを削除すると、両方のクエリの平均リコール率は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>要約すると、minimum_should_match: 100%句を削除すると、両方のクエリで完璧なリコールが得られます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaf4f08a8a2915180/6a170df61949f76cbfe7aaba/24d055da4348c63827ba7046fe8cafb6f47cadd8-546x628.png" alt="" /><p>これで完了でしょうか？</p><p>安心するのはまだ早いです。</p><p>リコールを改善することで、より幅広い結果を得る道が開かれます。ただし、それぞれの調整にはトレードオフが伴います。だからこそ、完全なテストケースを定義し、異なる指標を使って変更を評価することが重要です。</p><p>判断リストと指標を使用すると、変更をバックアップするデータが得られるため、変更を行うときに盲目的に変更を行うことがなくなります。検証は手動で繰り返し行う必要がなくなり、変更を1つのユースケースだけでなく複数のユースケースでテストできるようになります。さらに、A/Bテストでは、どの構成がユーザーやビジネスケースに最適かをライブでテストできるため、技術的な指標と実際の指標から完全に把握できます。</p><h2>判断リストの使用に関する最終的な推奨事項</h2><p>判断リストを扱うことは、単に測定することだけでなく、自信を持って反復作業を行うためのフレームワークを作ることでもあります。これを実現するには、次の推奨事項に従ってください。</p><ol><li><p><strong>規模にこだわらずとにかく始める</strong>。それぞれ50個の判断リストを持つ10,000個のクエリを用意する必要はありません。ビジネスケースの最も重要な5〜10個のクエリを特定し、結果の冒頭にどの文書が表示されたいかを定義するだけで十分です。これですでに基礎が整いました。通常は、上位クエリと結果なしのクエリから始めるのが望ましいです。また、精度のような設定が簡単な指標でテストを開始し、複雑さを上げていくこともできます。</p></li><li><p><strong>ユーザーとともに検証する。</strong>本番環境でのA/Bテストで数値を補完します。こうすることで、指標で良さそうに見える変更が実際に効果を生んでいるかどうかを知ることができます。</p></li><li><p><strong>リストをアクティブに保つ。</strong>ビジネスケースは進化し、重要な問い合わせも進化していきます。新たなニーズを反映するために、定期的に判断を更新してください。</p></li><li><p><strong>フローの一部に組み込む。</strong>判断リストを開発パイプラインに統合しましょう。各構成の変更、同義語、またはテキスト分析が基本リストに対して自動的に検証されることを確認します。</p></li><li><p><strong>技術的な知識と戦略を結び付ける。</strong>精度やリコールなどの技術的な指標の測定にとどまらず、評価結果をビジネスの成果に役立てましょう。</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[関連性]]></category>
    <category><![CDATA[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[Elasticsearch で構造化ドキュメントの再帰チャンクを構成する]]></title>
    <description><![CDATA[チャンク サイズ、セパレーター グループ、カスタム セパレーター リストを使用して Elasticsearch で再帰チャンクを設定し、構造化ドキュメントのインデックスを最適に作成する方法を学びます。]]></description>
    <content:encoded><![CDATA[<p>8.16 以降、ユーザーは長いドキュメントをセマンティック テキスト フィールドに取り込むときに使用するチャンキング戦略を構成できるようになりました。9.1 / 8.19 では、正規表現のリストを使用してドキュメントをチャンク化する、新しい構成可能な再帰チャンク化戦略を導入しました。チャンク化の目的は、長いドキュメントを関連するコンテンツをカプセル化するセクションに分割することです。既存の戦略では、テキストを単語/文の粒度で分割しますが、構造化された形式 (例:Markdown では、区切り文字列で定義されたセクション内に関連コンテンツが含まれることがよくあります (例:ヘッダー)。このような種類のドキュメントでは、構造化ドキュメントの形式を活用してより適切なチャンクを作成するための再帰チャンキング戦略を導入しています。</p><h2>再帰チャンキングとは何ですか?</h2><p>再帰チャンク化では、指定されたセクション分離パターンのリストを反復処理して、必要な最大チャンク サイズを満たすまで、ドキュメントを段階的に小さなセグメントに分割します。</p><h3>再帰チャンクを構成するにはどうすればよいですか?</h3><p>以下は、再帰チャンク化に対してユーザーが指定できる構成可能な値です。</p><ul><li><p>(必須) <code>max_chunk_size</code> : チャンク内の最大単語数。</p></li><li><p>次のいずれか:</p><ul><li><p><code>separators</code>: ドキュメントをチャンクに分割するために使用される正規表現文字列パターンのリスト。</p></li><li><p><code>separator_group</code>: 特定の種類のドキュメントに使用するために Elastic によって定義された区切り文字のデフォルト リストにマップされる文字列。現在、 <code>markdown</code>と<code>plaintext</code>が利用可能です。</p></li></ul></li></ul><h3>再帰チャンキングはどのように機能しますか?</h3><p>入力ドキュメント、 <code>max_chunk_size</code> (単語単位で測定)、および区切り文字列のリストが与えられた場合の再帰チャンク化のプロセスは次のとおりです。</p><ol><li><p>入力ドキュメントがすでに最大チャンク サイズ内である場合は、入力全体にわたる単一のチャンクを返します。</p></li><li><p>区切り文字の出現に基づいてテキストを潜在的なチャンクに分割します。潜在的なチャンクごとに:</p><ol><li><p>潜在的なチャンクが最大チャンク サイズ内である場合は、ユーザーに返すチャンクのリストに追加します。</p></li><li><p>それ以外の場合は、潜在的なチャンクのテキストのみを使用して、リスト内の次のセパレーターを使用して分割し、手順 2 から繰り返します。試す区切り文字がもう残っていない場合は、文ベースのチャンクに戻ります。</p></li></ol></li></ol><h2>再帰チャンクの設定例</h2><p>チャンク サイズとは別に、再帰チャンク化の主な構成は、ドキュメントを分割するために使用するセパレーターを選択することです。どこから始めればよいかわからない場合は、Elasticsearch では一般的なユースケースに使用できるデフォルトのセパレーター グループがいくつか用意されています。</p><h3>セパレーターグループの活用</h3><p>セパレーター グループを利用するには、チャンク設定を構成するときに使用するグループの名前を指定するだけです。例えば：</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separator_group": "plaintext"
}<p>これにより、区切りリスト<code>["(?&lt;!\\n)\\n\\n(?!\\n)", "(?&lt;!\\n)\\n(?!\\n)")]</code>を利用する再帰的なチャンク化戦略が提供されます。これは、2 つの改行文字とそれに続く 1 つの改行文字で分割する、一般的なプレーン テキスト アプリケーションに適しています。</p><p>セパレーターリストを利用するセパレーターグループ<code>markdown</code>も提供しています。</p>[
"\n# ",
       "\n## ",
       "\n### ",
       "\n#### ",
       "\n##### ",
       "\n###### ",
       "\n^(?!\\s*$).*\\n-{1,}\\n",
       "\n^(?!\\s*$).*\\n={1,}\\n"
]<p>この区切りリストは、6 つの見出しレベルとセクション区切り文字のそれぞれに分割する一般的なマークダウンの使用例に適しています。</p><p>リソース (推論エンドポイント/セマンティック テキスト フィールド) を作成すると、その時点のセパレーター グループに対応するセパレーターのリストが構成に保存されます。セパレーター グループが後日更新されても、既に作成されたリソースの動作は変更されません。</p><h3>カスタム区切りリストの利用</h3><p>定義済みの区切り文字グループのいずれかが使用ケースに適していない場合は、ニーズに合った区切り文字のカスタム リストを定義できます。区切りリスト内に正規表現を指定できることに注意してください。以下は、カスタムセパレーターを使用して構成されたチャンク設定の例です。</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n\n", "\n", "&lt;my-custom-separator&gt;"]
}<p>上記のチャンク化戦略では、 2 つの改行文字、続いて 1 つの改行文字、最後に文字列<code>“&lt;my-custom-separator&gt;”</code>で分割されます。</p><h2>再帰チャンキングの実際の例</h2><p>再帰チャンキングの実際の例を見てみましょう。この例では、上位 2 つのヘッダー レベルを使用してマークダウン ドキュメントを分割するセパレーターのカスタム リストとともに、次のチャンク設定を使用します。</p>"chunking_settings": {
    "strategy": "recursive",
    "max_chunk_size": 25,
    "separators": ["\n# ", "\n## "]
}<p>単純なチャンクなしの Markdown ドキュメントを見てみましょう。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdb5f41d1bd43ba50/6a17e831e9ea87c1d8a9c5f3/3a5507f4a1288065097231548e5b18e240508785-1302x1446.png" alt="チャンクなしのMarkdown文書" /><p>ここで、上で定義したチャンク設定を使用してドキュメントをチャンク化してみましょう。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfffda162c7b9c87a/6a17e83296142aefa8eb1b0b/a3313c4c40ff39b8dbcdd7c4878c723f088e6c1a-1600x1187.png" alt="Elasticsearchでドキュメントをチャンク化する" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt96f65346a8e09e3a/6a17e834445de9157b4d015e/79a2921943191ea631df94c9d465818ec8d3e738-1600x1206.png" alt="2番目のセパレーターで分割 - Elasticsearchでドキュメントをチャンク化する" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt28381c8f85aedf07/6a17e836ec0f89801e5a6640/459e695cce7540267422396b9a62ff4ad35f61db-1600x1260.png" alt="Elasticsearch で文ベースのチャンクを分割した後のドキュメントの最終チャンク" /><p>注: 各チャンク (チャンク 3 を除く) の末尾の改行は強調表示されませんが、実際のチャンク境界内に含まれます。</p><h3>今すぐ再帰チャンキングを始めましょう!</h3><p>この機能の利用方法の詳細については、チャンク設定の構成に関するドキュメントを参照してください。</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[基本]]></category>
    <category><![CDATA[Elastic内部の実情]]></category>
    <category><![CDATA[AI]]></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[Elasticsearch向けAgentic AIツールの改善実験]]></title>
    <description><![CDATA[スケーラブルな RAG 最適化のために線形リトリーバー、ハイブリッド検索、および semantic_text を組み合わせることで、反復的な実験を通じて Elasticsearch の AI エージェント ワークフローをどのように改善したかを学びます。]]></description>
    <content:encoded><![CDATA[<p>最近の他社と同様に、Elastic ではチャット、エージェント、RAG に全力を注いでいます。検索部門では最近、エージェント ビルダーとツール レジストリに取り組んでおり、その目的は、Elasticsearch 内のデータとの「チャット」を簡単に行えるようにすることです。</p><p>この取り組みの「全体像」について詳しくは、<a href="https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder">ブログ「Elasticsearch を使用した AI エージェントワークフローの構築」</a>をお読みください。より実践的な入門書として<a href="https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch">、「初めての Elastic エージェント: 単一のクエリから AI を活用したチャットまで」もご覧ください</a>。</p><p>ただし、このブログでは、チャットを開始したときに最初に起こることの 1 つに焦点を絞り、最近行った改善点のいくつかについて説明します。</p><h2>ここで何が起こっているのですか?</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1331b1043612efe3/6a17f115505ac3dc41ad8c3c/25a24055a166d7d6ba81d80aa35cb97163662e23-1600x443.png" alt="" /><p>Elasticsearch データとチャットする場合、デフォルトの AI エージェントが次の標準フローを実行します。</p><ol><li><p>プロンプトを検査します。</p></li><li><p>どのインデックスにそのプロンプトの回答が含まれている可能性があるかを特定します。</p></li><li><p>プロンプトに基づいて、そのインデックスのクエリを生成します。</p></li><li><p>そのクエリでそのインデックスを検索します。</p></li><li><p>結果を統合します。</p></li><li><p>結果はプロンプトに対応できますか?はいの場合は応答してください。そうでない場合は、別の方法を試しながら繰り返します。</p></li></ol><p>これはあまり目新しいものではないはずです。これは単に Retrieval Augmented Generation (RAG) です。そして当然のことですが、応答の質は最初の検索結果の関連性に大きく左右されます。そのため、応答品質の向上に取り組む中で、ステップ 3 で生成してステップ 4 で実行するクエリに細心の注意を払ってきました。そして、私たちは興味深いパターンに気づきました。</p><p>多くの場合、最初の応答が「悪い」場合、それは実行したクエリが悪かったからではありません。クエリを実行するために<em>間違ったインデックスを選択した</em>ためです。通常、ステップ 3 と 4 は問題ではありません。問題はステップ 2 です。</p><h2>私たちは何をしていたのでしょうか?</h2><p>当初の実装はシンプルでした。私たちは、 <code>_cat/indices</code>を効果的に実行して利用可能なすべてのインデックスをリストし、これらのインデックスのうちどれがユーザーのメッセージ/質問/プロンプトに最も一致するかを LLM に識別させるツール (index_explorer と呼ばれる) を構築しました。この<a href="https://github.com/elastic/kibana/blob/0cc78184957fcd12110dabae50353392ea937508/x-pack/platform/packages/shared/onechat/onechat-genai-utils/tools/index_explorer.ts#L98-L113">オリジナルの実装はここで</a>見ることができます。</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>これはどれくらいうまく機能しましたか?よく分かりませんでした！うまく機能して<em>いない</em>明確な例はありましたが、私たちにとっての本当の最初の課題は、現状を定量化することでした。</p><h2>ベースラインの確立</h2><h3>それはデータから始まる</h3><p>私たちが必要としていたのは、ユーザーのプロンプトと既存のインデックス セットに基づいて適切なインデックスを選択するツールの有効性を測定するためのゴールデン データ セットでした。そして、手元にそのようなデータセットがなかったので、それを生成しました。</p><p>謝辞: これは「ベスト プラクティス」ではないことは承知しています。しかし、時には、自転車を捨てるよりも前進する方が良いこともあります。<a href="https://www.elastic.co/about/our-source-code#progress-perfection">進歩、シンプルな完璧さ</a>。</p><p><a href="https://gist.github.com/seanstory/a08db2e149897da656db3a1ca72e17ac">このプロンプト</a>を使用して、いくつかの異なるドメインのシードのインデックスを生成しました。次に、生成されたドメインごとに、<a href="https://gist.github.com/seanstory/a280a85d067e61bfeb5911bf2654e6e2">このプロンプト</a>を使用してさらにいくつかのインデックスを生成しました (ここでの目標は、ハードネガティブと分類が難しい例を使用して LLM に混乱を引き起こすことです)。次に、生成された各インデックスとその説明を手動で編集しました。最後に、<a href="https://gist.github.com/seanstory/44291b666c05a383136f6e36bb9106fa">このプロンプト</a>を使用してテストクエリを生成しました。次のようなサンプルデータが得られました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1bd9cd78154195e3/6a17f117dbb4fff7b5fb57d2/9d96d87e286eddbc012402b1ecccd57419a99253-1600x782.png" alt="" /><p>そして次のようなテストケース:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltadf30a0aeafd56ef/6a17f1192f4a5c160ffa89eb/4c2e9ad941d98d7e66033bbc08c9b8060ec19097-1600x797.png" alt="" /><h3>テストハーネスの作成</h3><p>ここからのプロセスは非常に簡単でした。次の機能を備えたツールをスクリプト化します。</p><ol><li><p>ターゲット Elasticsearch クラスターを使用してクリーンな状態を確立します。</p></li><li><p>ターゲット データセットで定義されているすべてのインデックスを作成します。</p></li><li><p>各テスト シナリオに対して、 i <code>ndex_explorer</code>ツールを実行します (便利なことに、<a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-agent-builder-tools-execute">実行ツール API が</a>あります)。</p></li><li><p>結果のインデックスを予想インデックスと比較し、結果を取得します。</p></li><li><p>すべてのテストシナリオを終了したら、結果を表にまとめます。</p></li></ol><h3>調査によると…</h3><p>当初の結果は予想通り平凡なものでした。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt73367741359e258d/6a17f11a505ac39749ad8c40/9c10679bcd6291edfa2a9ba42e7dd922aa483f0b-1216x806.png" alt="" /><p>全体として、正しいインデックスを識別する精度は 77.14% です。これは、すべてのインデックスに意味的に意味のある適切な名前が付けられている「最良のケース」のシナリオでした。`PUT test2/_doc/foo {...} ` を実行したことがある人なら、インデックスの名前が必ずしも意味のあるものではないことはご存じでしょう。</p><p>つまり、ベースラインがあり、改善の余地が十分にあることがわかります。さあ、科学の時間です！🧪</p><h2>実験</h2><h3>仮説1: マッピングは役立つ</h3><p>ここでの目標は、元のプロンプトに関連するデータが含まれるインデックスを識別することです。インデックスに含まれるデータを最もよく表す部分は、インデックスの<em>マッピング</em>です。インデックスの内容のサンプルを取得しなくても、インデックスに double 型の価格フィールドがあることがわかれば、そのデータは販売されるものを表していることがわかります。テキストタイプの著者フィールドは、何らかの非構造化言語データを意味します。これら 2 つを組み合わせると、データが書籍、物語、詩であることを意味する可能性があります。インデックスのプロパティを知るだけで、意味上の手がかりを数多く得ることができます。そこでローカルブランチで`.index_explorer`を調整しましたインデックスの完全なマッピング (およびその名前) を LLM に送信して決定を下すツール。 </p><p>結果（Kibana ログより）:</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>ツールの最初の作成者はこれを予期していました。インデックスのマッピングは情報の宝庫ですが、非常に冗長な JSON ブロックでもあります。そして、多数のインデックス (評価データセットでは 20 個が定義されています) を比較する現実的なシナリオでは、これらの JSON BLOB が加算されます。したがって、LLM に、すべてのオプションのインデックス名だけでなく、それぞれの完全なマッピングほどではなく、決定のためのより多くのコンテキストを提供したいと考えています。</p><h3>仮説2: 妥協案としての「フラット化された」マッピング（フィールドリスト）</h3><p>私たちは、インデックス作成者が意味的に意味のあるインデックス名を使用するという前提から始めました。その仮定をフィールド名にも拡張するとどうなるでしょうか?前回の実験は、JSON のマッピングに大量の煩わしいメタデータと定型句が含まれているため失敗しました。</p>     "description_text": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          },
          "copy_to": [
            "description_semantic"
          ]
        },<p>たとえば、上記のブロックは 236 文字で、Elasticsearch マッピング内の 1 つのフィールドのみを定義します。一方、文字列「description_text」は 16 文字だけです。これは文字数が約 15 倍に増加していることを意味しますが、そのフィールドが利用可能なデータについて何を意味するかを説明する意味的な改善は見られません。すべてのインデックスのマッピングをフェッチしたが、それを LLM に送信する前に、フィールド名のリストだけに「フラット化」するとどうなるでしょうか?</p><p>試してみました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta5eda7a79493ee81/6a17f11c9da390327fe46590/112c2f447c11f154b5082725cd49b51d0a3c8a65-1214x804.png" alt="" /><p>これは素晴らしいですね！全面的に改善されました。しかし、もっと良い方法はないでしょうか?</p><h3>仮説3: マッピング_meta内の説明</h3><p>追加のコンテキストのないフィールド名だけでこれほど大きな変化が生じたのであれば、実質的なコンテキストを追加すればさらに良くなると思われます。すべてのインデックスに説明を添付することが必ずしも慣例ではありませんが、マッピングの _meta オブジェクトにあらゆる種類のインデックス レベルのメタデータを追加することは可能です。生成されたインデックスに戻り、データセット内のすべてのインデックスに説明を追加しました。説明が極端に長くない限り、完全なマッピングよりも少ないトークンが使用され、インデックスに含まれるデータに関するはるかに優れた洞察が提供されるはずです。私たちの実験はこの仮説を検証しました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt61b85cf40e0e6357/6a17f11dfbc5f82809491bbe/32d2692ad4479d0e52d8ee723dcc5710a6ec90f3-1208x806.png" alt="" /><p>若干の改善があり、現在では全体的に 90% を超える精度を実現しています。</p><h3>仮説4：全体は部分の合計よりも大きい</h3><p>フィールド名により結果が向上しました。説明により結果が向上しました。したがって、説明とフィールド名の<em>両方</em>を利用すると、さらに良い結果が得られるはずです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte6297c6aaf7db802/6a17f11e14d90c1bd779b6e6/114cbb408ff16b136251d2265416bd5270380fe5-1208x794.png" alt="" /><p>データは「いいえ」（前回の実験から変化なし）を示しました。ここでの主な理論は、説明はそもそもインデックス フィールド/マッピングから生成されたため、これら 2 つのコンテキストの間には、組み合わせたときに何か「新しい」ものを追加するのに十分な情報がないというものでした。さらに、20 個のテスト インデックスに送信するペイロードもかなり大きくなっています。これまで私たちが辿ってきた考え方はスケーラブルではありません。実際、これまでの私たちの実験は、数百または数千のインデックスから選択できる Elasticsearch クラスターでは機能しないと考えられる十分な理由があります。インデックスの合計数が増加するにつれて、LLM に送信されるメッセージ サイズが直線的に増加するアプローチは、おそらく一般化可能な戦略にはなりません。</p><p>私たちに本当に必要なのは、多数の候補から最も関連性の高い選択肢だけを絞り込むのに役立つアプローチです...</p><p>ここで問題となるのは検索の問題です。</p><h3>仮説5：意味検索による選択</h3><p>インデックスの名前に意味がある場合は、ベクトルとして保存し、意味的に検索することができます。</p><p>インデックスのフィールド名に意味がある場合は、それらをベクトルとして保存し、意味的に検索することができます。</p><p>インデックスに意味を持つ記述がある場合は、それもベクトルとして保存し、意味的に検索することができます。</p><p>現在、Elasticsearch インデックスではこの情報を検索可能にしていません (検索可能にすべきかもしれませんが) が、そのギャップを回避できる<a href="https://github.com/elastic/connectors/pull/3638">ものをハックする</a>のは非常に簡単でした。Elastic のコネクタ フレームワークを使用して、クラスター内のすべてのインデックスのドキュメントを出力するコネクタを構築しました。出力ドキュメントは次のようになります。</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>これらのドキュメントを、次のように手動でマッピングを定義した新しいインデックスに送信しました。</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>これにより、単一の semantic_content フィールドが作成され、セマンティックな意味を持つ他のすべてのフィールドがチャンク化され、インデックスが作成されます。このインデックスの検索は、次のようにするだけで簡単になります。</p>GET indexed-indices/_search
{
 "query": {
   "semantic": {
     "field": "semantic_content",
     "query": "$query"
   }
 }
}<p>修正された<code>index_explorer</code>ツールは、LLM へのリクエストを行う必要がなくなり、代わりに指定されたクエリに対して単一の埋め込みをリクエストして効率的なベクトル検索操作を実行できるため、<em>大幅に</em>高速化されました。トップヒットを選択したインデックスとして取得すると、次の結果が得られました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc27c302e6bef0b23/6a17f120577262d2f21bccdc/06ef5d78040d064d3444793f636d527d9e19a869-1214x800.png" alt="" /><p>このアプローチはスケーラブルです。このアプローチは効率的です。しかし、このアプローチはベースラインよりわずかに優れているだけです。しかし、これは驚くことではありません。ここでの検索アプローチは信じられないほど単純です。ニュアンスがない。インデックスの名前と説明は、インデックスに含まれる任意のフィールド名よりも重視されるべきであるという認識がありません。正確な語彙の一致を同義語の一致よりも重視するアフォーダンスはありません。ただし、非常に微妙なニュアンスのあるクエリを構築するには、手元のデータについて多くのことを想定する必要があります。これまで、インデックス名とフィールド名には意味があるという大きな仮定をすでに立ててきましたが、さらに一歩進んで、インデックス名とフィールド名が<em>どの程度の</em>意味を持ち、互いにどのように関連しているかを仮定する必要があります。そうしないと、最上位の結果として最適な一致を確実に特定することはできないかもしれませんが、最上位 N 個の結果のどこかに最上位の一致があると言える可能性が高くなります。意味情報をそれが存在するコンテキスト内で消費し、意味的に異なる方法で自身を表現する別のエンティティと比較し、それらを判断できるものが必要です。LLM のようなものです。</p><h3>仮説6: 候補セットの削減</h3><p>他にも簡単に触れる実験はいくつかありましたが、重要な突破口となったのは、純粋にセマンティック検索から最適な一致を選択したいという欲求を捨て、代わりにセマンティック検索をフィルターとして活用して、LLM の検討対象から無関係なインデックスを除外したことです。<a href="https://gist.github.com/seanstory/d704443120e20f6c844db10e30066860">検索</a>では、リニア リトリーバー、RRF を使用したハイブリッド検索、 <code>semantic_text</code>を組み合わせて、一致する上位 5 つのインデックスに結果を制限しました。</p><p>次に、一致ごとに、インデックスの名前、説明、フィールド名を LLM のメッセージに追加しました。結果は素晴らしかったです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7ac4cb8f7153fdf9/6a17f121af47b66d1dcde082/8fcabd78f591f90d6bc7c0e087d31317e4eef791-1206x804.png" alt="" /><p>これまでのどの実験よりも最高の精度です!また、このアプローチではインデックスの合計数に比例してメッセージ サイズが増加しないため、このアプローチははるかにスケーラブルです。</p><h2>成果</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8d66130d9fae6bea/6a17f123ddf97d7527910c19/04d630797213dbb8bf567da41d1cdd5c7b4586c9-1600x521.png" alt="" /><p>最初の明らかな結果は、ベースラインを改善<em>できる</em>ということでした。振り返ってみるとこれは明らかなようですが、実験が始まる前に、 <code>index_explorer</code>ツールを完全に放棄して、ユーザーからの明示的な構成に依存して検索空間を制限すべきかどうかについて真剣な議論がありました。これはまだ実行可能かつ有効なオプションですが、この調査では、そのようなユーザー入力が利用できない場合にインデックス選択を自動化するための有望な道筋があることが示されています。</p><p>次の明らかな結果は、問題に対して説明文字をさらに追加するだけでは、効果は減少するということです。この調査を行う前、Elasticsearch の<a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/mapping-field-meta">フィールドレベルのメタデータ</a>保存機能を拡張することに投資すべきかどうかについて議論していました。現在、これらの<code>meta</code>値は 50 文字に制限されており、フィールドの意味を理解できるようにするにはこの値を増やす必要があると想定されていました。これは明らかに事実ではなく、LLM はフィールド名だけでかなりうまく機能しているようです。これについては後でさらに調査するかもしれませんが、もはや緊急の問題ではないように思われます。</p><p>逆に言えば、これは「検索可能な」インデックス メタデータを持つことの重要性を明確に示しています。これらの実験のために、インデックスのインデックスをハッキングしました。しかし、これを Elasticsearch に直接組み込むか、管理するための API を構築するか、少なくとも規則を確立することを調査することはできます。私たちは選択肢を検討し、社内で議論する予定ですので、お楽しみに。</p><p>最後に、この取り組みにより、時間をかけて実験し、データに基づいた意思決定を行うことの価値が確認されました。実際、これにより、Agent Builder 製品には強力な製品内評価機能が必要になることが再確認されました。インデックスを選択するツール専用のテスト ハーネス全体を構築する必要がある場合、お客様は反復的な調整を行う際にカスタム ツールを定性的に評価する方法が絶対に必要になります。</p><p>私たちが何を構築するのか楽しみにしています。皆さんも楽しみにしていただければ幸いです。</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[エージェント型AI]]></category>
    <category><![CDATA[Elastic内部の実情]]></category>
    <category><![CDATA[ハイブリッド検索]]></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[初めてのElastic Agent: 単一のクエリからAIを活用したチャットまで]]></title>
    <description><![CDATA[Elastic の AI エージェント ビルダーを使用して特殊な AI エージェントを作成する方法を学びます。このブログでは、金融 AI エージェントを構築します。]]></description>
    <content:encoded><![CDATA[<p>Elastic の新しい<a href="https://www.elastic.co/search-labs/blog/ai-agentic-workflows-elastic-ai-agent-builder">Agent Builder を</a>使用すると、特定のビジネスドメインの専門家として機能する特殊な AI エージェントを作成できます。この機能により、単純なダッシュボードや検索バーを超えて、データを受動的なリソースから能動的な会話のパートナーへと変換できます。</p><p>顧客との会議の前に、状況を把握しておく必要がある財務マネージャーを想像してください。ニュース フィードを手動で調べたり、ポートフォリオ ダッシュボードを相互参照したりする代わりに、カスタム構築されたエージェントに直接質問するだけで済みます。これは「チャットファースト」アプローチの利点です。マネージャーはデータに直接、会話形式でアクセスし、「ACME Corp の最新ニュースは何ですか。また、それがクライアントの保有株にどのような影響を与えますか」などと質問します。数秒以内に専門家による総合的な回答が得られます。</p><p>私たちは現在、金融の専門家を構築していますが、そのアプリケーションはデータと同じくらい多様です。同じ力で、脅威を探すサイバーセキュリティアナリスト、機能停止を診断するサイト信頼性エンジニア、キャンペーンを最適化するマーケティングマネージャーを生み出すこともできます。分野に関係なく、中核となる使命は同じです。データを、チャットできる専門家に変換することです。</p><h2>ステップ0: データセット</h2><p>本日のデータセットは、金融口座、資産状況、ニュース、財務レポートで構成される合成的な金融ベースのデータセットです。これは合成ではありますが、実際の金融データセットの簡略化されたバージョンを複製したものです。</p><p><code>financial_accounts</code>: リスクプロファイル付き顧客ポートフォリオ</p><p><code>financial_holdings</code>: 購入履歴のある株式/ETF/債券のポジション</p><p><code>financial_asset_details</code>: 株式/ETF/債券の詳細</p><p><code>financial_news</code>: 感情分析によるAI生成の市場記事</p><p><code>financial_reports</code>: 企業収益とアナリストのコメント</p><p><a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/your-first-elastic-agent/Your_First_Elastic_Agent.ipynb">ここに</a>ある付属のノートブックに従って、このデータセットを自分でロードできます。</p><h2>ステップ1: 基盤 - ES|QLとしてのビジネスロジック</h2><p>すべての AI スキルは、確かなロジックから始まります。Financial Manager エージェントには、「市場のセンチメントが心配です。」というよくある質問に回答する方法を教える必要があります。悪いニュースによって最もリスクにさらされている顧客は誰なのか教えていただけますか？」この質問は単純な検索の範囲を超えています。市場の感情と顧客のポートフォリオを相関させる必要があります。</p><p>否定的な記事で言及されている資産を見つけ、それらの資産を保有しているすべての顧客を特定し、そのエクスポージャーの現在の市場価値を計算し、結果をランク付けして最も高いリスクを優先する必要があります。この複雑な複数結合の分析は、当社の高度な ES|QL ツールに最適です。</p><p>使用する完全なクエリは次のとおりです。見た目は印象的ですが、コンセプトは単純です。</p><h2>分解：接合部とガードレール</h2><p>このクエリでは、エージェント ビルダーを構成する 2 つの重要な概念が関係しています。</p><h3>1.ルックアップ結合</h3><p>長年にわたり、Elasticsearch で最も要望が多かった機能の 1 つは、共通キーに基づいて異なるインデックスのデータを結合する機能でした。ES|QL では、 <code>LOOKUP JOIN</code>でそれが可能になりました。</p><p>新しいクエリでは、3 つの<code>LOOKUP JOIN</code>のチェーンを実行します。最初に否定的なニュースを資産の詳細に関連付け、次にそれらの資産をクライアントの保有資産にリンクし、最後にクライアントのアカウント情報に結合します。これにより、単一の効率的なクエリで 4 つの異なるインデックスから非常に豊富な結果が作成されます。つまり、すべてのデータを事前に 1 つの巨大なインデックスに非正規化する必要がなく、異なるデータセットを組み合わせて単一の洞察に満ちた回答を作成できるということです。</p><h3>2. LLMガードレールとしてのパラメータ</h3><p>クエリでは<code>?time_duration</code>が使用されていることがわかります。これは単なる変数ではなく、AI のガードレールです。大規模言語モデル (LLM) はクエリの生成に優れていますが、データに対して LLM を自由に制御させると、非効率的なクエリや間違ったクエリが発生する可能性があります。</p><p>パラメータ化されたクエリを作成することで、LLM は、人間の専門家がすでに定義したテスト済みの効率的で正しいビジネス ロジック内で動作するように強制されます。これは、開発者が長年にわたり検索テンプレートを使用して、クエリ機能をアプリケーションに安全に公開してきた方法に似ています。エージェントは「今週」のようなユーザーのリクエストを解釈して<code>time_duration</code>パラメータを埋めることができますが、回答を取得するにはクエリ構造を使用する必要があります。これにより、柔軟性と制御の完璧なバランスが実現します。</p><p>最終的に、このクエリにより、データを理解している専門家は自分の知識をツールにカプセル化できるようになります。他の人や AI エージェントは、そのツールを使用して、基礎となる複雑さについて何も知らなくても、単一のパラメータを提供するだけで相関結果を得ることができます。</p><h2>ステップ2：スキル - クエリを再利用可能なツールに変える</h2><p>ES|QL クエリは、<strong>ツール</strong>として登録されるまでは単なるテキストです。エージェント ビルダーでは、ツールは単なる保存されたクエリではなく、AI エージェントが理解して使用することを選択できる「スキル」です。その魔法は、私たちが提供する<strong>自然言語による説明</strong>にあります。この説明は、ユーザーの質問と基礎となるクエリ ロジックを結び付ける橋渡しとなります。作成したクエリを登録しましょう。</p><h3>UIパス</h3><p>Kibana でツールを作成するのは簡単なプロセスです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte73e11c1d87593fa/6a17f2134202294dae29f6f2/a29c53a73b99af5972273c51218ea9004a9b0abb-1600x812.png" alt="Kibana でツールを作成する方法。" /><p>1.<strong>エージェント</strong>へ移動</p><ul><li><p><strong>[ツール]</strong>または<strong>[ツールの管理]</strong>をクリックし、 <strong>[新しいツール]</strong>ボタンをクリックします。</p></li></ul><p>2. フォームに以下の詳細を入力します。</p><ul><li><p><strong>ツールID:</strong> <code>find_client_exposure_to_negative_news</code></p></li></ul><p>             私。これはツールの一意のIDです</p><ul><li><p><strong>説明:</strong> 「クライアントのポートフォリオがネガティブなニュースにさらされているかどうかを調べます。」このツールは、最近のニュースやレポートをスキャンして否定的な感情を検出し、関連する資産を識別して、その資産を保有しているすべてのクライアントを見つけます。最も高い潜在的リスクを強調するために、ポジションの現在の市場価値でソートされたリストを返します。</p></li></ul><p>             私。これは、LLM が読んで、このツールが仕事に適しているかどうかを判断します。</p><ul><li><p><strong>ラベル</strong>: <code>retrieval</code>および <code>risk-analysis</code></p></li></ul><p>         ラベルは複数のツールをグループ化するのに役立ちます</p><ul><li><p><strong>設定:</strong>ステップ1の完全なES|QLクエリを貼り付けます</p></li></ul><p>            私。これはエージェントが使用する検索です</p><p>3.<strong>クエリからパラメータを推測するを</strong>クリックします。UI は自動的に<code>?time_duration</code>見つけて以下にリストします。エージェント (および他のユーザー) が目的を理解できるように、それぞれに簡単な説明を追加します。</p><ul><li><p><code>time_duration</code>: ネガティブなニュースを遡って検索する期間。フォーマットは「X時間」です。デフォルトは8760時間です。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7afbb0589c1828ad/6a17f2146864a44e7cb688a9/deb422d97863f78dbe08bfa2e3c708d1f75166ff-1600x938.png" alt="ESQL クエリを使用して、ロジックや必要なパラメータを含むツールを構成します。 " /><p>4. 試してみましょう!</p><ul><li><p>[保存してテスト]をクリックします。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd09afbef6e21a93/6a17f2162f4a5c73b1fa89fd/57e768b88327821e70bd616744822f98fa367362-732x136.png" alt="Kibana の同じ &amp; test ボタン。" /><ul><li><p>クエリが期待どおりに動作していることを確認できる新しいフライアウトが表示されます。</p></li></ul><p>             私。<code>time_duration</code>に希望の範囲を入力します。ここでは「8760時間」を使用します。</p><ul><li><p>「送信」をクリックすると、すべてがうまくいけば JSON レスポンスが表示されます。期待どおりに動作することを確認するには、下にスクロールして<code>values</code>オブジェクトを確認します。ここで、実際に一致するドキュメントが返されます。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt89bdc3f093363f2a/6a17f217be60861c9c00488a/7e0c5171a4f7ffdfc1830f1a05a9acb987870b75-1600x722.png" alt="送信をクリックした後に表示される JSON 応答。" /><p>5. 右上の「X」をクリックして、テストのフライアウトを閉じます。新しいツールがリストに表示され、エージェントに割り当てる準備が整います。</p><h3>APIパス</h3><p>自動化を好む開発者やツールをプログラムで管理する必要がある開発者は、1 回の API 呼び出しで同じ結果を得ることができます。ツールの定義を含む<code>POST</code>リクエストを<code>/api/agent_builder/tools</code>エンドポイントに送信するだけです。</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>ステップ3：頭脳 - カスタムエージェントの作成</h2><p>再利用可能なスキル (ツール) を構築しました。ここで、実際に使用するペルソナである<strong>Agent</strong>を作成する必要があります。エージェントは、LLM、アクセスを許可する特定のツール セット、そして最も重要な、エージェントの構成として機能し、エージェントの性格、ルール、目的を定義する<strong>カスタム インストラクション</strong>セットの組み合わせです。</p><h3>プロンプトの芸術</h3><p>信頼できる専門エージェントを作成する上で最も重要なのはプロンプトです。よく練られた一連の指示こそが、一般的なチャットボットと、集中力のあるプロのアシスタントとの違いです。ここで、ガードレールを設定し、出力を定義し、エージェントにミッションを与えます。</p><p><code>Financial Manager</code>エージェントでは、次のプロンプトを使用します。</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>このプロンプトがなぜ効果的なのかを分析してみましょう。</p><ul><li><p><strong>洗練されたペルソナを定義します。</strong>最初の行で、エージェントが「専門的なデータ インテリジェンス アシスタント」であることを即座に示し、プロフェッショナルで有能な雰囲気を醸し出します。</p></li><li><p><strong>これは推論フレームワークを提供します。</strong>エージェントに「理解、計画、実行、統合」を指示することで、標準的な操作手順を提供します。これにより、複雑で複数のステップから成る質問を処理する能力が向上します。</p></li><li><p><strong>インタラクティブな対話を促進します。</strong> 「明確な質問をする」という指示により、エージェントはより堅牢になります。曖昧なリクエストに対する誤った想定を最小限に抑え、より正確な回答が得られます。</p></li></ul><h3>UIパス</h3><p>1.<strong>エージェントに移動します。</strong></p><ul><li><p><strong>[ツール]</strong>または<strong>[ツールの管理]</strong>をクリックし、 <strong>[新しいツール]</strong>ボタンをクリックします。</p></li></ul><p>2. 基本的な詳細を入力します。</p><ul><li><p><strong>エージェント ID:</strong> <code>financial_assistant</code> 。</p></li><li><p><strong>手順:</strong>上記のプロンプトをコピーします。</p></li><li><p><strong>ラベル</strong>: <code>Finance</code> 。</p></li><li><p><strong>表示名:</strong> <code>Financial Assistant</code> 。</p></li><li><p><strong>表示の説明:</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="財務アシスタントの作成 - エージェント ID フィールドに入力します。" /><p>3. 上部に戻り、 <strong>「ツール」</strong>をクリックします。</p><ul><li><p><code>find_client_exposure_to_negative_news</code>ツールの横にあるボックスにチェックを入れてください。</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltcd23556e556a76c5/6a17f21baf47b63a9fcde0a0/0c1e4ecbbd51d0dd10c6e861dbe9a9ccddeb35f6-1600x149.png" alt="" /><p>4. <strong>「保存」</strong>をクリックします。</p><h3>APIパス</h3><p><code>/api/agent_builder/agents</code>エンドポイントへの<code>POST</code>リクエストを使用して、まったく同じエージェントを作成できます。リクエスト本体には、ID、名前、説明、完全な指示セット、エージェントが使用を許可されているツールのリストなど、すべて同じ情報が含まれています。</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>ステップ4：成果 — 会話をする</h2><p>ビジネス ロジックがツールにカプセル化され、エージェントでそれを使用できる「頭脳」が準備されました。すべてが一つにまとまるのを見る時が来ました。専用のエージェントを使用して、データとのチャットを開始できるようになりました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8826539b16e46f4/6a17f21d505ac35924ad8c5c/5414cb6b7c41365acb0356a8bfe1140751ffd8db-1600x1014.png" alt="財務アシスタントを作成した後、Elastic Agent Builder と会話します。" /><h3>UIパス</h3><ol><li><p>Kibana の<strong>エージェント</strong>に移動します。</p></li><li><p>チャット ウィンドウの右下にあるドロップダウンを使用して、デフォルトの<strong>Elastic AI エージェント</strong>から新しく作成した<strong>Financial Assistant</strong>エージェントに切り替えます。</p></li><li><p>エージェントが当社の専用ツールを使用できるように、次の質問をしてください。</p><ol><li><p><em>市場のセンチメントが心配です。悪いニュースによって最もリスクにさらされている顧客は誰なのか教えていただけますか?</em></p></li></ol></li></ol><p>しばらくすると、エージェントは完全にフォーマットされた完全な回答を返します。LLM の性質上、回答の形式が若干異なる場合がありますが、この実行ではエージェントは次のように返しました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta1e163fd7c4416bd/6a17f21f6864a4e35bb688ad/17b4ed43d279f9e53ee9fe3d482d0b2ec359a083-1600x1088.png" alt="ネガティブなニュースによるリスクが最も高いクライアント向けの財務アシスタントとして Elastic Agent Builder によって作成された応答。" /><h3>何が起こったのですか?エージェントの推論</h3><p>エージェントは単に答えを「知っていた」だけではありません。仕事に最適なツールを選択することを中心とした多段階の計画を実行しました。その思考プロセスは次のようになります。</p><ul><li><p><strong>識別された意図:</strong> 「リスク」や「ネガティブなニュース」など、質問のキーワードが<code>find_client_exposure_to_negative_news</code>ツールの説明と一致しました。</p></li><li><p><strong>計画を実行しました:</strong>リクエストから時間枠を抽出し、その専用ツールを<strong>1 回呼び出し</strong>ました。</p></li><li><p><strong>作業を委任:</strong>ツールは連鎖結合、値の計算、並べ替えなど、面倒な作業をすべて実行しました。</p></li><li><p><strong>結果の統合:</strong>最後に、エージェントはプロンプトのルールに従って、ツールからの生データを明確で人間が読める要約にフォーマットしました。</p></li></ul><p>思考を広げて詳細を見れば、推測するだけでは足りません。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt93f6075be8495418/6a17f221af47b65eadcde0a4/6a4da9262d3f88c60bfd8f8bf9b67c3b84e961ba-1600x607.png" alt="ファイナンシャルアシスタントが、ネガティブなニュースに最も多く触れた顧客から得た 50 件の文書。" /><h3>APIパス</h3><p>同じ会話をプログラムで開始することもできます。入力した質問を<code>converse</code> API エンドポイントに送信し、 <code>financial_manager</code>の<code>agent_id</code>を必ず指定してください。</p>POST kbn://api/agent_builder/converse
{
  "input": "Show me our largest positions affected by negative news",
  "agent_id": "financial_assistant"
}<h2>開発者向け: APIとの統合</h2><p>Kibana UI はエージェントの構築と管理に素晴らしく直感的なエクスペリエンスを提供しますが、今日見てきたことはすべてプログラムで実現することもできます。Agent Builder は一連の API に基づいて構築されており、この機能を独自のアプリケーション、CI/CD パイプライン、または自動化スクリプトに直接統合できます。</p><p>使用する 3 つのコア エンドポイントは次のとおりです。</p><ul><li><p><strong><code>/api/agent_builder/tools</code></strong>: エージェントが使用できる再利用可能なスキルを作成、一覧表示、管理するためのエンドポイント。</p></li><li><p><strong><code>/api/agent_builder/agents</code></strong>: エージェントのペルソナ（重要な指示やツールの割り当てなど）を定義するためのエンドポイント。</p></li><li><p><strong><code>/api/agent_builder/converse</code></strong>: エージェントと対話し、会話を開始し、回答を得るためのエンドポイント。</p></li></ul><p>これらの API を使用してこのチュートリアルのすべてのステップを実行するための完全な実践的なチュートリアルについては、 こちらの GitHub リポジトリで入手できる付属の<strong> Jupyter Notebook を</strong> <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/your-first-elastic-agent/Your_First_Elastic_Agent.ipynb"></a>ご覧ください。</p><h2>結論: 構築する番です</h2><p>まず、ES|QL クエリを取得して、それを再利用可能なスキルに変換することから始めました。次に、明確なミッションとルールを与えて、そのスキルを付与した専用の AI エージェントを構築しました。その結果、複雑な質問を理解し、複数段階の分析を実行して、正確でデータに基づいた回答を提供できる洗練されたアシスタントが誕生しました。</p><p>このワークフローは、Elastic の新しい<strong>Agent Builder</strong>の中心です。これは、技術に詳しくないユーザーが UI を通じてエージェントを作成できるほどシンプルでありながら、開発者が API 上にカスタム AI 搭載アプリケーションを構築できるほど微妙なニュアンスも備えた設計になっています。最も重要なのは、定義したエキスパート ロジックに従って、LLM を独自のデータに安全かつ確実に接続し、データとチャットできることです。</p><h2>エージェントを使用してデータとチャットする準備はできていますか?</h2><p>学んだことを定着させる最良の方法は、実際に手を動かしてみることです。今日お話しした内容をすべて<a href="https://www.elastic.co/training/elastic-ai-agents-mcp"><strong>、無料のインタラクティブな実践ワークショップ</strong></a>で試してみてください。専用のサンドボックス環境で、このフロー全体とその他の内容を実行します。</p><p>今後のブログでは、 <code>Financial Assistant</code>エージェントと対話するスタンドアロン アプリケーションの使用方法と、それを可能にする<strong>モデル コンテキスト プロトコル (MCP)</strong>について詳しく説明します。また、別のブログでは、開発中の Agent2Agent (A2A) プロトコルに対する Agent Builder のサポートについて説明します。</p><p>引き続きご注目ください、そして楽しい建築を！</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[AI]]></category>
    <category><![CDATA[エージェント型AI]]></category>
    <category><![CDATA[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[Elasticsearch を使用した AI エージェントワークフローの構築]]></title>
    <description><![CDATA[Elasticsearch の新しい AI レイヤーである Agent Builder について学習します。Agent Builder は、ハイブリッド検索を使用して、エージェントが推論して行動するために必要なコンテキストを提供し、AI エージェントワークフローを構築するためのフレームワークを提供します。]]></description>
    <content:encoded><![CDATA[<p>Elasticでは、AIアシスタント、高度なRAG、ベクターデータベースの改善により、LLMと会話型インターフェースにコンテキストを提供してきました。最近、AI エージェントの台頭により、関連コンテキストの必要性が高まり、影響力の大きい<strong>AI エージェントには優れた検索が必要である</strong>ことがわかりました。そこで、Elasticsearch のデータを活用する AI エージェントの開発を支援するために設計された新しいネイティブ機能を Elastic Stack に構築しました。私たちは、この取り組みの進捗状況と今後の見通しについて共有したいと思います。</p><h2>エージェントビルダー: データ駆動型 AI エージェント構築の基盤</h2><p>AI エージェントの約束はシンプルです。目標を与えれば、仕事が完了します。しかし、開発者にとって、現実は一連の複雑な課題です。まず、エージェントの優秀さは、環境の認識と、ユーザーの目的を達成するために与えられたツールによって決まります。そして、多様な企業データから適切なコンテキストを提供することは大きな課題です。最後に、これらすべては、計画、実行、学習できる信頼性の高い推論ループによって調整される必要があります。</p><p>これを解決するには、開発者は複雑で脆弱なスタックをゼロから構築する必要があります。今日のエージェント アーキテクチャでは、LLM、ベクター データベース、メタデータ ストア、ログ記録とトレースの個別のシステム、そしてすべてが機能しているかどうかを評価する方法など、複数の異なる部分をつなぎ合わせる必要があります。これは単に複雑なだけでなく、コストがかかり、エラーが発生しやすく、ユーザーが求める高品質で信頼性の高い AI システムの構築が困難になります。</p><p>だから、もっとシンプルにしたいんです。これを実現するための私たちのアプローチは、効果的なコンテキスト駆動型エージェントの重要な要素を取り上げ、 <strong>Elastic AI Agent Builder</strong>と呼ばれる新しい機能セットを使用して Elasticsearch の中核に直接統合することです。この新しいレイヤーは、Elasticsearch を活用した AI エージェントを作成するためのすべての重要な構成要素（オープンなプリミティブ セット、標準ベースのプロトコル、データへの安全なアクセス）を備えたフレームワークを提供します。これにより、現実世界のデータと要件に合わせてカスタマイズされたエージェント システムを構築できます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2779dae5df010328/6a17e15eabe0f24f18dfe931/1ee1e73dd3f485ce86294d39490c98ce2a3d9925-1238x1072.png" alt="" /><p><strong>AI エクスペリエンスの提供</strong>: これが究極の目標です。当社の Search AI プラットフォームとお客様のデータを基盤として、カスタム チャット インターフェースから、LangChain などのエージェント フレームワークや Salesforce などのビジネス アプリケーションとの統合まで、あらゆるタイプの生成 AI アプリケーションを構築できます。</p><p><strong>エージェントとツールを搭載</strong>: プラットフォームの上に、クリーンでシンプルな抽象化レイヤーを公開します。エージェントやツールと直接対話し、特定のニーズに合わせてカスタマイズできます。強力な API や MCP、A2A などのオープン スタンダードを通じてプラットフォームの機能にアクセスすることもできます。</p><p><strong>Search AI Platform によって有効化</strong>: これは、コンポーネントを統合したコア エンジンです。高度なベクトル データベース、エージェント ロジック、クエリ構築、セキュリティ機能、評価のためのトレースはすべてここに存在し、Elastic によって管理および最適化されています。</p><p><strong>データの力を解き放つ</strong>: 優れたエージェントの基盤は優れたデータです。当社のプラットフォームは、すべての企業データへのアクセスを取り込み、連携する機能から始まります。</p><h2>プラットフォームにおけるエージェント構築</h2><p>Search AI プラットフォームに統合された Agent Builder は、エージェント開発のための完全なフレームワークを提供します。これは 5 つの主要な柱に基づいて構築されており、各柱は実稼働レベルの AI システムの構築と展開の重要な側面に対処するように設計されています。エージェントが目的を定義し、ツールが機能を提供し、オープン スタンダードが相互運用性を確保し、評価が透明性をもたらし、セキュリティが信頼を提供する仕組みについて詳しく見ていきましょう。</p><h3>エージェント</h3><p>エージェントは、Elasticsearch のこの新しいレイヤーにおける最高レベルの構成要素です。エージェントは、達成する目的、実行に使用できるツールのセット、および操作できるデータ ソースを定義します。エージェントは会話によるやり取りに限定されず、完全なワークフロー、タスクの自動化、ユーザー向けのエクスペリエンスを実現できます。</p><p>クエリがエージェントに送られると、構造化されたサイクルに従います。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774ffd7df65bd01d/6a17e15f25daabd5cc08a17f/627ad1744b629bbe27359325702f40d97e40d1f4-704x852.png" alt="" /><ol><li><p>入力内容と目的を解釈する</p></li><li><p>実行に適したツールと引数を選択する</p></li><li><p>ツールの応答の理由</p></li><li><p>結果を返すか、さらにツールの呼び出しを続行するかを決定します</p></li></ol><p>Elastic は、このサイクルのオーケストレーション、コンテキスト、および実行を処理します。開発者は、エージェントが<em>何</em>をすべきか（目的、ツール、データ）を定義することに重点を置き、システムは推論とワークフローの実行<em>方法</em>を管理します。</p><p><em>デフォルトエージェント</em></p><p>このプラットフォーム上に構築された最初のエージェントは、Kibana のネイティブ会話エージェントであり、データとすぐに対話できるようになります。完全な拡張性を維持しながらすぐに使用できるエクスペリエンスを提供し、追加の構成なしですぐにデータの操作を開始できます。</p><p>新しいチャット ユーザー エクスペリエンスまたは API を介して、Kibana でこのエクスペリエンスを直接操作できます。</p><p>API を介してデフォルトのエージェントを照会するには、1 回の呼び出しだけが必要です。</p>POST kbn://api/agent_builder/converse
{
    "input": "what is our top portfolio account?"
}<p>会話はステートフルなので、 conversation_id を使用してエージェントとの対話を継続したり、完全な会話履歴を取得したりできます。</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>カスタムエージェント</em></p><p>開発者は、シンプルな API を通じて独自のカスタム エージェントを作成することもできます。エージェントは、指示、ツール、データ アクセスをカプセル化し、カスタマイズされた推論エンジンを作成します。</p><p>カスタム エージェントの作成は、1 回の API 呼び出しを行うだけで簡単に行えます。以下のサンプルは例を示しています。「構成」フィールドには、手順や利用可能なツールなどのすべての重要な詳細が含まれています。</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>作成されたエージェントは直接クエリできます。</p>POST kbn://api/agent_builder/converse
{
    "input": "What news about DIA?",
    "agent_id": "custom_agent"
}<p>このアプローチにより、エージェントはゼロから構築する複雑なシステムから、ビジネス ロジックの単純な宣言型ユニットに変換され、インテリジェントな自動化をより迅速に提供できるようになります。</p><p>特化したエージェントをゼロから構築する方法の詳細については、詳細なステップバイステップガイド「<a href="https://www.elastic.co/search-labs/blog/ai-agent-builder-elasticsearch">初めての Elastic エージェント: 単一のクエリから AI を活用したチャットまで」</a>をご覧ください。</p><h3>ツール</h3><p>エージェントが達成すべき<em>こと</em>を定義するのに対し、ツールは達成<em>方法</em>を定義します。</p><p>ツールは、エージェントが情報を実行および取得したり、アクションを実行したりするための特定の Elastic Core 機能を公開します。ツールには、インデックスの取得やマッピングの取得などのコア機能や、自然言語から ES|QL への変換などのより高度な機能を含めることができます。</p><p>Elasticsearch には、一般的なニーズに合わせて最適化された一連のデフォルト ツールが付属しています。しかし、本当の柔軟性は、独自のものを作成することから生まれます。ツールを定義することで、ES|QL を使用してエージェントに公開されるクエリ、インデックス、フィールドを正確に決定し、速度、精度、セキュリティを正確に制御できます。</p><p>新しいツールの登録も、1 回の API 呼び出しと同じくらい簡単です。<a href="https://www.elastic.co/search-labs/blog/esql-timeline-of-improvements">ES|QL (Elasticsearch クエリ言語)</a>を活用して特定の金融資産に関するニュースを検索するツールを作成できます。</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>登録が完了すると、新しいツールをカスタム エージェントに割り当てることができ、適切なタイミングで推論して呼び出すための厳選された一連の機能をエージェントに提供できるようになります。</p><p>当社では、お客様固有のニーズに合わせてカスタム ツールを作成するためのプラットフォームを提供しています。たとえば、ES|QL を使用すると、エージェントを汎用エージェントから、お客様独自のデータとビジネス ドメインに基づいたドメイン固有のエキスパートに変換できます。</p><h3>オープンスタンダードと相互運用性</h3><p>Elasticsearch エージェントとツールはオープン標準 API を介して公開されるため、エージェントフレームワークのより広範なエコシステム内の基礎ブロックとして簡単に統合できます。私たちのアプローチはシンプルです。ブラックボックスはありません。Elastic の検索における強みを活かし、それを補完的な機能や他のエージェント システムと組み合わせることができるようにしたいと考えています。</p><p>これを実現するために、当社は API、新しいプロトコル、オープン スタンダードを通じて機能を公開しています。</p><p><em>モデルコンテキストプロトコル（MCP）</em></p><p><a href="https://www.elastic.co/search-labs/blog/model-context-protocol-elasticsearch">モデル コンテキスト プロトコル (MCP)</a>は、システム間でツールを接続するためのオープン スタンダードとして急速に普及しつつあります。MCP をサポートすることで、Elasticsearch は会話型 AI をデータベース、インデックス、外部 API に接続できるようになります。Elastic Stack に組み込まれたリモート MCP サーバーを使用すると、MCP 対応のクライアントはどれでも Elastic のツールにアクセスし、それらをより大規模なエージェントワークフローの構成要素として使用できます。</p><p>これは一方通行ではありません。外部の MCP サーバーからツールをインポートし、Elasticsearch 内で利用できるようにすることもできます。近い将来、MCP サーバーはほぼすべての用途で利用できるようになる見込みで、私たち自身が作成するものよりもはるかに包括的なものになるでしょう。Elastic は大規模な検索と取得機能を提供しており、これを他のプラットフォームの特殊な機能と組み合わせて効果的なエージェントを構築できます。</p><p><em>エージェント間（A2A）</em></p><p>また、エージェント間 (A2A) サポートにも取り組んでいます。MCP はツールを接続することに重点が置かれていますが、A2A はエージェントを接続することに重点が置かれています。A2A サーバーを使用すると、構築する Elastic エージェントは他のシステムのエージェントと直接通信して、コンテキストを共有したり、タスクを委任したり、ワークフローを調整したりできるようになります。</p><p>これを推論層における相互運用性と考えてください。Elastic エージェントは検索と取得を処理し、タスクを専門のサポート エージェントまたは IT エージェントに引き渡して、結果をシームレスに返すことができます。その結果、各エージェントが最善を尽くして協力するエコシステムが実現します。</p><p>最終的に、MCP と A2A を採用することで、Elasticsearch が第一級市民としての役割を担うという当社の取り組みが強化され、より広範なエージェントエコシステム全体でのオープンな統合が保証されます。</p><h3>追跡と評価</h3><p>検索がエージェントと統合されるにつれて、効果的な評価の課題が重要になります。実際の企業環境にエージェントを自信を持って導入するには、エージェントが正確であるだけでなく、効率的で信頼できるという保証が必要です。パフォーマンスを測定したり、悪い応答を診断したり、ベースラインを改善したりするにはどうすればよいですか?すべては可視性から始まります。</p><p>そのため、私たちはエージェント API を最初から透明性を重視して設計しました。次の単純なエージェントのやり取りを考えてみましょう。</p>POST kbn://api/agent_builder/converse
{
    "input": "what is our top portfolio account?"
}<p>応答には、最終的な回答だけでなく、エージェントが選択したツール、使用したパラメーター、各ステップの結果の詳細を含む完全な実行トレースが含まれます。</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>包括的なトレースとログ記録は継続的な改善ループに不可欠であり、まもなくこれらのエージェント トレースを Elasticsearch に直接保存して表示できるようになります。さらに、これらのトレースは OpenTelemetry プロトコルに基づいて構築されているため、標準化され、移植可能であり、選択した監視プラットフォームとの統合が可能です。</p><p>このレベルの詳細は、真の継続的改善ループの基礎となります。これにより、包括的なテスト スイートを構築し、障害をデバッグし、障害モードを特定して回帰を防ぎ、成功パターンをキャプチャしてパフォーマンスを微調整できるようになります。最終的に、このデータ主導のアプローチは、有望なプロトタイプを製品レベルの信頼できる AI システムに変換するための鍵となります。</p><h3>セキュリティ</h3><p>エージェントとツールの性能が向上するにつれて、セキュリティはオプションではなく、基礎的なものになります。API を公開し、タスクやワークフローを自動化するには、エンタープライズ システムが信頼されている必要があります。特に、エージェントがより多くのワークフローを自動化し始めると、これらを保護し、企業の要件を満たしていることを確認する機能が不可欠になります。</p><p>上記の機能はすべて、API 呼び出し<a href="https://www.elastic.co/search-labs/blog/rag-and-rbac-integration">のロールベースのアクセス制御 (RBAC)</a>や API キー管理など、現在 Elastic ですでに利用可能な制御を継承しています。同じ制御を MCP などの新しいプロトコルにも拡張しています。つまり、OAuth などの標準のサポートと、カスタム認証メカニズムをプラグインする機能を意味します。</p><p>私たちの目標は、組織が求めるセキュリティ、コンプライアンス、ガバナンスのレベルを維持しながら、エージェントとツールを実験する柔軟性を提供することです。</p><h2>次に何が起こるか</h2><p>機能を追加するだけではなく、エージェントコンテキストエンジニアリング向けに Elasticsearch を拡張しています。当社は、以下の理念に基づいて今後開発を進めていく予定です。</p><p>1. オープンソースと標準への取り組み</p><p>当社はオープン ソースとオープン スタンダードに注力しており、これらの機能が外部のエージェント フレームワークと相互運用可能であることを保証します。データとワークフローを常に管理しながら、エコシステム全体でエージェントを接続、拡張、構成できるようになります。</p><p>2. 文脈の価値</p><p>AI エージェントのコンテキストは最大の資産です。エージェントが検索やワークフロー操作を実行するときにコンテキストを管理することは、難しいタスクになる可能性があります。私たちは Elastic の強みを活用してコンテキスト エンジニアリングを解決し、エージェントが最も関連性の高い情報を常に利用できるようにしています。</p><p>3. エージェントデータストリームに焦点を当てる</p><p>今後、エージェントは、エージェントの出力 (生成されたドキュメント、レポート、視覚化) やエージェントの実行トレース (思考、ツールの呼び出し、メモリ/コンテキスト) など、ますます大きなデータソースになります。Elastic はこの種のデータの処理に適しており、私たちはこのデータを使用して分析、評価、自動改善を実行するための研究に取り組んでいます。</p><p>4. セキュリティと安全性を考慮した設計</p><p>AI エージェントは、セキュリティと安全性に関するまったく新しい一連の課題をもたらします。Elastic は常に安全なソリューションのリーダーであり、エンタープライズグレードのガードレール、アクセス制御、および「ゼロトラスト」原則の構築を継続しています。</p><p>5. プラットフォームに組み込む</p><p>AI エージェントを構築するための機能は、Elasticsearch プラットフォームに組み込まれています。つまり、トレース、評価、視覚化、分析などのプラットフォーム レベルの機能はすべてエージェントに適用できます。エージェントの実行に基づいてダッシュボードを開発したい - それが組み込まれています。感情分析を使用して AI エージェントのパフォーマンスを評価したい場合、プラットフォームでそれが可能です。これにより、AI エクスペリエンスを中心とした完全なライフサイクルを構築できるようになります。</p><p>Elastic の目標は、データに完全に統合され、拡張可能で、データに基づいた会話型 AI と自動化されたワークフローを構築するためのインターフェースを提供することです。より詳しい技術的な詳細と進捗状況については、近日中に共有される予定です。</p><p>Agent Builder は現在、プライベート プレビューでご利用いただけます。アクセスをリクエストするには、<a href="https://www.elastic.co/contact?pg=global&amp;plcmt=nav&amp;cta=205352">当社にご連絡ください</a>。ご質問やフィードバックはありますか?<a href="https://elasticstack.slack.com/archives/C09GRHEQ4AG"><strong>Slack ワークスペース</strong></a>または<a href="https://discuss.elastic.co/c/search/84"><strong>ディスカッション フォーラム</strong></a>で開発者コミュニティとつながりましょう。</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[AI]]></category>
    <category><![CDATA[エージェント型AI]]></category>
    <category><![CDATA[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[ベクター検索フィルタリング: 関連性を保つ]]></title>
    <description><![CDATA[クエリに最も類似した結果を見つけるためにベクトル検索を実行するだけでは不十分です。検索結果を絞り込むには、フィルタリングが必要になることがよくあります。この記事では、Elasticsearch と Apache Lucene でのベクトル検索のフィルタリングの仕組みについて説明します。]]></description>
    <content:encoded><![CDATA[<p>関連する結果を見つけるには、ベクター検索だけでは不十分です。検索結果を絞り込み、無関係な結果を除外するのに役立つフィルタリング基準を使用することは非常に一般的です。</p><p>ベクトル検索でのフィルタリングの仕組みを理解すると、パフォーマンスとリコールのトレードオフのバランスをとるのに役立ちます。また、フィルタリングの使用時にベクトル検索のパフォーマンスを高めるために使用される最適化のいくつかを知ることもできます。</p><h2>なぜフィルタリングするのですか?</h2><p>ベクトル検索は、大規模なデータセット内で関連情報を検索する方法に革命をもたらし、クエリと意味的に類似する項目を発見できるようになりました。</p><p>ただし、類似アイテムを見つけるだけでは十分ではありません。多くの場合、特定の基準や属性に基づいて検索結果を絞り込む必要があります。</p><p>電子商取引ストアで商品を検索していると想像してください。純粋なベクター検索では視覚的に類似したアイテムが表示される場合がありますが、価格帯、ブランド、在庫状況、または顧客評価でフィルタリングすることもできます。フィルタリングがなければ、類似した製品が大量に表示され、探しているものを正確に見つけることが難しくなります。</p><p>フィルタリングにより、検索結果を正確に制御できるようになり、取得された項目が意味的に一致するだけでなく、必要な要件をすべて満たすことが保証されます。これにより、より正確で効率的、そしてユーザーフレンドリーな検索エクスペリエンスが実現します。</p><p>Elasticsearch と Apache Lucene が優れているのはこの点です。さまざまなデータ タイプにわたって効果的なフィルタリングを使用することが、他のベクター データベースとの主な違いの 1 つです。</p><h2>正確なベクトル検索のためのフィルタリング</h2><p>正確なベクトル検索を実行するには、主に 2 つの方法があります。</p><ul><li><p>dense_vector フィールドに<code>flat</code>インデックス タイプを使用します。これにより、 <code>knn</code>検索では近似検索ではなく正確な検索が使用されるようになります。</p></li><li><p>ベクトル関数を使用してスコアを計算する<a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-script-score-query#vector-functions">script_score クエリ</a>を使用します。これはどのインデックス タイプでも使用できます。</p></li></ul><p>正確なベクトル検索を実行すると、すべてのベクトルがクエリと比較されます。このシナリオでは、フィルターを通過するベクトルのみを比較する必要があるため、フィルタリングによってパフォーマンスが向上します。</p><p>いずれにしてもすべてのベクトルが考慮されるため、結果の品質には影響しません。興味のない結果を事前にフィルタリングするだけで、操作の数を減らすことができます。</p><p>これは非常に重要です。適用したフィルターによって少数のドキュメントが生成される場合、近似検索ではなく正確な検索を実行するとパフォーマンスが向上する可能性があるためです。</p><p>経験則としては、フィルターを通過するドキュメントが 10,000 個未満の場合は完全一致検索を使用します。<a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">BBQ</a>インデックスは比較が非常に高速なので、ベース インデックスが 10 万未満の場合は、完全一致検索を使用するのが合理的です。詳細については、<a href="https://www.elastic.co/search-labs/blog/knn-exact-vs-approximate-search">このブログ投稿</a>をご覧ください。</p><p>フィルターが常に非常に制限的である場合は、HNSW ベースのインデックス タイプではなく<code>flat</code>インデックス タイプを使用して、近似検索ではなく完全検索に重点を置いたインデックス作成を検討してください。詳細については、 <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector#dense-vector-params">index_options のプロパティ</a>を参照してください。</p><h2>近似ベクトル検索のためのフィルタリング</h2><p>近似ベクトル検索を実行する場合、結果の精度とパフォーマンスをトレードオフします。HNSW のようなベクトル検索データ構造は、数百万のベクトルのおおよその最近傍を効率的に検索します。計算コストのかかるベクトル比較を最小限に抑えて、最も類似したベクトルを取得することに重点を置いています。</p><p>つまり、他のフィルタリング属性はベクター データの一部ではないということです。さまざまなデータ タイプには、用語辞書、投稿リスト、ドキュメント値など、検索やフィルタリングに効率的な独自のインデックス構造があります。</p><p>これらのデータ構造はベクトル検索メカニズムとは別であるため、ベクトル検索にフィルタリングをどのように適用すればよいでしょうか?フィルターには、ベクター検索の後にフィルターを適用する (ポストフィルタリング) か、ベクター検索の前にフィルターを適用する (プレフィルタリング) という 2 つのオプションがあります。</p><p>それぞれの選択肢には長所と短所があります。詳しく見ていきましょう！</p><h3>ポストフィルタリング</h3><p>ポストフィルタリングは、ベクトル検索が完了した後にフィルターを適用します。これは、最も類似した上位 k 個のベクトル結果が見つかった後にフィルターが適用されることを意味します。</p><p>明らかに、結果にフィルターを適用した後、 k 件未満の結果が返される可能性があります。もちろん、ベクトル検索 (より高い k 値) からより多くの結果を取得できますが、フィルターを適用した後に k 以上の結果が得られるかどうかはわかりません。</p><p>ポストフィルタリングの利点は、ベクトル検索の実行時の動作を変更しないことです。つまり、ベクトル検索はフィルタリングを認識しません。ただし、取得される結果の最終的な数は変わります。</p><p>以下は、 <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query">knn クエリ</a>を使用したポストフィルタリングの例です。フィルタリング句が knn クエリとは別であることを確認します。</p>{
  "query": {
    "bool": {
      "must": {
        "knn": {
          "field": "image-vector",
          "query_vector": [54, 10, -2],
          "k": 5,
          "num_candidates": 50
        }
      },
      "filter": {
        "term": {
          "file-type": "png"
        }
      }
    }
  }
}<p><a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/filter-search-results#post-filter">post-filter</a>を使用した knn 検索では、ポストフィルタリングも利用できます。</p>{
  "knn": {
    "field": "image-vector",
    "query_vector": [54, 10, 2],
    "k": 5,
    "num_candidates": 50
  },
  "post_filter": {
    "term": {
      "file-type": "png"
    }
  }
}<p>knn 検索では明示的なポストフィルター セクションを使用する必要があることに注意してください。ポストフィルターを使用しない場合、knn 検索はポストフィルターを実行する代わりに<a href="https://www.elastic.co/docs/solutions/search/vector/knn#_combine_approximate_knn_with_other_features">、最近傍の結果を他のクエリまたはフィルターと組み合わせます</a>。</p><h3>プレフィルタリング</h3><p>ベクトル検索の前にフィルターを適用すると、まずフィルターを満たすドキュメントが取得され、次にその情報がベクトル検索に渡されます。</p><p>Lucene は<a href="https://github.com/apache/lucene/blob/7a60d7ce92392181e137361336e5196bd486cdd9/lucene/core/src/java/org/apache/lucene/util/BitSet.java">BitSets</a>を使用して、フィルター条件を満たすドキュメントを効率的に保存します。次に、ベクトル検索は条件を満たすドキュメントを考慮して、HNSW グラフを走査します。候補を結果に追加する前に、それが有効なドキュメントの BitSet に含まれているかどうかを確認します。</p><p>ただし、有効なドキュメントでない場合でも、候補を調査してクエリと比較する必要があります。HNSW の有効性は、グラフ内のベクトル間の接続に依存します。つまり、候補の探索を停止すると、その近傍もスキップされる可能性があることを意味します。</p><p>ガソリンスタンドに行くために車を運転するのを想像してください。ガソリンスタンドのない道路を無視すると、目的地にたどり着く可能性は低くなります。他の道はあなたにとって必要なものではないかもしれませんが、目的地まであなたを<em>繋いで</em>くれます。HNSW グラフ上のベクトルも同様です。</p><p>したがって、プレフィルタリングを適用すると、フィルタを適用しない場合よりもパフォーマンスが低下します。検索で訪れる<em>すべての</em>ベクトルに対して作業を実行し、フィルターに一致しないベクトルを破棄する必要があります。私たちは、トップ k の結果を得るために、より多くの作業とより多くの時間をかけています。</p><p>以下は、Elasticsearch クエリ DSL での事前フィルタリングの例です。フィルタリング句が knn セクションの一部になっていることを確認します。</p>{
  "knn": {
    "field": "image-vector",
    "query_vector": [54, 10, -2],
    "k": 5,
    "num_candidates": 50,
    "filter": {
      "term": {
        "file-type": "png"
      }
    }
  }
}<p>事前フィルタリングは、 <a href="https://www.elastic.co/docs/solutions/search/vector/knn#knn-search-filter-example">knn 検索</a>と<a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query#knn-query-filtering">knn クエリの</a>両方で利用できます。</p>{
  "query": {
    "knn": {
      "field": "image-vector",
      "query_vector": [-5, 9, -12],
      "k": 5,
      "filter": {
        "term": {
          "file-type": "png"
        }
      }
    }
  }
}<h4>プレフィルタリングの最適化</h4><p>プレフィルタリングのパフォーマンスを確保するために適用できる最適化がいくつかあります。</p><p>フィルターの制限が厳しい場合は、完全一致検索に切り替えることができます。比較するベクトルが少ない場合は、フィルターを満たす少数のドキュメントに対して正確な検索を実行する方が高速です。</p><p>これは、 <a href="https://github.com/apache/lucene/blob/eb876b618da5d04c1ad14b04a48321638318493a/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L218">Lucene</a>および Elasticsearch で自動的に適用される最適化です。</p><p>別の最適化方法では、フィルターの条件を満たさないベクトルを無視します。代わりに、このメソッドは、フィルターを通過するフィルター処理されたベクトルの近傍をチェックします。このアプローチでは、フィルタリングされたベクトルは考慮されず、現在のパスに接続されたベクトルの探索が継続されるため、比較の回数が効果的に削減されます。</p><p>このアルゴリズムは ACORN-1 であり、そのプロセスについては<a href="https://www.elastic.co/search-labs/blog/filtered-hnsw-knn-search">こちらのブログ記事</a>で詳しく説明されています。</p><h2>ドキュメントレベルのセキュリティを使用したフィルタリング</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">ドキュメント レベル セキュリティ (DLS)</a>は、ユーザー ロールが取得できるドキュメントを指定する Elasticsearch 機能です。</p><p>DLS はクエリを使用して実行されます。ロールにはインデックスに関連付けられたクエリを持たせることができ、これにより、そのロールに属するユーザーがインデックスから取得できるドキュメントを効果的に制限できます。</p><p>ロール クエリは、<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">それに一致するドキュメントを取得する</a>ためのフィルターとして使用され、BitSet としてキャッシュされます。この BitSet は、基盤となる Lucene リーダーをラップするために使用されるため、クエリから返されたドキュメントのみが<em>ライブで</em>あると見なされます。つまり、それらのドキュメントはインデックス上に存在し、削除されていません。</p><p>knn クエリを実行するために<a href="https://github.com/apache/lucene/blob/a211d30097a8e3264d3ef073a054bd31eb847231/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L196">リーダーからライブ ドキュメントが取得される</a>ため、ユーザーが利用できるドキュメントのみが考慮されます。プレフィルターがある場合は、DLS ドキュメントが<a href="https://github.com/apache/lucene/blob/a211d30097a8e3264d3ef073a054bd31eb847231/lucene/core/src/java/org/apache/lucene/search/AbstractKnnVectorQuery.java#L204">それに追加され</a>ます。</p><p>つまり、DLS フィルタリングは、近似ベクトル検索のプレフィルタとして機能し、同じパフォーマンスへの影響と最適化を実現します。</p><p>完全一致検索を使用した DLS には、任意のフィルターを適用する場合と同じ利点があります。つまり、DLS から取得されるドキュメントが少ないほど、完全一致検索のパフォーマンスが向上します。DLS によって返されるドキュメントの数も考慮してください。DLS ロールの制限が非常に厳しい場合は、近似検索ではなく完全検索の使用を検討してください。</p><h2>ベンチマーク</h2><p>Elasticsearch では、ベクトル検索フィルタリングが効率的であることを確認したいと考えています。当社には、さまざまな<a href="https://elasticsearch-benchmarks.elastic.co/#tracks/so_vector/nightly/default/90d">フィルタリングを使用して近似ベクトル検索を実行するベクトル フィルタリング用の特定のベンチマーク</a>があり、ベクトル検索で関連する結果を可能な限り高速に取得し続けることができるようにします。</p><p>ACORN-1 が導入されたときの<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=()">改善点</a>を確認します。ベクトルの 2% のみがフィルターを通過するテストでは、クエリの待機時間は元の期間の 55% に短縮されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt820cb0b715cf291c/6a17e227dbb4ff8d49fb5615/3eac3748a33376fc97d957364a5c1f5108d5c58b-1023x896.png" alt="" /><h2>まとめ</h2><p>フィルタリングは検索の不可欠な部分です。ベクトル検索でフィルタリングのパフォーマンスを確保し、トレードオフと最適化を理解することが、効率的で正確な検索の成否を左右します。</p><p>フィルタリングはベクトル検索のパフォーマンスに影響します。</p><ul><li><p>フィルタリングを使用すると、正確な検索が高速になります。フィルタリングが十分に制限されている場合は、近似検索ではなく完全検索の使用を検討する必要があります。これは Elasticsearch での自動最適化です。</p></li><li><p>事前フィルタリングを使用すると近似検索が遅くなります。事前フィルタリングを使用すると、検索速度は遅くなりますが、フィルターに一致する上位 k 件の結果を取得できます。</p></li><li><p>ポストフィルタリングでは、フィルターの適用時にフィルターによってフィルタリングされる可能性があるため、必ずしも上位 k 件の結果が取得されるわけではありません。</p></li></ul><p>フィルタリングをお楽しみください！</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[Vector Database]]></category>
    <category><![CDATA[Lucene]]></category>
    <category><![CDATA[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>