AIが流行ってる今だからこそルールベースのチャットボットをAIMLで作ってみる【Python】その2

チャットボット

こんにちは、荒井(@yutakarai)です。

ルールベースのチャットボットをAIMLで作ってみるシリーズの第2回目です。

前回、以下の記事でAIMLの基本について解説しました。

AIが流行ってる今だからこそルールベースのチャットボットをAIMLで作ってみる【Python】その1
こんにちは、荒井(@yutakarai)です。いまは「AIを使ったチャットボット」と言えば、機械学習や深層学習技術を使ったチャットボットのことになります。AIに大量の学習をさせることで、構文の構造や意図理解の自然言語処理技術も進んで...

今回は、AIMLで作ったチャットボットをWEBシステムから使えるようにします。

ソースコードはGithubにあげてあります

Githubのリポジトリにソースコードを上げておきましたので必要があればご確認いただけたらと思います。

PythonのフレームワークFlaskを使う

Welcome | Flask  A Python Microframework 2018 10 25 16 56 34

チャットボットをWEBブラウザ上で動かすために、WEBシステムを準備します。

WEBシステムは、ユーザーから送られたリクエストに対して紐づけられた処理を実行します。
そして、実行した結果をレスポンスとしてユーザー側(WEBブラウザ)に返します。

今回は、Flaskを使います。

Flaskは、手軽にWEBシステムを作成することができるPythonのフレームワークです。

ディレクトリ構造

ディレクトリ構造について触れておきます。

全てのファイルをここで挙げても逆にわかりづらくなりますので、メインとなるプログラムとディレクトリ構造を記します。

ディレクトリ構造

chatbotAIML
aiml:AIMLファイル群を格納します
static:CSSやJSファイル群を格納します
templates:HTMLファイル群を格納します
main.py:最初に実行されるメインのプログラムです。

AIMLファイルを準備する

ルールベースのチャットボットの核となるAIMLについて、前回の記事で解説しました。

このサンプルでは
一から日本語のAIMLを作るのはものすごく時間がかかりますので、英語のみの会話とします。

英語のAIMLファイルは以下リポジトリから拝借しています。

sethuiyer/simple-chat-bot
A Simple Chatbot Application using Python and AIML (Artificial Intelligence Markup Language). - sethuiyer/simple-chat-bot

日本語でも同じような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で作るルールベースのチャットボットを紹介しました。
この記事が少しでも参考になるところがあれば嬉しいです。

チャットボットがビジネスの強い味方になる3つの活用ケース
こんにちは、荒井(@yutakarai)です。顧客のエンゲージメントに関して、ソーシャルメディアは間違いなく最高のマーケティングチャネルのひとつです。僕がソーシャルメディアに注目していることは、タイムリーに顧客と交流することで、より...