$30 off During Our Annual Pro Sale. View Details »

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

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

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

motuo1201

June 03, 2020
Tweet

More Decks by motuo1201

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

  3. SlackBotも社員の⼀員!
    3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  36. 36

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide