LINE WORKS FAQ Bot を QnA Maker + Microsoft FLOW で作成

QnA Maker を利用すると、既存の FAQ サイトの URL や、製品マニュアルのドキュメント ファイルなどを読み込ませて、簡単に FAQ サービスを作成できます。

TITLE: QnA Maker とは
URL: https://docs.microsoft.com/ja-jp/azure/cognitive-services/QnAMaker/overview/overview

この記事では、QnA Maker を用いて LINE WORKS の FAQ Bot を作成します。

<img width="375" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0df302f5-bdb5-505c-1686-e2f1c1f41de8.png">


##QnA Maker

TITLE: クイック スタート:QnA Maker API サービス ポータルを使用してナレッジ ベースを作成する
URL: https://docs.microsoft.com/ja-jp/azure/cognitive-services/QnAMaker/how-to/create-knowledge-base

ドキュメントの手順に沿って、QnA Maker ポータルで、ナレッジベースを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/803d8156-7e86-e315-7b9b-28eb07fc4732.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/af75d3df-3e43-045d-2ad9-60fcf1a315a0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/48761488-79fc-8f4e-e3aa-29de3a800f0e.png)

[Create Your KB] ボタンをクリックして、ナレッジベースの生成を待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/f727ac93-c116-c23f-0164-73783193f565.png)

生成されたナレッジベースを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/83ee9f39-5869-a813-07b1-37daec3dd5c1.png)

正しくナレッジベースが生成されたら Publish します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/46a624b3-8278-1c34-2492-73cafaabb8ea.png)

Endpoint key などの値は、後ほど Flow でアクション作成時に利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/bd51688b-1685-cd17-1e0b-87b0f99ff47e.png)

##Azure Automation

以下の記事で、Microsoft Flow で何かしらのトリガーを基に、定型のメッセージを送る LINE WORKS BOT の作成方法を説明しました。

TITLE: LINE WORKS + Azure Automation + Microsoft Flow で LINE WORKS Bot からトークメッセージ送信
URL: https://qiita.com/iwaohig/items/3056b95597772061d17b

上述の記事の説明に沿って、Azure Automation の設定を行ってください。
ただし、PowerShell のスクリプトは、ユーザー ID とメッセージの内容をパラメータで受け取るために、以下のものを利用してください。

Bot No. 、API 認証関連の値は、後ほど LINE WORKS の Developer Console を参照してく入力しなおしてください。Bot No. は Bot 登録時に生成されます。

```
Param
(
  [Parameter (Mandatory= $true)]
  [string] $accountId,

  [Parameter (Mandatory= $true)]
  [string] $message
)

$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("Content-Type","application/json; charset=UTF-8")
$header.Add("consumerKey","<Server API Consumer Key>")
$header.Add("Authorization","Bearer <Server Token>")
$header.Add("Cache-Control","no-cache")

$json = @"
{
    "botNo": <bot No.>,
    "accountId": "$accountId",
    "content": {
        "type": "text",
        "text": "$message"
    }
}
"@

$Body = [System.Text.Encoding]::UTF8.GetBytes($json)
$Uri = "https://apis.worksmobile.com/<API ID>/message/sendMessage/v2"
Invoke-RestMethod -Uri $Uri -Method Post -Header $header -Body $Body
```
Azure Automation の Runbook でのパラメータの利用は、こちらの記事で説明されています。

TITLE: Runbook の入力パラメーター
URL: https://docs.microsoft.com/ja-jp/azure/automation/runbook-input-parameters

##Microsoft Flow の準備

###HTTP 要求の受信時をトリガーとして作成

LINE WORKS ユーザーからの問い合わせを受けるために、Microsoft Flow でフローのトリガーとして [HTTP 要求の受信時] を指定します。

[要求本文の JSON スキーマ] を [サンプルのペイロードを使用してスキーマを生成する] を利用して作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0a88a8de-2d3f-ccb2-a9e0-e6623df248d1.png)


サンプルの JSON ペイロードは LINE WORKS の Developers サイトの "メッセージ受信 - Callback 形式 (message)" の記事中の Request Example として掲載された以下を用います。

https://developers.worksmobile.com/jp/document/100500901?lang=ja

```
{
  "type": "message",
  "source": {
    "accountId": "admin@example.com",
    "roomId": "12345"
  },
  "createdTime": 1470902041851,
  "content": {
    "type": "text",
    "text": "hello"
  }
}
```

FLOW がサンプル ペイロードを解析してスキーマを生成してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/3534239b-0692-6904-5686-1cb4bd7225f8.png)


[method] は "POST" を指定します。

###QnA Maker をアクションとして作成
ここでは、[Generate answer] をアクションとして指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/aacee498-9215-2a05-307f-2757b63e4e01.png)


ナレッジベースを Publish した時に生成された値を、それぞれ指定します。"Question" は動的コンテンツから "text" を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/d7f45946-36ef-0c81-fb5d-45147e134499.png)

###Azure Automaiton をアクションとして追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/e80c4401-5abe-bd35-c89a-96463887e583.png)

ここでは、[ジョブの作成] を選択します。

サブスクリプション、リソース グループ、Automation アカウント、Automation のハイブリッド worker グループ、Runbook 名、ジョブの待機、パラメータを指定します。Runbook Parameter でトークメッセージに含める情報を、"動的なコンテンツの追加" で選択できます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/59d49c43-30f3-c474-952a-6d9cc35dbc09.png)

フローを保存します。

[HTTP 要求の受信時] の HTTP POSR の URL が生成されるので、控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/65638144-92f5-246b-ed12-0b6d80977483.png)


##LINE WORKS Developer Console の準備

LINE WORKS でトークボット API を利用するため、LINE WORKS の Developer Console で、以下の作業を行います。

###API 認証の準備
- API ID 発行
- サーバー API のコンシューマーキー発行
- サーバー API の Server Token

手順はこちらのページの情報を参照します。
https://developers.worksmobile.com/jp/document/1002002?lang=ja

###Bot 登録
Bot メニューで [登録] ボタンをクリックし、以下の項目を入力し、保存をクリック
- Bot名 -> 任意の名前
- 「説明」-> 任意の説明文
- Callback URL -> Microsoft Flow の Http 受信時の要求で生成された URL
- 複数人のトークルームに招待可 -> off
- 管理者 -> 任意のメンバーを指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/b09c77d6-a31e-3674-cd9e-cbcfa684fed9.png)


登録すると Bot No. が生成されます。

API 認証の情報と、Bot No. を Runbook のスクリプトに記述します。

##LINE WORKS 管理画面での作業
LINE WORKS の管理画面の [サービス]-[Bot] メニューで当該 Bot を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/f6ea2852-e7e7-e4f4-3ab7-0aab10ccacc3.png)


追加後、Bot の詳細で、Bot の使用権限や公開設定を用途に応じて行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/7d3b4698-c321-487d-edc5-4a2148b43e29.png)



##動作確認
LINE WORKS で Bot に質問を送ると、Bot からナレッジベース内の関連情報が返信されることを確認します。