次の方法で共有


会話言語理解を Bot Framework と統合する

ダイアログは、ユーザー クエリとアプリケーションの間で発生する対話です。 ダイアログ管理は、さまざまな顧客との対話に対して発生する自動動作を定義するプロセスです。 会話言語理解では意図を分類し、エンティティを介して情報を抽出できますが、Bot Framework SDK では、そこから返される応答に適用されたロジックを構成できます。

このチュートリアルでは、Bot Framework SDK のフライト予約プロジェクトに対して独自の会話言語理解 (CLU) プロジェクトを統合する方法について説明します。これには、フライトの予約天気の取得なしという 3 つの意図が含まれます。

前提条件

  • Azure portal で言語リソースを作成し、キーとエンドポイントを取得します。 デプロイされたら、 [リソースに移動] を選択します。
    • API にボットを接続するには、作成したリソースのキーとエンドポイントが必要です。 このチュートリアルで後ほど下記に示すコードに、ご自分のキーとエンドポイントを貼り付けます。
  • CoreBotWithCLU サンプルをダウンロードします。
    • サンプル リポジトリ全体を複製して、このソリューションにアクセスします。

会話言語理解でプロジェクトをインポートする

  1. Core Bot with CLU サンプルの Cognitive Models フォルダーにある FlightBooking.json ファイルをダウンロードします。

  2. Language Studio にサインインし、言語リソースを選択します。

  3. 会話言語理解に移動し、サービスを選択します。 これにより、プロジェクト ページがルーティングされます。 [新しいプロジェクトの作成] ボタンの横にある [インポート] ボタンを選択します。 FlightBooking というプロジェクト名を含む FlightBooking.json ファイルをインポートします。 これにより、すべての意図、エンティティ、発話を含む CLU プロジェクトが自動的にインポートされます。

    Json ファイルをインポートする場所を示すスクリーンショット。

  4. プロジェクトが読み込まれたら、左側の [トレーニング ジョブ] を選択します。 [トレーニング ジョブの開始] を押し、モデル名 v1 を指定して [トレーニング] を押します。 [標準トレーニング] や評価設定など、他のすべての設定はそのままでかまいません。

    CLU のトレーニング ページのスクリーンショット。

  5. トレーニングが完了したら、左側の [モデルのデプロイ] をクリックします。 [デプロイの追加] を選択し、Testing という名前の新しいデプロイを作成し、モデル v1 をそのデプロイに割り当てます。

    CLU の [モデルのデプロイ] 画面内のデプロイ ページのスクリーンショット。

設定ファイルを更新する

CLU プロジェクトがデプロイされ、準備ができたので、デプロイに接続する設定を更新します。

Core Bot サンプルで、適切な値を使用して appsettings.json を更新します。

  • CluProjectNameFlightBooking です。
  • CluDeploymentNameTesting です
  • CluAPIKey は、Azure portal の言語リソースの [キーとエンドポイント] セクションのキーのいずれかにすることができます。 CLU の [プロジェクトの設定] タブからキーをコピーすることもできます。
  • CluAPIHostName は、Azure portal の言語リソースの [キーとエンドポイント] セクションにあるエンドポイントです。 形式は https:// がない <Language_Resource_Name>.cognitiveservices.azure.com である必要があることに注意してください。
{
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "CluProjectName": "",
  "CluDeploymentName": "",
  "CluAPIKey": "",
  "CluAPIHostName": ""
}

統合ポイントを特定する

Core Bot サンプルでは、FlightBookingRecognizer.cs ファイルをチェックアウトできます。 ここで、デプロイされたエンドポイントに対する CLU API 呼び出しを行って、意図とエンティティの CLU 予測を取得します。

        public FlightBookingRecognizer(IConfiguration configuration)
        {
            var cluIsConfigured = !string.IsNullOrEmpty(configuration["CluProjectName"]) && !string.IsNullOrEmpty(configuration["CluDeploymentName"]) && !string.IsNullOrEmpty(configuration["CluAPIKey"]) && !string.IsNullOrEmpty(configuration["CluAPIHostName"]);
            if (cluIsConfigured)
            {
                var cluApplication = new CluApplication(
                    configuration["CluProjectName"],
                    configuration["CluDeploymentName"],
                    configuration["CluAPIKey"],
                    "https://" + configuration["CluAPIHostName"]);
                // Set the recognizer options depending on which endpoint version you want to use.
                var recognizerOptions = new CluOptions(cluApplication)
                {
                    Language = "en"
                };

                _recognizer = new CluRecognizer(recognizerOptions);
            }

Dialogs フォルダーで、以下を使用して CLU 予測を行う MainDialog を見つけます。

            var cluResult = await _cluRecognizer.RecognizeAsync<FlightBooking>(stepContext.Context, cancellationToken);

CLU 結果の処理内容を判断するロジックではそれに従います。

 switch (cluResult.TopIntent().intent)
            {
                case FlightBooking.Intent.BookFlight:
                    // Initialize BookingDetails with any entities we may have found in the response.
                    var bookingDetails = new BookingDetails()
                    {
                        Destination = cluResult.Entities.toCity,
                        Origin = cluResult.Entities.fromCity,
                        TravelDate = cluResult.Entities.flightDate,
                    };

                    // Run the BookingDialog giving it whatever details we have from the CLU call, it will fill out the remainder.
                    return await stepContext.BeginDialogAsync(nameof(BookingDialog), bookingDetails, cancellationToken);

                case FlightBooking.Intent.GetWeather:
                    // We haven't implemented the GetWeatherDialog so we just display a TODO message.
                    var getWeatherMessageText = "TODO: get weather flow here";
                    var getWeatherMessage = MessageFactory.Text(getWeatherMessageText, getWeatherMessageText, InputHints.IgnoringInput);
                    await stepContext.Context.SendActivityAsync(getWeatherMessage, cancellationToken);
                    break;

                default:
                    // Catch all for unhandled intents
                    var didntUnderstandMessageText = $"Sorry, I didn't get that. Please try asking in a different way (intent was {cluResult.TopIntent().intent})";
                    var didntUnderstandMessage = MessageFactory.Text(didntUnderstandMessageText, didntUnderstandMessageText, InputHints.IgnoringInput);
                    await stepContext.Context.SendActivityAsync(didntUnderstandMessage, cancellationToken);
                    break;
            }

ボットをローカルで実行する

コンピューターでサンプルをローカルで実行またはターミナルあるいは Visual Studio からボットを実行します。

ターミナルからボットを実行する

ターミナルから、cognitive-service-language-samples/CoreBotWithCLU フォルダーに移動します。

その後、次のコマンドを実行します

# run the bot
dotnet run

Visual Studio からボットを実行する

  1. Visual Studio を起動する
  2. 上部のナビゲーション メニューから、[ファイル][開く][プロジェクト/ソリューション] の順に選択します
  3. cognitive-service-language-samples/CoreBotWithCLU フォルダーに移動します
  4. CoreBotCLU.csproj ファイルを選択します
  5. F5 キーを押して、プロジェクトを実行します

Bot Framework Emulator を使用したボットのテスト

Bot Framework Emulator は、ボット開発者がローカルホストで、またはトンネルを介したリモート実行でボットをテストおよびデバッグできるデスクトップ アプリケーションです。

Bot Framework Emulator を使用したボットへの接続

  1. Bot Framework Emulator を起動します。
  2. [ファイル][ボットを開く] の順に選択します
  3. ボットの URL として「http://localhost:3978/api/messages」を入力し、[接続] を押して読み込まれるのを待ちます
  4. "カイロからパリへの旅行" などのさまざまな例のクエリを実行し、結果を確認できるようになりました

CLU から返された最上位の意図が "フライトの予約" に解決された場合。 ボットでは、旅行の予約を作成するための情報が十分に格納されるまで追加の質問を行います。 予約を作成できたら、その予約情報をユーザーに返します。

次のステップ

Bot Framework SDK について、さらに詳しく学習します。