礼節を大切にする Slack bot を作ってみた

ネガティブワードを検出して注意する Slack bot の作成記事
2021.11.24

Slack はとても便利ですが、チャットというツールの特性上、自分が送ったメッセージを相手がどのように受け止めるか、リアルタイムに把握することが難しいという特性を持っています。

特に、ネガティブな言葉は目にするだけで生産性が下がるという研究結果があるため、普段から使用しないよう気をつける必要があります。

この点については塩谷が詳しくまとめていますので、ご参照ください。

チームで成果を出すためには心理的安全性が必要で、そのためには礼節とHRTが不可欠だ、という話をしました

ただし、無意識下で言葉が選択されることも多く、送信したメッセージを後で読み返してみたらネガティブワードが含まれてしまっていた、ということが多々ありました。

そこでこれを検出し、メッセージ送信者にフィードバックできないかと思い Slack bot を作ってみました。

できたもの

ネガティブワードを含んだメッセージを Slack に送信すると注意してくれます。

指摘の仕方も大切だと思い、人間のサポート役として有名な某公安組織の自律型ロボットとして bot を作ってみました。注意の受け入れやすさに関して、キャラクターの性格などはとても重要だと感じています。

実現方法

アーキテクチャーは次の図のようになっています。

Slack Events API を使い、 bot が参加しているチャンネルのメッセージすべてを Lambda API に送りチェックしています。

receiver の責務

Slack からのイベントはすべて AWS Lambda receiver で処理され、イベントを正常に受理したことを Slack 側に返しています。こうしている理由は、メッセージの解析処理に 3 秒以上の時間がかかるため、 Slack Events API の仕様上リトライしてしまうことを避けるためです。

ここでは Slack Bolt を用いています。 AWS Lambda に載せていますので、コスト面も問題になっていません。

AWS Lambda receiver ではメッセージをそのまま Amazon SQS へ詰め込み、解析用の AWS Lambda detector へ処理を移譲します。このパターンは Slack Events API を使う上で選択肢として知っているとスムーズに bot が作成できるかと思います。

detector の責務

AWS Lambda detector では次のことをやっています。

  • メッセージの形態素解析
  • 得られた言葉群の中にネガティブな言葉がないか辞書と照らし合わせる
  • もしネガティブな言葉があればメッセージの送信者に注意する

メッセージの形態素解析には kuromoji.js を使っています。これによって、動詞であっても語幹が得られるので後続の辞書との照らし合わせ処理を素直に書き下せました。

ネガティブな言葉の辞書は愛情あふれる手編集を用いて JSON で管理しています。辞書を引きながら総当りで書いていった形です。このファイルがネガティブワードの塊なので、中身を見るだけで気分が落ち込みます。編集する際は嬉しい予定の前など、気分が上がることがわかっている場合に限っています。

送信者への注意は Slack Web API を用いています。イベントの中に、どのチャンネルに送信されたかの情報も含まれているので、同様のチャンネルに注意を送信するつくりとしています。

その他に使っている技術は次です。

  • TypeScript
  • Serverless Framework

副作用

個人的にはうまくできたと思っているのですが、たまに行動を制限されているように感じるときもありました。

これらの対策は辞書をより洗練させていったり、注意をもっとやさしくするなどで対応可能かと思っています。

まとめ

この bot 、すでに自分の分報で 1 年弱運用していますが、個人的にネガティブな言葉をメッセージに含めてしまうことが減ったと感じています。

今後については副作用の節のようなできごとはできるだけ起こらないようなアップデートを考えています。また、プロトタイプの意味合いで作ったものなので、技術的には形態素解析部分をより低コストで実施する方法や、辞書編集の負担を下げる仕組みの構築など、伸びしろがかなりある状態です。

また、ネガティブな言葉は使われていないものの、ネガティブな意味が読み取れるメッセージもあります。次はこの検出をしたいと考えています。

よりよいフィードバックができる bot として洗練していき、エンジニアの仕事のサポートができるようになることが目標です。