前回作った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)にサインインして、左側のリソースグループのアイコンを選択しましょう。
「リソースグループ」を選択したことを確認し、+追加
をクリックします。
リソースグループの作成画面が出てきます。今回は、
- リソースグループ名 : Bot6
- リソースグループの場所 : 西日本
を選択し、ダッシュボードにピン留めする
にチェックを入れて(も入れなくてもいいですが)、作成
をクリックします。
すぐにリソースグループという名の空箱ができます。
1. Azure Bot Serviceのデプロイ
Bot Serviceのを作成します。先ほど作ったリソースグループ(Bot6)を開き、+追加
をクリックします。
フィルターに「bot service」と入力して検索をすると、Bot Service(プレビュー)
が表示されますので、クリックします。
Bot Service の設定が表示されますので、今回は以下を入力しました。
- アプリ名 : yokobot6
- リソースグループ名 : Bot6
- リソースグループの場所 : 西日本
作成
ボタンをクリックすると、デプロイが始まります。
「デプロイメントが成功しました」とメッセージが表示されるまでしばし待ちます。
ここで疑問なのですが、デプロイが完了した後にすぐ次の操作をしたらエラーになるときがあったりなかったり….ということで、謎い現象のリスク回避のため、デプロイによって作成される「yokobot6」だけでなく、以下図のようにプランができるのも待ってみます(今回、名称はJapanWestPlanとして作られましたが、リソースの場所によって名称が変わると思います)。
(この方法で何かが解決されるかってのは、私の妄想なので、正しくない可能性が高いです。。。)
5分もかからずできると思いますので、更新
ボタンをポチポチして確認してみましょう。
表示ができたら、Bot Serviceのyokobot6
をクリックします。
クリックすると、Microsoftアカウントの認証を要求され、認証後に以下の画面に遷移します。
アプリパスワードを生成して続行
ボタンをクリックすると、アプリのパスワードが表示されます。パスワードは一度しか見れないのでコピーしておきましょう。
コピーしたら、パスワードの画面を閉じ、終了してボットのフレームワークに戻る
ボタンをクリックすると、AzureポータルのBot Serviceの画面に戻ります。App IDが自動で入力されますので、さきほどコピーしたパスワードを入力します。
下に進み、「Choose a language」でC#
、「Choose a tempate」でLUISをしめすLanguage understanding
を選択し、Create bot
をクリックします。
以下の画面が表示されます。LUISについて書かれていますが…(Azureが自動で空のLUISを作ってくれます)OKをクリックして問題ありません。選択したテンプレートに合わせてプログラムが生成されますので少々待ちましょう。
これでベースのプログラムが完成となります。
2. LUISと連携する
Bot FramworkでLUISと作ったことがあるかたにとっては、それと類似のコードが生成されるだけとなります。LUIS絡みのコードは、messages
フォルダ > BasicLuisDialog.csx
になります。
LUISの接続について理解を深めるために、コードを見てみましょう。
13行目のコンストラクター、Utils.GetAppSetting(...
で、LuisAppIdとLuisAPIKeyを取得して、LUISと接続するための情報を設定しています。この部分は、どこかから値を取得しています。見てみましょう。
画面上部のSettings
をクリックし、画面下の方の「Application settings」のOpen
ボタンをクリックします。
AppServiceを使ったことがある開発者には馴染みのある画面で、環境に応じたキーを設定することができます。
先ほど見たUtils.GetAppSetting(...
メソッドの引数にLuisAppId
やLuisAPIKey
を入れることでここの中の値を取得することができます。(できるはずです。)
ってか最初から謎の値が入っています…..前述でちょっとふれましたが、LUISのMyApplicationを見てみると、空のLUISが作られており、その値が入っているというオチです。
ということで、以前に作ったLUISのAppIdとLuisAPIKeyをここに入れればつながるはず…..2つのキーの取得は、前回の記事のここをご参照ください。
Bot Serviceを先に作って自動で作られたLUISを使うという選択肢もありますし、現実的な開発シナリオとして、LUISをコネコネしながら、使いたいLUISをここで設定するという2パターンができますね。
2つのキーを更新してた後、最初うまくいかなかったのですが、お友達の大平さんから再起動すれば….と神の声が振ってきました。
Settings
タブのAdvanced settings
タブを開き、再起動
ボタンをドーンです。
うまく動作しない場合は、再起動してみましょう。 ちなみにAppServiceでは、AppSettingsを更新すると即時反映する仕様だったような…(私の人間性の問題で更新がうまくいかなかったか…)
本題のコードをいじるところです。
26-31行目のGetWeatherAsync
メソッド、33-38行目のGetTimeOfTrainAsync
を追加しましょう。コードを簡単に解説すると、LUISのIntentにアクセスしてそのレスポンスをもらうには、メソッドにLuisIntent
AttributeをつけてIntentの名称を引数として指定します。あとは、記載しているシグネチャでコードを書けば動作します。
今回は、チャット側でユーザーが入力した文章をそのまま返しているだけですが、作りたいように変更していくとよいところとなります。
3. 動作確認
チャットのエミュレーターが搭載されているので、文章を入力してみましょう。
本当に指定したLUISが受け取ったか見てみましょう。LUISの画面でSuggest
タブを開きます。
ここで、ラベリングしていない文章を見ることができます。IntentやEntityを条件に文章を検索することもできます。
さきほど入力した文章が無事にアクセスしていることが確認できました。ラベリングも正しく行われており、いい感じです。
もし、正しくラベリングされていなければ、ここでラベリングして学習させましょう。学習させたあとは、LUISの更新(画面左のPublish
> Update published application
ボタンクリック)を忘れずに。
ということで、ざっくり Azure Bot Service と LUIS の連携ができました。