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 で使用する方法について説明します。

前提条件

このサンプルについて

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

新しいボット開発では、Copilot Studio の使用をご検討ください。 Bot Framework SDK ボットの新しいナレッジ ベースを作成する必要がある場合は、次の Azure AI サービスの記事を参照してください。

C# クラス図。

ユーザー入力を受け取るたびに、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 アプリを作成します。

  1. 次のコマンドを実行して、アプリを本番環境にインポート、トレーニング、公開します。

    bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
    
  2. アプリケーション 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 スナップショットファイルを作成します。

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

BotServices.cs

C# (アーカイブ済み)

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

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

DispatchBot.cs ファイルでは、OnMessageActivityAsync メソッドが呼び出されるたびに、受信したユーザー メッセージをチェックし、Orchestrator Recognizer から最上位のインテントを取得します。 次に、topIntentrecognizerResult を適切なメソッドに渡してサービスを呼び出し、結果を返します。

bots\DispatchBot.cs

C# (アーカイブ済み)

認識結果を操作する

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

bots\DispatchBot.cs

C# (アーカイブ済み)

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

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

Note

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

ボットをテストする

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

  2. Bot Framework エミュレーターを開き、[ボットを開く] ボタンをクリックします。

  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 応答を確認できます。 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 番目のリクエストを送信します。

  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