サービスデスクにWatsonによるチャットボットを組み込む

# 注意事項
このコンテンツは、第16回広域連携医療ネットワークシステム研究会で『[問診票システム試作](http://gcmwso.web.fc2.com/pdf/gcm16/gcm16_1445.pdf)』として発表しました機能の解説です。Jira Service DeskおよびIBM Watsonの仕様変更などにより、手直しが必要になる場合がありますので、予めご了承ください。また、サーバー版のJira Service DeskとREST API、Node-REDについて、一通りご存知である必要があります。

# Jira Service Desk + IBM Watson
自社の従業員や顧客に向けて、ヘルプデスクを用意していると思います。今回は、「従業員から症状を聞き、〇〇の診療科に受診することを勧めるチャットボット」を、Node-REDを介して、Jira Service DeskとIBM Watsonを接続し、実装しています。

## 事前準備
この記事では、Node-REDを中心に説明しますので、事前にWatson Discoveryを用いて地道な準備を行います。
### 文書ファイルの準備
下記の内容で文書ファイルを用意します。大学病院などで配布が見当たりませんでしたので、自分で用意してください。動作確認だけであれば、ファイルが１つ２つあれば良いです。手間がかかりますが、サービスを作る際にデータがなければ、自分で作るしかありません。正直、この作業が一番大変かもしれません。

- ファイル名 = 診療科名 
- ファイルの中身 = 診療科名に該当する病気の予兆や症状をありったけ書く
- Word形式(.docx)

### Watson Discoveryに学習させる
作成した上記の「文書ファイル」を、Watson Discoveryにアップロードし、Node-REDで動作確認を行います。手順は、『[Node-REDでWatson Discovery Service 日本語体験サンプル](https://qiita.com/kolinz/items/b3be17c33694c9745697)』を使用しています。

上記で確認したNode-REDのフローを拡張します。

### Jira Service Desk 環境を立てる
下記のオンラインドキュメントを参考に、IaaS上にJira Service Desk環境を立てます。今回は、IBM Cloud上に仮想サーバーを用意し構築しています。
[Jira Service Desk 4.x インストールマニュアル(Linux)](https://www.ricksoft.jp/document/pages/viewpage.action?pageId=226690137)
仮に、[https://servicedesk.example.com/jsd](#) とします。

#### カスタマーポータルを構築する
構築したJira Service Desk環境にて、プロジェクトを作成し、カスタマーポータルを構築、動作確認用の顧客を登録します。
自動化機能を用いて、問い合わせ作成時に「どうかしましたか？」と返すようにしています。
関連ドキュメント https://ja.confluence.atlassian.com/servicedeskserver/configuring-the-customer-portal-939926277.html

### Node-RED 環境を立てる。
Node-REDの「exec」ノードを使用したいので、Jira Service Desk 環境と同じサーバーにNode-REDを構築します。手順はNode-REDの[ローカルインストール手順](https://nodered.org/docs/getting-started/local)を使用し、Nginxにてリバースプロキシを設定しています。
仮に、[https://servicedesk.example.com/red](#) とします。

## 実装
事前準備で確認したWatson DiscoveryのNode-REDのフローを拡張しています。
動きとしては、次のようになります。

1. Jira Service Deskのカスタマーポータルに、疲れの症状を入力
2. Jira Service DeskからWebhoookで、Node-REDにJSON形式で転送
3. 届いたJSON形式のデータから、コメント作成者を抽出。コメント作成者が管理者(adminユーザー)以外で、次へ。
3. Watson Discoverに照会し、該当する診療科名(=ファイル名)として出力。
4. 管理者(adminユーザー)アカウントを用いて、Jira Service Deskのカスタマーポータルにコメントとして返します。

Node-RED フロー図
![node-red-flow_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/40b3bb31-1bf2-bce4-0603-3b0b3624374d.png)

下記、各ポイントを説明します。

## webhookの設定
Jira Service Deskで、コメント作成時に、http(s)://ホスト名/red/webhook1 にJSONデータを送信するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/f59875c7-87a9-a9a4-1745-4bebb5d33103.png)


## admin以外は通過
switchノードを使用しています。Jira Service Deksのカスタマーポータルにコメント投稿後にNode-REDに届いたJSONデータから、コメント作成者を抜き出し、管理者ユーザー(ここではadmin) 以外の時、「要約取り出し」に進めるようにしています。
管理者ユーザーで、REST APIを用いてコメントを返すため、ここで管理者ユーザーからの入力を反応させると、ループしエラーが生じるためです。
![node-red-flow_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/3c180392-45b8-66ab-ce85-225e42ff34e3.png)

## 要約取り出し
functionノードを使用しています。Node-REDに届いたJSONデータから、コメント本文を取り出す処理です。ここれで取り出したコメント本文を、この後の処理で、Watson Discoveryにて照会し、出力された文書ファイル名(=診療科名)を出力します。
![node-red-flow_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/3fc9d0a0-6bbd-9506-254d-1f72116d1368.png)

## get issue id
functionノードを使用しています。コメントとして返すための、Jira Service Deskのissue idを取り出し、またコメント文を生成する処理になります。
![node-red-flow_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/99ba5fb7-c8f7-e970-f449-b1018eea9acb.png)

## template
templateノードを使用しています。手前の「get issue id」ノードで取り出したJira Service Deskのissue idと生成されたコメント文を用いて、この後の「exec」ノードで使用する引数を生成します。
![node-red-flow_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/0bf9a263-c1e7-5c0a-222f-c8c521a75c87.png)

また、画面の都合で隠れていますが、テンプレート欄には下記が記述されています。
{{issueid}}に、取り出したJira Service Deskのissue id が挿入され、{{payload}}に、コメント文が挿入されます。

```
--url 'https://servicedesk.example.com/jsd/rest/api/2/issue/{{issueid}}/comment' --header 'Accept: application/json' --header 'Content-Type: application/json' --data '{ "public": true,"body": "{{payload}}" }'
```
## curl実行によるREST API 処理
execノードを使用しています。[Jira Service Desk REST API](https://docs.atlassian.com/jira-servicedesk/REST/4.4.2/)のベーシック認証を用い、「template」ノードの内容を引数として、POST処理を実行します。
![node-red-flow_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/455b6f58-38ac-3250-766d-94f3f6feff6b.png)

# 動作確認

1. カスタマーポータルに顧客としてログインし、問い合わせを作成します。下図では「最近疲れやすい。」としています。
2. 「どうかしましたか？」と返信がありますので、「このリクエストにコメント」にWatson Disocveryに学習された文書ファイルの中身である病気の予兆や症状を入力します。たとえば「日中眠くなる」などです。
3. しばらくすると「〇〇の受診をお勧めします」とコメントに対する返信が届きます。さくっと確認したい場合は、画面を再読み込みします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/c3d914b5-c3bc-43ba-dcd0-d9c05616d2cf.png)

# まとめ
力技ですがNode-REDを用いて、Jira Service DeskにIBM Watson Discoveryを接続し、チャットボットとして機能するようにしました。
先日、Jira Service Deskのクラウド版に無料プランが登場しましたので、同様の仕組みをそちらでも実装してみるつもりです。