Orchestrator で複数の LUIS モデルと QnA モデルを使用する

適用対象: SDK v4

注意

Azure AI QnA Maker は、2025 年 3 月 31 日に廃止される予定です。 2022 年 10 月 1 日から、新しい QnA Maker リソースやナレッジ ベースを作成することはできません。 新しいバージョンの質問と回答機能が、Azure AI 言語の一部として利用できるようになりました。

Azure AI 言語の機能であるカスタム質問応答は、QnA Maker サービスの更新バージョンです。 Bot Framework SDK での質問と回答のサポートの詳細については、「 自然言語理解」を参照してください。

注意

Language Understanding (LUIS) は、2025 年 10 月 1 日に廃止される予定です。 2023 年 4 月 1 日から、新しい LUIS リソースを作成することはできません。 新しいバージョンの言語理解が Azure AI 言語の一部として利用できるようになりました。

Azure AI Language の機能である会話言語理解 (CLU) は、LUIS の更新バージョンです。 Bot Framework SDK での言語理解のサポートの詳細については、「 自然言語理解」を参照してください。

ボットで複数のLanguage Understanding (LUIS) モデルと QnA Maker ナレッジ ベースが使用されている場合は、Bot Framework Orchestrator を使用して、ユーザー入力に最も適した LUIS モデルまたは QnA Maker サポート情報判断できます。 CLI コマンドをbf orchestrator使用して Orchestrator スナップショット ファイルを作成し、スナップショット ファイルを使用して、実行時にユーザー入力を正しいモデルにルーティングできます。

この記事では、Orchestrator で既存の QnA Maker サポート情報を使用する方法について説明します。

前提条件

このサンプルについて

このサンプルは、LUIS および QnA Maker プロジェクトの定義済みのセットに基づいています。 ただし、ボットで QnA Maker を使用するには、QnA Maker ポータルに既存のサポート情報が必要です。 これで、ボットからナレッジ ベースを使用してユーザーの質問に回答できるようになります。

新しいボット開発の場合は、 Power Virtual Agents の使用を検討してください。 Bot Framework SDK ボットの新しいサポート情報を作成する必要がある場合は、次の Azure AI サービスに関する記事を参照してください。

C# クラスの図。

ユーザー入力を受け取るたびに、OnMessageActivityAsync が呼び出されます。 このモジュールでは、最上位スコアのユーザーの意図を検索し、その結果を DispatchToTopIntentAsync に渡します。 DispatchToTopIntentAsync は、適切なアプリ ハンドラーを呼び出します。

  • ProcessSampleQnAAsync - ボットに関する FAQ の質問。
  • ProcessWeatherAsync -天気クエリ。
  • ProcessHomeAutomationAsync -家庭用照明コマンド。

ハンドラーによって LUIS または QnA Maker サービスが呼び出され、生成された結果がユーザーに返されます。

LUIS アプリを作成する

Orchestrator スナップショット ファイルを作成する前に、LUIS アプリと QnA ナレッジ ベースを作成して発行する必要があります。 この記事で参照されているサンプル ボットでは、 フォルダー内の NLP With Orchestrator サンプルに含まれる次のモデルを \CognitiveModels 使用します。

名前 説明
HomeAutomation 関連付けられているエンティティ データによってホーム オートメーションの意図を認識する LUIS アプリ。
Weather 場所データによって天気関連の意図を認識する LUIS アプリ。
QnA Maker ボットに関するシンプルな質問への回答を提供する QnA Maker ナレッジ ベース。

LUIS アプリの作成

サンプルの cognitive models ディレクトリにある HomeAutomation ファイルと Weather .lu ファイルから LUIS アプリを作成します。

  1. 次のコマンドを実行して、アプリのインポート、トレーニング、および運用環境への発行を行います。

    bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
    
  2. アプリケーション ID、表示名、オーサリング キー、場所を記録します。

詳細については、 LUIS ポータルで LUIS アプリを作成 する方法と、LUIS アプリに接続するための値を取得する 方法に関するページの 「ボットに自然言語理解を追加する 」と、アプリを トレーニング して運用環境に 発行 する方法に関する LUIS ドキュメントを参照してください。

ボットをナレッジ ベースに接続するための値を取得する

注意

Azure AI QnA Maker は、2025 年 3 月 31 日に廃止される予定です。 2022 年 10 月 1 日から、新しい QnA Maker リソースやナレッジ ベースを作成することはできません。 新しいバージョンの質問と回答機能が、Azure AI 言語の一部として利用できるようになりました。

Azure AI 言語の機能であるカスタム質問応答は、QnA Maker サービスの更新バージョンです。 Bot Framework SDK での質問と回答のサポートの詳細については、「 自然言語理解」を参照してください。

既存のサポート情報と QnA Maker のホスト名とエンドポイント キーが必要です。

ヒント

QnA Maker のドキュメントには、サポート情報を作成、トレーニング、発行する方法に関する手順が記載されています。

Orchestrator スナップショット ファイルを作成する

Orchestrator ツールの CLI インターフェイスは、実行時に正しい LUIS または QnA Maker アプリにルーティングするための Orchestrator スナップショット ファイルを作成します。

  1. サポートされている最新バージョンの Visual C++ 再頒布可能パッケージ パッケージをインストールする

  2. コマンド プロンプトまたはターミナル ウィンドウを開き、ディレクトリをサンプル ディレクトリに変更します

  3. npm と Bot Framework CLI の現在のバージョンがあることを確認します。

    npm i -g npm
    npm i -g @microsoft/botframework-cli
    
  4. Orchestrator 基本モデル ファイルのダウンロード

    mkdir model
    bf orchestrator:basemodel:get --out ./model
    
  5. 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

C# (アーカイブ済み)

次に示すエンティティごとに、前の手順で記録した値を追加します。

"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 ボットを 、Weather、および SampleQnA サービスにHomeAutomation接続します。 コンストラクターでは、ご自身で指定した値が、これらのサービスへの接続に使用されます。

BotServices.cs

C# (アーカイブ済み)

ボットからのサービスを呼び出す

ユーザーからの入力ごとに、ボット ロジックはユーザー入力を Orchestrator Recognizer に渡し、返された上位の意図を検索し、その情報を使用して入力に適したサービスを呼び出します。

メソッドが呼び出されるたびに OnMessageActivityAsyncDispatchBot.cs ファイルで、受信ユーザー メッセージをチェックし、Orchestrator Recognizer から最上位の意図を取得します。 次に、 と recognizerResult を正しいメソッドに渡topIntentしてサービスを呼び出し、結果を返します。

bots\DispatchBot.cs

C# (アーカイブ済み)

認識結果を操作する

Orchestrator 認識エンジンによって結果が生成されると、発話を最も適切に処理できるサービスが示されます。 このボットのコードでは、要求を対応するサービスにルーティングし、呼び出されたサービスからの応答を要約します。 Orchestrator から返される 意図 に応じて、このコードでは、返された意図を使用して正しい LUIS モデルまたは QnA サービスにルーティングします。

bots\DispatchBot.cs

C# (アーカイブ済み)

メソッドと ProcessWeatherAsync メソッドはProcessHomeAutomationAsync、ターン コンテキスト内に含まれるユーザー入力を使用して、正しい LUIS モデルから最上位の意図とエンティティを取得します。

メソッドはProcessSampleQnAAsync、ターン コンテキスト内に含まれるユーザー入力を使用して、サポート情報から回答を生成し、その結果をユーザーに表示します。

注意

これが運用環境のアプリケーションの場合は、ここで、選択した LUIS メソッドが、指定されたサービスに接続されたうえで、そのメソッドによってユーザー入力が渡され、返された LUIS の意図とエンティティ データが処理されます。

ボットをテストする

  1. ご自身の開発環境を使用して、サンプル コードを開始します。 アプリによって開かれたブラウザー ウィンドウのアドレス バーに表示される localhost アドレスをメモします。 https://localhost:<Port_Number>

  2. Bot Framework Emulator開き、[ボットを開く] ボタンをクリックします。

  3. [ ボットを開く ] ダイアログ ボックスで、ボット エンドポイントの URL (など http://localhost:3978/api/messages) を入力します。 [Connect] をクリックします。

  4. 参考のために、ご自身のボット用に作成されたサービスに含まれる質問とコマンドの一部を次に示します。

    • QnA Maker
      • hi, good morning
      • what are you, what do you do
    • 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 にルーティングする

  1. エミュレーターでテキストを hi 入力し、発話を送信します。 ボットはこのクエリを Orchestrator に送信し、さらに処理するためにこの発話を取得する必要がある子アプリを示す応答を返します。

  2. ログ内の Orchestrator Recognition Trace 行を選択すると、エミュレーターで JSON 応答を確認できます。 オーケストレーターの結果がインスペクターに表示されます。

    {
    "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 番目の要求を行います。

  3. 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