BERTを使用してカスタムFAQチャットボットを構築する

BERTを使ってFAQチャットボットを作る

チャットボットは、さまざまな目的のために多くの組織で使用される、ますます標準的で価値のあるインターフェースとなっています。顧客に個別の製品推奨を提供したり、クエリの解決のための24時間対応のカスタマーサポートを提供したり、顧客の予約をサポートしたりするなど、異なる産業で多くの応用が見つかっています。この記事では、お客様との対話を目的としたFAQチャットボットの作成プロセスについて説明します。FAQチャットボットは、特定のドメイン内の質問に対処し、事前定義された質問と対応する回答のリストを利用します。このタイプのチャットボットは、その基盤として意味的な質問マッチングを利用しています。

学習目標

  • BERTモデルの基礎を理解する
  • Elasticsearchとそのチャットボットへの適用を理解する
  • チャットボットの作成メカニズム
  • Elasticsearchにおけるインデックス作成とクエリ処理

この記事は、データサイエンスブログマラソンの一部として公開されました。

BERTとは何ですか?

BERT(Bidirectional Encoder Representations from Transformers)は、2018年にGoogleによって開発された大規模な言語モデルです。単方向モデルとは異なり、BERTはTransformerアーキテクチャに基づく双方向モデルです。文中の前後の単語を考慮して単語の文脈を理解することで、より包括的な理解を可能にします。

BERTには、NLPタスクにおいて最先端のパフォーマンスを達成できなかったという大きな課題がありました。主な問題は、トークンレベルの埋め込みがテキストの類似性に効果的に使用できなかったため、文の埋め込みを生成する際のパフォーマンスが低下するということです。

しかし、この課題に対処するために、Sentence-BERT(SBERT)が開発されました。SBERTは、Siamese Networkに基づいており、2つの文を一度に取り、BERTモデルを使用してトークンレベルの埋め込みを生成します。次に、各セットの埋め込みに対してプーリング層を適用して文の埋め込みを生成します。本記事では、文の埋め込みにSBERTを使用します。

Elastic Searchは、非常に強力で高いスケーラビリティを持ち、リアルタイムで大量のデータを処理するために設計されたオープンソースの検索および分析エンジンです。全文検索機能を提供するApache Luceneライブラリ上に開発されています。Elasticsearchは、複数のノードにわたる高度に分散したネットワークを提供するため、高い可用性と障害耐性を提供する高いスケーラビリティを持っています。また、柔軟で堅牢なRESTful APIも提供しており、HTTPリクエストを使用して検索エンジンとの対話を可能にします。さまざまなプログラミング言語をサポートし、簡単なアプリケーション統合のためのクライアントライブラリも提供しています。

この記事では、事前学習済みのBERTとElasticsearchを使用してFAQチャットボットを作成する方法を学びます。

ステップ1)SBERTライブラリのインストール

# Sentence Transformersライブラリをインストールします
pip install sentence-transformers

ステップ2)質問の埋め込みの生成

SBERTライブラリを使用して、事前定義された質問の埋め込みを取得します。各質問について、一般的なBERTトークンレベルの埋め込みと同じサイズ(768次元)のNumPy配列を生成します。

from sentence_transformers import SentenceTransformer

sent_transformer = SentenceTransformer("bert-base-nli-mean-tokens")

questions = [

    "会話スキルを向上させる方法は?",

    "インドの総督の任命は誰が決定するのですか?",

    "オンラインでお金を稼ぐ最良の方法は何ですか?",

    "インドの政府のトップは誰ですか?",

    "英語の会話スキルを向上させるにはどうすればよいですか?"

]

ques_embedd = sent_transformer.encode(questions)

ステップ3)Elasticsearchライブラリのインストール

pip install elasticsearch

ステップ4) Elasticsearchでインデックスを作成する

from elasticsearch import Elasticsearch


# elastic searchのためのpythonクライアントを定義する
es_client = Elasticsearch("localhost:9200")

INDEX_NAME = "chat_bot_index"


# numpy配列のインデックス次元(768)を定義する
dim_embedding = 768

def create_index() -> None:

    es_client.indices.delete(index=INDEX_NAME, ignore=404)

    es_client.indices.create(

        index=INDEX_NAME,

        ignore=400,

        body={

            "mappings": {

                "properties": {

                    "embedding": {

                        "type": "dense_vector",

                        "dims": dim_embedding,

                    },

                    "question": {

                        "type": "text",

                    },

                    "answer": {

                        "type": "text",

                    }

                }

            }

        }

    )



create_index()

elastic searchでインデックスを作成するプロセスは、他のデータベースのスキーマ定義のプロセスと非常に似ています。上記のコードでは、「chat_bot_index」という名前のインデックスを作成しました。このインデックスには、’embedding’、’question’、および’answer’という3つのフィールドと、それぞれのタイプ(’embeddings’には「dense_vector」、他の2つには「text」)が定義されています。

def indexing_q(qa_pairs: List[Dict[str, str]]) -> None:

  for pair in qa_pairs:
  
      ques = pair["question"]
  
      ans = pair["answer"]
  
      embedding = sent_transformer.encode(ques)[0].tolist()
  
          data = {
  
              "question": questi,
  
              "embedding": embedding,
  
              "answer": ans,
  
          }
  
          es_client.index(
  
              index=INDEX_NAME,
  
              body=data
  
          )
  
 

qa_pairs = [{

    "question": "会話スキルを向上させる方法は?",

    "answer": "もっと話す",

},{

    "question": "インドの総督の任命は誰が決めるのですか?",

    "answer": "インドの大統領",

},{

    "question": "英会話のスキルを向上させる方法は?",

    "answer": "もっと練習する",

}]

indexing_q(qa_pairs)

上記のコードでは、質問と回答のペアをelastic searchデータベースに質問の埋め込みとともにインデックス化しました。

ステップ6) Elasticsearchからのクエリ

ENCODER_BOOST = 10

def query_question(question: str, top_n: int=10) -> List[dict]:
  embedding = sentence_transformer.encode(question)[0].tolist()
      es_result = es_client.search(
          index=INDEX_NAME,
          body={
              "from": 0,
              "size": top_n,
              "_source": ["question", "answer"],
              "query": {
                  "script_score": {
                      "query": {
                          "match": {
                              "question": question
                          }
                      },
                      "script": {
                          "source": """
                              (cosineSimilarity(params.query_vector, "embedding") + 1)
                              * params.encoder_boost + _score
                          """,
                          "params": {
                              "query_vector": embedding,
                              "encoder_boost": ENCODER_BOOST,
                          },
                      },
                  }
              }
          }
      )
      hits = es_result["hits"]["hits"]
      clean_result = []
      for hit in hits:
          clean_result.append({
              "question": item["_source"]["question"],
              "answer": item["_source"]["answer"],
              "score": item["_score"],
          })
  return clean_result

query_question("英語を流暢に話す方法は?")#import csv

ESクエリを変更することで、埋め込みのcosine類似度スコアを計算するスコアリング関数を作成することができます。このスコアをESのBM25マッチングスコアと組み合わせます。埋め込みのcosine類似度の重み付けを調整するために、「ENCODER_BOOST」というハイパーパラメータを変更することができます。

結論

この記事では、SBERTとElasticsearchを使用してチャットボットを作成するアプリケーションについて説明しました。クエリの意図に基づいて事前定義された質問と回答のペアに基づいてクエリに応答するチャットボットを作成する方法について議論しました。

以下は、私たちの調査結果からの主なポイントです:

  1. チャットボット開発の領域でSBERTとElasticsearchの重要性を把握し、会話体験を向上させるためにそれらの機能を活用する。
  2. 質問の埋め込みを生成するためにSBERTを利用することで、その意味と文脈をより深く理解することができる。
  3. 質問と回答のペアを効率的に保存・整理するために、Elasticsearchを活用してインデックスを確立する。
  4. ユーザーの質問に基づいて最も関連性の高い回答を効果的に取得するために、Elasticsearchでのクエリプロセスを実証する。

よくある質問

この記事で表示されているメディアは、Analytics Vidhyaの所有ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

「パクストンAIの共同創業者兼CEO、タングイ・シャウ - インタビューシリーズ」

タングイ・ショウは、Paxton AIの共同創設者兼CEOであり、法的研究と起草の負担を軽減するためにGenerative AIを使用するプラ...

機械学習

3つの質問:大規模言語モデルについて、Jacob Andreasに聞く

CSAILの科学者は、最新の機械学習モデルを通じた自然言語処理の研究と、言語が他の種類の人工知能をどのように高めるかの調査...

人工知能

「コーネリスネットワークスのソフトウェアエンジニアリング担当副社長、ダグ・フラーラー氏 - インタビューシリーズ」

ソフトウェアエンジニアリングの副社長として、DougはCornelis Networksのソフトウェアスタック全体、Omni-Path Architecture...

人工知能

「トリントの創設者兼CEO、ジェフ・コフマンへのインタビューシリーズ」

ジェフ・コーフマンは、ABC、CBS、CBCニュースで30年のキャリアを持った後、Trintの創設者兼CEOとなりましたジェフは手作業の...

AIニュース

OpenAIのCEOであるSam Altman氏:AIの力が証明されるにつれて、仕事に関するリスクが生じる

OpenAIのCEOであるSam Altmanは、特に彼の作品であるChatGPTに関するAIの潜在的な危険性について公言してきました。最近のイ...

人工知能

「ジャスティン・マクギル、Content at Scaleの創設者兼CEO - インタビューシリーズ」

ジャスティンは2008年以来、起業家、イノベーター、マーケターとして活動しています彼は15年以上にわたりSEOマーケティングを...