こんにちは、荒井(@yutakarai)です。
いまは「AIを使ったチャットボット」と言えば、機械学習や深層学習技術を使ったチャットボットのことになります。
AIに大量の学習をさせることで、構文の構造や意図理解の自然言語処理技術も進んでいて、チャットボットがどんどん進化しています。
そんな中、がっちがちのルールベースのチャットボットは結構以前からありました。
今回は、AIMLの紹介と、AIMLを使ったルールベースのチャットボットの作り方をシリーズ全2回に分けて解説したいと思います。
シリース第1回目となるこの記事では、AIMLの紹介をします。
シリーズ第2回目はこちらからどうぞ。
AIMLとは
AIMLとは「Artificial Intelligence Markup Language」の略です。
AIMLは、AlicebotのOSSコミュニティとカーネギーメロン大学のRichard S. Wallace博士によって1995〜2000年に開発されました。
Artificial Linguistic Internet Computer Entity(A.L.I.C.E)に基づくチャットボットであるAlicebotに利用されたことでも知られています。
参考までに、
A.L.I.C.Eのダウンロードはこちらからできます。
最新のプログラム更新が2000年となっているので、かなり古いことがわかります。
AIMLのタグについて
AIMLにはかなり多くのタグがあり、細かな仕様の解説はここでは割愛しますが、AIMLのバージョン1.0と2.0でも違いがあったりしますので注意が必要です。
まず基本的なタグを紹介します。
<aiml>:AIMLドキュメントの開始と終了を定義します。
<category>:ナレッジベース(知識ベース)を定義します。
<pattern>:ユーザーが入力したものと一致するパターンを定義します。
<template>:ユーザーの入力に対するチャットボットの応答を定義します。
以下がサンプルです。
<aiml version = "1.0.1" encoding = "UTF-8"?> <category> <pattern>こんにちは</pattern> <template> こんにちは!! </template> </category> <category> <pattern>元気?</pattern> <template> 最高だぜ。 </template> </category> </aiml>
ボットとのやりとりは以下のようになります。
ユーザ:「こんにちは」
ボット:「こんにちは!!」
ユーザ:「元気?」
ボット:「最高だぜ。」
その他のよく利用するタグも紹介します。
<star>:<pattern>タグ内のワイルドカード文字を照合するために使用します。
<srai>:多目的タグ。他のカテゴリの呼び出し/一致に使用します。
<random>:ランダム応答をするために使用します。
<li>:複数の回答を表すために使用します。
<set>:AIML変数に値を設定します。
<get>:AIML変数に格納された値を取得するために使用します。
<that>:コンテキストに基づいて応答するために使用します。
<topic>:後で会話がそのコンテキストに基づいて行われるように、コンテキストを保存するために使用されます。
<think>:ユーザーに通知せずに変数を格納するために使用されます。
<condition>:プログラミング言語のswitch文に似ています。
こういったタグを適切に利用することで、チャットボットがユーザからの入力にマッチした応答をすることができあます。
タグの詳細については、こちらのページ(英語)をご参照ください。
実装の手順
AIMLルールベースチャットボットの実装の手順は以下になります。
- AIMLモジュールをインストールする
- 標準スタートアップファイルを作成する
- AIMLファイルの作成する
- AIMLファイルにランダム応答を入れる
- Pythonプログラムに組み込む
AIMLモジュールをインストールする
AIMLを使うために、まずはAIMLモジュールをインストールします。
PythonのバージョンによってAIMLモジュールのインストールコマンドが違います。
python 2の場合
pip install aiml
python 3の場合
pip install python-aiml
もしくは、
pip3 install python-aiml
標準スタートアップファイルを作成する
AIMLファイルをロードするための主要なエントリポイントとして、std-startup.xmlというスタートアップファイルを作成します。
以下がサンプルです。
ここでは、”LOAD AIML B”と入力されたときに動作するようにpatternタグに定義します。
<!-- std-startup.xml --> <aiml version="1.0.1" encoding="UTF-8"> <category> <!-- ユーザの入力とのマッチを定義 --> <!-- "LOAD AIML B"という入力にマッチ --> <pattern>LOAD AIML B</pattern> <!-- 対話テンプレートを定義 --> <!-- aimlファイルを指定 --> <template> <learn>basic_chat.aiml</learn> <!-- 同じようにaimlを追加できます --> </template> </category> </aiml>
AIMLファイルの作成する
上の例では、1つのパターンだけを処理するAIMLファイルを作成しました。
“LOAD AIML B”と入力されると、templateタグで定義したbasic_chat.aimlがロードされます。
次に、basic_chat.aiml内に対話フローを定義します。
以下がサンプルです。
<!-- basic_chat.aiml --> <aiml version = "1.0.1" encoding = "UTF-8"?> <category> <pattern>こんにちは</pattern> <template> こんにちは!! </template> </category> <category> <pattern>元気?</pattern> <template> 最高だぜ。 </template> </category> </aiml>
AIMLファイルにランダム応答を入れる
ランダムな応答を追加することもできます。
例えば、「私は」で始まるメッセージを受け取るとランダムに応答するようにします。
「*」はワイルドカードというもので、何にでもマッチします。
以下がサンプルです。
<category> <pattern>私は*</pattern> <template> <random> <li>こんにちは</li> <li>どうも</li> <li>ご機嫌いかがですか?</li> <li>もう少し詳しくお願いします</li> <li>ほんと?</li> <li>すみません、理解できませんでした</li> </random> </template> </category>
独自のAIMLファイルを定義するのは楽しいかもしれませんが、膨大な作業が必要です。
AIMLで作ったルールベースのチャットボットが、何かに特化した目的だとしても、AIMLの定義はかなり大きなものになるはずです。
まとめ
今回は、ルールベースのチャットボットを作る第1回目として、AIMLの紹介をしました。
実運用に適用するには
現実的な方法ではないということがわかっていただけたかと思います。
まぁでも、AIMLを知っていることで
いまの機械学習や深層学習のありがたみが増すと思いますので
もしよろしければ、おつきあいください。
このシリーズの第2回目は、このAIMLをPythonプログラムに組み込む方法を紹介します。