すべてのプロダクト
Search
ドキュメントセンター

Elasticsearch:Elasticsearch Machine Learning を使用してインテリジェントな質疑応答を実装する

最終更新日:Mar 21, 2025

このトピックでは、テキスト埋め込みモデルを使用してユーザーのクエリの詳細なセマンティック分析を実行する方法について説明します。 これにより、従来のキーワードベースのマッチングの制限を解消し、大量のデータから相関性の高いコンテンツを正確に抽出できます。 また、質疑応答モデルを使用して、相関テキストの詳細な解釈を実行し、テキストに関連する質問への回答を正確に提供する方法についても説明します。 テキスト埋め込みモデルと質疑応答モデルの組み合わせは、インテリジェントな検索エンジンや、パーソナライズされたレコメンデーションなどのシナリオで使用して、情報検索と質疑応答の精度を向上させることができます。

準備

モデルのアップロード

この例では、Hugging Face ライブラリの質疑応答モデル luhua/chinese_pretrain_mrc_macbert_large とテキスト埋め込みモデル thenlper/gte-large-zh を使用します。

中国本土のネットワーク経由での Hugging Face へのアクセスは低速です。 この例では、モデルはオフラインモードで Alibaba Cloud Elasticsearch にアップロードされます。

  1. モデルをダウンロードします。

  2. Elastic Compute Service (ECS) インスタンスにモデルをアップロードします。

  3. ECS インスタンスで次のコマンドを実行して、model フォルダ内のモデルを解凍します。

    cd /model/
    tar -xzvf luhua--chinese_pretrain_mrc_macbert_large.tar.gz
    tar -xzvf thenlper--gte-large-zh.tar.gz
    cd
  4. ECS インスタンスで次のコマンドを実行して、モデルを Elasticsearch クラスタにアップロードします。

    1. 次のコマンドを実行して、質疑応答モデルをアップロードします。

      eland_import_hub_model       
      --url 'http://es-cn-lbj3l7erv0009****.elasticsearch.aliyuncs.com:9200'       
      --hub-model-id '/model/root/.cache/huggingface/hub/models--luhua--chinese_pretrain_mrc_macbert_large/snapshots/f2d95d06f16a3043002c9702f66c834f4e0aa944'       
      --task-type question_answering       
      --es-username elastic       
      --es-password  ****       
      --es-model-id models--luhua--chinese_pretrain_mrc_macbert_large \
    2. 次のコマンドを実行して、テキスト埋め込みモデルをアップロードします。

      eland_import_hub_model       
      --url 'http://es-cn-lbj3l7erv0009****.elasticsearch.aliyuncs.com:9200'       
      --hub-model-id '/model/root/.cache/huggingface/hub/models--thenlper--gte-large-zh/snapshots/952432e6b99137bbfd8397d5ad92f920be5f22e9'       
      --task-type text_embedding       
      --es-username elastic       
      --es-password  ****       
      --es-model-id models--thenlper--gte-large-zh \

モデルのデプロイ

  1. Elasticsearch クラスタの Kibana コンソールにログインします。 詳細については、「Kibana コンソールにログインする」をご参照ください。

  2. Kibana コンソールの左上隅にある image アイコンをクリックします。 左側のナビゲーションウィンドウで、[分析] > [機械学習] を選択します。

  3. 表示されるページの左側のナビゲーションウィンドウで、[モデル管理] > [トレーニング済みモデル] を選択します。

  4. オプション。 [トレーニング済みモデル] ページの上部にある [ジョブとトレーニング済みモデルを同期] をクリックします。 表示されるパネルで、[同期] をクリックします。

  5. [トレーニング済みモデル] ページで、アップロードされたモデルを見つけ、image[アクション] 列の アイコンをクリックしてモデルを起動します。

    image

  6. 表示されるダイアログボックスで、モデルを構成し、[開始] をクリックします。

    ページの右下隅に [モデルが開始されました] というメッセージが表示された場合、モデルはデプロイされています。

    説明

    モデルを起動できない場合は、Elasticsearch クラスターのメモリが不足している可能性があります。Elasticsearch クラスターの構成をスペックアップした後に、モデルを再起動できます。エラーを通知するダイアログボックスで、[完全なエラーメッセージの表示] をクリックして、エラーの原因を表示できます。

モデルのテスト

  1. Kibana コンソールの左上隅にある image アイコンをクリックします。 左側のナビゲーションウィンドウで、[管理] > [開発ツール] を選択します。

  2. モデルをテストします。

    • 次のコマンドを実行して、質疑応答モデルをテストします。

      POST /_ml/trained_models/models--luhua--chinese_pretrain_mrc_macbert_large/_infer
      {
       "docs":[{"text_field": "コンピュータに複数のアンチウイルスソフトウェアをインストールする必要はありません。 2 つのアンチウイルスソフトウェアをインストールすると、コンピュータのセキュリティを向上させることができますが、複数の欠点があります。 たとえば、アンチウイルスソフトウェアは、リアルタイム保護中に大量のハードディスクリソースと CPU リソースなどのシステム ハードウェアリソースを占有するため、コンピュータのパフォーマンスが低下します。 2 つのアンチウイルスソフトウェアがウイルスを検出すると、関連システムが大量のリソースを占有するため、システムの動作能力に影響を与え、コンポーネントで誤検知が発生する可能性があります。"}]
       "inference_config": {"question_answering": {"question": "コンピュータに複数のアンチウイルスソフトウェアをインストールできますか?"}}
      }
      
      

      次の結果が返されます。これは期待どおりです。

      {
        "inference_results": [
          {
            "predicted_value": "コンピュータに複数のアンチウイルスソフトウェアをインストールする必要はありません。",
            "start_offset": 0,
            "end_offset": 4,
            "prediction_probability": 0.8775923604355836
          }
        ]
      }
    • 次のコマンドを実行して、テキスト埋め込みモデルをテストします。

      POST /_ml/trained_models/models--thenlper--gte-large-zh/_infer
      {
        "docs":[{"text_field": "コンピュータに複数のアンチウイルスソフトウェアをインストールする必要はありません。 2 つのアンチウイルスソフトウェアをインストールすると、コンピュータのセキュリティを向上させることができますが、複数の欠点があります。 たとえば、アンチウイルスソフトウェアは、リアルタイム保護中に大量のハードディスクリソースと CPU リソースなどのシステム ハードウェアリソースを占有するため、コンピュータのパフォーマンスが低下します。 2 つのアンチウイルスソフトウェアがウイルスを検出すると、関連システムが大量のリソースを占有するため、システムの動作能力に影響を与え、コンポーネントで誤検知が発生する可能性があります。"}]
      }

      次のデータを含む結果が返されます。これは期待どおりです。

      {
        "inference_results": [
          {
            "predicted_value": [
              1.389997959136963,
              -0.6398589611053467,
              -0.5746312737464905,
              -0.5629222393035889,
              -0.49914881587028503,
              0.5277091264724731,
              -1.2194437980651855,
              0.19847321510314941,
              ..............
              0.6711148619651794,
              1.6224931478500366,
              2.0970489978790283,
              -0.4506820738315582,
              -0.298383504152298
            ]
          }
        ]
      }

データセットの準備

データのインデックス作成中には、サンプルデータセットが必要です。

  1. サンプル データセットをダウンロードします。

    この例では、extracted_data.json データセットが使用されます。

  2. データセットを ECS インスタンスにアップロードします。 この例では、データセットは /model/ ディレクトリにアップロードされます。

手順 1: データのインデックス作成

  1. 取り込みパイプラインを使用して、インデックス内のモデルを構成し、データ書き込み中にテキスト変換を完了します。

    説明

    インデックス内の既存のデータをベクターに変換するには、モデルを使用する必要があります。詳細については、「ドキュメントの取り込み」をご参照ください。

    PUT _ingest/pipeline/text-embedding-pipeline
    {
      "processors": [
        {
          "inference": {
            "model_id": "models--thenlper--gte-large-zh",
            "target_field": "text_embedding",
            "field_map": {
              "context": "text_field"
            }
          }
        }
      ]
    }
    
    #####インデックスのマッピングを設定し、インジェスト パイプラインを指定します。
    PUT question_answering
    {
      "settings": {
        "index": {
              "number_of_shards": 2,
              "number_of_replicas": 1,
              "default_pipeline": "text-embedding-pipeline"
          }
      }, 
      "mappings": {
        "properties": {
          "text_embedding.predicted_value": {
            "type": "dense_vector",
            "dims": 1024,
            "index": true,
            "similarity": "l2_norm"
          },
          "context": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  2. Python 環境を使用して、準備したデータセットをインポートします。 この例では、Python 3.10 を使用します。

    # -*- coding:utf-8 -*-
    import json
    from pprint import pprint
    import os
    import time
    from elasticsearch import helpers
    import time
    from elasticsearch import Elasticsearch
    
    elastic_user="elastic"
    elastic_password="****"
    elastic_endpoint="es-cn-lbj3l7erv0009****.elasticsearch.aliyuncs.com"
    url = f"http://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200"
    es = Elasticsearch(url)
    print(es.info())
    with open('/model/extracted_data.json') as f:
     data_json = json.load(f)
    
    # インデックスを作成するドキュメントを準備します
    documents = []
    for doc in data_json:
     documents.append({
     "_index": "question_answering",
     "_source": doc,
     })
    
    # helpers.bulk を使用してインデックスを作成します
    helpers.bulk(es, documents)
    
    print("`question_answering` インデックスへのドキュメントのインデックス作成が完了しました!")
    time.sleep(5)

手順 2: Kibana コンソールでのデータの取得

「Alibaba Cloud Elasticsearch のユースケースは何ですか?」という質問を例として使用して、Elasticsearch クラスタの Kibana コンソールで取得を実行します。

  1. Kibana コンソールの左上隅にある image アイコンをクリックします。 左側のナビゲーションウィンドウで、[管理] > [開発ツール] を選択します。

  2. Alibaba Cloud Machine Learning の推論 API 操作を呼び出して、ドキュメントをベクトルデータに変換します。

    V8.7 以降の Elasticsearch クラスタ

    V8.7 以降の Elasticsearch クラスタを使用している場合は、query_vector_builder 構成オブジェクトを使用してクエリベクトルを構築できます。

    GET question_answering/_search
    {
      "_source": ["context","title"],
      "knn": {
        "field": "text_embedding.predicted_value",
        "k": 5,
        "num_candidates": 10,
        "query_vector_builder": {
          "text_embedding": { 
            "model_id": "models--thenlper--gte-large-zh", 
            "model_text": "Alibaba Cloud Elasticsearch のユースケースは何ですか?"
          }
        }
      }
    }

    次の結果が返されます。 結果は、最初の 5 つのドキュメントが Elasticsearch と高度に相関しており、最初のドキュメントでは主に Alibaba Cloud Elasticsearch について紹介していることを示しています。

    {
      "took": 30,
      "timed_out": false,
      "_shards": {
        "total": 2,
        "successful": 2,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": {
          "value": 5,
          "relation": "eq"
        },
        "max_score": 0.003581697,
        "hits": [
          {
            "_index": "question_answering",
            "_id": "evdbaI0BU_1of7kX5_Hn",
            "_score": 0.003581697,
            "_source": {
              "context": "Alibaba Cloud Elasticsearch は、オープンソースの Elasticsearch に基づいて開発されたフルマネージド クラウドサービスです。 このサービスは、オープンソースの Elasticsearch が提供する機能と完全に互換性があります。 すぐに使用でき、従量課金方式をサポートしています。 Elasticsearch、Logstash、Kibana、Beats などの Elastic Stack コンポーネントに加えて、Alibaba Cloud は Elastic とともに X-Pack プラグイン (オープンソースの Elasticsearch Platinum エディションの高度な機能) を無料で提供しています。 X-Pack は Kibana に統合されており、セキュリティ、アラート、モニタリング、機械学習などの機能を提供します。 また、SQL 機能も提供します。 Alibaba Cloud Elasticsearch は、リアルタイム ログ分析と処理、情報検索、多次元データクエリ、統計データ分析などのシナリオで広く使用されています。",
              "title": "Alibaba Cloud Elasticsearch ととは何ですか?"
            }
          },
          {
            "_index": "question_answering",
            "_id": "2VBdaI0Bg5EzGjIAN-Tx",
            "_score": 0.003581697,
            "_source": {
              "context": "Alibaba Cloud Elasticsearch は、オープンソースの Elasticsearch に基づいて開発されたフルマネージド クラウドサービスです。 このサービスは、オープンソースの Elasticsearch が提供する機能と完全に互換性があります。 すぐに使用でき、従量課金方式をサポートしています。 Elasticsearch、Logstash、Kibana、Beats などの Elastic Stack コンポーネントに加えて、Alibaba Cloud は Elastic とともに X-Pack プラグイン (オープンソースの Elasticsearch Platinum エディションの高度な機能) を無料で提供しています。 X-Pack は Kibana に統合されており、セキュリティ、アラート、モニタリング、機械学習などの機能を提供します。 また、SQL 機能も提供します。 Alibaba Cloud Elasticsearch は、リアルタイム ログ分析と処理、情報検索、多次元データクエリ、統計データ分析などのシナリオで広く使用されています。",
              "title": "Alibaba Cloud Elasticsearch ととは何ですか?"
            }
          },
          {
            "_index": "question_answering",
            "_id": "t49gaI0BNqB2ciGcDbmF",
            "_score": 0.003581697,
            "_source": {
              "context": "Alibaba Cloud Elasticsearch は、オープンソースの Elasticsearch に基づいて開発されたフルマネージド クラウドサービスです。 このサービスは、オープンソースの Elasticsearch が提供する機能と完全に互換性があります。 すぐに使用でき、従量課金方式をサポートしています。 Elasticsearch、Logstash、Kibana、Beats などの Elastic Stack コンポーネントに加えて、Alibaba Cloud は Elastic とともに X-Pack プラグイン (オープンソースの Elasticsearch Platinum エディションの高度な機能) を無料で提供しています。 X-Pack は Kibana に統合されており、セキュリティ、アラート、モニタリング、機械学習などの機能を提供します。 また、SQL 機能も提供します。 Alibaba Cloud Elasticsearch は、リアルタイム ログ分析と処理、情報検索、多次元データクエリ、統計データ分析などのシナリオで広く使用されています。",
              "title": "Alibaba Cloud Elasticsearch ととは何ですか?"
            }
          },
          {
            "_index": "question_answering",
            "_id": "efdbaI0BU_1of7kX5_Hn",
            "_score": 0.0027631863,
            "_source": {
              "context": "Kibana コンソールにログインする方法については、「Kibana コンソールにログインする」のトピックをご参照ください。 Kibana コンソールにログインするために使用できるユーザー名は elastic です。 パスワードは、Elasticsearch クラスタの作成時に指定したパスワードです。 パスワードを忘れた場合は、リセットできます。 パスワードをリセットする手順と注意事項については、「Elasticsearch クラスタのアクセス パスワードをリセットする」のトピックをご参照ください。",
              "title": "Kibana コンソールにログインするにはどうすればよいですか? Kibana コンソールにログインするために使用できるユーザー名とパスワードは何ですか?"
            }
          },
          {
            "_index": "question_answering",
            "_id": "2FBdaI0Bg5EzGjIAN-Tx",
            "_score": 0.0027631863,
            "_source": {
              "context": "Kibana コンソールにログインする方法については、「Kibana コンソールにログインする」のトピックをご参照ください。 Kibana コンソールにログインするために使用できるユーザー名は elastic です。 パスワードは、Elasticsearch クラスタの作成時に指定したパスワードです。 パスワードを忘れた場合は、リセットできます。 パスワードをリセットする手順と注意事項については、「Elasticsearch クラスタのアクセス パスワードをリセットする」のトピックをご参照ください。",
              "title": "Kibana コンソールにログインするにはどうすればよいですか? Kibana コンソールにログインするために使用できるユーザー名とパスワードは何ですか?"
            }
          }
        ]
      }
    }

    V8.7 より前の Elasticsearch クラスタ

    1. Elasticsearch Machine Learning の推論 API 操作を呼び出します。

      POST /_ml/trained_models/thenlper__gte-large-zh/_infer
      {
        "docs":[{"text_field": "Alibaba Cloud Elasticsearch のユースケースは何ですか?"}]
      }

      次の結果が返されます。

      image.png

    2. ベクトルデータをコピーし、kNN 検索 API を呼び出して、インデックス内で類似のドキュメントを検索します。

      GET question_answering/_search
      { 
        "_source": ["context","title"],
        "knn": {
          "field": "text_embedding.predicted_value",
          "k": 5,
          "num_candidates": 10,
          "query_vector": [
            0.2767493426799774,
            0.05577810853719711,
            0.2760164141654968,
            -0.9484721422195435,
            ..............
            0.8358230590820312,
            0.6053569316864014,
            -0.5380803942680359
          ]
        }
      }
  3. 最初のドキュメントの context パラメータの値をコピーし、質疑応答モデルを呼び出して質疑応答を実装します。

    POST /_ml/trained_models/models--luhua--chinese_pretrain_mrc_macbert_large/_infer
    {
      "docs":[{"text_field": "Alibaba Cloud Elasticsearch は、オープンソースの Elasticsearch に基づいて開発されたフルマネージド クラウドサービスです。 このサービスは、オープンソースの Elasticsearch が提供する機能と完全に互換性があります。 すぐに使用でき、従量課金方式をサポートしています。 Elasticsearch、Logstash、Kibana、Beats などの Elastic Stack コンポーネントに加えて、Alibaba Cloud は Elastic とともに X-Pack プラグイン (オープンソースの Elasticsearch Platinum エディションの高度な機能) を無料で提供しています。 X-Pack は Kibana に統合されており、セキュリティ、アラート、モニタリング、機械学習などの機能を提供します。 また、SQL 機能も提供します。 Alibaba Cloud Elasticsearch は、リアルタイム ログ分析と処理、情報検索、多次元データクエリ、統計データ分析などのシナリオで広く使用されています。"}]
      "inference_config": {"question_answering": {"question": "Alibaba Cloud Elasticsearch のユースケースは何ですか?"}}
    }

    次の結果が返されます。

    {
      "inference_results": [
        {
          "predicted_value": "リアルタイム ログ分析と処理",
          "start_offset": 220,
          "end_offset": 228,
          "prediction_probability": 0.014678373776954107
        }
      ]
    }

手順 3: 質疑応答シナリオのシミュレーション

ECS インスタンスで Python3 コマンドを実行して、Python 環境を読み込みます。 次に、次のコマンドを実行して、質疑応答シナリオをシミュレートします。

# -*- coding:utf-8  -*-
import json
from pprint import pprint
import os
import time
from elasticsearch import helpers
import time
from elasticsearch import Elasticsearch

elastic_user="elastic"
elastic_password="Es123456"
elastic_endpoint="es-cn-lbj3l7erv0009bz81.public.elasticsearch.aliyuncs.com"
url = f"http://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200"
es = Elasticsearch(url)

question = input("質問を入力してください: ")

query_args = {
    "field": "text_embedding.predicted_value",
    "k": 5,
    "num_candidates": 10,
    "query_vector_builder": {
        "text_embedding": {
            "model_id": "models--thenlper--gte-large-zh",
            "model_text": question
        }
    }
}

result=es.search(index="question_answering",source=["context","title"],knn=query_args)
# print(result["hits"]["hits"])
concatenated_content = ""
for hit in result["hits"]["hits"]:
    context=hit["_source"]["context"]
    concatenated_content += context+" "

#print(concatenated_content)
docs=[{"text_field": concatenated_content}]
inference_config= {"question_answering": {"question": question}}

response=es.ml.infer_trained_model(model_id="models--luhua--chinese_pretrain_mrc_macbert_large",docs=docs,inference_config=inference_config)
print("推論結果: ")
print(response["inference_results"][0]["predicted_value"])

次の結果が返されます。

質問を入力してください:
張家港高速鉄道駅の場所はどこですか?
推論結果:
張家港高速鉄道駅は、唐橋鎮の人民路の北、国道 204 号線の東側にあります。