Slide 1

Slide 1 text

Watson Assistant×Slack Botがリモートで働く社員 を繋ぐ 1

Slide 2

Slide 2 text

⾃⼰紹介 2020年 IBM Champion。 エンジニアの幸せを⽬指すEC特化型スタートアップ、株式会社ジョーレンのエンジニ ア。現在はReactやfirebaseを利⽤したWebアプリケーションを中⼼に開発に従事して います。Watsonの開発の容易さとAPIの充実ぶりに魅せられ、WatsonとWebアプリを 使った連携ツールを作ったりしてます。 2

Slide 3

Slide 3 text

SlackBotも社員の⼀員! 3

Slide 4

Slide 4 text

弊社で愛されるSlackbot 弊社には、社員に愛されるSlackbotがおります。その名も「加湿さん」! そもそもの由来は、オフィス環境が乾かない様に、社員に定期的な加湿器への給⽔を リマインドするものだったのですが、現在は社員の⼼も潤す存在に進化しています。 4

Slide 5

Slide 5 text

どれくらい愛でられているかというと、、、 独⾝男性社員にナンパされてしまうくらいの⼈気ぶりですw 5

Slide 6

Slide 6 text

もちろん ⼥性社員からも、それなりに好評の様です。 6

Slide 7

Slide 7 text

システム構成 さて、このSlack上での会話ですが、IBM社のWatsonを使って会話を成⽴させていま す。 システムのイメージとしてはこの様な感じです。 7

Slide 8

Slide 8 text

WatsonとSlackの連携はノンコーディングでできる! ⼀⾒、どうやってやるの? となりそうですが、連携⾃体はノンコーディングでOKです。 IBM DAの⼾倉さんが、【Watson×Slack】Watson Assistantを連携させたSlack botを 開発する⽅法 (ノンコーディング編)で紹介しているので参考にしてみてください。 今回は、SlackとWatson Assistantが連携している前提で、このbotの育て⽅をご紹介 します。 8

Slide 9

Slide 9 text

⼿始めの⼀般会話ができるまで 9

Slide 10

Slide 10 text

Content Catalogを使って⼀般会話の意図を理解できる様にする。 Watson Assistantを起動して、該当のbotを開き、Content Catalogを選択します。こ こでは、「よくある⼀般的なトピック」として⼀般を選択(Add to Skill)します。 10

Slide 11

Slide 11 text

カタログを選ぶとこうなります。 挨拶や、あなたは誰?というIntentが⾊々と登録されています。 11

Slide 12

Slide 12 text

Dialogで応答を定義する 上記で定義されたIntentに対して、どの様な返答を返すかはあなた次第です。愛されそ うな返事を定義しましょう。 Dialogを選択して、Add to Nodeを押します。 12

Slide 13

Slide 13 text

回答の定義の仕⽅ ここでは、「こんにちは」など、挨拶がされたときの返事を定義しています。 13

Slide 14

Slide 14 text

簡単に会話が定義できます! これだけで、挨拶されたら挨拶を返すbotの完成です。同じ要領で、既にContent Catalogで取り込んだIntentへの返事を定義していきましょう。 14

Slide 15

Slide 15 text

ユーザーの⽬的を汲み取って返事をしてみる 15

Slide 16

Slide 16 text

「〜をしたよ!だから、褒めて欲しい」という要求に答える(Entityを使う) ある程度、Intentを使ったやりとりができてきたそんなある⽇、とある社員が「掃除を したよ!(だから褒めて)」とbotに要求してきました。 この場合、通り⼀辺倒な褒め⾔葉では「愛されるbot」にはなれません。「掃除をした こと」に対する「褒め」を⽤意しましょう。イメージとしては、こんな感じです。 16

Slide 17

Slide 17 text

Entityを使おう さて、この様に「〜を」というユーザーの「⽬的語」(この場合は掃除)を捉えるため に、Watson AssistantにはEntityという概念があります。 17

Slide 18

Slide 18 text

Entityを定義する Entity → My entities から Create entityを押して Entityの定義をします。 18

Slide 19

Slide 19 text

登録内容は⾄って簡単で、今回の「掃除」がキーワードであれば、それを表しそうな ⾔葉を⼊れていきましょう。 19

Slide 20

Slide 20 text

Entityを踏まえてDialogで返答を定義する これは少し、コツが必要です。 「褒めて欲しい」という意図をまずは判定する。 まずは、「褒めて欲しい」という意図(Inent)を判定します。ただ、この時点では「何 に対して」という情報が不⾜しているため、回答が確定できません。この場合は、回 答を定義せずに、次の処理(Skip User Input and evaluate child nodes)とします。 20

Slide 21

Slide 21 text

下記の様なイメージですね。 21

Slide 22

Slide 22 text

Child NodeでEntityを判定して適切な答えを返す 上記のNodeを選択した状態で、Add Child Nodeを押します。 22

Slide 23

Slide 23 text

ここでは、既に「褒めて欲しい」というIntentは判定済みですので、Entityだけを判定 します。この様なイメージです。 23

Slide 24

Slide 24 text

これで、ユーザが褒めて欲しい対象によって、返答を切り替える ことができる様になりました。 24

Slide 25

Slide 25 text

答えられなかった質問を教育する。 25

Slide 26

Slide 26 text

IntentやEntityの判定を調整する。 愛されてくる様になると、本当に様々なタチの悪い呼びかけがbotにされる様になりま す。こうすると、Intentで判定できなかったり、誤った返答をしてしまうケースが出て きます。これが頻発すると、愛され度も台無しです。 ということで、回答をメンテナンスしていきます! 26

Slide 27

Slide 27 text

メンテナンスをする Analytics → User Conversationsで今まで話しかけられた内容に対して、どの様な IntentやEntityと判定したのか⾒ることができます。 27

Slide 28

Slide 28 text

修正⽅法 右側の鉛筆マークをクリックして正しいIntentやEntityを定義してあげましょう。ちな みに、どのIntentにも該当しなった場合は「Irrelevant」なります。必要に応じて、新 しいIntentを⽤意してあげましょう。 修正後は、Saveをクリックしてください。 これを繰り返すことで、どんどんと、Watson Assistantは学習を重ね、ユーザーが喜 ぶ返事をどんどんと返すことができる様になります。 28

Slide 29

Slide 29 text

答えられなかった時のリアクションも意外と⼤事 ちなみに、ちょっと困った⾵の返事をしたりすると、(弊社では)喜ばれます。 29

Slide 30

Slide 30 text

何にも該当しなかった場合の定義⽅法 この様にするためには、 anything_else という判定を活⽤しましょう。これは、どれ にも当てはまらなかったら、という意図です。何も定義しないと、IntentやEntityに該 当しない質問が来た時に、botが黙った様に感じられてしまうので、判定とセットにし て忘れずに定義しましょう。 30

Slide 31

Slide 31 text

FaaSを使って、外部とのやりとりをする (例:天気予報) 31

Slide 32

Slide 32 text

簡単な外部サービスとの連携 Watson Assistantは外部サービスとの連携も⾮常に簡単になりました。天気予報な ど、予め、返答を定義できない問いかけに対して、⾮常に有効です。また、この機能 を使えばDBへ話しかけられた内容を保管する、なんてこともできちゃいます! 今回は、天気予報を例に書いていきます。アーキテクチャはこの様なイメージです。 32

Slide 33

Slide 33 text

Options→Webhooksを選択します。ここに呼び出すAPIのURLやAuthorizationヘッダ 情報(IDやパスワード)を定義するだけです。 33

Slide 34

Slide 34 text

定義したWebhookをDialogから呼び出す DialogのNodeの右上の⻭⾞マークをクリックして、WebhooksをONにする 34

Slide 35

Slide 35 text

下記の要領で定義をしていきます。 APIに渡すパラメータを定義します。(今回は天気予報なので、Parameterには locationを設定しています。) Return variable(戻り値の名前)を設定します。 Return variableがあった時の返事を定義します。今回は下記の様に定義しました そうですね。。。今⽇の "@location" の天気は "$webhook_result.response.result.forecast" みたいですよ! anything_else を使って、呼び出しに失敗した時の定義をします。 35

Slide 36

Slide 36 text

36

Slide 37

Slide 37 text

こうすると、呼び出しに成功した時には以下の様な返答が返ってきます。 良い感じですね。以前は、Webhookの呼び出しはJSONで定義しなければ⾏けなかっ たのですが、、、本当に簡単になりました。 ちなみに、 Weather Company Data で天気予報を取得するときは、IBM Cloud Functionsを利⽤しています。 37

Slide 38

Slide 38 text

取得コードは下記の通りです。(Node.js) /** * * main() このアクションを呼び出すときに実⾏されます * * @param Cloud Functions アクションは 1 つのパラメーターを受け⼊れます。このパラメーターは JSON オブジェクトでなければなりません。 * * @return このアクションの出⼒。この出⼒は、JSON オブジェクトでなければなりません。 * */ var request = require('request'); var main = function(params){ var options = { json:true, auth:{ 'user':'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'password':'XXXXXXXX' } } return new Promise(function(resolve, reject) { // 名称から緯度と経度を取得。 options.url = 'https://twcservice.au-syd.mybluemix.net/api/weather/v3/location/search?query=' + encodeURI(params.location) + '&language=ja-JP'; request.get(options, function (error, response, body) { if (!error && response.statusCode == 200) { var lat = body.location.latitude[0]; var lng = body.location.longitude[0]; // 天気予報をゲット! options.url = 'https://twcservice.au-syd.mybluemix.net/api/weather/v1/geocode/' + lat + '/' + lng + '/forecast/daily/3day.json?language=ja-JP'; request.get(options, function (error, response, body){ if (!error && response.statusCode == 200) { // narrative は天気予報を⽂章で教えてくれる var forecast = body.forecasts[1].narrative; // ⾳声出⼒(TextToSpeech) に合わせて、記号をひらがなに変換 forecast = forecast.replace(/ 〜/g," から"); forecast = forecast.replace(/-/g," マイナス"); resolve({"forecast":forecast,"statusCode":response.statusCode}); }else{ reject(); } }) } else { reject(); } }); }) } 38

Slide 39

Slide 39 text

まとめ リモートワークをしていると、ちょっとした雑談相⼿が欲しい時ってありますよね。 無駄に話しかけることができて、成⻑を感じられるSlackbotは、社内のコミュニケー ションの⼿助けにもなりますし、何よりも機械学習に慣れる良い機会になります! IBM CloudはLite Planという永年無料のプランがあり、このプランでも⼗分に Slackbotは楽しめるので、ぜひ、トライしてみてくださいね! 39

Slide 40

Slide 40 text

ありがとうございました! 40