Elastic検索:セマンティック検索エクスペリエンスの構築
概要
Elastic検索について
Elasticsearchと、Elastic Cloudでデータを取り込んで表示する方法の概要について理解を深めることができます。
Elasticを使い慣れてきたらベクトル検索を始めましょう。Elasticのベクトル検索は、"高密度"(kNNベクトル検索)と"低密度"(ElasticのLearned Sparse Encoder(ELSER)など)の2つの形態に分かれます。
Elasticにはさまざまな検索手法があり、テキスト検索の業界標準であるBM25も利用できます。詳細な検索に対して、キーワードとの完全一致をともなう高精度な一致結果を提供し、調整によって検索結果を改善します。
さらにElasticは、設定なしですぐにセマンティック検索を使用できるLearned Sparse Encoderも提供しています。このモデルは、財務データ、気象データ、質問と回答のペアなどのさまざまなデータセットに対応し、優れた結果を提供します。細かい調節をすることなく、領域を横断した関連性の高い検索が可能になるよう構築されています。
このインタラクティブなデモで、ElasticのテキストBM25アルゴリズムにElasticのLearned Sparse Encoderモデルを試すことによって検索結果の関連性がさらに高くなるしくみをご覧ください。
さらに、Elasticはテキスト以外の非構造化データ、たとえば動画、画像、音声などに対する類似検索の性能を向上させるために、高密度ベクトルにも対応しています。
セマンティック検索とベクトル検索のメリットは、お客様が検索クエリに直感的な言葉を使用できるということです。たとえば、副業に関する職場のガイドラインを検索する場合、人事のドキュメントで正式には使われているわけではない"ダブルワーク"という言葉でも検索することができます。
このガイドでは、Elastic Cloudアカウントを作成する方法、ElasticのWebクローラーでデータをインジェストする方法、数クリックでセマンティック検索を実装する方法を実演します。
データを取り込む
Elastic Cloudアカウントを作成する
14日間の無料トライアルを開始しましょう。cloud.elastic.coに移動して、アカウントを作成した後は、次の手順に従い、世界中の50以上の対象リージョンのいずれかで最初のElastic Stackを立ち上げる方法についてご覧ください。
[設定の編集]をクリックすると、AWS、Microsoft Azure、Google Cloudなどのクラウドプロバイダーを選択できます。クラウドプロバイダーを選択した後は、関連するリージョンを選択できます。次に、いくつかの異なるハードウェアプロファイルから選択し、ニーズに合わせてデプロイを効果的にカスタマイズできます。さらに、最新バージョンのElasticがあらかじめ選択されています。
デプロイの作成中に、ユーザー名とパスワードが表示されます。統合をインストールするときに必要になるため、必ずこの情報をコピーするかダウンロードしてください。
ElasticのWebクローラーでデータをインジェストする
デプロイを作成したら、データをElasticに取り込みましょう。そのためには、ElasticのWebクローラーを使います。まず、[セマンティック検索エクスペリエンスの構築]タイルを選択します。
次に、セマンティック検索を設定するために、以下のいずれかを開始できるページが表示されます。
- Elastic Learned Sparse Encoder
- ベクトル検索
- NLPエンリッチメント
これらをはじめとする機能はすべて、Elasticsearch Relevance Engine(ESRE)の一部です。
今回は、ガイドのテーマに沿ってElastic Learned Sparse Encoderとベクトル検索の両方でセマンティック検索を設定する方法を説明します。
注:セマンティック検索を使い始めて、テキストを検索する場合は、最初にElastic Learned Sparse Encoderガイドを参照してください。kNNベクトル検索ガイドは、以下の条件のユーザーに適している可能性が高いです。
- データサイエンスや、そのスキルセットにアクセスできる
- 組み込みのElastic Learned Sparse Encoderセマンティック検索モデルでは対応しきれないユースケースだと判断した
- 埋め込みモデルの比較や、場合によってはMLモデルの微調整の経験がある
- 高速なkNN検索には大量のRAMリソースが必要であると知っている
開始の準備が整ったら、AI検索のパワーを活かすアプリケーションを構築するためのお好みの方法を選択します。
どちらの方法でも、インデックスの作成を選択するところから始まります。ここからWebクローラーを選択して、データのインジェストを開始します。
Webクローラーを設定するには、このガイドツアーを確認するか、以下の指示に従ってください。
インデックスを作成します。今回は、ガイドのテーマに沿ってelastic.co全体のブログをインジェストします。
インデックスに名前を付けたら[インデックスの作成]を選択します。次にドメインを検証し、ドメインを追加します。
画面の右下でドメインを追加したら、[編集]を選択し、必要に応じてサブドメインを追加します。
次に、[クロールルール]を選択して、以下のようにクロールルールを追加します。*
次に、後でフィールドを選択する際、一部のフィールドでトークン数が512を超えます(body_contentなど)。そこで、抽出ルールを活用して、ブログの中でも関連性のある部分だけを絞り込みます。
抽出ルールを選択したら[コンテンツの抽出ルールの追加]をクリックします。
次に、ルールの説明画面で名前を付け、他の人もこのルールの抽出対象データを理解できるようにします。今回は、ガイドのテーマに沿って"main"と呼びます。
[すべてのURLに適用]、[コンテンツフィールドの追加]の順に選択すると、フライアウトが表示されます。フライアウトが表示されたら、次の条件を入力して選択します。
- ドキュメントのフィールド:
- フィールド名:main
- ソース:
- コンテンツの抽出元:HTML要素
- CSSセレクターまたはXPath式:main
- コンテンツ
- コンテンツの使用元:抽出された値
- 抽出されたコンテンツの格納形式:文字列
これらの条件を入力したら[保存]、[ルールの保存]の順にクリックします。
ElasticsearchとESREを使用する
Elastic Learned Sparse Encoderでデータをインジェストして検索する
ベクトル検索の開始にあたって求められる上記の推奨条件を確認し、その方法で問題なければ、左側の[kNNベクトル検索でデータを検索する]に移動して、指示に従います。
これではなく、Elasticのすぐに使えるセマンティック検索モデルであるElastic Learned Sparse Encoderを使用する場合は、次の指示をご確認ください。
これを行うには、パイプラインを選択してから画面上部の[コピーとカスタマイズ]を選択して、カスタムパイプラインを開放します。次に、[機械学習の推論パイプライン]で[デプロイ]を選択して、モデルをダウンロードし、お使いのElasticsearch環境にインストールします。
デプロイが完了したら、[単一スレッドで開始]、[+推論パイプラインの追加]の順に選択します。次に、以下を実行します。
- 新規または既存のパイプラインを選択する
- 名前を付ける
- 最後に、選択したトレーニング済みのMLモデルのドロップダウンで、[ELSERテキスト拡張]を選択し、[続行]をクリックします。
ここで、ELSERテキスト拡張を適用するフィールドを選択する必要があります。"title"と"main"をソースフィールドとして選択し、[追加]を選択します。
次に、[続行]をクリックします。
[パイプライン結果のテスト]のステップをスキップするために[続行]をクリックし、[パイプラインの作成]をクリックします。
これでパイプラインが作成されたので、右上の[クローリング]を選択してから[このインデックスのすべてのドメインをクローリング]を選択します。
ここからは、探している情報を検索してみましょう。これを行うために推奨される方法は2通りあります。
- 開発ツールを使用する
- アプリケーションのエンドポイントとして検索アプリケーション機能を活用する
それぞれ、次のような場面で使用します。
- (Webアプリケーションなどに)検索を実装しようとしている開発者である場合は、開発ツールを使用して、インデックス済みデータからの検索結果のテストと調整を行うとよいでしょう。
- 検索エンドポイントを作成して、検索リクエストを独自のアプリケーションから送信し、そのアプリケーションで検索結果を返す場合は、検索アプリケーション機能を使用するとよいでしょう。
次の2つの短い動画を確認して、開発ツールと検索アプリケーション機能の使い方についての概要をご覧ください。このガイドツアーでも同様のことを確認できます。
kNNベクトル検索でデータをインジェストして検索する
Elasticでは、環境全体でkNNベクトル検索を利用できます。上記のとおり、kNNベクトル検索ではテキストだけでなく、画像や音声なども横断的に検索できます。
Webクローラーでデータをインジェストしたら、Elasticsearchに埋め込みモデルを読み込ませて、データのベクトルを生成する必要があります。次の動画でその方法をご確認ください。
これを行うには、パイプラインを選択してから画面上部の[コピーとカスタマイズ]を選択して、カスタムパイプラインを開放します。次に、[機械学習の推論パイプライン]で[デプロイ]を選択して、モデルをダウンロードし、お使いのElasticsearch環境にインストールします。
デプロイが完了したら、[単一スレッドで開始]、[+推論パイプラインの追加]の順に選択します。次に、以下を実行します。
- 新規または既存のパイプラインを選択する
- 名前を付ける
- 最後に、選択したトレーニング済みのMLモデルのドロップダウンで、[高密度ベクトル検索の埋め込み]を選択し、[続行]をクリックします。
ここで、高密度なベクトルの埋め込みを適用するフィールドを選択する必要があります。Webクローラーを使用しているので、デフォルトで選択できるフィールドがいくつかあります。今回は、ガイドのテーマに沿って、新しいフィールドを開始するためにtitleを選択し、次に[続行]を選択します。
次に、[続行]、[パイプラインの作成]の順に選択します。
ここで、dense_vectorフィールドのマッピングを更新する必要があります(注:Elasticsearchバージョン8.8以降では、このステップは自動化されます)。
- ナビゲーションメニューで[開発ツール]をクリックします。開発ツールを始めて開く場合、フライアウトで[閉じる]をクリックする必要がある場合があります。
- コンソールタブの[開発ツール]で次のコードを使用して、kNNベクトルターゲットフィールド用のマッピングを更新します。これをコードボックスに貼り付けて、1行目の右にある小さな矢印をクリックするだけです。
POST search-blogs/_mapping
{
"properties": {
"title-vector": {
"type": "dense_vector",
"dims": 768,
"index": true,
"similarity": "dot_product"
}
}
}
"search-blogs"は、自分で付けたインデックス名に必ず置き換えてください。さらに、"title-vector"はベクトルの格納先となる場所の名前です。
これでパイプラインが作成されたので、右上の[クローリング]を選択してから[このインデックスのすべてのドメインをクローリング]を選択します。
最後に、kNNベクトル検索を実行して、探している情報を見つけてみましょう。これを行うには、開発ツールを利用します。次の動画でその方法をご確認ください。
次のステップ
Elastic Cloudを使用したデータのセマンティック検索を設定するためにお時間を割いていただき、ありがとうございました。Elasticの導入を始めるにあたって、環境全体でデプロイを行うときにユーザーとして管理すべき運用、セキュリティ、データの要素について理解しておいてください。