BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

AzureBot Service に LUIS を連携させる(C#)

前回作ったLUISくんを、Azure Bot Serviceと連携させてみようのコーナーです。
LUIS も Azure Bot Service もブラウザだけでできちゃうお手軽感すごいです。

Overview

事前準備

事前に以下が必要です。

  • Microsoftアカウント
  • Cognitve SerivicesのLUIS

ちなみに、前回つくったLUISくんはこちら
Azure Bot Serviceの概要はこちら

0. リソースグループの作成

Azureのあれやこれやを作成方法は多々ありますが、Bot Service を作る際、(私的には)リソースグループを作って、その中で Bot Service を作ることをお勧めします。
理由は、 Bot Serviceを作ると、5つのインスタンスができるため、管理や削除するのがめんどくさいからです。なによりポータルがごちゃごちゃするの嫌だからです(でも、性格は几帳面ではありません…)。

Azureのポータル(portal.azure.com)にサインインして、左側のリソースグループのアイコンを選択しましょう。

f:id:beachside:20161122133936p:plain

「リソースグループ」を選択したことを確認し、+追加をクリックします。

f:id:beachside:20161122133940p:plain

リソースグループの作成画面が出てきます。今回は、

  • リソースグループ名 : Bot6
  • リソースグループの場所 : 西日本

を選択し、ダッシュボードにピン留めするにチェックを入れて(も入れなくてもいいですが)、作成をクリックします。

f:id:beachside:20161122134352p:plain

すぐにリソースグループという名の空箱ができます。

1. Azure Bot Serviceのデプロイ

Bot Serviceのを作成します。先ほど作ったリソースグループ(Bot6)を開き、+追加をクリックします。

f:id:beachside:20161122134558p:plain

フィルターに「bot service」と入力して検索をすると、Bot Service(プレビュー)が表示されますので、クリックします。

f:id:beachside:20161122134802p:plain

Bot Service の設定が表示されますので、今回は以下を入力しました。

  • アプリ名 : yokobot6
  • リソースグループ名 : Bot6
  • リソースグループの場所 : 西日本

f:id:beachside:20161122135039p:plain

作成ボタンをクリックすると、デプロイが始まります。 「デプロイメントが成功しました」とメッセージが表示されるまでしばし待ちます。

ここで疑問なのですが、デプロイが完了した後にすぐ次の操作をしたらエラーになるときがあったりなかったり….ということで、謎い現象のリスク回避のため、デプロイによって作成される「yokobot6」だけでなく、以下図のようにプランができるのも待ってみます(今回、名称はJapanWestPlanとして作られましたが、リソースの場所によって名称が変わると思います)。

(この方法で何かが解決されるかってのは、私の妄想なので、正しくない可能性が高いです。。。)

f:id:beachside:20161122135312p:plain

5分もかからずできると思いますので、更新ボタンをポチポチして確認してみましょう。
表示ができたら、Bot Serviceのyokobot6をクリックします。

クリックすると、Microsoftアカウントの認証を要求され、認証後に以下の画面に遷移します。 f:id:beachside:20161122135656p:plain

アプリパスワードを生成して続行ボタンをクリックすると、アプリのパスワードが表示されます。パスワードは一度しか見れないのでコピーしておきましょう。
コピーしたら、パスワードの画面を閉じ、終了してボットのフレームワークに戻るボタンをクリックすると、AzureポータルのBot Serviceの画面に戻ります。App IDが自動で入力されますので、さきほどコピーしたパスワードを入力します。

f:id:beachside:20161122140812p:plain

下に進み、「Choose a language」でC#、「Choose a tempate」でLUISをしめすLanguage understandingを選択し、Create botをクリックします。

f:id:beachside:20161122141126p:plain

以下の画面が表示されます。LUISについて書かれていますが…(Azureが自動で空のLUISを作ってくれます)OKをクリックして問題ありません。選択したテンプレートに合わせてプログラムが生成されますので少々待ちましょう。

f:id:beachside:20161122141419p:plain

これでベースのプログラムが完成となります。

2. LUISと連携する

Bot FramworkでLUISと作ったことがあるかたにとっては、それと類似のコードが生成されるだけとなります。LUIS絡みのコードは、messagesフォルダ > BasicLuisDialog.csxになります。

LUISの接続について理解を深めるために、コードを見てみましょう。

13行目のコンストラクターUtils.GetAppSetting(...で、LuisAppIdとLuisAPIKeyを取得して、LUISと接続するための情報を設定しています。この部分は、どこかから値を取得しています。見てみましょう。

画面上部のSettingsをクリックし、画面下の方の「Application settings」のOpenボタンをクリックします。

f:id:beachside:20161122142846p:plain

AppServiceを使ったことがある開発者には馴染みのある画面で、環境に応じたキーを設定することができます。

f:id:beachside:20161122142939p:plain

先ほど見たUtils.GetAppSetting(...メソッドの引数にLuisAppIdLuisAPIKeyを入れることでここの中の値を取得することができます。(できるはずです。)

ってか最初から謎の値が入っています…..前述でちょっとふれましたが、LUISのMyApplicationを見てみると、空のLUISが作られており、その値が入っているというオチです。

ということで、以前に作ったLUISのAppIdとLuisAPIKeyをここに入れればつながるはず…..2つのキーの取得は、前回の記事のここをご参照ください。

Bot Serviceを先に作って自動で作られたLUISを使うという選択肢もありますし、現実的な開発シナリオとして、LUISをコネコネしながら、使いたいLUISをここで設定するという2パターンができますね。

2つのキーを更新してた後、最初うまくいかなかったのですが、お友達の大平さんから再起動すれば….と神の声が振ってきました。
SettingsタブのAdvanced settingsタブを開き、再起動ボタンをドーンです。

f:id:beachside:20161122150815p:plain

うまく動作しない場合は、再起動してみましょう。 ちなみにAppServiceでは、AppSettingsを更新すると即時反映する仕様だったような…(私の人間性の問題で更新がうまくいかなかったか…)

本題のコードをいじるところです。

26-31行目のGetWeatherAsyncメソッド、33-38行目のGetTimeOfTrainAsyncを追加しましょう。コードを簡単に解説すると、LUISのIntentにアクセスしてそのレスポンスをもらうには、メソッドにLuisIntentAttributeをつけてIntentの名称を引数として指定します。あとは、記載しているシグネチャでコードを書けば動作します。

今回は、チャット側でユーザーが入力した文章をそのまま返しているだけですが、作りたいように変更していくとよいところとなります。

3. 動作確認

チャットのエミュレーターが搭載されているので、文章を入力してみましょう。

f:id:beachside:20161122145111p:plain

本当に指定したLUISが受け取ったか見てみましょう。LUISの画面でSuggestタブを開きます。
ここで、ラベリングしていない文章を見ることができます。IntentやEntityを条件に文章を検索することもできます。

さきほど入力した文章が無事にアクセスしていることが確認できました。ラベリングも正しく行われており、いい感じです。

f:id:beachside:20161122153052p:plain

もし、正しくラベリングされていなければ、ここでラベリングして学習させましょう。学習させたあとは、LUISの更新(画面左のPublish > Update published applicationボタンクリック)を忘れずに。

ということで、ざっくり Azure Bot Service と LUIS の連携ができました。