14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

怒りを検知すると逆ギレしてくるチャットボット作ってみた

Last updated at Posted at 2018-01-31

#はじめに
チャットボット、作ってますか?
人間のように会話できるチャットボットを作るというのはチャットボット開発における永遠のテーマですよね。
今回は、「人間のように」すなわち、感情を吹き込んだチャットボットを作ってみました。
吹き込む感情は **「怒り」**です。

#イメージ図
イメージはこんな感じです。
あえてボットにはユーザーを煽るような返事をさせます。
スクリーンショット 2018-01-31 10.53.53.png

するとユーザーは当然怒ります。しかしこのボットは怒りを検知すると逆ギレします。
スクリーンショット 2018-01-31 10.59.22.png

#構成図
プレゼンテーション2.png

という構成にします。

#手順
##Watson Conversationの準備
今回は簡単な挨拶をするだけの構成にしました。
#挨拶というインテントを作成
スクリーンショット 2018-01-31 13.18.26.png

・Dialogノードはこんな感じ。"anger"が0.3以上のときには他ノードに飛ばないように怒り検知ノードを最上部へ配置しました。
スクリーンショット 2018-01-31 13.18.36.png

#挨拶を認識したら相手を煽る挨拶を返すノード
スクリーンショット 2018-01-31 13.18.50.png

・Contextの"anger"値が0.3以上のときに相手を煽る挨拶を返すノード
スクリーンショット 2018-01-31 13.18.44.png

このワークスペースのJSONです。Import Workspaceでそのまま取り込めます。

{"name":"逆ギレ","created":"2018-01-31T02:54:48.056Z","intents":[{"intent":"挨拶","created":"2018-01-31T02:55:25.287Z","updated":"2018-01-31T02:56:04.803Z","examples":[{"text":"こんにちは。","created":"2018-01-31T02:55:53.711Z","updated":"2018-01-31T02:55:53.711Z"},{"text":"おはよう。","created":"2018-01-31T02:55:56.600Z","updated":"2018-01-31T02:55:56.600Z"},{"text":"やあ。","created":"2018-01-31T02:55:58.478Z","updated":"2018-01-31T02:55:58.478Z"},{"text":"おはようございます。","created":"2018-01-31T02:56:01.612Z","updated":"2018-01-31T02:56:01.612Z"},{"text":"こんばんは。","created":"2018-01-31T02:56:04.803Z","updated":"2018-01-31T02:56:04.803Z"}],"description":""}],"updated":"2018-01-31T04:18:01.610Z","entities":[],"language":"ja","metadata":{"api_version":{"major_version":"v1","minor_version":"2017-05-26"}},"description":"","dialog_nodes":[{"type":"standard","title":"その他","output":{"text":{"values":["解釈できませんでした。申し訳ありませんが違う表現を試していただけますか。","恐れ入りますが表現を変えていただけますか。解釈できませんでした。"],"selection_policy":"sequential"}},"parent":null,"context":null,"created":"2018-01-31T02:56:22.997Z","updated":"2018-01-31T02:56:22.997Z","metadata":{},"next_step":null,"conditions":"anything_else","description":null,"dialog_node":"その他","previous_sibling":"ようこそ"},{"type":"standard","title":"挨拶","output":{"text":{"values":["こんにちは。チャットボットです。お前のかーちゃんでべそ!"],"selection_policy":"sequential"}},"parent":null,"context":null,"created":"2018-01-31T02:56:22.997Z","updated":"2018-01-31T02:58:42.630Z","metadata":{},"next_step":null,"conditions":"#挨拶","description":null,"dialog_node":"ようこそ","previous_sibling":"node_1_1517367701357"},{"type":"standard","title":"怒り検知","output":{"text":{"values":["は?キレてんじゃねぇよ!"],"selection_policy":"sequential"}},"parent":null,"context":null,"created":"2018-01-31T03:01:43.315Z","updated":"2018-01-31T04:18:01.610Z","metadata":{},"next_step":null,"conditions":"$anger >= 0.3","digress_in":"does_not_return","description":null,"dialog_node":"node_1_1517367701357","previous_sibling":null}],"workspace_id":"44d94825-1b6f-4438-8fd8-f2550c81e460","counterexamples":[],"learning_opt_out":false}

##NodeREDでロジック作成
スクリーンショット 2018-01-31 14.04.11.png
こんな感じになりました。
ポイントは、Conversationで使うContextに"anger"値を追加(msg.additional_context)したことです。
Tone Analyzerからはanger値が入ってきますので、これをContextに入れてConversationに渡すことでDialogノードの怒り検知ノードでanger値を評価してくれるようになります。
こちらのフローは以下です。

[{"id":"2f2a5edd.cd51b2","type":"watson-conversation-v1","z":"4db2b831.2986b8","name":"","workspaceid":"","multiuser":false,"context":true,"empty-payload":false,"default-endpoint":true,"service-endpoint":"https://gateway.watsonplatform.net/conversation/api","x":490,"y":180,"wires":[["4606b527.f783cc"]]},{"id":"4606b527.f783cc","type":"function","z":"4db2b831.2986b8","name":"","func":"msg.payload = msg.payload.output.text[0];\nreturn msg;","outputs":1,"noerr":0,"x":590,"y":260,"wires":[["ffac6b3c.3031a"]]},{"id":"a6d8fcdd.0bd44","type":"watson-translator","z":"4db2b831.2986b8","name":"","action":"translate","basemodel":"es-en","domain":"news","srclang":"ja","destlang":"en","password":"","custom":"","domainhidden":"news","srclanghidden":"ja","destlanghidden":"en","basemodelhidden":"es-en","customhidden":"","filetype":"forcedglossary","trainid":"","lgparams2":true,"neural":true,"default-endpoint":true,"service-endpoint":"https://gateway.watsonplatform.net/language-translator/api","x":170,"y":260,"wires":[["d4744fb3.2eda5"]]},{"id":"d4744fb3.2eda5","type":"watson-tone-analyzer-v3","z":"4db2b831.2986b8","name":"","tones":"emotion","sentences":"true","contentType":"false","tone-method":"generalTone","interface-version":"2016-05-19","inputlang":"en","default-endpoint":true,"service-endpoint":"https://gateway.watsonplatform.net/tone-analyzer/api","x":280,"y":180,"wires":[["a0273ad9.ceb64"]]},{"id":"a0273ad9.ceb64","type":"function","z":"4db2b831.2986b8","name":"","func":"msg.additional_context = {\n    \n        \"anger\":msg.response.document_tone.tone_categories[0].tones[0].score\n    \n};\nmsg.payload = msg.slackObj.text;\n\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":260,"wires":[["2f2a5edd.cd51b2"]]},{"id":"313e7515.d76c62","type":"Slack Bot In","z":"4db2b831.2986b8","name":"Slack Bot In","apiToken":"","channel":"","x":70,"y":180,"wires":[["a6d8fcdd.0bd44"]]},{"id":"ffac6b3c.3031a","type":"Slack Bot Out","z":"4db2b831.2986b8","name":"Slack Bot Out","apiToken":"","channel":"","x":700,"y":180,"wires":[]}]

※Credential情報などは適宜IBM Cloudのサービスからコピペしてください。
※SlackノードにはHuebotのAPIトークンと、channel名を入力してください。
※そのchannelにHuebotを招待することでチャットボットとして稼働できます。

#動作の様子
スクリーンショット 2018-01-31 14.10.31.png

ちなみに、Debugノードを1つめのfunctionノードに繋いでmsgの中身を確認したところ、
いきなり悪口言うなよ!失礼だろ馬鹿野郎!
の英訳結果は
Don't speak ill of me!You're rude, you idiot!
anger値は
0.895779
となっていました。(母親のでべそを指摘されたらこのくらい怒るのは当然ですね。)

#終わりに
いかがでしたか?
今回は超絶簡単な作りですが、常にユーザーの感情を取得することでチャットボットが人間のように反応を変えるようにすることができます。
何かの参考になれば嬉しいです。

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?