Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

水曜ワトソンカフェvol.25「Watson Assistant×Slack Bot」
登壇資料
https://bmxug.connpass.com/event/176610/

B9af09b28f6a47a055a1e15d59037266?s=128

motuo1201

June 03, 2020
Tweet

Transcript

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

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

  3. SlackBotも社員の⼀員! 3

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

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

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

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

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

    Assistantが連携している前提で、このbotの育て⽅をご紹介 します。 8
  9. ⼿始めの⼀般会話ができるまで 9

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

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

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

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

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

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

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

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

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

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

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

    child nodes)とします。 20
  21. 下記の様なイメージですね。 21

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    "$webhook_result.response.result.forecast" みたいですよ! anything_else を使って、呼び出しに失敗した時の定義をします。 35
  36. 36

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

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

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