読者です 読者をやめる 読者になる 読者になる

UnityでBotが作れるアセット「Chatbot」を試してみました

UnityAssets Unity

最近、色々なところでコンピュータと人が自然言語で対話する仕組みを採用しました、のようなニュースを見ます。

japan.cnet.com

www.nri.com

こうやって、技術が進歩してくると、ゲームの世界でもキャラクターと自然に話ができるようになるのかな、と夢が膨らみます。

例えば、ゲームやアニメでは主人公にくっついているキャラがいて、そのキャラと話しかけるシーンがよくあります。

すでに連載終了してますが、ブリーチの斬魄刀とか、リボーンのボックスとか、もっと古いところだと、フルメタルパニックのアーバレストとか、、(知らない人にはわかりづらくてすいません、)

ゲーム面だと、AIはこういう方向に使えるような気がしています。AIのパートナーと一緒に会話しながらミッションをクリアするようなVRゲーム、こういうものがそのうち出るかもしれないですね。自分でも作ってみたいですし。


ということで、そういう対話ができる機能を作るにはどうするか、と思ってUnityのアセットで探してみたところ、このようなアセットを見つけました。

f:id:Takyu:20170304220448j:plain


これは、会話のパターンを多数組み込み、質問に合致する回答を返したり、質問の中に含まれるキーワードから、それっぽい回答を類推して返すという機能を実現できるアセットです。


以下、Chatbotの概要や、botを構成するAIMLの概要などを整理してみました。

=========

目次

1. Chatbotの概要

2. AIMLについて

3. AIML構文の代表的なタグ

4. AIMLの読み込み優先順位について

5. その他Tips

6. 終わりに

=========

1. Chatbotの概要

Chatbotとは、あらかじめ定義しておいた問い合わせと答えの組み合わせを用いて、任意の質問に対して瞬時に回答を返すアセットです。

問い合わせと答えは、AIML(Artificial Intelligence Markup Language)というマークアップ言語で定義されています。

AIMLについては後述しますので、まずはChatbotアセットの特徴を解説します。


[特徴1] 質問文を入力すると、あらかじめ登録しておいた構文と一致する文章を返す

Basicというサンプルシーンを実行すると、OnGUIベースのウインドウが出てきます。

f:id:Takyu:20170406085346p:plain

ここで、Helloと入力してSendボタンをクリックします。

f:id:Takyu:20170406085419p:plain


すると、このように返答が瞬時に表示されます。

f:id:Takyu:20170406085443p:plain

[特徴2] 質問文と完全一致する構文が登録されてなくても、部分一致やキーワード一致などで返答を返すことができる

例えば、登録されていない質問文である、「What do you think of VR?」を入力してSendを押してみます。

f:id:Takyu:20170406085455p:plain

すると、
f:id:Takyu:20170406085505p:plain

I haven't thought much about of VR, so I don't have a good answer for you.

(私は今までVRについてそれほど考えたことがなかったので、良い答えは持っていません)

という答えを返します。他にも色々なバリエーションがあります。


このように、予想外の質問が来ても自然な応答ができるので、AIMLで定義された問いと答えを充実させることで、より人間に近い応答が可能になります。

[特徴3] WindowsMacLinuxiOSAndroidWebGL向けにビルドすることができる。

iOSAndroid向けのビルドをするときは、使用するフォルダが変わります。これは5-4で後述します。

[特徴4] キャラクタアイコンに連動してチャットができる。

アセットに含まれているAdvanced Exampleというシーンを実行すると、チャットのやり取りに応じて、アイコンがアニメーションで動きます。

f:id:Takyu:20170406085516p:plain

f:id:Takyu:20170406085524p:plain

2. AIMLについて

(注)
以後、xmlライクなタグの表記について、"<"と">"をわざと大文字で表記しております。これははてなブログで"<"と">"を小文字表記するとHTMLタグと認識されて正しく表示されないためです。

マニュアルによると、AIMLとは、マークアップ言語の一種であり、Dr. Richard Wallaceによって1995年から2002年にかけて開発され、A.L.I.C.E(Artificial Linguistic Internet Computer Entity)というBotシステムに使われています。

A.L.I.C.Eについては下記を参照ください。

www.alicebot.org

このアセットでは、AIMLファイルは拡張子がaimlのファイルです。(iOSAndroidの場合はaimlを認識できないらしく、Unityプロジェクトの中で、拡張子xmlで定義されています)

AIMLファイルでは、問い合わせと回答のペアを<category>、問い合わせは<pattern>、回答は<template>で囲みます。

<category>
<pattern>WHO CREATED AIML</pattern>
<template>Dr. Richard S. Wallace created AIML.</template>
</category>

問い合わせ:WHO CREATED AIML
回答:Dr. Richard S. Wallace created AIML.

これが最もシンプルな記述方法です。

3.AIMLの代表的なタグ


2で説明した<category>、<pattern>、<template>以外にもいくつか書き方のルールがあります。

ここに代表的なタグの使い方が解説されていたので、このページの記載を元に整理しました。

www.tutorialspoint.com

3-1. <br>

改行です。

3-2. <set>、<get>

回答に応じて変数を設定、呼び出しする機能です。

例えば、下記の例では、<get name="name"/>として、"name"という文字列を取得して表示しようとしています。

<category><pattern>ACTIVATE THE ROBOT</pattern>
<template>Robot activated. Awaiting your command <get name="name"/>.</template>
</category>

しかし、ai.aimlでは、nameのタグで定義された文字列がありません。そのため、そのまま実行すると、このようにAwating your commandで回答文が終わります。

f:id:Takyu:20170408154705p:plain

f:id:Takyu:20170408154715p:plain


そこで、新しく<set name="name">Unity-chan</set>を含んだ質問と回答を追加します。

<category>
<pattern>OperationX</pattern>
<template>Roger, Sir. <think> <set name="name">Unity-chan</set> </think></template>
</category>


このあとUnity Editorを実行します。

まず、OperationXを入力します。

f:id:Takyu:20170408222614p:plain

元々定義した答えが表示されます。

f:id:Takyu:20170408222639p:plain

なお、

<think> <set name="name">Unity-chan</set>

は答えには表示されません。

続いて、ACTIVATE THE ROBOTを入力します。

f:id:Takyu:20170408222755p:plain

すると、<get name="name"/>で"name"で定義された"Unity-chan"を呼び出すことで、答えの文章に"Unity-chan"が追加されています。

f:id:Takyu:20170408222802p:plain

これを応用することで、特定の答えがあった時だけ展開される会話シナリオを作ることが可能です。

3-3. <think>

上記で解説済みですが、このタグで囲んだ範囲は実行画面では見えなくなります。

「この会話の時だけフラグを立てる」のようなときの条件設定に使えそうです。また、公式マニュアルでは、<set>、<get>とセットで使っています。

3-4. <that>

このタグで囲むと、相手の返答に対応した応答を追加できます。

例えば、下記の文例をai.aimlに追加します。

<category>
      <pattern>HOW ABOUT MOVIE</pattern>
      <template>Do you like comedy movies</template>  
</category>
   
<category>
      <pattern>YES</pattern>
      <that>Do you like comedy movies</that>
      <template>Nice, I like comedy movies too.</template>
</category>
   
<category>
      <pattern>NO</pattern>
      <that>Do you like comedy movies</that>
      <template>Ok! But I like comedy movies.</template>
</category> 

最初の会話では、HOW ABOUT MOVIE(映画を見るのはどう?)という質問に対して、「Do you like comedy movies」(ではコメディ映画はどう?)と答えています。

「コメディ映画はどう?」の返答はYes/Noです。そこで、<that>に質問文を書き、その上で想定される答えを<pattern>で定義します。
あとは、<pattern>で回答を定義しておけば、単純な<pattern>と<template>よりも細かいシナリオ定義が可能になります。

3-5. <star>

質問に含んだアスタリスクと同じ単語を設定します。このアスタリスク正規表現に対応しているため、この質問の型にハマりそうな文章が来たら、一律同じ表現として扱うことができます。

<category>
   <pattern> A * is a *. </pattern>
   
   <template>
      When a <star index = "1"/> is not a <star index = "2"/>?
   </template>

このようなaimlの文章があった場合、

質問(というより問いかけ):A mango is a fruits.
回答 :When a mango is not a fruits?

という会話が成立します。

なお、<pattern>タグの中に"*"が一つしかない場合、<star />のみで良いです。

3-6. <srai>

このタグで囲むと、類似の質問や回答をまとめて記述することができます。いくつか機能があるので個別に解説します。

3-6-1. Symbolic Reduction

質問の意味は同じだけど文章が異なる場合に使います。例えば、下記2つは文としては異なりますが、聞きたいことは同じです。

Who was Albert Einstein?

DO YOU KNOW WHO Albert Einstein IS?

こういうとき、個別に同じ回答パターンを書くのは冗長なので、記述を減らすことができます。

例えばこのように書きます。

<!-- [1]-->
   <category>
      <pattern> WHO IS ALBERT EINSTEIN </pattern>
      <template>Albert Einstein was a German physicist.</template>
   </category>
  
<!-- [2]-->
   <category>
      <pattern> WHO IS Isaac NEWTON </pattern>
      <template>Isaac Newton was a English physicist and mathematician.</template>
   </category>
<!-- [3]-->   
   <category>
      <pattern>DO YOU KNOW WHO * IS</pattern>
      <template>
         <srai>WHO IS <star/></srai>
      </template>
   </category>

この場合、Who is xx?と聞かれる場合には、[1]、[2]のいずれかが使われます。

もしDo you know who xx is ?と聞かれる場合は、[3]が使われ、回答の<template>で<srai>タグの質問、すなわち[1]、[2]に飛びます。

3-6-2. Divide and Conquer

最初に決まった単語が含まれていれば、その後の文章が異なっていても同一の返答を返すことができます。例えば、下記2つの問い合わせに対して、同じ回答をしたい場合を考えます。

問い合わせ:Bye
botの回答: GoodBye!

問い合わせ: Bye Alice!
botの回答: GoodBye!

このように表現します。

<!--[1] -->
<category>
      <pattern>BYE</pattern>
      <template>Good Bye!</template>
   </category>

<!--[2] -->   
   <category>
      <pattern>BYE *</pattern>
      <template>
         <srai>BYE</srai>
      </template>
   </category>

BYE、だけが来れば[1]の処理で完結しますが、BYE Unity-chanのように、他の単語がつく場合は[2]の処理に飛びます。

3-6-3. Synonyms Resolution

同じ回答を返したいときに使います。例えば、下記の2つは、Factory、Industoryのどちらを聞かれても同じ回答をしています。

問い合わせ: Factory
botの回答: Development Center!

問い合わせ: Industry
botの回答: Development Center!

このように表現します。

<!--[1] -->
   <category>
      <pattern>FACTORY</pattern>
      <template>Development Center!</template>
   </category>

<!--[2] -->   
   <category>
      <pattern>INDUSTRY</pattern>
      <template>
         <srai>FACTORY</srai>
      </template>
   </category>

FACTORYが問い合わせの場合は[1]で完結しますが、INDUSTORYが来ると、[2]を経由して[1]が使われます。

3-6-4. Keywords Detection

文章に特定のキーワードが含まれていたら、どの場所にあっても同じ回答を返すことができます。「Divide and Conquer」は冒頭にキーワードがある場合に限定していたので、より広くまとめることができます。

例えば、下記の例では"school"という言葉が文の途中や文末に出て来ていますが、回答は同じです。

問い合わせ:  I love going to school daily.
botの回答: School is an important institution in a child's life.

問い合わせ: I like my school.
botの回答: School is an important institution in a child's life.

同じ回答にするには、このように表現します。

<!-- 基本形 -->
<category>
   <pattern>SCHOOL</pattern>
   <template>School is an important institution in a child's life.</template>
</category>

<category>
   <pattern>_ SCHOOL</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>_ SCHOOL</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>SCHOOL *</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>_ SCHOOL *</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>


"_"が冒頭の任意の文字列、"*"が末尾の任意の文字列を意味します。"_と"*"を混ぜたpatternを複数記述して<srai>で誘導することで、"school"が文中に含まれている問い合わせに対して、決まった応答を返すことができます。

3-6-5. <random>

このタグで囲むと、複数の回答候補の中からランダムに回答を表示できます。

<category>
	<pattern>WHAT IS YOUR FAVORITE MOVIE ABOUT ROBOTS</pattern>
	<template>
		<random> 
			<li>2001.</li> 
			<li> Terminator.</li> 
			<li> Short Circuit</li> 
			<li> Conceiving Ada </li>
			<li>AI</li> 
		</random></template>
</category>


このように記述すると、<li>で囲んだ候補からランダムな回答を表示します。

3-6-6. <topic>


このタグで囲むと、特定のキーワードをトリガーにして、Chatbotが決められた範囲の応答をします。

<!-- [1] 最初に"topic"の変数を設定する。ここでは会話の中でmoviesを変数の値として設定している-->
   <category>
      <pattern>LET DISCUSS MOVIES</pattern>
      <template>Yes <set name = "topic">movies</set></template>  
   </category>
 
<!-- [2] moviesの変数を実行した後は、この2パターンのいずれかの回答を返す -->  
   <topic name = "movies">
      <category>
         <pattern> * </pattern>
         <template>Watching good movie refreshes our minds.</template>
      </category>
      
      <category>
         <pattern> I LIKE WATCHING COMEDY! </pattern>
         <template>I like comedy movies too.</template>
      </category>
      
   </topic>

このように書くと、LET DISCUSS MOVIESという問い合わせをした後は、2パターンの回答を返すようになります。

3-6-7. <conditon>

このタグで囲むと、いわゆる、switch-caseのような処理が実現できます。

同じ質問をされるたびに、順番に返答したい場合に使います。

<category><pattern>PERSONALITY TEST QUESTION</pattern>
<template><condition name="eindex"> 
  <li value="1A">Do you get angry alot?<think> <set name="eindex">1B</set></think></li>
  <li value="1B">Do you like to have everything organized?<think> <set name="eindex">2A</set></think></li>
   <li value="2A">Do you make a lot of sacrifices for others?<think> <set name="eindex">2B</set></think></li>
  <li value="2B">Do you laugh or cry more than other people?<think> <set name="eindex">3A</set></think></li>
   <li value="3A">Are you very competitive?<think> <set name="eindex">3B</set></think></li>
  <li value="3B">Do you like to be number one?<think> <set name="eindex">4A</set></think></li>
   <li value="4A">Are you very creative?<think> <set name="eindex">4B</set></think></li>
  <!-- 4Bはvalueで定義されていない。この場合、一番下の文章が使われる-->
   <li>Do you like to "go with the flow?<think> <set name="eindex">1A</set></think></li>
    </condition></template>
</category>

<template>である回答文に、<condition name="eindex">を書き、set nameで"eindex"の値を指定します。

すると、PERSONALITY TEST QUESTIONという質問があると、最初はvalue="1A"に相当する、Do you get angry alot?が回答になります。

しかし、ここでeindex="1B"が指定されているので、もう一度PERSONALITY TEST QUESTIONがあると、今度はDo you like to have everything organized?が回答になります。以後、"2A"、"2B"、、と続きます。

"4B"はないので、ここでvalueがないDo you like to "go with the flow?が呼ばれて、再び"1A"に戻ります。

4. AIMLの読み込み優先順位について

3で解説したように、AIMLには多数のタグがあります。また、多数の問いと答えを書くことで、似たような文章があるときにどれが優先されるのかがわからなくなります。

実際、自分で作った構文を追加したとき、指定した答えとは別の答えが返ってきたことが何度かありました。

aimlファイルの数が多くなったり、未調査の文法があるとまた話が変わる可能性がありますが、今回調べた範囲では以下のようなルールで問い合わせに対する回答が表示されました。

4-1. 一つのaimlファイルの中では、後ろに書いた<category>が優先される

まず、Assets / Program # / aiml の中で、ai.aiml以外を全て削除しました。

次に、ai.aimlファイルの中身を先頭のxml,aiml定義以外削除しました。この時点ではこうなります。

<?xml version="1.0" encoding="utf-8"?/>
<aiml version="1.0">
</aiml>

ここで、2種類の<category>を追加しました。こうなります。

<?xml version="1.0" encoding="utf-8"?/>
<aiml version="1.0">
<category>
  <pattern>WHAT IS YOUR FAVORITE MOVIE ABOUT ROBOTS</pattern>
     <template><random>
	  <li>2001.</li>
	  <li> Terminator.</li>
          <li> Short Circuit</li>
	  <li> Conceiving Ada </li>
	   <li>AI</li>
         </random></template>
</category>

<category>
	<pattern>WHAT IS YOUR FAVORITE MOVIE ABOUT ROBOTS</pattern>
	<template> Hahaha </template>
</category>
</aiml>


Unity Editorで実行し、WHAT IS YOUR FAVORITE MOVIE ABOUT ROBOTSを入力しました。5回実行しましたが、全て回答はHahahaでした。

次に、<category>の順番をひっくり返しました。

<?xml version="1.0" encoding="utf-8"?/>
<aiml version="1.0">
<category>
	<pattern>WHAT IS YOUR FAVORITE MOVIE ABOUT ROBOTS</pattern>
	<template> Hahaha </template>
</category>

<category>
  <pattern>WHAT IS YOUR FAVORITE MOVIE ABOUT ROBOTS</pattern>
     <template><random>
	  <li>2001.</li>
	  <li> Terminator.</li>
          <li> Short Circuit</li>
	  <li> Conceiving Ada </li>
	   <li>AI</li>
         </random></template>
</category>
</aiml>

Unity Editorで実行し、WHAT IS YOUR FAVORITE MOVIE ABOUT ROBOTSを入力しました。5回実行したところ、全て結果が<random>で囲まれてた回答になりました。


このことから、aimlファイルの<category>はファイルの末尾から読まれると考えられます。

4-2. 一つのaimlファイルの中で同一の質問文があるとき、ワイルドカードの"*"の優先度は低くなる


4-1と同じく、aimlフォルダはai.aimlのみです。以下の構文を作成しました。

<?xml version="1.0" encoding="utf-8"?/>
<aiml version="1.0">
<category><pattern>TELL ME ABOUT THE ROBOT</pattern>
<template>The Robot is a natural language chatterbot, that talks to people on the Internet.</template>
</category>

<category><pattern>TELL ME ABOUT *</pattern>
<template>Asterisk is valid</template>
</category>
</aiml>

Unity Editorで実行しました。

"TELL ME ABOUT"を入力とした

=> 回答は何も表示されず。

"TELL ME ABOUT a"を入力とした

=> Asterisc is validが表示された。

"TELL ME ABOUT THE ROBOT"を入力とした

=> The Robot is a natural language chatterbot, that talks to people on the Internet. が表示された。


このことから、"*"よりは文章の完全一致が優先されるようです。

4-3. <srai>タグで囲まれたキーワードを含む文章があると、完全一致の文章よりも優先度が高くなる

4-1と同じく、aimlフォルダはai.aimlのみです。以下の構文を作成しました。

<?xml version="1.0" encoding="utf-8"?/>
<aiml version="1.0">

<category>
 <pattern>The school is the best building in Japan</pattern>
  <template>Yes, I think so.</template>
</category>

<!-- shcoolが入っていると必ず決まった回答になる例:ここから-->
<category>
   <pattern>SCHOOL</pattern>
   <template>School is an important institution in a child's life.</template>
</category>

<category>
   <pattern>_ SCHOOL</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>_ SCHOOL</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>SCHOOL *</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>_ SCHOOL *</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>
<!-- shcoolが入っていると必ず決まった回答になる例:ここまで-->
</aiml>

Unity Editorで実行し、The school is the best building in Japanを入力すると、常にSchool is an important institution in a child's life.が表示されました。


次に、<srai>を使う塊を先頭にしました。

<?xml version="1.0" encoding="utf-8"?/>
<aiml version="1.0">

<!-- shcoolが入っていると必ず決まった回答になる例:ここから-->
<category>
   <pattern>SCHOOL</pattern>
   <template>School is an important institution in a child's life.</template>
</category>

<category>
   <pattern>_ SCHOOL</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>_ SCHOOL</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>SCHOOL *</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>

<category>
   <pattern>_ SCHOOL *</pattern>
   <template>
      <srai>SCHOOL</srai>
   </template>
</category>
<!-- shcoolが入っていると必ず決まった回答になる例:ここまで-->

<category>
 <pattern>The school is the best building in Japan</pattern>
  <template>Yes, I think so.</template>
</category>

Unity Editorで実行し、The school is the best building in Japanを入力すると、やはり、常にSchool is an important institution in a child's life.が表示されました。


このことから、<srai>で定義されたキーワードがあると、完全一致の文章よりも<srai>の中で定義された回答が優先されるようです。

4-4. 複数のaimlファイルに同じ問い合わせがあると、ファイル名のアルファベットが後ろの方が優先度が高くなる

4-1とは異なり、aimlフォルダにはai.aimlと、alice.aimlを準備して、下記の構文を作りました。

<!-- ai.aiml-->
<?xml version="1.0" encoding="utf-8"?/>
<aiml version="1.0">
<category>
 <pattern>The school is the best building in Japan</pattern>
  <template>Yes, I think so</template>
</category>

</aiml>
<!-- alice.aiml-->
<?xml version="1.0" encoding="utf-8"?/>
<aiml version="1.0">
<category>
 <pattern>The school is the best building in Japan</pattern>
  <template>No, I don't</template>
</category>
</aiml>


Unity Editorで実行し、The school is the best building in Japanを入力すると、常にNo, I don'tが表示されました。


次に、ai.aimlのファイル名をbot.aimlに変更しました。中身は同じです。

同じくUnity Editorで実行し、The school is the best building in Japanを入力すると、今度は常にYes, I think soが表示されました。

今回、2つのファイルの内容は同一で、相違点はファイル名だけです。そのため、同一ファイル名に同じ問い合わせがある場合、アルファベットの後ろの方が優先度が高くなるようです。



5. その他Tips

5-1. ビルドするプラットフォームによっては設定変更が必要

PC(Windows,Mac,Linux)向け、WebPlayer、WebGL向けにビルドするときは、Other Settingsで、.NETを選択してください。

f:id:Takyu:20170406061912p:plain

5-2. BasicシーンとAdvancedシーンの違い

Basicシーンでは、AIMLTestChat.csがユーザーの入力を受けて、AIMLエンジンによる返答をOnGUIで表示しています。

Advancedシーンでは、同等のスクリプトは、SimpleEmotionChat.csです。

このシーンでは応答に応じてキャラクタの表情を変更させるようになっています。
また、

5-3. Jurassicは自分で改変可能

JurassicSource.zip、およびJurassicDll.zipを解凍し、下記のように整理すると改変できる環境が整います。

f:id:Takyu:20170406060305p:plain

f:id:Takyu:20170406060314p:plain

Chatbot_4_DLLフォルダにはslnが含まれているので、Visual StudioMonoDevelopで開きます。

なお、readmeによると、現状のソースコードは、MonoDevelop4.0.1でコンパイルされています。

ただし、マニュアルをみる限り、jurassicを変えることで新しいAIができるというものではなさそうです。

5-4. AIMLファイルの格納場所は、プラットフォームによって異なる

Assetsフォルダ以下には質問と回答をAIML形式で記述したファイルがありますが、PC、WebGL系とiOSAndroid系で使用するフォルダが異なります。

【PC、WebGL系】

Chatbot/Program #/aiml

Chatbot/Program #/config


iOSAndroid系】

Chatbot/Resources/Chatbot/Program #/aiml

Chatbot/Resources/Chatbot/Program #/config

5-5. 起動時間を短くする方法

Chatbotアセットの入ったUnityプロジェクトを実行すると、起動時間が長くなります。

MacBook Pro(Late2016)上のUnity Editorでは数秒なので気になりませんが、低スペックのAndroid端末だと1分近くかかりました。

これは起動時に、aimlファイルを多数読み込んでいるためです。

aimlファイルは、Chatbot/Program/aimlフォルダにあります。シンプルですが、このフォルダの中からaimlファイル(iOS,Androidの場合はxml)を削除すると、それらが読み込まれなくなるので、起動時間が早くなります。

ただし、当然ですが Chatbotが答えられる質問が減るので、文章を打ち込んでも何も返ってこないことがありえます。


ちなみに、config/settings.xmlに以下の記載があります。

<item name="aimlfilesforwebplayer" value="ai.aiml,alice.aiml,astrology.aiml,atomic.aiml,badanswer.aiml,biography.aiml,bot.aiml,bot_profile.aiml,client.aiml,client_profile.aiml,computers.aiml,continuation.aiml,date.aiml,default.aiml,drugs.aiml,emotion.aiml,food.aiml,geography.aiml,history.aiml,humor.aiml,imponderables.aiml,inquiry.aiml,interjection.aiml,iu.aiml,knowledge.aiml,literature.aiml,loebner10.aiml,money.aiml,movies.aiml,mp0.aiml,mp1.aiml,mp2.aiml,mp3.aiml,mp4.aiml,mp5.aiml,mp6.aiml,music.aiml,numbers.aiml,personality.aiml,phone.aiml,pickup.aiml,politics.aiml,primeminister.aiml,primitive-math.aiml,psychology.aiml,pyschology.aiml,reduction0.safe.aiml,reduction1.safe.aiml,reduction2.safe.aiml,reduction3.safe.aiml,reduction4.safe.aiml,reductions-update.aiml,religion.aiml,salutations.aiml,science.aiml,sex.aiml,sports.aiml,stack.aiml,stories.aiml,that.aiml,update_mccormick.aiml,update1.aiml,wallace.aiml,xfind.aiml"/>
  

タグにwebplayerと記載があるせいか、ここの中身を削除してもaimlファイルは読み込まれていました。

6. 終わりに

当初、Chatbotアセットについて整理するだけにする予定でしたが、元となるAIMLに関する情報が見当たらなかったので、その辺りを整理していたら全体の量が多くなってしまいました。

今回初めてAIMLについて調べました。何か特殊なアルゴリズムで会話の推定をしているというよりは、構文のパターンをルールベースで当てはめているという印象を持ちました。

Chatbotアセットは英語しか対応しておらず、日本語を入力しても何も返答が返ってきませんが、少し調整することによって日本語への対応も可能である気がします。

実際、Docomo APIの「シナリオ対話API」の説明を見ると、シナリオ作成にAIMLを使っていることが記載されています。

dev.smt.docomo.ne.jp


もう少し調べても良いのですが、すでにブログ記事が相当長くなってしまったので、別の機会にしたいと思います。