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とは何ですか?
Elastic Searchは、非常に強力で高いスケーラビリティを持ち、リアルタイムで大量のデータを処理するために設計されたオープンソースの検索および分析エンジンです。全文検索機能を提供するApache Luceneライブラリ上に開発されています。Elasticsearchは、複数のノードにわたる高度に分散したネットワークを提供するため、高い可用性と障害耐性を提供する高いスケーラビリティを持っています。また、柔軟で堅牢なRESTful APIも提供しており、HTTPリクエストを使用して検索エンジンとの対話を可能にします。さまざまなプログラミング言語をサポートし、簡単なアプリケーション統合のためのクライアントライブラリも提供しています。
BERTとElastic Searchを使用してチャットボットを作成する方法
この記事では、事前学習済みの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」)が定義されています。
ステップ5) Elasticsearchで質問と回答をインデックス化する
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を使用してチャットボットを作成するアプリケーションについて説明しました。クエリの意図に基づいて事前定義された質問と回答のペアに基づいてクエリに応答するチャットボットを作成する方法について議論しました。
以下は、私たちの調査結果からの主なポイントです:
- チャットボット開発の領域でSBERTとElasticsearchの重要性を把握し、会話体験を向上させるためにそれらの機能を活用する。
- 質問の埋め込みを生成するためにSBERTを利用することで、その意味と文脈をより深く理解することができる。
- 質問と回答のペアを効率的に保存・整理するために、Elasticsearchを活用してインデックスを確立する。
- ユーザーの質問に基づいて最も関連性の高い回答を効果的に取得するために、Elasticsearchでのクエリプロセスを実証する。
よくある質問
この記事で表示されているメディアは、Analytics Vidhyaの所有ではなく、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles