Microsoft が提供している Cognitive Services の一つに LUIS(Language Understanding Intelligent Service) があります。LUIS は与えられた文章を、機械学習を用いて解析し、指定したパターンに当てはまるかどうかを判定、不足している要素は何か、といったところを扱えるものです。今回は LUIS を用いて、自然な文章で問い合わせができる Bot を作成してみます。
まずは LUIS を利用できるようアカウントなどを登録します。今年いっぱいは Free プランがトライアル用として用意されているのですが、来年からはプランが廃止されますので注意が必要です。
1.LUIS の環境を作成する
![image image]()
LUISのサイトへ行き、「Sign in or create an account」をクリック。
![image image]()
サインインオプションとして、MS 社員かそうでないかを聞かれるので、most users をクリック。
![image image]()
利用するアカウントでサインインします。初めて LUIS にサインインする場合は、権限付与を求められるのでそれも許可します。
![image image]()
アカウントの国情報、組織名、どこで LUIS を知りましたか的な質問があるので、それらしいのを選択・入力し「I agree ・・・」にチェックをつけたうえで Continue をクリック。
![image image]()
これで LUIS にアカウントを登録できました。続いて、LUIS の機能を利用するアプリケーション情報を登録します。アプリケーション登録することで、HTTP による呼出も可能になります。
![image image]()
New App をクリックするとメニューが表示されるので、New Application をクリック。
![image image]()
このようなダイアログが表示され、アプリの名前や、使用用途、対象とするカテゴリ、アプリの説明、そして言語を選択します。現在 LUIS では言語によって利用できる機能が違っており、日本語環境ではまだ提供されていない機能も多いですが、とりあえず利用するには問題ありません。
なお、表示がいろいろ乱れていてアレなのは Chrome だから(
![image image]()
登録されるとこのような画面に切り替わります。
ここで行うことは、
- 文章の要素(エンティティ)の設定
- 文章の要素パターン(インテント)の設定
- 解析サンプルとなる例文の投入
が主だった作業になります。エンティティとして必要な要素を登録し、それらを組み合わせて院展ととなるパターンを設定、その後に正しく解析できるかどうかサンプルをどんどん投入、という感じです。
左部にあるメニューで Entities をクリックすると、新しい要素の登録が行えます。
![image image]()
実際の登録はこのような形で行います。エンティティの名称と、もし子要素があるなら子要素の名称を登録します。子要素がない場合は、Include Children のチェックを外すことで単一の要素となります。また、Include children の下にある、Hierarchical と Composite ですが、Hierarchical だと新規に子要素も追加でき、Composite だと既存の子要素を指定できます。
![image image]()
ここで日本語環境以外であれば、このインテントに当てはまった場合に特定の動作を行うことができるよう、設定が行えるのですが・・・
![image image]()
日本語環境では残念ながら未対応で、Action の部分については何も設定できません。仕方がないので、Parameters に対して、どのエンティティを用いるかを指定します。この際に左端の Required にチェックをつけると、必須項目として扱われるようになります。解析した結果、恐らくこのインテントだと思われるけども項目が足りていない場合、LUIS は不足項目が何かというのを返答してくれます。Prompt で設定したものが、その際に利用される質問文となりますのでそれを用いて、確認メッセージを飛ばす、などと言った使い方ができると思います。
![image image]()
インテントを登録できれば、あとはサンプル文を投入し、その際にどう解析してほしいかを指定する作業になります。投入した文章で、エンティティとなる部分を反転させると、この部分はどのエンティティになるかを尋ねられるので、適切なエンティティを指定します。また、右側のリストボックスでは、どのインテントとするかを設定します。
設定後に Submit をクリックすると LUIS はそれをモデルとして把握するようになります。
![image image]()
サンプル文の解析を教え込んだ後は、画面左下にある Train をクリックします。こうすることで把握したモデル情報が LUIS に反映され、これより後に投入した文章に解析に用いられるようになります。
ここでどれだけ大量にサンプルを投入できるかが、意図した解析を行ってくれるかに影響しますので、できるだけ多くの文章を投入するのが良いと思います。
2.LUIS を使用できるよう設定する
続いて行うのは、実際に LUIS を利用するために必要なサブスクリプションを設定することです。これは Azure Portal から Cognitive Services を選択することで、新規に購入が可能です。
![image image]()
上記の一覧で追加をクリック。
![image image]()
このような画面が表示されるので、アカウント名(識別するための適当な名称)、サブスクリプション、API type(LUIS を選択)、価格レベル、リソースグループ、設置するリージョンを指定します。2016/12/27 時点では、利用可能なリージョンは米国西部のみ、となっています。
![image image]()
大体このような感じになるので、設定後に作成をクリックします。
![image image]()
作成できたら、一覧上でそのアカウントをクリックし、キー情報を取得します。キーは二つ用意されていますが、どちらか片方のみで大丈夫です。
![image image]()
キーを取得した次は、LUIS へそのキー情報を登録します。左側メニューより App Settings をクリックすると、このような画面が表示されるので、Endpoint Key Assigned to app な枠内にある、Save a new endpoint key 欄に、先程のキーを貼り付けし、Add New Key をクリックします。これで LUIS を利用できる状態になりました。
![image image]()
外部サービスなどから利用できるようにするには、LUIS のサービスを API としてデプロイしておく必要があります。左側メニューから Publish をクリック、初めてのデプロイ時は上記のように表示されるので、Publish web service をクリックします。
![image image]()
一度デプロイすると、このように HTTP で呼び出せる WebAPI となります。クエリパラメータとして解析した文言を渡す形式になりますので、アプリ側からはその形式で呼び出す必要があります。
3.LogicFlow から呼び出す
ここまでやると、ようやく LogicFlow から LUIS を呼び出して利用することが可能です。
![image image]()
今回はざっくりとこのような形の LogicFlow としています。Twitter で話しかけられたのをトリガとしたいのですが、今回は定期的に TL を取得し、その中に自分あてのツイートがあれば反応する、という方式です。
含まれていた場合には、まず LUIS を呼び出します。LUIS は先程もありましたように、HTTP の GET でアクセスする方式で、解析したい文言をクエリパラメータとしてアドレスに付与した形でアクセスするものとなります。
そこで解析された結果から、処理をどうこうさせるのですが、今回はその部分を別の LogicFlow に分けています。
![image image]()
それが上記のような LogicFlow です。こうすることで、LUIS からの戻り値である JSON の値を、HTTP Request コネクタにスキーマ定義しておくことで、デザイナ上で扱いやすくさせています。そして必要な値だけを戻すようにしています。
![image image]()
こちらがもともとの LogicFlow で、ここでいう HTTP2 となっているコネクタが、分けた LogicFlow を呼び出しているところになります。LogicApps の場合、HTTP コネクタでなくとも、直接同一リージョンの LogicFlow を呼び出すことは可能なのですが、今回のように受け取る値のスキーマを定義して利用したい場合、少々面倒なことになるので注意が必要です。
![Media preview]()
JSON スキーマで定義しているすべての値を求められるのは、悪くはないのですが結構な面倒ですので、今回のような場合はそのまま JSON を渡すことができる HTTP コネクタを利用する方が楽だと思います。
試しに LUIS を呼び出し、解析を行った場合はこのように実行されています。
![image image]()
戻された本文には、こちらから投げた文章となる query、解析結果で最もスコアが高かったものについての topScoringIntent などがあります。実際の解析結果は entities に設定され、不足があれば dialog に不足に対する質問内容が設定されてきます。実際に戻された JSON は以下のようになっていました。
このように、LUIS を利用することで、自然な文章に対して特定のパターンにあてはまるかどうか、あてはまる場合はどの要素にどの言葉があてはまるのかを判断できるようになります。今回の例では解析結果を特にどうこうしていませんが、「札幌の今日の天気は?」という質問に対して、いつ:今日、どこ:札幌、というのが抽出できています。
![image image]()
![image image]()
それらを利用することで、例えば特定の場所の天候を調べたり、特定の挙動を行わせることも十分に可能です。
何をやらせるか、何を解析させるか、というのを決めるのが今回一番悩みましたが、目的が決まれば LUIS を利用するのもそれほど難しくはありません。このあたりの技術を含めることで、コードを書かなくとも人間味のある BOT 開発が十分に可能です。