ゼファーネットのロゴ

RasaでFAQチャットボットを作成するにはどうすればよいですか?

日付:

ステッドフォース

この記事では、FAQを実装する方法を示します チャットボット よくある質問に答えてフォームに記入するためにRasaと一緒に。 フォームを操作するために、Rasaフレームワークと フォームポリシー は、大規模なダイアログを作成することなく、このタスク用のシンプルでありながらユーザーフレンドリーなボットを作成する簡単な方法を提供します。

記事「 Rasaを使用してチャットボットを作成する」簡単な作成方法を説明しました チャットボット ラサと。 Rasaをインストールして最初のプロジェクトを初期化する方法を示しました。 また、ボットと簡単な対話を行う方法についても説明しました。

このユースケースを示すために、ホテルの部屋を予約し、ホテルに関する基本的な質問に答えることができるチャットボットについて説明します。 例示的な実装は、で見つけることができます。 https://github.com/Steadforce/rasa_faq_form_bot。 この記事では、そこにある実装を使用したチャットボットの作成について説明します。

作成にはRasa1.8を使用しました。 この記事の執筆時点では、Rasa 2.0の最初のアルファ版のみが紹介されているため、Rasa2.0は対象外です。 まず、 チャットボット 質問に答える。

開始するには、を使用して空のフォルダでプロジェクトを初期化します ラサ CLI。 Rasaがまだインストールされておらず、初期プロジェクトの設定方法がわからない場合は、前のチュートリアルの手順に従うことができます。

プロジェクトの初期化後、ドメインの*インテント、ストーリー、および不要な構成を削除します。 これで、XNUMXつの質問のインテントが作成されました。 FAQ チャットボット ホテルの場所、外観、そこで可能な活動について質問することができます。 まず、data /nlu.mdの下のNLUデータ内にこれらを作成します。

ResponseSelectorを使用すると、RasaにはスモールトークやFAQの処理を簡素化する機能があります。 この機能は以下で使用されます。 この目的のために、NLUデータ内の質問は特別にマークされている必要があります。 質問はパターン##インテントに従う必要があります:faq / ask_ 。 ホテルの外観に関する質問を例として以下に示します。 ResponseSelectorを使用するには、少なくともXNUMXつのインテントを作成する必要があります。

##インテント:faq / ask_location
- ホテルはどこですか?
-どこであなたを見つけることができますか?
-ホテルはどこですか?
-ホテルはどの都市にありますか?
- ホテルはどこですか?

インテントを作成した後、応答、つまりユーザーのインテントに対するボットの反応を準備する必要があります。 これは、前の記事で説明したように、ドメイン内の応答を介して行われません。 domain.ymlファイルが混乱しすぎて構成が過負荷になるのを防ぐために、新しいresponses.mdをデータフォルダーに追加します。

このファイルでは、応答。 以前に定義された質問に生成されます。 応答はストーリーと同様に作成されますが、ユーザーとチャットボットをXNUMX回切り替えるだけです。

#場所を尋ねる 
* faq / ask_location
-ホテル「Tospeakingbot」はミュンヘンの中心部にあり、アルプスのパノラマの景色を眺めることができます。

ResponseSelectorの利点は、ストーリーの作成で明らかになりました。 個々の質問を扱う複数のストーリーを作成する必要はありません。 data / stories.mdの下のストーリー内では、すべてのFAQが同じように扱われ、それらの間に区別はありません。 これは、特に多くの異なるFAQを持つチャットボットにとって大きな利点になる可能性があります。

##よくある質問に関するいくつかの質問
* よくある質問
--respond_faq

最終的に、FAQチャットボットをコマンドrasa trainでトレーニングし、rasaシェルを介してテストできるように、意図的なFAQとドメイン(ファイル:domain.yml)の質問に答えるアクションを追加する必要があります。

1.チャットボットとEメールマーケティングの統合がビジネスにどのように役立つか

2.チャットボットが中小企業にとって次の大きなものになる理由

3.会話デザインへの私の旅

4.言語学習のための実用的なNLP

FAQチャットボットが簡単な質問に答えられるようになりました。 以下では、ボットが予約を受け入れることができるようにします。 これを行うために、Rasaはフォームに記入する可能性を提供します。 この記事では、 PoC 機能が制限されています。

エンティティ抽出を使用すると、Rasaは複雑なデータ型をフォームに入力する可能性を提供します。 これにより、「明日の午後14:00」などのユーザーデータを正しく解釈することができます。 詳細については、次のRasaのドキュメントを参照してください。 https://rasa.com/docs/rasa/nlu/entity-extraction.

Rasaでフォームに入力するには、最初にconfig.ymlのポリシーの下にrequiredFormPolicyを追加する必要があります。
次のステップは、domain.ymlファイル内のドメインに入力するフォームを追加することです。

フォーム:
--hotel_form

必要なポリシーが追加され、フォームがドメインに含まれます。 回答する質問と同様に、フォームに記入するプロセスを示すストーリーを生成します。 このために、最初にドメイン内にインテントrequest_roomを設定し、data /nlu.mdの下でトレーニングのサンプルコンテンツを定義します。

ここでは、XNUMXつの異なるバージョンのインテントを追加します。 最初のインテントには、部屋を予約する必要があるという情報のみが含まれています。

## intent:request_room 
-部屋を予約したい

もうXNUMXつの可能性は、すでにこのインテントにある情報を転送することです。 したがって、このインテント内でいわゆるエンティティを指定できます。 この例では、到着日がこの目的で使用されます。 この例の日付では、スロットとエンティティの名前が同じであることが重要です。 スロットとエンティティは、以降の手順で指定されます。

## intent:request_room 
-[11年02月2020日](日付)から利用できる部屋です。
-[10年03月2020日](日付)の部屋を予約したいのですが。

これらのXNUMXつのインテントにより、フォームの先頭にあるフィールドのXNUMXつに入力できるようになりました。 また、domain.ymlの下のドメインにもそれらを含めます。 この日付は最初にすでに指定されているため、フォームにさらに入力するときに、ユーザーは希望する日付を尋ねられません。

次に、フォームに入力するための最適なケースを示すストーリーを作成します。

##ハッピーパスを形成する 
* リクエストルーム
--hotel_form
--form {"name": "hotel_form"}
-form {"name":null}

iダイアログでフォームに入力するには、actions.py内にPythonクラスHotelFormを記述します。 このクラスはclassFormActionを継承し、requiered_slots、submit、slot_mappingsのXNUMXつのメソッド名を実装します。 各メソッドの目的とその実装を以下に説明します。

このメソッドは、ドメイン内で定義されているフォームの名前を返すだけです。 これにより、RasaはPythonクラスとドメイン内で定義されたフォームの間で*マッピングを実行できます。

def 名前(自己)->テキスト:
「hotel_form」を返す

必要なスロット

この静的メソッドは、フォームのすべての必須フィールド/スロットを返します。 これはリストとして行われます。 リストの順序は、チャットボットがユーザーに必須フィールドを要求する順序も定義します。 この例では、人数、到着日、宿泊日数、および部屋のタイプがフォームの必須フィールドです。

ユーザーの入力に基づいて、フィールドを必須として動的に定義することも可能です。 ユースケースは、子供が部屋で寝ている場合、ベビーベッドが必要かどうかの表示である可能性があります。 部屋で子供が寝ていない場合、この質問は不要であるため、質問されません。 ただし、この例では、動的な必須フィールドが含まれていないため、コードは次のようになります。

@静的メソッド
def required_slots(tracker:Tracker)-> List [Text]:
戻る[
"number_of_persons"、
"日付"、
「夜」、
"room_type"]

スロットを使用するには、ドメイン内のスロットの下にスロットを定義します。 これもdomain.ymlの下で行われます。 Dスロットの定義は、名前、データタイプ、および特別な場合にはスロットの可能な値を指定します。 この例では、スロットnumber_of_personsとroom_typeのみを示しています。

他のXNUMXつのスロットについては、正しいデータタイプを選択する必要があり、その場合の手順はfornumber_of_personsと同じです。 スロットroom_typeは、値の選択肢が限られているスロットの例です。 この時点で、ユーザーはXNUMXつのバリエーションから選択できます。これらは、ボットとのチャットでXNUMXつのボタンとして表示されます。

スロット:
number_of_persons:
タイプ:float
room_type:
タイプ:カテゴリ
値:
-ジュニア
-シニア

この方法に関連する変更を完了するには、FAQチャットボットがスロットを埋めるために尋ねる質問を準備する必要があります。 これらもドメイン内に作成する必要があります(ファイル:domain.yml)。 固定構造utter_askに従って設定する必要があります。 特別な要素はスロットroom_typeです。 ボタンとしてXNUMXつの選択オプションのみをユーザーに提供するために、次のようにこの応答を作成します。

utter_ask_room_type:
-テキスト:「どの部屋で寝たいですか。ジュニアスイートまたはシニアスイートですか?」
ボタン:
-タイトル:「ジュニアスイート」
ペイロード: '/ choice {"room_type": "Junior"}'
-タイトル:「シニアスイート」
ペイロード: '/ choice {"room_type": "Senior"}'

提出する

フォームが完全に入力されると、submitメソッドが実行されます。 予約の保存に使用できます。 この例では、アクションutter_submitのみを実行します。 このアクションは、ユーザーの入力を出力して確認します。

def submit(
自己、
ディスパッチャー:CollectingDispatcher、
トラッカー:トラッカー、
ドメイン:Dict [テキスト、任意]、
)->リスト[ディクト]:
dispatcher.utter_message(template = "utter_submit")
戻る[]

応答utter_submitを実行するには、ドメイン内で定義する必要があります。 応答テキスト内でスロット名を指定することにより、現在の値を出力することができます。 たとえば、room_typesの値を出力する場合、これは次のように実行されます。

「{room_type}スイートの予約を受け取りました。」

応答内では、現在の値で任意の数のスロットを出力できます。

スロットマッピング

slot_mappingと呼ばれるクラスの最後のメソッドを定義する前に、ドメインに別のインテントを追加する必要があります。 これは、ユーザーがフォームに入力するために実行する意図です。 このために、エンティティ番号、データ、日数、room_type、およびインテントインフォームをドメインに追加します。

意図:
-お知らせ
エンティティ:
-番号
-日付
- 日々
--room_type

次に、data /nlu.mdの下にそれぞれのエンティティを含むサンプルコンテンツを追加します。 エンティティroom_typeは、5つのボタンを選択して入力されるため、これは必要ありません。 正しいトレーニングのために、エンティティごとに少なくともXNUMXつの例を提供することをお勧めします。

## intent:inform
-私たちの[4](数)がいます
-[2](number)の部屋を探しています
-[03年05月2020日](日付)は私の到着日です
-[04/15/2023](日付)
-[4](日)日
-私は[1](日)日ホテルにいます

エンティティとスロットをドメインに追加し、トレーニング用にdata /nlu.md内にインテントを設定しました。 最後の方法は、エンティティからスロットへのマッピングです。ここでは非常に単純なバージョンです。 マッピングは、FormActionクラスのform_entityメソッドを使用して行われます。 パラメータとして、エンティティと可能なインテントのリストが渡されます。 マッピングはディクショナリ内で行われ、ディクショナリはメソッドによって返されます。

def slot_mappings(self)->
Dict [Text、Union [Dict、List [Dict [Text、Any]]]]:

return {
"number_of_persons":
[self.from_entity(entity = "number"、intent = ["inform"])]、
"日付":[self.from_entity(entity = "date"、intent = ["inform"])]、
"nights":[self.from_entity(entity = "days"、intent = ["inform"])]、
"room_type":
[self.from_entity(entity = "room_type"、intent = ["inform"])]、
}

FAQチャットボットの実行

チャットボットを正しく実行するために、Rasaのアクションサーバーを起動します。 開発者によって作成されたアクションは、このサーバー内で実行されます。 Rasa内でさらに複雑なアクションを作成できます。 たとえば、外部インターフェイスを統合して、アクション内で使用できます。 したがって、アクション内のエラーは、ボット自体が独立して実行されるため、ボット自体の終了にはつながりません。

コマンドrasarunactionを使用してサーバーを起動します。 パラメータ-pを使用標準ポート5055と異なる場合は、代替ポートを指定することもできます。

ここでrasaシェルを使用してチャットボットを起動した場合、フォームへの入力は機能しません。 これは、構成fileendpoints.ymlで、アクションサーバーとチャットボット自体のXNUMXつのサーバーをリンクする必要があるためです。 したがって、最初にコメントされた行を追加する必要があります。

action_endpoint:
URL: http://localhost:5055/webhook

これで、rasaシェルを使用したrasa trainによるトレーニング後に、チャットボットを使用できるようになりました。 ダイアログを埋めるためのダイアログの例を以下に示します。

*意図=ユーザーの意図。 たとえば、ユーザーが「昨日のテクノロジーニュースを見せて」と入力した場合、ユーザーの意図はテクノロジーのヘッドラインのリストを取得することです。 インテンションには、「showNews」などの名前、多くの場合動詞と名詞が付けられます。

*エンティティ/エンティティ=データモデリングでは、エンティティは、情報を保存または処理する明確に識別可能なオブジェクトです。

*(データ-)マッピング=異なるデータモデル間でデータ要素をマッピングするプロセス。 データマッピングは、さまざまな情報統合タスクの最初のステップとして必要です。

この記事では、簡単な質問に答えて予約するためのチャットボットを作成しました。 この実装には、エラー処理はまだ含まれていません。 これまでのところ、ボットは予期しない質問に反応できません。 また、予約時にユーザーが質問することはできません。

このチャットボットは、外部インターフェースを介して、または依存関係に基づいてスロットを埋める可能性も提供していません。 これらすべての問題に対して、Rasaは各状況に最適なチャットボットを作成するためのソリューションを提供できます。

コインスマート。 BesteBitcoin-ヨーロッパのBörse
Source: https://chatbotslife.com/how-to-create-a-faq-chatbot-with-rasa-fdefcf465bae?source=rss—-a49517e4c30b—4

スポット画像

最新のインテリジェンス

スポット画像