こんにちは、荒井(@yutakarai)です。
ルールベースのチャットボットをAIMLで作ってみるシリーズの第2回目です。
前回、以下の記事でAIMLの基本について解説しました。
今回は、AIMLで作ったチャットボットをWEBシステムから使えるようにします。
ソースコードはGithubにあげてあります
Githubのリポジトリにソースコードを上げておきましたので必要があればご確認いただけたらと思います。
PythonのフレームワークFlaskを使う
チャットボットをWEBブラウザ上で動かすために、WEBシステムを準備します。
WEBシステムは、ユーザーから送られたリクエストに対して紐づけられた処理を実行します。
そして、実行した結果をレスポンスとしてユーザー側(WEBブラウザ)に返します。
今回は、Flaskを使います。
Flaskは、手軽にWEBシステムを作成することができるPythonのフレームワークです。
ディレクトリ構造
ディレクトリ構造について触れておきます。
全てのファイルをここで挙げても逆にわかりづらくなりますので、メインとなるプログラムとディレクトリ構造を記します。
chatbotAIML
– aiml:AIMLファイル群を格納します
– static:CSSやJSファイル群を格納します
– templates:HTMLファイル群を格納します
main.py:最初に実行されるメインのプログラムです。
AIMLファイルを準備する
ルールベースのチャットボットの核となるAIMLについて、前回の記事で解説しました。
このサンプルでは
一から日本語のAIMLを作るのはものすごく時間がかかりますので、英語のみの会話とします。
英語のAIMLファイルは以下リポジトリから拝借しています。
日本語でも同じようなAIMLファイルがあったら需要あるかもしれませんね。
必要があれば(お時間に余裕があれば)、上記ファイルを日本語に書き換えていろいろいじってみるのも面白いと思います。
AIMLファイルは「aiml」ディレクトリに格納します。
メインプログラムを作る
最初に実行されるメインのプログラムを作ります。
まず、最初にアクセスされたときに動くプログラムを書きます。
@app.route("/") def chat(): return render_template('chat.html')
これは、ドキュメントルート(/)にアクセスされた場合
定義されているchatメソッドが実行されます。
Chatメソッドでは、chat.htmlを表示します。
chat.htmlは、templatesディレクトリに格納します。
chat.htmlの中身も解説すると、記事が長くなってしまうのでここでは割愛します。Githubのリポジトリを確認してみてください。
次に、ユーザーからメッセージが送信されたときに動くプログラムを書きます。
@app.route("/ask", methods=['POST']) def ask(): # メッセージを取得 message = str(request.form['messageText']) # AIMLカーネル kernel = aiml.Kernel() if os.path.isfile("bot_brain.brn"): kernel.bootstrap(brainFile = "bot_brain.brn") else: kernel.bootstrap(learnFiles = os.path.abspath("aiml/std-startup.xml"), commands = "load aiml b") kernel.saveBrain("bot_brain.brn") # kernel準備OK while True: if message == "quit": exit() elif message == "save": kernel.saveBrain("bot_brain.brn") else: bot_response = kernel.respond(message) # チャットボットの返答を返す return jsonify({'status':'OK','answer':bot_response})
chat.htmlの画面からユーザーがメッセージを送信すると、「/ask」にそのメッセージがPOSTされて渡ってきます。
すると、ここで定義されているaskメソッドが実行されます。
まずは、POSTで渡ってきたメッセージをmessage編集へ格納します。
# メッセージを取得 message = str(request.form['messageText'])
次に、AIMLカーネルの準備をします。
# AIMLカーネル kernel = aiml.Kernel() if os.path.isfile("bot_brain.brn"): kernel.bootstrap(brainFile = "bot_brain.brn") else: kernel.bootstrap(learnFiles = os.path.abspath("aiml/std-startup.xml"), commands = "load aiml b") kernel.saveBrain("bot_brain.brn")
AIMLカーネルというのは
AIMLファイルをまとめて応答の準備をするためのもの、と考えてもらえればと思います。
ここでは、「bot_brain.brn」というファイルを生成します。
すでに「bot_brain.brn」があればそのまま、
「bot_brain.brn」がなければ、AIMLファイル群を読み込んで、「bot_brain.brn」を生成します。
「bot_brain.brn」ファイルがAIMLカーネルの実体ということですね。
AIMLカーネルが準備できたら、ユーザーからのメッセージに返答します。
# kernel準備OK while True: if message == "quit": exit() elif message == "save": kernel.saveBrain("bot_brain.brn") else: bot_response = kernel.respond(message) # チャットボットの返答を返す return jsonify({'status':'OK','answer':bot_response})
JSON形式でchat.htmlへ返答を返します。
以下main.pyのソースコードの全体になります。
from flask import Flask, render_template, request, jsonify import aiml import os app = Flask(__name__) @app.route("/") def chat(): return render_template('chat.html') @app.route("/ask", methods=['POST']) def ask(): # メッセージを取得 message = str(request.form['messageText']) # AIMLカーネル kernel = aiml.Kernel() if os.path.isfile("bot_brain.brn"): kernel.bootstrap(brainFile = "bot_brain.brn") else: kernel.bootstrap(learnFiles = os.path.abspath("aiml/std-startup.xml"), commands = "load aiml b") kernel.saveBrain("bot_brain.brn") # kernel準備OK while True: if message == "quit": exit() elif message == "save": kernel.saveBrain("bot_brain.brn") else: bot_response = kernel.respond(message) # チャットボットの返答を返す return jsonify({'status':'OK','answer':bot_response}) if __name__ == "__main__": app.run(host='0.0.0.0', debug=True)
全体の動きは単純です。
POSTリクエストを待ち受け、リクエスとを受けたらレスポンスを返すというだけです。
AIMLファイルを更新したら
気をつける点がひとつあります。
AIMLファイルを更新しただけでは
チャットボットの返答内容は変わりません。
AIMLファイルを更新した場合は、bot_brain.brnファイルを削除する必要があります。
そして、main.pyを起動すると、更新されたAIMLファイルで新しいbot_brain.brnが生成されます。
そうすることで、更新された新しいAIMLファイルの内容でチャットボットが返答してくれるようになります。
まとめ
今回は、ルールベースチャットボットのWEBシステムをつくってみました。おおまかな流れを掴んでいただけたらと思います。
前回も書きましたが、このルールベースのチャットボットを実運用に適用するには現実的な方法ではありません。やりたいことが多くなるほど、チャットボットを作る手間も多くなります。
しかし、AIMLの仕組みを知ることで、機械学習や深層学習の理解度が高まるのは事実です。
全2回のシリーズでAIMLで作るルールベースのチャットボットを紹介しました。
この記事が少しでも参考になるところがあれば嬉しいです。