こんばんは。今日はAzure Cognitive ServiceのLanguage Understanding (LUIS)を触ってみましたので、その記録を残しておきたいと思います。
なお、なるべく正確な記載になるよう、各種ドキュメントを読んだり、実際に触ってみた上でまとめていますが、私の理解が正しくない部分もあるかもしれません。コメント等でご指摘いただけますと幸いです。
それではまいります。
Contents
Language Understanding (LUIS)とは?
公式ドキュメントで以下の説明があるように、LUISは投げかけた文章の意図を抽出してくれるCognitive Serviceの機能です。
https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/what-is-luis
Language Understanding (LUIS) は、カスタムの機械学習インテリジェンスをユーザーの自然言語での会話テキストに適用して、全体の意味を予測し、関連性のある詳細な情報を引き出す、クラウドベースの会話型 AI サービスです。
とだけ説明があってもわかりづらいですよね。
例えば、以下のように”Turn the blue light off”と投げかけると、”電源を切る”という、投げかけの意図を見つけ出して返してくれます。さらに、付加機能で、感情スコアなどを算出して返すことも可能です。
QnA Makerなどで、この機能と組み合せる話がよく出てくるかと思いますが、その文脈の通り、このLUISアプリ自体には問いに対する回答を返す機能はないため、このLUISの解釈結果をQnA Makerのインプットにしたりして組み合わせることで最終的な機能を実現することになると思います。
LUISの構成要素
LUISを使うにあたって、以下の用語と関係を抑えておくとよいでしょう。
- ドメイン(Domain):話題
- 意図(Intent):発話の目的とする結果
- 発話(utterance):意図を実現するために発せられるフレーズ
- エンティティ(Entity):発話から抽出された、意図を達成するために必要なデータ。
それぞれは以下のような包含関係で整理できそうです。LUISでは、こちらが投げかけた発話に対してこの意図やエンティティを抽出して返答してくれます。
上の例以外、例えばフライトを予約し、目的地の天気を確認する機能を備えた旅行アプリでも考えてみると、以下のように対応します。(と公式ドキュメントに書いています)
- ドメイン:旅行
- 意図:BookFlight(航空券を予約する)、BookHotel(ホテルを予約する)etc
- 発話:”航空券を予約したい”、”ホテルを予約してほしい” etc
- エンティティ:BookFlightを例にすると、日付、目的地、など意図(BookFlight)を達成するために必要となる情報
https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/concepts/application-design
なので「シアトルからカイロの航空券を購入する」という発話をLUISに与えたとすると、以下のような構造で解釈されることになります。
- 発話:シアトルからカイロの航空券を購入する
- ドメイン:旅行
- 意図:航空券の購入
- エンティティ:
- 出発地:シアトル
- 目的地:カイロ
- チケット枚数:1
LUISを使ってみる
ドキュメントだけ読んでいていてもなかなかイメージがわかないと思いますので、実際に簡単なアプリを作成してみたいと思います。
今回は、こちらのクイックスタートを参考にして実際に触ってみました。
https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/luis-get-started-create-app
LUISリソースの作成
はじめにLUISリソースの作成です。Azure Portalで”Language Understanding”と入力するとヒットすると思いますので、そこで「作成」に進みます。
Azureでも見慣れぬ構成だなぁと思ったのが、以下のように学習と予測で異なるリソースを利用すること。思想はよくわかりませんが、そういうものだと思って進めます。
なお、Authoring(オーサリング)側のリソースと、予測用リソースは、それぞれ対応リージョンが限られていますので、以下を要チェックです。(Authoringの方は日本をリージョンに指定することができませんでした)
https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/luis-reference-regions
まずはすべて規定値かつFree価格プランを選択して作成していきました。
LUISアプリの作成
リソースを作成したら、Authoring側のリソースからLUISポータルに移動します。ポータルを開いた際、初回だけAuthoringリソースとの紐づけ設定を行います。
LUISアプリを作成します。Cultureで言語を選択します。これは後から変更することができません。
事前学習済モデル(Prebuilt Domains)をアプリに追加
アプリを作成したら、アプリの中に進んで、Prebuilt Domainsの”HomeAutomation”を追加します。
Prebuilt Domainsについての説明はこちら。
https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/luis-concept-prebuilt-model
https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/luis-reference-regions
すると、HomeAutomationドメインに関する意図とエンティティがアプリに追加されます。
意図の中身はこんな感じ。意図に対応させる発話のサンプルが複数登録されています。
ここで、発話中の単語をクリックすることで、対応するエンティティを手動で更新することもできます。
学習してテストする
そして、まずはこのままの状態で「学習(Train)」を実行して、「テスト」に進みます。
ここでは、LUISアプリに対して発話して、応答を確認してみることができます。
以下は”turn off the lights”という発話をアプリに渡した例ですが、意図として、”HomeAutomation.TurnOff”が信頼度0.966で正しく認識されていることが分かります。また、エンティティとして”lights”が認識されていることも確認できますね。
予測スコアである信頼度の説明は以下にあります。
https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/luis-concept-prediction-score
マニュアルでの意図・エンティティの追加
意図はマニュアルで追加することもできます。”Intent”から”Create”で”HomeAutomation.AddDeviceAlias”を追加してみます。
続いてエンティティの定義です。”HomeAutomation.DeviceAlias”というエンティティ分類を”Machine learned”タイプで追加します。
機械学習エンティティについては以下に説明があります。
機械学習エンティティでは、コンテキストを使用して、ラベル付けされた例に基づいてエンティティを抽出します。 これは、LUIS アプリケーションを構築するのに推奨されるエンティティです。 これは、機械学習アルゴリズムに依存しており、アプリケーションに合わせて正しく調整するにはラベル付けが必要です。 常に正しい形式とは限らないものの同じ意味を持つデータを識別するには、ML エンティティを使用します。
次に意図に発話例をいくつか追加します。
例として、発話中の”illumination”という単語に先ほど追加した”HomeAutomation.DeviceAlias”を手動で割り当てます。
最後にこれを学習させてまたテストしてみます。
その前に更新反映前のアプリに先ほど新たに追加した意図の発話例の一部を投げてみて、信頼度の低い答えしかかえってこないことを確認しておきます。
下が更新反映後のモデルで同じ発話を投げかけた時。想定通り”AddDeviceAlias”の意図として、先ほどよりも高い信頼度で結果が返ってくるようになりました!なるほど。
LUISアプリをデプロイする
最後にアプリのデプロイです。MANAGEタブからProduction Slotへデプロイします。
スロットについては以下に説明があります。
https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/how-to/publish#publishing-slots
両方の発行スロットを使用することで、2 つの異なるバージョンのアプリを発行されたエンドポイントで使用できるようになります。また、2 つの異なるエンドポイントで同じバージョンを使用することもできます。
デプロイしたら、テストしてみます。Azure Resources > Prediction Resources > Example Queryから、サンプルリクエストフォーマットを取得できますので、ここの”YOUR_QUERY_HERE”をテストしたい発話内容におきかえてURLをたたくと・・
結果がjson形式で返ってきました!
## 結果のサンプル
{
"query": "\"alias lights to\"",
"prediction": {
"topIntent": "HomeAutomation.AddDeviceAlias",
"intents": {
"HomeAutomation.AddDeviceAlias": {
"score": 0.454815
},
"HomeAutomation.SetDevice": {
"score": 0.2946795
},
"HomeAutomation.TurnUp": {
"score": 0.032528415
},
"HomeAutomation.QueryState": {
"score": 0.019824529
},
"HomeAutomation.TurnDown": {
"score": 0.013631174
},
"HomeAutomation.TurnOn": {
"score": 0.008939692
},
"HomeAutomation.TurnOff": {
"score": 0.006565024
},
"None": {
"score": 0.0020315358
}
},
"entities": {
"HomeAutomation.DeviceType": [
[
"light"
]
],
"HomeAutomation.DeviceAlias": [
"\""
],
"$instance": {
"HomeAutomation.DeviceType": [
{
"type": "HomeAutomation.DeviceType",
"text": "lights",
"startIndex": 7,
"length": 6,
"modelTypeId": 5,
"modelType": "List Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"HomeAutomation.DeviceAlias": [
{
"type": "HomeAutomation.DeviceAlias",
"text": "\"",
"startIndex": 16,
"length": 1,
"score": 0.68858093,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
},
"sentiment": {
"label": "neutral",
"score": 0.5
}
}
}
以上、LUISアプリのデモでした。イメージを掴んでいただけましたでしょうか。
今回の記事はここまでとして、今度はQnA Makerと組み合わせて利用する方法についても研究してみたいと思います。少しでも参考になりましたら幸いです。
おしまい
コメントを残す