自然言語入力解析APIと雑談対話APIで愛されるBotづくり

きっと2016年最後の投稿ですね!わたなべです。

ORATTAではDevOpsの一貫として、ChatOpsを推進しています。

先日、本番へのデプロイがBotを通じてChatで完結するようになったので、
その成果を雑兵MeetUp #8で発表致しました。

愛されるBotとは

せっかくBotを作成したとしても、使われなくなると意味がありません。
でもBotの何を評価基準に置けば良いのでしょう。
有名な基準としてチューリングテストがありますが、
これは人間らしいかどうかを軸に評価を決めるもので、
そのBotが仕事面で役に立つかどうかはまた別の話です。

cool-bot-01

そこで今回は、Slack社のAmir Shevatさんが提唱しているBeer Testを参考にし、
一緒に飲みに行きたい!と思われるようなBotを作成することを目指しました。

この一緒に飲みに行きたい!という感情の中には、
・ 一緒に仕事がしたい
・ この子が居ると仕事が捗る
といった、長くBotが使われるようになるであろう、
ポジティブな評価が内包されていると考えてのものです。

コマンド対話式のBotなんて廃れるだけ

それでは、リリースに至るまでの改善を、最初のプロトタイプから遡って見ていきましょう。

ORATTAのデプロイには
・ Git名
・ アプリ名
・ 環境名
・コメント
といった4つの入力が必要ですが、
プロトタイプは必要な情報を逐一、ユーザーに入力を求めるものでした。

cool-bot-02

こんな同僚とは飲みに行きたくないですね。
見て分かる通り、これではすぐに使われなくなってしまうでしょう。

自然言語入力解析の導入

さて、文章の解析は普通、正規表現などで頑張る所だと思いますが、
ユーザーの自由入力文というものは、名前の通りとても自由です。

レイヴのマスター反映お願いします。ステージです。

画像をアスカZERO本番反映お願いします\(^o^)/

リソースファイルをクロ庭の本番にデプロイしてください!

BLEACHのプログラムプロダクト反映OKです!

これはあくまで一例ですが、入力する人によって、何万通りもの文章になるでしょう。
これを全て網羅した正規表現なんて、とても考えられませんよね。

そこで今回は、Microsoft LUISを採用しました。
これはユーザーの自由入力文の中から、特定の要素をタグ付けして返してくれるものです。
要素の順番や表記ゆれ等を意識すること無く、お手軽に文章を解析することができます。

cool-bot-04
cool-bot-05

実際の利用には、どこがどの要素に当たるのか、例文を流し込んでの調教が必要ですが、
今回のBotで実用レベルまで至るには100回程度の調教を必要としました。

cool-bot-06

過去のAPIリクエストを元に調教する機能があるので、そこまで大変ではないと思います。

APIの実装もリクエストを飛ばしてJsonを受け取るだけなので、
正規表現を頑張って作るよりよっぽど気軽です。
BotKitでの実装例を載せておきます。

var massage_text = encodeURI(message.text);
var url = 'https://api.projectoxford.ai/luis/v2.0/apps/xxx?subscription-key=xxx&verbose=true&q=' + massage_text;

request( url, function( error, response, body ){
 if( !error && response.statusCode == 200 ){
 console.dir(json[‘entities’]);
 }
});

最終的にはここまで入力を減らすことが出来ました。

cool-bot-03

同僚に話しかけるかの如く、自然な入力でデプロイの依頼が出来ていますね。

もっと愛されるために

ここまでの改善で、仕事的には十分使えるようになったでしょう。
しかし、飲みに行きたいと思うくらい、
これから愛されるかどうか…と言われると、まだ自信がありません。

cool-bot-07

ああ…辛い…
もっと優しくして欲しい…

そう、仕事には癒やしも必要です。

雑談対話の導入

そこで今回は、docomo雑談対話APIを更に導入しました。

cool-bot-08

このAPIもリクエストを飛ばしてJsonで受け取るだけですので、気軽に実装できます。
BotKitでの実装例を載せておきます。

var context = '';
var mode = 'dialog';
var place = '東京';
var options = {
url: 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=xxxxx',
 json: {
  utt: message.text,
  place: place,
  context: context,
  mode: mode
 }
}

//リクエスト送信
request.post(options, function (error, response, body) {
 context = body.context;
 mode = body.mode;
 bot.reply(message, body.utt);
});

cool-bot-09

ちょっとツンデレな返答になってしまいましたが、まあ良いでしょう。
理解されず冷たくあしらわれるのと比べたら、雲泥の差です。

2つのAPIの組み合わせでさらに柔軟なBotに

前述したMicrosoft LUISは文章内の要素判定と一緒に、全体のカテゴリ判定も行ってくれます。
LUISが会話をデプロイと関係ないと判断したものを、
docomo雑談対話APIに投げるようにしました。

cool-bot-10

この会話は、デバッグ中になかなかデプロイモードに移行しなかった時のものです。
上手くBotが理解できていなかったとしても、
冷たいエラーメッセージを出すよりはよっぽど愛着が湧くのではないでしょうか。
(このあと調教し直しました)

また、文章内に要素が足りない場合でも、
その要素のみを聞き出す事によって、ユーザビリティーを向上させています。

cool-bot-11

まとめ

以上2つのAPIを内包することにより、一気に愛されるBotへと進化させることができました。

cool-bot-12

実際に活用されはじめるのはまだ先の予定ですが、きっとこれから大きく育ってくれることでしょう。
来年も積極的に業務改善を行いたいと思いますので、2017年もどうぞよろしくお願い致します。

作者 Jun Watanabe

2010年11月ORATTA入社。エンジニアリーダーと名刺には書いてました。

コメントを残す