Orchestrator で複数の LUIS および QnA モデルを使用します
この記事の対象: SDK v4
Note
Azure AI QnA Maker は 2025 年 3 月 31 日に廃止されます。 2022 年 10 月 1 日以降、新しい QnA Maker リソースまたはナレッジ ベースを作成できなくなります。 Azure AI Language の一部として、質問応答機能の新しいバージョンが提供されました。
Azure AI Language の機能であるカスタム質問応答は、QnA Maker サービスの更新バージョンです。 Bot Framework SDK での質問と回答サポートの詳細については、「自然言語理解」を参照してください。
Note
Language Understanding (LUIS) は、2025 年 10 月 1 日に廃止されます。 2023 年 4 月 1 日以降は、新しい LUIS リソースを作成することはできません。 より新しいバージョンの言語理解が、現在、Azure AI Language の一部として提供されています。
Azure AI Language の機能である会話言語理解 (CLU) は、LUIS の更新バージョンです。 Bot Framework SDK での言語理解のサポートの詳細については、「自然言語の理解」を参照してください。
ボットが複数の Language Understanding (LUIS) モデルと QnA Maker ナレッジベースを使用する場合、Bot Framework Orchestrator を使用して、どの LUIS モデルまたは QnA Maker ナレッジベースがユーザー入力に最も一致するかを判断できます。 bf orchestrator
CLI コマンドを使用して Orchestrator スナップショットファイルを作成し、そのスナップショットファイルを使用して実行時にユーザー入力を正しいモデルにルーティングできます。
この記事では、既存の QnA Maker ナレッジベースを Orchestrator で使用する方法について説明します。
- 新しいボットの場合は、Azure AI Language の質問応答およびオーケストレーション ワークフロー機能の使用を検討してください。
- Orchestrator の詳細については、「Composer での Orchestrator によるインテント認識」を参照してください。
bf orchestrator
コマンドの詳細については、「Bot Framework CLI README」を参照してください。
前提条件
- LUIS アプリを作成するための luis.ai アカウント。
- QnA Maker アカウントと既存の QnA Maker ナレッジ ベース
- C# (アーカイブ済み) または JavaScript (アーカイブ済み) の Orchestrator を使用した NLP サンプルのコピー。
- ボットの基本、LUIS、および QnA Maker に関する知識。
- コマンドライン BF CLI をインストールします。
このサンプルについて
このサンプルは、LUIS および QnA Maker プロジェクトの定義済みセットに基づいています。 ただし、ボットで QnA Maker を使用するには、QnA Maker ポータルに既存のナレッジベースが必要です。 これで、ボットからナレッジ ベースを使用してユーザーの質問に回答できるようになります。
新しいボット開発では、Copilot Studio の使用をご検討ください。 Bot Framework SDK ボットの新しいナレッジ ベースを作成する必要がある場合は、次の Azure AI サービスの記事を参照してください。
ユーザー入力を受け取るたびに、OnMessageActivityAsync
が呼び出されます。 このモジュールでは、最上位スコアのユーザーの意図を検索し、その結果を DispatchToTopIntentAsync
に渡します。 次に、DispatchToTopIntentAsync が適切なアプリ ハンドラーを呼び出します。
ProcessSampleQnAAsync
- ボットの FAQ 質問用。ProcessWeatherAsync
-天気クエリ。ProcessHomeAutomationAsync
-家庭用照明コマンド。
ハンドラーによって LUIS または QnA Maker サービスが呼び出され、生成された結果がユーザーに返されます。
LUIS アプリを作成する
Orchestrator スナップショット ファイルを作成する前に、LUIS アプリと QnA ナレッジベースを作成して公開する必要があります。 この記事で参照されているサンプル ボットは、\CognitiveModels
フォルダー内の Orchestrator を使用した NLP サンプルに含まれている次のモデルを使用します。
名前 | 説明 |
---|---|
HomeAutomation | 関連付けられているエンティティ データによってホーム オートメーションの意図を認識する LUIS アプリ。 |
Weather | 場所データによって天気関連の意図を認識する LUIS アプリ。 |
QnA Maker | ボットに関するシンプルな質問への回答を提供する QnA Maker ナレッジ ベース。 |
LUIS アプリの作成
サンプルの認知モデル ディレクトリにある HomeAutomation および Weather .lu ファイルから LUIS アプリを作成します。
次のコマンドを実行して、アプリを本番環境にインポート、トレーニング、公開します。
bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
アプリケーション ID 、表示名、オーサリングキー、および場所を記録します。
詳細については、「LUIS ポータルで LUIS アプリを作成する」と、「ボットに自然言語理解を追加する」の「LUIS アプリに接続するための値を取得する」方法、およびアプリをトレーニングして運用環境に公開する方法についての LUIS ドキュメントを参照してください。
ボットをナレッジ ベースに接続するための値を取得する
Note
Azure AI QnA Maker は 2025 年 3 月 31 日に廃止されます。 2022 年 10 月 1 日以降、新しい QnA Maker リソースまたはナレッジ ベースを作成できなくなります。 Azure AI Language の一部として、質問応答機能の新しいバージョンが提供されました。
Azure AI Language の機能であるカスタム質問応答は、QnA Maker サービスの更新バージョンです。 Bot Framework SDK での質問と回答サポートの詳細については、「自然言語理解」を参照してください。
既存のナレッジベースと、QnA Maker のホスト名およびエンドポイントキーが必要です。
ヒント
QnA Maker のドキュメントには、ナレッジ ベースを作成、トレーニング、発行する方法が記載されています。
Orchestrator スナップショットファイルを作成する
Orchestrator ツールの CLI インターフェイスは、実行時に適切な LUIS または QnA Maker アプリにルーティングするための Orchestrator スナップショットファイルを作成します。
Visual C++ 再頒布可能パッケージの最新バージョンをインストールする
コマンド プロンプトまたはターミナル ウィンドウを開き、ディレクトリをサンプルディレクトリに変更する
npm と Bot Framework CLI の最新バージョンがインストールされていることを確認してください。
npm i -g npm npm i -g @microsoft/botframework-cli
Orchestrator ベースモデルファイルをダウンロードする
mkdir model bf orchestrator:basemodel:get --out ./model
Orchestrator スナップショットファイルを作成する
mkdir generated bf orchestrator:create --hierarchical --in ./CognitiveModels --out ./generated --model ./model
パッケージのインストール
このアプリを初めて実行する前に、いくつかの NuGet パッケージがインストールされていることを確認します。
- Microsoft.Bot.Builder
- Microsoft.Bot.Builder.AI.Luis
- Microsoft.Bot.Builder.AI.QnA
- Microsoft.Bot.Builder.AI.Orchestrator
お使いの appsettings.json ファイルを手動で更新する
すべてのサービス アプリが作成されたら、それぞれの情報を "appsettings.json" ファイルに追加する必要があります。 C# (アーカイブ済み) コードの初期サンプルには、空の appsettings.json ファイルが含まれています。
appsettings.json
次に示すエンティティごとに、前の手順で記録した値を追加します。
"QnAKnowledgebaseId": "<knowledge-base-id>",
"QnAEndpointKey": "<qna-maker-resource-key>",
"QnAEndpointHostName": "<your-hostname>",
"LuisHomeAutomationAppId": "<app-id-for-home-automation-app>",
"LuisWeatherAppId": "<app-id-for-weather-app>",
"LuisAPIKey": "<your-luis-endpoint-key>",
"LuisAPIHostName": "<your-dispatch-app-region>",
すべての変更が完了したら、このファイルを保存します。
ボットからサービスに接続する
LUIS および QnA Maker サービスに接続するために、ボットは設定ファイルから情報を取得します。
BotServices.cs では、設定ファイル appsettings.json に含まれる情報を使用して、Orchestrator ボットを、HomeAutomation
、Weather
および SampleQnA
サービスに接続します。 コンストラクターでは、ご自身で指定した値が、これらのサービスへの接続に使用されます。
BotServices.cs
ボットからのサービスを呼び出す
ユーザーからの入力ごとに、ボット ロジックはユーザー入力を Orchestrator Recognizer に渡し、返された最上位のインテントを見つけ、その情報を使用して入力に適したサービスを呼び出します。
DispatchBot.cs ファイルでは、OnMessageActivityAsync
メソッドが呼び出されるたびに、受信したユーザー メッセージをチェックし、Orchestrator Recognizer から最上位のインテントを取得します。 次に、topIntent
と recognizerResult
を適切なメソッドに渡してサービスを呼び出し、結果を返します。
bots\DispatchBot.cs
認識結果を操作する
Orchestrator 認識エンジンが結果を生成すると、どのサービスが発話を最も適切に処理できるかが示されます。 このボットのコードでは、要求を対応するサービスにルーティングし、呼び出されたサービスからの応答を要約します。 このコードは、Orchestrator から返されたインテントに応じて、返されたインテントを使用して正しい LUIS モデルまたは QnA サービスにルーティングします。
bots\DispatchBot.cs
ProcessHomeAutomationAsync
メソッドと ProcessWeatherAsync
メソッドは、ターン コンテキスト内に含まれるユーザー入力を使用して、正しい LUIS モデルから最上位の意図とエンティティを取得します。
ProcessSampleQnAAsync
メソッドでは、ターン コンテキスト内に含まれるユーザー入力を使用して、ナレッジ ベースから回答を生成し、その結果をユーザーに表示します。
Note
これが運用環境のアプリケーションの場合は、ここで、選択した LUIS メソッドが、指定されたサービスに接続されたうえで、そのメソッドによってユーザー入力が渡され、返された LUIS の意図とエンティティ データが処理されます。
ボットをテストする
ご自身の開発環境を使用して、サンプル コードを開始します。 アプリによって開かれたブラウザウィンドウのアドレスバーに表示される次の localhost アドレスをメモします。
https://localhost:<Port_Number>
Bot Framework エミュレーターを開き、[ボットを開く] ボタンをクリックします。
[ボットを開く] ダイアログ ボックスで、ボットのエンドポイント URL (
http://localhost:3978/api/messages
など) を入力します。 [Connect] をクリックします。参考のために、ご自身のボット用に作成されたサービスに含まれる質問とコマンドの一部を次に示します。
- QnA Maker
- $
- $
- LUIS (ホーム オートメーション)
turn on bedroom light
turn off bedroom light
make some coffee
- LUIS (天気)
whats the weather in redmond washington
what's the forecast for london
show me the forecast for nebraska
- QnA Maker
ユーザーの発話を QnA Maker にルーティングする
エミュレーターで、テキスト
hi
を入力し、発話を送信します。 ボットはこのクエリを Orchestrator に送信し、どの子アプリがこの発話を取得してさらに処理する必要があるかを示す応答を返します。ログ内の
Orchestrator Recognition Trace
行を選択すると、エミュレーターで JSON 応答を確認できます。 Orchestrator の結果がインスペクターに表示されます。{ "type": "trace", "timestamp": "2021-05-01T06:26:04.067Z", "serviceUrl": "http://localhost:58895", "channelId": "emulator", "from": { "id": "36b2a460-aa43-11eb-920f-7da472b36492", "name": "Bot", "role": "bot" }, "conversation": { "id": "17ef3f40-aa46-11eb-920f-7da472b36492|livechat" }, "recipient": { "id": "5f8c6123-2596-45df-928c-566d44426556", "role": "user" }, "locale": "en-US", "replyToId": "1a3f70d0-aa46-11eb-8b97-2b2a779de581", "label": "Orchestrator Recognition", "valueType": "OrchestratorRecognizer", "value": { "text": "hi", "alteredText": null, "intents": { "QnAMaker": { "score": 0.9987310956576168 }, "HomeAutomation": { "score": 0.3402091165577196 }, "Weather": { "score": 0.24092200496795158 } }, "entities": {}, "result": [ { "Label": { "Type": 1, "Name": "QnAMaker", "Span": { "Offset": 0, "Length": 2 } }, "Score": 0.9987310956576168, "ClosestText": "hi" }, { "Label": { "Type": 1, "Name": "HomeAutomation", "Span": { "Offset": 0, "Length": 2 } }, "Score": 0.3402091165577196, "ClosestText": "make some coffee" }, { "Label": { "Type": 1, "Name": "Weather", "Span": { "Offset": 0, "Length": 2 } }, "Score": 0.24092200496795158, "ClosestText": "soliciting today's weather" } ] }, "name": "OrchestratorRecognizerResult", "id": "1ae65f30-aa46-11eb-8b97-2b2a779de581", "localTimestamp": "2021-04-30T23:26:04-07:00" }
発話
hi
は Orchestrator の QnAMaker インテントの一部であり、topScoringIntent
として選択されているため、ボットは今度は同じ発話を使用して QnA Maker アプリに 2 番目のリクエストを送信します。エミュレータログの
QnAMaker Trace
行を選択します。 インスペクターに QnA Maker の結果が表示されます。{ "questions": [ "hi", "greetings", "good morning", "good evening" ], "answer": "Hello!", "score": 1, "id": 96, "source": "QnAMaker.tsv", "metadata": [], "context": { "isContextOnly": false, "prompts": [] } }
[Python (アーカイブ済み)]: https://github.com/microsoft/BotBuilder-Samples/tree/main/archive/samples/python/14.nlp-with-orchestrator