ボットに自然言語の理解を追加するAdd natural language understanding to your bot

適用対象: SDK v4APPLIES TO: SDK v4

ユーザーの真意を会話と文脈から理解する能力は難しいタスクかもしれませんが、より自然な会話の印象をボットに与えることができます。The ability to understand what your user means conversationally and contextually can be a difficult task, but can provide your bot a more natural conversation feel. Language Understanding (LUIS) はクラウドベースの API サービスです。これを使用することで、ボットでユーザーのメッセージの意図が認識され、ユーザーのより自然な言葉が許容され、会話フローがより適切に指示されるようになります。Language Understanding (LUIS) is a cloud-based API service that enables you to do just that so that your bot can recognize the intent of user messages, allow for more natural language from your user, and better direct the conversation flow.

このトピックでは、LUIS を航空券予約アプリケーションに追加して、ユーザー入力に含まれるさまざまな意図やエンティティを認識する手順について説明します。This topic walks you through adding LUIS to a flight booking application to recognize different intents and entities contained within user input.

前提条件Prerequisites

このサンプルについてAbout this sample

このコア ボット サンプルでは、空港のフライト予約アプリケーションの例を示しています。This core bot sample shows an example of an airport flight booking application. これは LUIS サービスを使用してユーザー入力を認識し、認識した最上位の LUIS の意図を返します。It uses a LUIS service to recognize the user input and return the top recognized LUIS intent.

この言語モデルには、Book FlightCancelNone という 3 つの意図が含まれています。The language model contains three intents: Book Flight, Cancel, and None. LUIS では、これらの意図を使用して、ユーザーがどのようなつもりでボットにメッセージを送信したかが理解されます。LUIS will use these intents to understand what the user meant when they send a message to the bot. また、この言語モデルでは、出発地や目的地の空港など、ユーザーの入力から LUIS で抽出できるエンティティも定義します。The language model also defines entities that LUIS can extract from the user's input, such as the origin or destination airport.

ユーザー入力の処理が完了するたびに、DialogBot では UserStateConversationState の両方の現在の状態が保存されます。After each processing of user input, DialogBot saves the current state of both UserState and ConversationState. 必要な情報がすべて収集されると、コード サンプルによりデモの航空券予約が作成されます。Once all the required information has been gathered the coding sample creates a demo flight booking reservation. この記事では、このサンプルの LUIS 部分について説明します。In this article we'll be covering the LUIS aspects of this sample. ただし、サンプルの一般的なフローは次のようになります。However, the general flow of the sample is shown below:

  • 新しいユーザーが接続され、ようこそカードを表示すると、OnMembersAddedAsync が呼び出されます。OnMembersAddedAsync is called when a new user is connected and displays a welcome card.
  • ユーザー入力を受け取るたびに、OnMessageActivityAsync が呼び出されます。OnMessageActivityAsync is called for each user input received.

LUIS サンプル ロジック フロー

OnMessageActivityAsync モジュールは、Run ダイアログ拡張メソッドによって適切なダイアログを実行します。The OnMessageActivityAsync module runs the appropriate dialog through the Run dialog extension method. そして、メイン ダイアログは LUIS ヘルパーを呼び出して、最もスコアが高いユーザーの意図を見つけます。Then the main dialog calls the LUIS helper to find the the top scoring user intent. ユーザー入力の最上位の意図によって "BookFlight" が返されると、ヘルパーは LUIS によって返されたユーザー情報を入力します。If the top intent for the user input returns "BookFlight", the helper fills out information from the user that LUIS returned. その後、メイン ダイアログは BookingDialog を開始し、これにより、必要に応じて次のような追加情報をユーザーから取得します。After that, the main dialog starts the BookingDialog, which acquires additional information as needed from the user such as:

  • Origin 出発地Origin the originating city
  • TravelDate 航空券の予約日TravelDate the date to book the flight
  • Destination 到着地Destination the destination city

この記事では、ボットに LUIS を追加する方法について説明します。This article covers how to add LUIS to a bot. ダイアログまたは状態の使用については、ダイアログ プロンプトを使用してユーザー入力を収集する方法に関するページまたは「ユーザーおよび会話データを保存する」をそれぞれ参照してください。For information about using dialogs or state, see how to gather user input using a dialog prompt or save user and conversation data, respectively.

LUIS ポータルでの LUIS アプリの作成Create a LUIS app in the LUIS portal

  1. LUIS ポータルにサインインします。Sign in to the LUIS portal.

    • まだアカウントを持っていない場合は作成します。If you don't already have an account, create one.
    • まだオーサリング リソースがない場合は作成します。If you don't already have an authoring resource, create one.
    • 詳細については、LUIS ポータルへのサインイン方法に関する LUIS のドキュメントを参照してください。For more information, see the LUIS documentation on how to sign in to the LUIS portal.
  2. [マイ アプリ] ページで、 [会話用の新しいアプリ] をクリックし、 [JSON としてインポート] を選択します。On the My Apps page, click New app for conversation and select Import as JSON.

  3. [新しいアプリのインポート] ダイアログで次のようにします。In the Import new app dialog:

    1. サンプルの CognitiveModels フォルダーにある FlightBooking.json ファイルを選択します。Choose the FlightBooking.json file in the CognitiveModels folder of the sample.
    2. アプリの省略可能な名前として「FlightBooking」と入力し、 [完了] をクリックします。Enter FlightBooking as the optional name of the app, and click Done.
  4. 複合エンティティをアップグレードするように求められる場合があります。You may be prompted to upgrade your composite entities. これを無視し、[ 後で通知 する] をクリックします。You can ignore this and click Remind me later:

    ignore-複合-エンティティ

  5. アプリをトレーニングして発行します。Train and publish your app. 詳細については、アプリをトレーニングし、運用環境に発行する方法に関する LUIS のドキュメントを参照してください。For more information, see the LUIS documentation on how to train and publish an app to the production environment.

エンティティを使用する理由Why use entities

LUIS エンティティを使うと、標準の意図とは異なる物事やイベントを、お使いのボットがインテリジェントに解釈できるようになります。LUIS entities allow your bot to intelligently understand certain things or events that are different than the standard intents. これにより、ユーザーから追加情報を収集できるようになり、お使いのボットが、よりインテリジェントに応答したり、ユーザーにその追加情報をたずねる特定の質問をスキップしたりできます。This enables you to gather extra information from the user, which lets your bot respond more intelligently or possibly skip certain questions where it asks the user for that information. FlightBooking.json ファイルには、3 つの LUIS の意図である "Book Flight"、"Cancel"、および "None" の定義と共に、"From.Airport" や "To.Airport" などのエンティティのセットも含まれています。Along with definitions for the three LUIS intents 'Book Flight', 'Cancel', and 'None' the FlightBooking.json file also contains a set of entities such as 'From.Airport' and 'To.Airport'. これらのエンティティにより、ユーザーが新しい旅行の予約を要求したときに、LUIS は、そのユーザーの元の入力に含まれる追加情報を検出し、返すことができます。These entities allow LUIS to detect and return additional information contained within the user's original input when they request a new travel booking.

LUIS アプリに接続するための値を取得するObtain values to connect to your LUIS app

LUIS アプリには、その発行後、ボットからアクセスできるようになります。Once your LUIS app is published, you can access it from your bot. ボット内から LUIS アプリにアクセスするためには、いくつかの値を記録する必要があります。You will need to record several values to access your LUIS app from within your bot. その情報は、LUIS ポータルを使用して取得できます。You can retrieve that information using the LUIS portal.

LUIS.ai ポータルからアプリケーション情報を取得するRetrieve application information from the LUIS.ai portal

設定ファイル (appsettings.json.env、または config.py) は、すべてのサービス参照を 1 か所にまとめる場所として機能します。The settings file (appsettings.json, .env or config.py) acts as the place to bring all service references together in one place. 取得した情報は、次のセクションでこのファイルに追加されます。The information you retrieve will be added to this file in the next section.

  1. 発行済みの LUIS アプリを luis.ai から選択します。Select your published LUIS app from luis.ai.
  2. 発行済み LUIS アプリを開いた状態で [MANAGE] タブを選択します。With your published LUIS app open, select the MANAGE tab.
  3. 左側の [設定] タブを選択し、[アプリケーション ID] に表示される 値を として記録 します <YOUR_APP_ID> 。Select the Settings tab on the left side and record the value shown for Application ID as <YOUR_APP_ID>.

    LUIS アプリの管理 - アプリケーション情報Manage LUIS app - Application Information

  4. 左側にある [Azure リソース] タブを選択し、 [オーサリング リソース] グループを選択します。Select the Azure Resources tab on the left side and select the Authoring Resource group. [場所] に表示される値を <YOUR_REGION> としてメモし、 [主キー] を <YOUR_AUTHORING_KEY> としてメモします。Record the value shown for Location as <YOUR_REGION> and Primary Key as <YOUR_AUTHORING_KEY>.

    LUIS アプリの管理 - オーサリング情報Manage LUIS app - Authoring Information

設定ファイルを更新するUpdate the settings file

LUIS アプリにアクセスするために必要な情報 (アプリケーション ID、オーサリング キー、リージョンなど) を appsettings.json ファイルに追加します。Add the information required to access your LUIS app including application id, authoring key, and region into the appsettings.json file. これらは、発行済みの LUIS アプリから先ほど保存した値です。These are the values you saved previously from your published LUIS app. API ホスト名は <your region>.api.cognitive.microsoft.com 形式にする必要があることに注意してください。Note that the API host name should be in the format <your region>.api.cognitive.microsoft.com.

appsetting.jsonappsetting.json

{
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "LuisAppId": "",
  "LuisAPIKey": "",
  "LuisAPIHostName": ""
}

LUIS アプリを使用するためのボットの構成Configure your bot to use your LUIS app

NuGet パッケージ Microsoft.Bot.Builder.AI.Luis がプロジェクトにインストールされていることを確認します。Be sure that the Microsoft.Bot.Builder.AI.Luis NuGet package is installed for your project.

LUIS サービスに接続するために、ボットは、上記で追加した情報を appsetting.json ファイルからプルします。To connect to the LUIS service, the bot pulls the information you added above from the appsetting.json file. FlightBookingRecognizer クラスには、appsetting.json ファイルからのユーザーの設定に関するコードが含まれています。このクラスは、RecognizeAsync メソッドを呼び出すことで LUIS サービスにクエリを実行します。The FlightBookingRecognizer class contains code with your settings from the appsetting.json file and queries the LUIS service by calling RecognizeAsync method.

FlightBookingRecognizer.csFlightBookingRecognizer.cs

public class FlightBookingRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public FlightBookingRecognizer(IConfiguration configuration)
    {
        var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
        if (luisIsConfigured)
        {
            var luisApplication = new LuisApplication(
                configuration["LuisAppId"],
                configuration["LuisAPIKey"],
                "https://" + configuration["LuisAPIHostName"]);
            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV3(luisApplication)
            {
                PredictionOptions = new Bot.Builder.AI.LuisV3.LuisPredictionOptions
                {
                    IncludeInstanceData = true,
                }
            };

            _recognizer = new LuisRecognizer(recognizerOptions);
        }
    }

    // Returns true if luis is configured in the appsettings.json and initialized.
    public virtual bool IsConfigured => _recognizer != null;

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
        => await _recognizer.RecognizeAsync(turnContext, cancellationToken);

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
        where T : IRecognizerConvert, new()
        => await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}

FlightBookingEx.cs には、FromTo、および TravelDate を抽出するロジックが含まれています。これは、MainDialog.cs から FlightBookingRecognizer.RecognizeAsync<FlightBooking> を呼び出したときに LUIS の結果を格納するために使用される部分クラス FlightBooking.cs を拡張します。The FlightBookingEx.cs contains the logic to extract From, To and TravelDate; it extends the partial class FlightBooking.cs used to store LUIS results when calling FlightBookingRecognizer.RecognizeAsync<FlightBooking> from the MainDialog.cs.

CognitiveModels\FlightBookingEx.csCognitiveModels\FlightBookingEx.cs

// Extends the partial FlightBooking class with methods and properties that simplify accessing entities in the luis results
public partial class FlightBooking
{
    public (string From, string Airport) FromEntities
    {
        get
        {
            var fromValue = Entities?._instance?.From?.FirstOrDefault()?.Text;
            var fromAirportValue = Entities?.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (fromValue, fromAirportValue);
        }
    }

    public (string To, string Airport) ToEntities
    {
        get
        {
            var toValue = Entities?._instance?.To?.FirstOrDefault()?.Text;
            var toAirportValue = Entities?.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (toValue, toAirportValue);
        }
    }

    // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
    // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
    public string TravelDate
        => Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0];
}

お客様のボットで使用するための LUIS の構成と接続が完了しました。LUIS is now configured and connected for your bot.

ボットのテストTest the bot

最新の Bot Framework Emulator をダウンロードしてインストールしますDownload and install the latest Bot Framework Emulator

  1. ご自身のマシンを使ってローカルでサンプルを実行します。Run the sample locally on your machine. 手順については、README ファイルで C# サンプルJS サンプル、または Python サンプルを参照してください。If you need instructions, refer to the readme file for the C# Sample, JS Sample or Python Sample.

  2. エミュレーターで、"パリへの移動" や "パリからドイツへの移動" などのメッセージを入力します。In the Emulator, type a message such as "travel to paris" or "going from paris to berlin". FlightBooking.json ファイルの任意の発話を、意図 "Book flight" のトレーニングに使用します。Use any utterance found in the file FlightBooking.json for training the intent "Book flight".

LUIS の予約の入力

LUIS から返された最上位の意図が "Book flight" に解決されると、お使いのボットは、旅行の予約を作成するための情報が十分に確保されるまで質問を続けます。If the top intent returned from LUIS resolves to "Book flight" your bot will ask additional questions until it has enough information stored to create a travel booking. 予約を作成できたら、その予約情報をユーザーに返します。At that point it will return this booking information back to your user.

LUIS の予約の結果

この時点で、コードのボット ロジックはリセットされ、引き続き追加の予約を作成できます。At this point the code bot logic will reset and you can continue to create additional bookings.

関連情報Additional information

LUIS の詳細については、LUIS のドキュメントを参照してください。For more about LUIS, see the LUIS documentation:

次のステップNext steps