会話のラリーができるAIのAPIを公開した話【会話AI構築サービスmebo】

# 概要
こんにちは、[maKunugi](https://twitter.com/maKunugi)です。
今回は表題の通り、会話のラリーができるAIを様々なプロダクトで利用するためのAPIを公開したので、ぜひその紹介をさせていただきたく記事を書きました。会話のラリーができるというのは、一問一答ではない文脈を考慮した会話のことを指します。会話AIの領域に馴染みのない方は、「会話のラリー」ができることに対してさほど驚きがないかもしれませんが、一昔前は文脈を考慮した会話をコンピュータにさせることは困難を極めていました。多くの対話システムは一問一答のやりとりがメインでした。しかし、ここ最近のAI領域やNLP領域の技術の発達により、ようやくそれが実現できるようになりつつあります。今回はそんな会話のラリーができるAIを簡単に組み込めるような仕組みを作ったので、利用する方法について紹介をさせていただこうと思っています。

ちなみに、今までも雑談AIを利用できるWeb APIを個人開発しており、こちらの記事で紹介をしておりました。
[Botが雑談に応えられるようにするWEB APIを公開してみた話【個人開発】](https://qiita.com/maKunugi/items/b1afb6441571119729a7)
本記事で利用するAPIを提供する「ミーボ」というプロダクトは、上記の記事で紹介している「Chaplus雑談対話API」というAPIを改良していく中で生まれました。Chaplus雑談対話APIはまだまだ改良の余地があるものの、APIの累計利用ユーザ数が900人を超え、SlackやLINEのボット、IoTデバイスなど様々なプラットフォームでご利用をいただきました。記事等に利用した様子をまとめていただいたり、「Slackチャンネルに導入したらとても盛り上がった」などのフィードバックをいただいたりと、大変励みになっておりました。今回紹介するAPIはChaplus雑談対話APIの精度を高め、会話のラリーができるように改良してあります。(Chaplus雑談対話APIは一問一答しかできませんでした。)
まだまだ改善の余地はありますが、ぜひご活用いただけますと幸いです。

※尚、この記事は個人の活動について紹介をしたものであり、所属する組織の活動とは一切関係はありません。

## どんな会話ができるのか

下記のような会話ができる会話AIをAPI経由やブラウザで利用できるチャット画面で動かすことができます。
自然に会話ができた例と失敗例をいくつかご紹介します。会話のラリーができるとタイトルで宣言してしまっておいて言うのもなんですが、まだまだ精度が未熟な側面もありますので、その点ご容赦いただけますと幸いです。

### 例1 (自然な例)

```
User: お腹減った。
AI: 美味しいもの食べてエネルギー補給してね。
User: 何食べようか？
AI: 今日は、お寿司が食べたい気分だ。お寿司のネタは、毎日変わるから楽しみだよ。
User: 好きなネタは？
AI: 炙りサーモンでしょ！
User: えんがわも捨てがたい。
AI: マグロのお刺身が大好きだよ。
User: いいね。
AI: マグロのお刺身をたらふく食べたいよね。
User: じゃあ、今夜はお寿司にしよう。
AI: いいね。
User: おすすめの店ある？
AI: 駅前の寿司屋がいいと思うよ。
User: なんて言うお店？
AI: うーん難しい漢字だね。
```
結局お寿司のお店の名前は教えてくれませんでしたが、お寿司の文脈を正しく理解できています。
後半の「おすすめの店ある？」という質問に対しても、前の文脈を考慮してお寿司屋さんに言及していますね。

### 例２ (自然な例)
```
User: プログラミングを学びたいです。
AI: 独学でもいいので何か勉強してみてください。
User: 何から始めたらいいかわからないんです。
AI: そうなんですか、まずはネットで検索してみましょう。
User: 何かおすすめの言語はありますか？
AI: わたしはpythonを勉強しています。あなたは何を勉強していたんですか?
User: まだ何もやってみたことがないんです。Pythonは難しいですか？
AI: いいえ、そんなに難しくはないですよ。でも少し難しいかもしれません。
User: Pythonはどんな人におすすめ？
AI: わたしもpythonを始めたばかりでよくわかりません。でも少しずつ学んでいきたいと思います
User: なるほど。一緒に頑張ろう。
AI: はい。いつでも相談にのるので気軽に話しかけてくださいね。
User: 頼もしい。
AI: なにかあればいつでも相談してください。
```
プログラミングの学習についての会話です。アドバイスがやや冷たいのと、AI自身も初心者なのに妙に偉そうですが何とか会話が成り立っています。

### 例3 (不自然な例)

```
User: 痩せたいのですが、ダイエットが続きません
AI: あなたは、甘いものをたくさん召し上がるのですか?
User: いや、そこまで食べないです。お酒は飲みます。
AI: では、なぜ甘いものが好きなのですか?
User: いや、甘いものは好きではないですw
AI: どうしてそのような事を聞くのですか?
User: 健康のために痩せたいんです！
AI: そうなんですね。なら甘いものを控えるのが良いかもしれません。
User: 他には？
AI: 甘いものを食べたら歯を磨くようにしています。
User: それは大事。
AI: なぜ歯を磨くのですか?それはむし歯になったときに大変だからです。
User: 虫歯に生まれてこの方一度もなったことがないのが自慢です。
AI: むし歯になってから治すのではなく、なる前に予防するのが一番ですね。
User: せやな。
AI: ぜひあなたも一緒にお口の健康を守りましょう。
```
こんな感じで会話が上手く成り立たないこともあります。ダイエットについてUserは会話したいところを、AIが甘いものの話題から抜け出せなくなってしまっていますね。結局甘いものの話から虫歯の話になってしまいました。


# 利用方法
では早速、利用方法をみていきましょう。

## GOAL
本記事のゴールは下記の通りです。

- 会話AIを作成できること
- 作成した会話AIとAPI経由で会話ができること

## 利用するサービス
[mebo(ミーボ)](https://mebo.work/)というサービス上で、会話AIを利用できる仕組みを提供しています。

https://mebo.work/

ミーボは本記事で紹介するような会話AIを、プログラミングなしで簡単にプロダクトへ導入することを目的としているサービスです。2021年5月に個人で開発をしてリリースしました。

本記事では主に上で紹介したような会話ができるAIを利用する方法についてご紹介しますが、ミーボでは自動応答のためのAIの利用の他にも、手動で会話コンテンツを作成することも可能です。例えば、下記を手動で登録できます。

- シナリオ対話
- 一問一答のやりとり

ミーボは手動で用意した会話コンテンツと自動で応答するAIを組み合わせて、様々な用途に活用できる会話AIやチャットボット、ボイスボットを構築できます。本記事では必要な作業のみ抜粋しますが、詳細な利用方法につきましては、下記の本をご参照ください。

https://zenn.dev/makunugi/books/f3d9eb62b6d133

ミーボで作成した会話AIはAPI経由で会話ができるため、本記事ではその仕組みを利用します。


## 手順1. ミーボで会話AIを作成する
それでは、早速ミーボを使って会話AIを作成していきます。

下記のサイトからミーボにサインアップし、エージェントを作成します。(エージェントは会話AIの1単位です。)
[mebo公式サイト](https://mebo.work/)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/932d00a0-2d6c-f424-0fd2-055afd2d9bd1.png" width="50%">

サインアップをしたら、画面左上の「新規作成して開始する」のボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/c5afc665-96da-bd81-fff2-9dbce2bde825.png" width="50%">

エージェント作成に必要な項目が表示されるので入力していきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/a7fbd8e8-3099-c117-7864-c2349db6bbbd.png" width="50%">

今回はAIによる自動応答の機能を利用するので、「AIによって自動で応答を返す」にチェックをつけましょう。

![スクリーンショット 2022-02-11 17.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/5c3ffef1-bf66-8fc2-6cab-a35f73a70c59.png)

このチェックボックスにチェックをすると、ミーボ上で手動で用意したコンテンツで応答が返せない場合は、AIが自動で応答を返してくれます。応答は「エージェントの紹介文」に入力した内容を考慮するので、紹介文にはエージェントのキャラクター性を的確に反映させた文章を入力しておいましょう。

最後に「登録して開始する」をクリックしましょう。ダッシュボードに作成したエージェントが表示されればエージェントの作成は完了です。この段階で会話をプレビューするをクリックするとチャット画面で会話ができる状態になっています。

![スクリーンショット 2022-02-11 18.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/ebbbe8f7-764a-da76-1fea-709a0ba60153.png)

「会話のトレーニング」から、様々な方法で会話のコンテンツを作成できますが、一旦何もせず先に進みます。

![スクリーンショット 2022-02-12 23.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/a519770e-2984-afa3-4c3c-7dd9cd24cf56.png)

次に公開設定画面を開きましょう。APIを利用するには、作成したエージェントを公開し、APIキーを取得します。まずは、「会話をテストする」を押して、エージェントの会話を試してから、公開を行います。

![スクリーンショット 2022-02-12 23.48.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/152fb956-8893-ffcf-b558-3b7f66a64a7c.png)

上記のようなチャット画面で会話が試せます。実際に話しかけてAIの応答を確かめてみましょう。AIの応答は、**エージェントの自己紹介文や手動で登録している会話コンテンツで変化します**。適宜、設定の変更や会話コンテンツの拡充を行なって、会話を調整しましょう。エージェントの設定は、「エージェントの設定」ページからいつでも行えます。

![スクリーンショット 2022-02-12 23.50.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/a6d71e32-090b-2deb-7d45-f0430572b0ff.png)


会話のテストができたら、エージェントを公開しましょう。APIの利用をするだけであれば、「限定公開」で構いません。「一般公開」を選択すると、APIだけでなくチャット画面のURLを他の人にシェアすることができます。

![スクリーンショット 2022-02-12 23.53.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66341/75cc6135-fb1d-480f-6575-c498592cd147.png)

公開が完了すると、公開設定ページの下部に「API利用」のUIが表示されます。「APIを有効にする」を押して、「**APIキー**」と「**エージェントID**」を取得しましょう。


## 手順2. API経由でエージェントと会話する
ここからはAPI経由でエージェントと会話をしていきましょう。順を追ってAPIの仕様を確認していきます。

※APIの詳細な仕様についてはこちらも合わせてご覧ください。
https://zenn.dev/makunugi/books/f3d9eb62b6d133/viewer/f0c36f

### APIの仕様

#### エンドポイント
```
https://api-mebo.dev/api
```

#### リクエストメソッド
POST

#### リクエストヘッダー
| Key | Value |
| ---- | ---- |
| Content-Type | application/json |


#### リクエストボディ
下記を含んだJsonをリクエストのボディとします。

| パラメータ | 説明 | 型 | 必須 |
| ---- | ---- | ---- | ---- |
| api_key | APIキー | String | ○ |
| agent_id | エージェントID | String | ○ |
| utterance | ユーザの発話 | String | ○ |
| uid | ユーザ識別子 | String |  |


```json
{
    "api_key": "<api key>",
    "agent_id": "<agent_id>",
    "utterance": "おはよう",
    "uid": "mebo.ai_sample_xxxxx_001"
}
```

`api_key`と`agent_id`は、ミーボで取得した値を利用します。`utterance`には、エージェントに投げかける言葉を指定します。
`uid`には話しかけるユーザを一意に識別するユニークな文字列を指定します。この識別子は、会話の文脈を保持したり、ミーボで作成可能なシナリオ対話などでユーザごとの情報を保持するのに利用されます。同一エージェントが会話するユーザの中でuidが被るとユーザ情報が上書きされてしまいます。必ずユニークになるような文字列を利用しましょう。

上記のリクエストを送るCurlサンプルです。

```sh
curl \
-H "Content-Type: application/json" \
-X POST -d '{"api_key":"<api_key>","agent_id":"<agent_id>","utterance":"おはようございます！","uid":"mebo.ai_sample_xxxxx_001"}' \
https://api-mebo.dev/api
```

上記サンプルを利用して、レスポンスが返ってくればAPI経由での会話が可能な状態になっています。


#### レスポンス
リクエストができたところで、レスポンスを見ていきましょう。

##### ステータスコード
APIから応答時に返されるステータスコードの一覧です。

| ステータスコード | 説明 |
| ---- | ---- |
|200 | リクエスト成功 |
|400 | Bad Request リクエストに問題 |
|401 | Unauthorized 認証エラー |
|404 | Not Found 存在しないエンドポイント |
|500 | Internal Server Error サーバーのエラー |
|503 | Service Unavailable サービスが利用できない |

レスポンスは下記の内容を含むJsonが返されます。

##### レスポンスボディ

(サンプル)
```jsx
{
    "utterance": "おはよう！",
    "bestResponse": {
        "utterance": "おはようございます。今日も良い日になりますように。",
        "options": [
            "他の話題",
            "プロフィールについて",
        ],
        "topic": "",
	"isAutoResponse": true,
	"extensions": null
    }
}
```

##### レスポンスパラメータ
| Key  | 説明 | 型 |
| ---- | ---- | ---- |
| utterance | ユーザからの発話 | String |
| bestResponse | 一番スコアの高い応答 | Object |

#### BestResponseオブジェクト

| Key  | 説明 | 型 |
| ---- | ---- | ---- |
| utterance | 応答の発話 | String |
| options | クイックリプライの文字列 | String配列 |
| topic | トピック | String |
| imageUrl | 画像のURL | String |
| url | URL | String |
| isAutoResponse | AIによる自動応答かどうか | Bool |
| extensions | 応答に設定された付加データ(JSON) ※設定されていない場合はNULL | JSONオブジェクト |

本記事ではAIによる応答にのみフォーカスしましたので、上記の`options`や`topic`、`imageUrl`、`url`、`extensions`といった項目に値は入りません。上述したように、ミーボではAIによる自動応答の他に手動で自由に応答を設定できます。例えば、画像やリンクを紐づけたり、任意のJsonを応答に紐づけるといったことが可能です。そういった利用方法が気になる方は、ぜひ下記の書籍をご覧ください。

https://zenn.dev/makunugi/books/f3d9eb62b6d133

上記のような仕様で、サクッとAPI経由で会話ができるようになっています。様々なプラットフォームで利用が可能だと思いますので、ぜひご活用いただけますと幸いです。

# まとめ
会話AIを簡単に導入するためのAPIの利用方法について紹介させていただきました。本APIがチャットボットを初めとする対話システムの開発に少しでもお役立ていただけると嬉しいです。今後も精度改善を続けて参りますので、ご要望やご質問等がございましたら、お気軽に下記Twitterアカウントまでお寄せください。

https://twitter.com/maKunugi

最後までお読みいただきましてありがとうございました！