ボットに自然言語の理解を追加する

この記事の対象: SDK v4

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) はクラウドベースの API サービスです。これを使用することで、ボットでユーザーのメッセージの意図が認識され、ユーザーのより自然な言葉が許容され、会話フローがより適切に指示されるようになります。

このトピックでは、LUIS を航空券予約アプリケーションに追加して、ユーザー入力に含まれるさまざまな意図やエンティティを認識する手順について説明します。

Note

Bot Framework JavaScript SDK、C#、Python SDK は引き続きサポートされますが、Java SDK については、最終的な長期サポートは 2023 年 11 月に終了する予定です。 このリポジトリ内の重要なセキュリティとバグの修正のみが行われます。

Java SDK を使用して構築された既存のボットは引き続き機能します。

新しいボットの構築については、Power Virtual Agents の使用を検討し、適切なチャットボット ソリューションの選択についてお読みください。

詳細については、「The future of bot building」をご覧ください。

前提条件

このサンプルについて

このコア ボット サンプルでは、空港のフライト予約アプリケーションの例を示しています。 これは LUIS サービスを使用してユーザー入力を認識し、認識した最上位の LUIS の意図を返します。

この言語モデルには、Book FlightCancelNone という 3 つの意図が含まれています。 LUIS では、これらの意図を使用して、ユーザーがどのようなつもりでボットにメッセージを送信したかが理解されます。 また、この言語モデルでは、出発地や目的地の空港など、ユーザーの入力から LUIS で抽出できるエンティティも定義します。

ユーザー入力の処理が完了するたびに、DialogBot では UserStateConversationState の両方の現在の状態が保存されます。 必要な情報がすべて収集されると、コード サンプルによりデモの航空券予約が作成されます。 この記事では、このサンプルの LUIS 部分について説明します。 ただし、サンプルの一般的なフローは次のようになります。

  • 新しいユーザーが接続され、ようこそカードを表示すると、OnMembersAddedAsync が呼び出されます。
  • ユーザー入力を受け取るたびに、OnMessageActivityAsync が呼び出されます。

Class diagram outlining the structure of the C# sample.

OnMessageActivityAsync モジュールは、Run ダイアログ拡張メソッドによって適切なダイアログを実行します。 そして、メイン ダイアログは、LUIS ヘルパー を呼び出して、最もスコアが高いユーザーの意図を見つけます。 ユーザー入力の最上位の意図によって "BookFlight" が返されると、ヘルパーは LUIS によって返されたユーザー情報を入力します。 その後、メイン ダイアログは BookingDialog を開始し、これにより、必要に応じて次のような追加情報をユーザーから取得します。

  • Origin 出発地
  • TravelDate 航空券の予約日
  • Destination 到着地

この記事では、ボットに LUIS を追加する方法について説明します。 ダイアログまたは状態の使用については、ダイアログ プロンプトを使用してユーザー入力を収集する方法に関するページまたは「ユーザーおよび会話データを保存する」をそれぞれ参照してください。

LUIS ポータルでの LUIS アプリの作成

  1. LUIS ポータルにサインインし、必要に応じてアカウントオーサリング リソースを作成します。
  2. LUIS[会話アプリ] ページで、[インポート] を選択し、[JSON としてインポート] を選択します。
  3. [新しいアプリのインポート] ダイアログで次のようにします。
    1. サンプルの CognitiveModels フォルダーにある FlightBooking.json ファイルを選択します。
    2. アプリの代替名として「FlightBooking」と入力し、[完了] をクリックします。
  4. サイトに、効果的な LUIS アプリの作成方法複合エンティティのアップグレードのダイアログが表示される場合があります。 これらのダイアログを閉じて、続行できます。
  5. アプリをトレーニングしてから、運用環境にアプリを発行します。 詳しくは、LUIS ドキュメントでアプリをトレーニング公開する方法をご覧ください。

エンティティを使用する理由

LUIS エンティティによって、ボットは標準の意図以外のイベントを理解できます。 これにより、ユーザーから追加情報を収集できるため、ボットは質問をしたり、よりインテリジェントに応答したりできます。 FlightBooking.json ファイルには、3 つの LUIS の意図である "Book Flight"、"Cancel"、および "None" の定義と共に、"From.Airport" や "To.Airport" などのエンティティのセットも含まれています。 これらのエンティティにより、ユーザーが新しい旅行の予約を要求したときに、LUIS は、そのユーザーの元の入力に含まれる追加情報を検出し、返すことができます。

LUIS アプリに接続するための値を取得する

LUIS アプリには、その発行後、ボットからアクセスできるようになります。 ボット内から LUIS アプリにアクセスするためには、いくつかの値を記録する必要があります。 その情報は、LUIS ポータルを使用して取得できます。

LUIS.ai ポータルからのアプリケーション情報の取得

設定ファイル (appsettings.json.env、または config.py) は、すべてのサービス参照を 1 か所にまとめる場所として機能します。 取得した情報は、次のセクションでこのファイルに追加されます。

  1. 発行済みの LUIS アプリを luis.ai から選択します。

  2. 発行済み LUIS アプリを開いた状態で [管理] タブを選択します。

  3. 左側の [設定] タブを選択し、[アプリケーション ID] に表示される値を <YOUR_APP_ID> として記録します。

    Screenshot of the Manage page displaying your application ID.

  4. [Azure リソース][予測リソース] の順に選択します。 [場所 に表示される値を <YOUR_REGION> として、[主キー] に表示される値を <YOUR_AUTHORING_KEY> として記録します。

    Screenshot of the Manage page displaying your location and primary key.

    または、オーサリング リソースにリージョンと主キーを使用することもできます。

設定ファイルを更新する

LUIS アプリにアクセスするために必要な情報 (アプリケーション ID、オーサリング キー、リージョンなど) を appsettings.json ファイルに追加します。 前の手順では、発行済みの LUIS アプリからこれらの値を取得しました。 API ホスト名は <your region>.api.cognitive.microsoft.com 形式にする必要があります。

appsetting.json

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

LUIS アプリを使用するためのボットの構成

NuGet パッケージ Microsoft.Bot.Builder.AI.Luis がプロジェクトにインストールされていることを確認します。

LUIS サービスに接続するために、ボットは appsetting.json ファイルに追加された情報をプルします。 FlightBookingRecognizer クラスには、appsetting.json ファイルからのユーザーの設定に関するコードが含まれています。このクラスは、RecognizeAsync メソッドを呼び出すことで LUIS サービスにクエリを実行します。

FlightBookingRecognizer.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 を拡張します。

CognitiveModels\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 の構成と接続が完了しました。

ボットのテスト

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

  1. ご自身のマシンを使ってローカルでサンプルを実行します。 手順については、README ファイル内の C# サンプルJS サンプル、または Python サンプルを参照してください。

  2. エミュレーターで、"パリを旅行する"、"パリからベルリンに移動する" などのメッセージを入力します。 FlightBooking.json ファイルの任意の発話を、意図 "Book flight" のトレーニングに使用します。

LUIS から返された最上位の意図が "Book flight" に解決されると、ボットは、旅行の予約を作成するための情報が十分に保存されるまでさらに質問を続けます。 予約を作成できたら、その予約情報をユーザーに返します。

この時点で、コードのボット ロジックはリセットされ、引き続き追加の予約を作成できます。

追加情報

LUIS の詳細については、LUIS のドキュメントを参照してください。

ヒント

SDK の別の部分では、別のエンティティ クラスまたは要素を定義します。 メッセージ エンティティについては、「エンティティとアクティビティの種類」を参照してください。