Repl-AI上でチャットボットを作るための簡易リファレンス

本記事では、[Repl-AI](https://repl-ai.jp)におけるボットの作り方を解説していきます。公式チュートリアルもあるので、そちらも参照して下さい。

- [公式チュートリアル](https://repl-ai.jp/tutorial/overview)
- [APIリファレンス](https://repl-ai.jp/references/dialogue)


## 対話内容の記述方法について
GUIエディタツールを利用して作成します。公式チュートリアルに詳しいので割愛。

## 条件分岐について
### ユーザ発話による条件分岐
Repl-AIでは、基本的に __ユーザ発話__ によってシナリオを分岐させていきます。
一つのシステム発話ボックスの後ろにユーザ発話ボックスを複数接続し、それぞれの発話候補を分けることで、ユーザの発話に応じてボットが発話する内容を振り分けていきます。

### システム発話ボックス内での条件分岐
Repl-AIで作成するボットはユーザ毎に変数を定義できますが([公式チュートリアル:ボットに情報を覚えさせよう](https://repl-ai.jp/tutorial/learning))、この変数を利用して、一つのユーザ発話ボックスに対して、システム発話を振り分けることが出来ます。

- OR条件の指定
	- `|`で区切る事によって記述可能です
- And条件の指定
	- システム発話ボックスを複数つなぎ合わせ、それぞれに条件を設定することで記述可能になります。


__変数の型について__
定義した変数は全て文字列として扱われます。

## ランダム返答について
システム発話ボックスでは、ボットの返答内容を複数記述できますが、実際の返答はその中からランダムに決定されます。

## 文章のマッチングについて
### 基本的なマッチング原則
デフォルトでは、曖昧性を排除したマッチングになっています。発話候補として入力した文字列を比較してマッチングします。曖昧性の吸収や、文章に含まれる単語でマッチングさせたい場合は、「部分一致機能」や「曖昧一致機能」を利用して下さい。

### 部分一致、曖昧一致について
  - __部分一致機能__
    文章の中に入力した発話が含まれていればマッチングする機能です。
       - 例えば、「食べたい」と入力した場合は、「ハンバーグが食べたい」「今私が食べたい料理はハンバーグだ」などの文章にもマッチングします。

  - __曖昧一致機能__
    入力した発話の概念を解釈し、似たような言葉にもマッチングするようにできる機能です。
	※あくまでシステムが自動で補完してくれるものになります。自身でカスタマイズしたい場合は、辞書機能を利用して下さい。
	
### 辞書機能について
発話の揺らぎ吸収機能のカスタマイズとして、発話のかたまりを辞書として定義することが出来ます。挨拶の表現は多岐にわたりますが、辞書で「こんにちは」という代表単語の配下にその様々な表現を登録することで、発話候補作成時には「こんにちは」と入れておくだけで多様な表現を吸収してくれます。


## Repl-AI Facebook Messenger連携仕様

### Repl-AI上での連携手順
  1. 自分のFacebookページを作成する
  1. Repl-AIのボット一覧画面のページにアクセス
  1. 連携させるボットのセクションにあるFacebook連携ボタンをクリック
  1. Facebookログインが求められるので、OKを押下
  1. 自分のページとボット内のシナリオIDが表示されるので、連携させるページと、会話を開始させたいシナリオを選んで、規約に同意をチェックし、設定を押下
  1. 一覧画面でFacebookページのサムネイルが表示されていたら連携成功。

### 構造化メッセージを利用する
ボタンやカード、クイック返信などの構造化メッセージも送信可能です。

![スクリーンショット 2016-10-25 17.38.36.png](https://qiita-image-store.s3.amazonaws.com/0/57807/d47d618a-e5e5-4b8c-6558-f0029c5aff0c.png "スクリーンショット 2016-10-25 17.38.36.png")


__注意__

- APIの返却内容がJSONデータになるため、Facebook Messengerとの連携を行わない場合はJSONがそのまま返却されますのでご注意下さい。
- サンプル画像やJSONのサンプルの内容は筆者の個人的な趣味です。

__利用方法__
- システム発話ボックスにMessenger仕様のJSONを設定することで構造化メッセージの送信が可能になります。2016/10/14現在、Facebook Messengerへのメッセージ送信時のリクエストボディは下記のようになっています。

``` テキスト送信時のリクエストボディ
{
  "recipient":{
    "id":"USER_ID"
  },
  "message":{
    "text":"hello, world!"
  }
}
```

``` 画像送信時のリクエストボディ
{
  "recipient":{
    "id":"USER_ID"
  },
  "message":{
    "attachment":{
      "type":"image",
      "payload":{
        "url":"https://petersapparel.com/img/shirt.png"
      }
    }
  }
}
```

Repl-AI上では`message`配下のJSONをシステム発話ボックスに設定します。変数などを利用したい場合は、`ユーザ発話`や`覚えた内容`ボタンを利用して任意の場所に挿入することが可能です。

__postbackについて__

Repl-AIでは下記の例にも出てくる`postback`を利用して、構造化メッセージ内でのアクションを拾って再びRepl-AIへメッセージを送信してくる仕組みになっています。
Repl-AIでは`postback`内の`payload`を次のユーザ発話と解釈し、マッチングを行います。

- ex. __一般テンプレート__の`postback`では`payload`に「チャットを開始する」と設定しているため、FB上でそのボタンを選択した場合、MessengerはRepl-AIに「チャットを開始する」という __ユーザ発話__を送信します。

1. 一般テンプレート


``` システム発話ボックスに挿入するJSON例
{ 
  "attachment":{
    "type":"template", 
    "payload":{ 
      "template_type":"generic", 
      "elements":[{
        "title":"「恋ダンス」フルver.期間限定公開!!",
        "item_url":"https://www.youtube.com/watch?v=qvgA332_A9E",
        "image_url":"http://bit.ly/2f34reg",
        "subtitle":"逃げるは恥だが役に立つ", 
        "buttons":[{
          "type":"web_url",
          "url":"https://www.youtube.com/watch?v=qvgA332_A9E",
          "title":"動画を見る" 
        },{ 
          "type":"postback", 
          "title":"チャットを開始する",
          "payload":"チャットを開始する" 
        }]
      },{ 
        "title":"新垣結衣×星野源の「恋ダンス」 先行映像", 
        "item_url":"https://www.youtube.com/watch?v=dXJVKZhU5jo",
        "image_url":"http://bit.ly/2e67Mo2",
        "subtitle":"10/11スタート 火曜ドラマ 『逃げるは恥だが役に立つ』",
        "buttons":[{
          "type":"web_url",
          "url":"https://www.youtube.com/watch?v=dXJVKZhU5jo",
          "title":"動画を見る" 
        },{ 
          "type":"postback", 
          "title":"チャットを開始する", 
          "payload":"チャットを開始する" 
        }]
      }] 
    }
  }
}
```

2. ボタンテンプレート

``` システム発話ボックスに挿入するJSON例
{
  "attachment":{
    "type": "template",
    "payload":{
      "template_type": "button",
      "text": "何をしますか？",
      "buttons" : [{ 
        "type": "web_url",
        "url": "https://repl-ai.jp",
        "title": "Repl-AIのサイトを見る"
      },{
        "type": "phone_number",
        "title": "電話をかける",
        "payload": "+81+++++++++"
      },{
        "type": "postback",
        "title":"お話する",
        "payload":"お話する"
      }]
    }
  } 
}
```

3. クイック返信テンプレート

``` システム発話ボックスに挿入するJSON例
{ 
  "text":"どっちの色が好き？",
  "quick_replies":[{
    "content_type":"text",
    "title":"赤", "payload":"赤" 
  },{ 
    "content_type":"text",
    "title":"緑",
    "payload":"緑" 
  }]
}
```


4. 画像テンプレート

``` システム発話ボックスに挿入するJSON例
{
  "attachment": {
    "type": "image",
    "payload": {
      "url": "http://bit.ly/2eMxJc6"
    }
  }
}
```

5. 動画テンプレート

``` システム発話ボックスに挿入するJSON例
{
  "attachment": {
    "type": "video",
    "payload": {
      "url": "http://bit.ly/2e6cBxi"
    }
  }
}
```