Pandorabotsでルールベースのチャットボット作成

## Pandorabots の概要

[Pandorabots](https://www.pandorabots.com)とは、[A.L.I.C.E.](https://ja.wikipedia.org/wiki/Artificial_Linguistic_Internet_Computer_Entity)という一時期最強を誇ったチャットボットの作者であるRichard Wallace氏が設立に関わった、元祖？チャットボットのホスティングサービスです。

基本的に、RESTコマンドで、ボットの作成から対話までほぼ全て行います。ただ、[Playground](https://playground.pandorabots.com/)という、無料でAIMLファイルをアップロードして、対話をテストできるWeb環境が用意されています。Playgroundには、REST APIは一切用意されていませんし、ボットサービスへ設定を連携する手段はありません。本格的に運用する際には、PlaygroundからAIMLファイルをダウンロードしてから、有料サービスの[AIaaS(chatbot.io)](https://developer.pandorabots.com)にて、REST経由でボット作成、設定、AIMLファイル等のアップロード、対話という一連の操作を行います。本番運用ではPandorabotsのAIaaSを使わず、AIMLファイル単体での動作を確認するためにPlaygroundだけ使うという手もあります。

[AIaaS(chatbot.io)](https://developer.pandorabots.com)は、2017年末時点で、Developerプラン(ボット10個、10,000コール、ボットの規模に制限は無し)で月額9ドルです。10日間無料で利用できますが、無料期間であっても、クレジットカードを登録(して中の人が承認)しないとボットを作成できません。

本記事では、前半でPlaygroundを使って簡単なAIMLファイルの対話を確認し、後半でAIaaSサービスに登録してREST経由でボットを作成し、対話してみます。

## Playground を使ってみる

https://playground.pandorabots.com/ にアクセスしてサインアップします。

![signup.png](https://qiita-image-store.s3.amazonaws.com/0/10290/df695dc0-bb3e-3c24-1a02-f4cb69acb26e.png)

### ボットの作成

サインアップが終わり、ログインすると、以下の画面が表示されます。

![mybot_new.png](https://qiita-image-store.s3.amazonaws.com/0/10290/ae8a36be-96eb-bf74-3c39-baf79106229e.png)

まだボットが作成されていないため、`create`というリンクをクリックして、最初のボットを作成します。

![botcreation.png](https://qiita-image-store.s3.amazonaws.com/0/10290/82f4155d-6f39-3f11-1187-46ea446ecbf5.png)

ボットの名前と、言語を指定します。ただ、Japaneseを選択しても、分かち書きがされないようですので、あまり意味がないかもしれません。

### ボットの設定(デフォルトAIMLファイルの編集)

![new.png](https://qiita-image-store.s3.amazonaws.com/0/10290/e6636d4b-b524-c960-e801-65328c30dbbd.png)

作成直後は、このような画面になっています。**Files** 、**Train** の順番にタブを使っていきます。まず、`Files`タブをクリックします。

![editor.png](https://qiita-image-store.s3.amazonaws.com/0/10290/3102d395-52d5-1a48-b833-1aa9b6bcc69e.png)

左側のツリー状メニューの`udc`というリンクをクリックします。

![スクリーンショット 2017-11-12 22.36.01.png](https://qiita-image-store.s3.amazonaws.com/0/10290/29ecd1de-b6ca-e970-b7cd-23ce73b0d7ed.png)

エディタが開きます。[AIML入門記事](https://qiita.com/makopo/items/de161a1377296b998d8b)を参考に、AIMLを記述します。

よくわからなければ、とりあえずこんな感じで編集して、保存アイコンをクリックします。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<aiml>
  <category> 
    <pattern>こんにちは</pattern> 
    <template>ども</template> 
  </category> 
  <category>
    <pattern>*</pattern>
    <template>よくわかりません</template>
  </category>
</aiml>
```

`Your changes have successfully been saved to udc.aiml`という緑のメッセージが画面上部に出てこれば、保存に成功しています。

### ボットの設定(AIMLファイルのアップロード)

AIMLファイルが既に手元にある場合は、アップロードアイコンをクリックすると、ファイルをアップロードできます。

![editor.png](https://qiita-image-store.s3.amazonaws.com/0/10290/3102d395-52d5-1a48-b833-1aa9b6bcc69e.png)


### ボットの訓練

`Train`タブをクリックします。

![train.png](https://qiita-image-store.s3.amazonaws.com/0/10290/f3dbee67-03da-3330-652c-fbe25b1f6852.png)

テキストボックスに何か入力して、横の`Ask`ボタンをクリックします。

> Sarafiの場合、`Ask`ボタンをクリックしても反応がない場合があります。その場合は、Chromeなど別のブラウザを使いましょう。

![train2.png](https://qiita-image-store.s3.amazonaws.com/0/10290/6588f9e0-ec90-7c92-1d9e-ad36c6522e9a.png)

画面下部に、発言、マッチしたpattern、ボットの返答が表示されます。その表示の下のテキストボックスは、入力して`Say Instead`ボタンをクリックすると、ボットの返答が上書きされる、というものです。

![uwagaki.png](https://qiita-image-store.s3.amazonaws.com/0/10290/62a1da69-8584-6b84-61bc-ae7518ab0f9a.png)

`pand_learn`というAIMLファイルが自動で生成され、上書きされた挙動は、そこに記録されます。

### AIMLファイルのエクスポート

エディタ画面に表示されているダウンロードアイコンをクリックすると、ZIPがダウンロードされます。

![download.png](https://qiita-image-store.s3.amazonaws.com/0/10290/ca1f5577-fdcd-52af-5aea-f4177a611798.png)

> どのファイルをエディタで開いた状態でダウンロードしても、ZIPには、ボットで使用する全てのAIMLファイルや設定ファイルが含まれます。

## AIaaSサービスを使ってみる

Developerプランにサインアップします。

![signup.png](https://qiita-image-store.s3.amazonaws.com/0/10290/83ec7934-bd87-2ca3-083f-f34ea06dd4f8.png)

登録後にメールが届きます。クレジットカード情報を登録します。承認されたらまたメールが届きます。これで、晴れて利用可能となります。

### アプリのプロパティの確認

アプリ一覧に、アプリが1個表示されているはずです。

![apps.png](https://qiita-image-store.s3.amazonaws.com/0/10290/87a2dd87-8f4f-4d2f-49d4-4cd3851142f3.png)

アプリ名のリンクをクリックすると、アプリのプロパティ画面が出てきます。

![app.png](https://qiita-image-store.s3.amazonaws.com/0/10290/b87561db-4602-4b2a-25b3-6db7021a19ea.png)

これ以上の詳細は画面では表示されませんし、操作もできません。アプリの中にボットを登録し、その中にAIMLファイルで定義したルールを登録するのですが、画面からはボット一覧すら参照できません。

`User Key`と`Application ID`の内容は、どこかに控えておきます。あとで使います。

### ボットの作成〜設定

REST APIで実行します。
https://developer.pandorabots.com/docs#activedocs

`APP_ID`には`Application ID`で控えた内容、`USER_KEY`は`User Key`で控えた内容、`BOTNAME`には、ボットの名前としたい任意の文字列、`INPUT`はボットに話しかける内容に置き換えてください。

* ボットの作成

```
curl -v  -X PUT 'https://aiaas.pandorabots.com/bot/APP_ID/BOTNAME?user_key=USER_KEY'
```

* AIMLファイルのアップロード

```
curl -v -X PUT 'https://aiaas.pandorabots.com/bot/APP_ID/BOTNAME/file/udc.aiml?user_key=USER_KEY' --data-binary @/ダウンロードしたZIPを展開した場所/udc.aiml
```

* コンパイル

```
curl -v  -X GET 'https://aiaas.pandorabots.com/bot/APP_ID/BOTNAME/verify?user_key=USER_KEY'
```

* 対話

```
curl -v  -X POST 'https://aiaas.pandorabots.com/talk/APP_ID/BOTNAME?user_key=USER_KEY&input=INPUT'
```

うまくいけば、このようにボットから返事が返ってきます。

```json
{ "status": "ok", "responses": ["Hi there!"], "sessionid": 23253265 }
```

[A.L.I.C.E. AIML Set](https://code.google.com/archive/p/aiml-en-us-foundation-alice/) の全てのAIMLを含んだ`alice`というボットを作成する[サンプルシェル](https://gist.github.com/Makopo/c6109d1b2c95631448d53fd3f8c8972c)を作成しましたので、RESTリクエストの書き方のご参考になれば。

> AIaaSサービスから退会する場合は、「Messages」のところから運営宛にメッセージを書いて送ります。タイトルに「Subscription Cancellation Request」、本文に「I want to finish my subscription. Thank you.」とでも書いておけば良いでしょう。運営が確認次第、即日登録解除されるようです。

## 参考サイト

公式チュートリアル
https://playground.pandorabots.com/en/tutorial/
AIML2.0の仕様や、Pandorabotでの解釈優先順も記載されています。