簡単な応答システムとチャットボットインターフェイスを連携する
STEP1で作った簡単な応答を行うプログラムとチャットボットを連携します。
チャットボットのインターフェイスが入力の受付や返答を行ってくれるので、AIプログラム側は入力された内容を受け取り、
チャットボットが受け取れる形にデータを加工して返却することで連携できます。
# 必要なモジュールをインポートする
import json
import cgi
# AIクラスをインポートする
from front_desk_ai import FrontDeskAi
# AIクラスをインスタンス化する
fron_desk_ai_obj = FrontDeskAi()
# 辞書情報を格納する
response_dict = fron_desk_ai_obj.readDict()
# サイト受付共通メッセージリストを格納する
common_res_list = fron_desk_ai_obj.res_message_list
# FieldStorageクラスをインスタンス化する
form = cgi.FieldStorage()
返却時に配列をJSON形式に変換するためのjsonモジュール、指定されたパラメータを受け取るためのcgiモジュールをインポートします。
また、返却に利用するメッセージ情報を格納したクラスをインポートします。ここで、辞書クラスとしていたものをAIクラスとしました。
AIクラスは個別のAI情報を生成します。AI受付は一人ではなく複数のキャラクターが会話に参加するようにしたいので、
AIクラスをキャラクター毎にインスタンス化することで複数のキャラクターオブジェクトを作るようにします。
オブジェクト指向っぽくなってきたでしょうか。キャラクターオブジェクトの話は、以降のSTEPで少しずつ説明していきます。
# パラメータが未入力の場合にエラーメッセージを返却する
if 'get_params' not in form:
get_text = 'パラメータエラーです。'
else:
# パラメータが存在する場合は、指定された値を取得する
# 念のため、未指定の場合の代替メッセージを設定する
get_text = form.getfirst('get_params', '未入力です。')
# 入力内容の制御文字を無効化する
get_text = cgi.escape(get_text)
# 応答メッセージを初期化する
responseMessage = ""
# 入力パラメータが辞書情報のキーに存在する場合は、設定された値を返却する
for response_key in response_dict:
if response_key in get_text:
responseMessage = response_dict[response_key]
break
# 辞書に含まれていない文字の指定の場合は、問い返す
if not responseMessage:
responseMessage = get_text + common_res_list[0]
# 返却配列を設定する
params = {'output':[
{
"type":"text",
"value":responseMessage
}
]
}
# 返却配列をJSON形式に変換する
json_encode_params = json.JSONEncoder().encode(params)
# 呼び出し側に加工したデータを返却する
print("Content-type: application/json")
print ("\r\n")
print (json_encode_params)
FieldStorageクラスをインスタンス化したものにはGET指定のパラメータが入っているので、
GET指定時のキーが存在するかチェックします。存在しない場合は、必須パラメータのためエラーメッセージを返却用変数に格納します。
キーが存在した場合は、GET指定された値を取得します。値が未指定の場合を考慮して、未指定の場合は「未入力です。」を設定します。
取得した入力情報が辞書情報のキーに一致するものがある場合は、辞書情報のキーに設定された値を返却用変数に格納します。
一致しない場合は、問い返す共通メッセージを返却用変数に格納します。
チャットボットインターフェイスが受け取るパラメータ配列を生成し、JSONエンコードでJSON形式に変換します。
画面側にJSON形式の情報として返却します。
辞書に登録するメッセージも少し手を加えました。リヨぐだ子っぽくなってきたでしょうか。
一人で辞書を作るにも限界はあるので、次は教えて貰った言葉を覚えるようにしましょう。
次回も楽しみに待っていただければ、幸いです。