Taste of Tech Topics

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

第49回Elasticsearch勉強会で、ElasticsearchによるNLP(質問応答)の発表をしてきました

こんにちは、@shin0higuchiです😊
先日、第49回Elasticsearch勉強会を開催しました。

私からは、Elasticsearch 8.3 で実装された、PyTorchモデルによる質問応答機能を紹介しました。
発表のスライドはこちらです。

www.slideshare.net
以下、発表の内容について簡単に説明します。

概要

「質問応答」とは?

今回の発表のテーマである「質問応答」とは、機械学習タスクのひとつで、
一般に、利用者の質問に対して適切な回答を自動で返すことを指します。

活用先の例としては、チャットボットで製品に関する質問に回答させることなどが考えられます。
この場合、質問に対する回答は製品マニュアルに書いてあるはずですので、マニュアル内の適切な箇所を抜き出して回答するのが良いと言えます。
※チャットボットの口調などはまた別の話になるので、ここでは扱いません。

たとえばユーザが「ネットに繋がらない」という質問をしたときに、
「インターネットに繋がらない場合は機器背面のボタンを長押しして再起動をしてください」という回答を返せば適切と言えるでしょう。


Elasticsearchは、 7.6で教師あり機械学習を利用できるようになって以降、
PyTorchモデルのインポートが可能になるなど自然言語処理周りの機能追加が続いており、8.3で質問応答がサポートされた形です。


Elasticsearchで質問応答を実現する仕組みは下図のようなイメージです。
製品マニュアルのような大量のデータから、質問文に対する回答となる箇所を適切に抽出する内容となります。

学習済みモデルの取り込み

Elasticsearchに機械学習モデルをインポートするためには eland というPythonライブラリを利用します。
github.com

eland は次のコマンドで簡単にインストールすることができます。

python -m pip install eland


elandをインストールすると、eland_import_hub_model コマンドが使えるようになります。
HuggingFace社が、様々な学習済みモデルをダウンロード可能なプラットフォームを提供しており、
elandでは公開済みモデルのIDを指定するだけで簡単にElasticsearchに取り込むことが可能です。
huggingface.co

  • deepset/tinyroberta-squad2 というモデルを取り込む場合のコマンド例
eland_import_hub_model --cloud-id xxxx -u ml_import_user -p xxxx --hub-model-id deepset/tinyroberta-squad2 --task-type question_answering 

※ ml_import_user というユーザーで、インポートしています。適宜書き換えてください。

モデルの利用

モデルは、KibanaのUIから、もしくはElasticserchのAPIを通じて実行可能です。

たとえば、Inference API は、以下のような形で利用することができます。

curl -XPOST "http://<host>:9200/_ml/trained_models/question-answering-demo/_infer?timeout=60s&pretty" -H "Content-Type: application/json" -H "Authorization: ApiKey xxxxxxxx" -d'
{
  "inference_config": {
    "question_answering": {
      "question": "ネットに繋がらない"
    }
  },
  "docs": [
    {
      "text_field": "「スリープ設定」で設定した時間内に操作しないと液晶モニターが消灯します。いずれかのボタンを押すと、復帰します。\n        インターネットに繋がらない場合は機器背面のボタンを長押しして再起動をしてください。それでも繋がらない場合はサポートカウンターまでお問い合わせください。\n        暗い場所では、液晶モニターの明るさを維持するためにノイズが出ることがあります。印刷に影響はありません。\n        2枚以上の連続プリントまたは周囲温度が高いところでのプリントは時間がかかることがあります。\n        印刷時にプチプチという音がすることがありますが、インク・紙の走行によるものであり異常ではありません。\n        パソコンで作成したフォルダ名に特殊文字が入っている場合、そのフォルダ内の画像は表示できません。フォルダ名を変更してください。 "
    }
  ]
}'

レスポンスは以下のような形式で返ってきます。

{
  "inference_results" : [
    {
      "predicted_value" : " インターネットに繋がらない場合は機器背面のボタンを長押しして再起動をしてください",
      "start_offset" : 72,
      "end_offset" : 113,
      "prediction_probability" : 0.702419152359398672
    }
  ]
}


以上のように、質問と情報源を渡すことで、回答を得ることができます。
通常の全文検索とはまた異なる方向の情報検索が実現でき、活用の可能性を感じますね。

今回は学習済みのモデルをそのまま取り込んで利用しましたが、
日本語での精度を改善したい場合や、ドメイン特有の文脈を上手く扱いたい場合などは、
転移学習と呼ばれる手法で、既存モデルを自身のユースケースにフィットさせてください。

転移学習そのものの方法は、ここでは割愛しますが、
TorchScriptと呼ばれる形式に変換したモデルを、下記のように取り込むことが可能です。

import eland as ed
from elasticsearch import Elasticsearch
from eland.ml.pytorch import PyTorchModel

es = Elasticsearch("http://ml_admin:xxxxxxxx@<host>:9200")
ptm = PyTorchModel(es, 'question-answering-demo')
ptm.import_model(model_path='/path/to/model', config_path='/path/to/config', vocab_path='/path/to/vocabfile', config=config)

詳細は下記のリンクをご確認ください。
GitHub - elastic/eland: Python Client and Toolkit for DataFrames, Big Data, Machine Learning and ETL in Elasticsearch


今後の期待

今回紹介した機能は、実装されたばかりの機能なので今後の改善に期待したい箇所もあります。
たとえば、現状はモデル実行に多少時間がかかる場合があります。こちらは 8.4 で推論時のキャッシュ利用や、推論時のスレッド数を並列化する改善が入っているようなので、その効果に期待したいところです。
また、現状は情報源となるドキュメントをリクエストに含める必要がありますが、インデックス内のドキュメントをまとめて指定できるようになると実用性が飛躍的に上がりそうです。

今後 Elasticsearch における検索の幅をより一層広げてくれるであろう NLP機能、今後も目が離せませんね。


ということで今回の記事は以上になります。最後までお読みいただきありがとうございました。


Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
Kaggle Grandmasterと一緒に働きたエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの採用 - Wantedlywww.wantedly.com