QnA Maker + Slack

以下はAzureでQnA Makerサービスを作成し、Slackと連携させるまでの流れを説明。

# Azure

はじめにWebアプリボットを作成します。

リソースの作成 > AI Machine Learning > Web App Bot

![azure_01.png](https://qiita-image-store.s3.amazonaws.com/0/297616/d6b45cb4-7ce8-28fe-6d70-be5979a695b7.png)

- ボット名: SampleBot-2018 (任意)
- リソースグループ: SampleBot (任意)
- 場所: Japan East
- 価格レベル: F0 (無料枠で構築)
- ボットテンプレート: Question and Answer
- App Serviceプラン場所
    - Appサービスプラン名: SampleBot-2018 (任意)
    - 場所: 東日本 (任意)

※値を指定していない項目はdefaultを使用しています。

![azure_02.png](https://qiita-image-store.s3.amazonaws.com/0/297616/cac6a84d-1000-cd83-f0c4-5149e856afb2.png)

# QnA Maker

次にQnA Makerの設定を行います。
https://www.qnamaker.ai/ のページから、Create a knowledge baseタグを選択。
STEP1 の Create a QnA service をクリックすると、Azureのダッシュボードに遷移しますので、そちらでサービスの設定をします。

- Name: QnA (任意)
- Management Pricing tier: F0 (無料枠で構築)
- 場所: 米国西部 (現時点では東日本などは選択不可)
- Resource Group: SampleBot (Webアプリボット作成時のリソースグループ)
- Search pricing tier: F
- Search location: 米国西部 (上記の場所に合わせた。任意)
- App name: QnA-2018

※値を指定していない項目はdefaultを使用しています。
※App service はデフォルトで S1 が選択されるように記載があります。こちらは無料枠ではないレベルなので、そのままにすると課金されます。(無料枠への変更方法は後述)

QnA Makerサービス作成後、QnA Makerのページへ戻り、STEP2以降は設定します。
- Microsoft Azure Directory ID: 規定のディレクトリ
- Azure subscription name: 従量課金 (各自の設定による)
- Azure QnA service: QnA (作成したQnA Service)

※QnA Makerサービス後、QnA Makerのページの refresh this pageをクリックすることで、選択肢が再度読み込まれ、Azure QnA serviceなどが、選択可能になります。

STEP3では、ナレッジベースの名前を設定
- Name: SampleBot-2018KB (任意)

![azure_03.png](https://qiita-image-store.s3.amazonaws.com/0/297616/d95fc6b8-97f1-f796-d416-bb688b1f6166.png)

リソースの作成が完了したら、ナレッジの登録をします。
今回は「竜頭蛇尾」と「朝三暮四」について登録します。
2つの熟語を登録したら、
Save and train > Test
を実施し、動作確認をしてください。

![azure_04.png](https://qiita-image-store.s3.amazonaws.com/0/297616/57551c2d-f6a6-0371-6ce9-7b82d1587474.png)

動作確認が済んだら、ナレッジを公開します。

![azure_05.png](https://qiita-image-store.s3.amazonaws.com/0/297616/24f0ce42-fc9a-0b6d-30b9-41600f74f63b.png)

公開したら Edit Service で、Azureのリソースに Sample HTTP requestに表示されている一部の値を環境変数として登録します。

```Text:Postman
POST /knowledgebases/<QnAKnowledgebaseId>/generateAnswer
Host: <QnAEndpointHostName>
Authorization: EndpointKey <QnAAuthKey>
Content-Type: application/json
{"question":"<Your question>"}
```

アプリケーション設定
- QnAAuthKey
- QnAEndpointHostName
- QnAKnowledgebaseId

登録したら「Webチャットでテスト」でサービスとQnA Makerのナレッジが連携されていることを確認するテストします。

![azure_07.png](https://qiita-image-store.s3.amazonaws.com/0/297616/127be134-ad57-2704-3540-6dca7448ea3b.png)

![azure_08.png](https://qiita-image-store.s3.amazonaws.com/0/297616/498c27a5-f953-d8b2-1577-173b4adbb1f6.png)

最後に、QnA Serviceを作成時に、defaultで無料枠ではなかった箇所について、価格レベルを変更します。

![azure_09.png](https://qiita-image-store.s3.amazonaws.com/0/297616/1d4494bf-9378-142f-34d1-35f3ac17cd41.png)

# Slack API

さて本題のAzureで作成したチャットボットとSlackを連携させます。
https://api.slack.com/apps から Create New App します。
- App Nmae: AuzreBot (任意)
- Development Slack Workspace: (各自のSlackワークスペース)

![azure_10.png](https://qiita-image-store.s3.amazonaws.com/0/297616/f729a8eb-b7df-ada6-e6ab-1320a1cd7978.png)

App Credentialsが表示されます。
- Client ID
- Client Secret
- Verification Token
は、あとで使いますが、その前にSlack APIの設定をしていきます。

![azure_11.png](https://qiita-image-store.s3.amazonaws.com/0/297616/a21b039a-dfe9-291e-7933-2a2f0cf177d3.png)

OAuth & Permissions > Redirect URLs
- Redirect URLs: `https://slack.botframework.com`

![azure_12.png](https://qiita-image-store.s3.amazonaws.com/0/297616/1a652cc5-99e4-8f51-dea3-8ff7a41950b7.png)

BOT Users > Add a Bot User
- Display name: azurebot (任意)
- Default username: azurebot (任意)
- Always Show My Bot as Online: On

![azure_13.png](https://qiita-image-store.s3.amazonaws.com/0/297616/4408f539-e147-5379-1c86-ae0717d739a4.png)

Event Subscriptions
― Enable Events > On
    - Request URL: `https://slack.botframework.com/api/Events/${QnA Service Name}`
- Subscribe to Bot Events
    - Event Name: message.channels

![azure_14.png](https://qiita-image-store.s3.amazonaws.com/0/297616/f63de267-2b08-7a0f-b9f8-4d2bd0b72051.png)

# Azure

最後に、WebアプリボットとSlack APIを接続させます

チャネル > Slack

App Credentialsで表示されていた、Client IdをクライアントID。Client Secretをクライアントシークレット。Verification Tokenを確認トークへ入力します。

![azure_15.png](https://qiita-image-store.s3.amazonaws.com/0/297616/5dbfb7fe-60cd-8dbe-119b-ac8fc2709cac.png)

![azure_16.png](https://qiita-image-store.s3.amazonaws.com/0/297616/5c02214a-f473-4368-7c8a-4d5dd9b4deed.png)

# Slack

それでは AzureBot をチャネルに招待して、「朝三暮四」について聞いてみましょう。
![azure_17.png](https://qiita-image-store.s3.amazonaws.com/0/297616/d8ab7fd3-0111-eba9-fc5c-addf4250dbd0.png)