社内SEへの問い合わせをAIで！FAQ-botの作り方

最近私の勤務している病院が移転したことにより、建物が大きくなり部署も増え、職員も増えたので問い合わせの量も増えました。しかしシステム課の人員は移転前と同じままです。明らかに業務量が目に見えて増えるようになりました。人員はすぐには増やせないのでこの人数で対応を行わなければなりません。

そんな中移転作業の振り返りで、AIで業務負担を軽減できないかなぁと話が挙がりました。AIは最近のニュースで何度も話題なっていて興味はあったのですが、大企業とか大規模なデータを持っている会社しかできないだろうと思っていました。

しかし、同じ沖縄の情シスの方が**DialogFlow**というサービスを使ったAIを構築していると伺いました。調べてみると、そのDialogFlowを応用して、AIを使ったチャットボットシステムが意外と簡単にしかも**無料**で作れました。

今回はそのAI-FAQ-botの概要と、その作成方法についてご紹介いたします。

## FAQ-botの概要

まず今回のbotはLINE株式会社の社員さんが紹介している[記事](https://engineering.linecorp.com/ja/blog/detail/211/)を参考にして作成しました。この記事で私が構築したい内容がほぼ決まり、また構築方法もほとんど載っていたので大変参考になりました。

作成したbotは**どんどん賢くなるチャットボット**をテーマとして作成しました。ユーザーからの質問に答え、分からないことは管理者である院内SEに回答を伺い、その回答内容を学習して賢くなっていくbotになります。

具体的には

1. ユーザーからの質問で用意されているものなら自動で返答する
2. 用意されていない質問だと、管理者(院内SE)に回答を促す
3. 管理者(院内SE)が回答を行うと、回答内容をユーザーに返答する
4. 管理者(院内SE)が回答した内容をbotが学習し、次回以降の同じ質問は自動で返答する

このような流れで動いています。

## 動作図

![output (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350456/1d44e319-ecb6-3586-48f3-8edbf25d06ee.gif)


ユーザーと管理者が同じ画面なので分かりにくいですが、「テスト」、「よろしく」というユーザーからのメッセージに対してはbotが自動的に答えています。しかし「ありがとう」というユーザーからのメッセージには管理者に回答を促し、管理者の回答内容をユーザーに返すといった動作になっています。

## システム図

今回構築したシステムは以下のサービスを組み合わせています。

* LINE
* DialogFlow 
* Heroku

![system-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350456/de5e1246-d30e-c53f-9c10-30c10a6763ae.png)

ユーザーはLINEを通してシステム課への問い合わせを行います。問い合わせの内容はクラウド上にあるサーバー(Heroku)のチャットボットプログラムに送られます。

その後、DialogFlowという自然言語処理サービスにより、問い合わせの意図を分析します。その分析した結果により回答できる場合は自動的に返答し、回答できない場合は管理者のLINEアカウントへ回答を促すシステムとなっています。

## 動作フロー

システムの動きの流れとしては以下のようになっています。左が自動応答で右が管理者からの回答が必要な場合の動きです。

![image-20201110215912825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350456/b0121eaf-5e29-25c2-cf0f-1d78360ebf88.png)

まず自動応答の場合ですが、ユーザーが質問を送るとチャットボットPGはDialogFlowに質問意図の解析を依頼します。意図を特定出来たら対応するスキルで処理を行い、その結果をユーザーに返すことで自動応答を実現しています。

管理者から回答を行う場合、ユーザーからの質問をDialogFlowで意図解析するまでは同じですが、DialogFlowで意図が分からなかった場合、チャットボットPGは管理者へエスカレーションして管理者(院内SE)に問い合わせます。管理者が回答を行うとその回答内容をユーザーにそのまま転送を行います。さらにその回答内容をDialogFlowに学習させることで次回以降の同じ質問は自動で答えられるようにしていく仕組みになっています。

## 各種システムについて

今回は無料で構築するためにそれぞれ無料の範囲内で動かしていますが、制限があるので、その制約事項とともに各システムについてご説明します。

### LINE

まずはLINEです。もうこれはメジャーなんで説明不要なくらい普及しているので、職員に使ってもらえると思い採用しました。しかしスマホで通常使っているLINEではなく、LINE公式アカウントというのを作成して使用しています。

LINE公式アカウントとはLINEで使っている機能を使え、LINEユーザーに情報発信や販促などを行いやすいものとなっています。そして今回の目的であるbotとして使うために必須のものとなっています。

そんなLINE公式アカウントですが、プランが3種類あり以下のように月額料金が変わります。

![line-pran.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350456/cf3200ac-3d77-611a-15a1-51c5c3a03233.png)

無料で使っているとメッセージ数が1,000通に制限されてしまいます。カウントされるメッセージは、botから返答されるメッセージも基本的にカウントされますし、LINE公式アカウントから配信できるメッセージもカウントされるので上限に達しないように注意が必要です。

### DialogFlow

次にDialogFlowですが、このサービスはGoogleが提供している言語解析エンジンで様々なサービス連携することが可能です。LINEはもちろん、SlackやWeb、Androidスマホなどの「OK,Google」でも連携することが可能です。

こちらもいくつかの[プラン](https://cloud.google.com/dialogflow/pricing?hl=ja#es-agent)があり、今回は無料で使っていますが、無料プランでも今回導入しようと検討している範囲では問題なく使えそうなくらい制約事項があまりないです。

例えば、botが1分当たりに反応する回数が180回までだったり、反応する例文数が2,000までだったりと広めに範囲が取られているので、とりあえずは安心して使っていくことができそうです。

### Heroku

次にHerokuです。HerokuはPaaS(Platform as a Service)と呼ばれるサービスの一種で、サーバー、OS、データベース、プログラム実行環境を稼働させることができます。私も以前個人開発で作ったWebサービスをHerokuで動かしていたので始めやすかったです。個人開発のようなスモールサービスで使うこともできるのでお勧めです。

そんなHerokuにもいくつかの[プラン](https://jp.heroku.com/pricing)があり、無料プランでは制限があり使用限度時間が1か月あたり550時間になります。クレジットカードを登録すると1000時間までになるので1日24時間×31日=744時間で常時起動が可能となります。しかしもう一つ制限があり、30分間アクセスがなければ自動的にスリープに入り、次の応答までに時間がかかってしまいます。私の環境だとスリープ後にLINEメッセージを送ると返信まで20秒前後かかりました。こちらはherokuのアドオンや外部サービスで定期的にアクセスするジョブなどを実行すれば回避できます。

### チャットボット

肝心なプログラムですが、こちらはLINE株式会社の社員さんが公開している記事を参考にして作りました。

https://engineering.linecorp.com/ja/blog/how-to-make-better-chatbot/

環境構築についても[qiita](https://qiita.com/nkjm)でいくつかの記事を公開しているので、それを参考にして構築することができました。GitHubで公開されているソースコードに少し修正を入れて自分の環境で使えるようにしていますので、ご興味がある方はご覧ください。[GitHub](https://github.com/rikki-tamaki/faq-bot)

動作フローのところで説明したスキルですが、具体的にこのボットは以下の3つのスキルで構成されています。

* robot-response

  意図が特定できた問い合わせに対して、用意されている回答を自動的にユーザーに返すスキル意図が特定できた問い合わせに対して、用意されている回答を自動的にユーザーに返すスキル

* escalation

  意図が特定できなかった問い合わせに対し、管理者に回答してもらうように促す。

* human-response

  エスカレーションされてきた問い合わせ内容に対し、管理者からの回答内容をユーザーに返信し、botに学習させる。

## 導入手順

ここまででボットの概要を説明してきましたが、いかがでしたでしょうか？院内SEだけではなくそのほかの部署、事務部や総務、経理などよく問い合わせを受ける部署で役に立つと思います。またこのシステムは最近話題になってきているノンコーディングで構築できています。プログラムコードはありますが、公開しているコードを使用しているのでほぼ手を加えていません。そして運用行う上で例文や回答の追加はプログラムを修正する必要がなく、Web上のGUI画面で追加することができるのでプログラムを知らない方でも運用ができます。

ここからは具体的に構築手順について説明していきます。[私のブログ](https://hospital-se.work/create-ai-faq-bot/)の方で具体的な方法を説明していますので、興味がある方は是非ご覧ください。(申し訳ありませんが有料となります)
https://hospital-se.work/create-ai-faq-bot/