ダイアログは、ユーザー クエリとアプリケーションの間で発生する対話です。 ダイアログ管理は、さまざまな顧客との対話に対して発生する自動動作を定義するプロセスです。 会話言語理解では意図を分類し、エンティティを介して情報を抽出できますが、Bot Framework SDK では、そこから返される応答に適用されたロジックを構成できます。
このチュートリアルでは、Bot Framework SDK のフライト予約プロジェクトに対して独自の会話言語理解 (CLU) プロジェクトを統合する方法について説明します。これには、フライトの予約、天気の取得、なしという 3 つの意図が含まれます。
前提条件
- Azure portal で言語リソースを作成し、キーとエンドポイントを取得します。 デプロイされたら、 [リソースに移動] を選択します。
- API にボットを接続するには、作成したリソースのキーとエンドポイントが必要です。 このチュートリアルで後ほど下記に示すコードに、ご自分のキーとエンドポイントを貼り付けます。
- CoreBotWithCLU サンプルをダウンロードします。
- サンプル リポジトリ全体を複製して、このソリューションにアクセスします。
会話言語理解でプロジェクトをインポートする
Core Bot with CLU サンプルの Cognitive Models フォルダーにある FlightBooking.json ファイルをダウンロードします。
Language Studio にサインインし、言語リソースを選択します。
会話言語理解に移動し、サービスを選択します。 これにより、プロジェクト ページがルーティングされます。 [新しいプロジェクトの作成] ボタンの横にある [インポート] ボタンを選択します。 FlightBooking というプロジェクト名を含む FlightBooking.json ファイルをインポートします。 これにより、すべての意図、エンティティ、発話を含む CLU プロジェクトが自動的にインポートされます。
プロジェクトが読み込まれたら、左側の [トレーニング ジョブ] を選択します。 [トレーニング ジョブの開始] を押し、モデル名 v1 を指定して [トレーニング] を押します。 [標準トレーニング] や評価設定など、他のすべての設定はそのままでかまいません。
トレーニングが完了したら、左側の [モデルのデプロイ] をクリックします。 [デプロイの追加] を選択し、Testing という名前の新しいデプロイを作成し、モデル v1 をそのデプロイに割り当てます。
設定ファイルを更新する
CLU プロジェクトがデプロイされ、準備ができたので、デプロイに接続する設定を更新します。
Core Bot サンプルで、適切な値を使用して appsettings.json を更新します。
- CluProjectName は FlightBooking です。
- CluDeploymentName は Testing です
- 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 からボットを実行する
- Visual Studio を起動する
- 上部のナビゲーション メニューから、[ファイル]、[開く]、[プロジェクト/ソリューション] の順に選択します
cognitive-service-language-samples/CoreBotWithCLU
フォルダーに移動しますCoreBotCLU.csproj
ファイルを選択しますF5
キーを押して、プロジェクトを実行します
Bot Framework Emulator を使用したボットのテスト
Bot Framework Emulator は、ボット開発者がローカルホストで、またはトンネルを介したリモート実行でボットをテストおよびデバッグできるデスクトップ アプリケーションです。
- 最新の Bot Framework Emulator をインストールします。
Bot Framework Emulator を使用したボットへの接続
- Bot Framework Emulator を起動します。
- [ファイル]、[ボットを開く] の順に選択します
- ボットの URL として「
http://localhost:3978/api/messages
」を入力し、[接続] を押して読み込まれるのを待ちます - "カイロからパリへの旅行" などのさまざまな例のクエリを実行し、結果を確認できるようになりました
CLU から返された最上位の意図が "フライトの予約" に解決された場合。 ボットでは、旅行の予約を作成するための情報が十分に格納されるまで追加の質問を行います。 予約を作成できたら、その予約情報をユーザーに返します。
次のステップ
Bot Framework SDK について、さらに詳しく学習します。