アダプティブ ダイアログの概要Introduction to adaptive dialogs

アダプティブダイアログには、ダイアログライブラリに対するイベントベースの新しい追加機能が用意されています。これを使用すると、中断処理やディスパッチなどの高度な会話管理手法を簡単にレイヤー化できます。Adaptive dialogs offer a new event-based addition to the Dialogs library that enables you to easily layer in sophisticated conversation management techniques like interruption handling, dispatching, and more.

重要

アダプティブダイアログは、現在、.NET バージョンの Bot Framework SDK でのみ使用できます。Adaptive dialogs is currently only available in the .NET version of the Bot Framework SDK. GitHub のBotBuilder リポジトリで、アダプティブダイアログを使用して構築されたサンプルボットを見つけることができます。You can find sample bots built using adaptive dialogs in the BotBuilder-Samples repository on GitHub.

前提条件Prerequisites

  • Bot Framework V4 SDK のダイアログに関する知識An understanding of dialogs in the Bot Framework V4 SDK
  • Bot Framework V4 SDK のプロンプトに関する一般的な知識A general understanding of prompts in the Bot Framework V4 SDK

定義済みのアダプティブ ダイアログAdaptive dialogs defined

アダプティブダイアログの理由Why adaptive dialogs

アダプティブダイアログには、 WaterfallDialogsに多くの利点があります。Adaptive dialogs have many advantages to WaterfallDialogs. 主に次のようになります。Primarily, they:

  • コンテキストとイベントに基づいてメッセージ交換フローを動的に更新できる柔軟性を備えています。Provide flexibility that enables you to dynamically update conversation flow based on context and events. これは、会話の途中で会話コンテキストの切り替えや中断を処理する場合に特に便利です。This is especially handy when dealing with conversation context switches and interruptions in the middle of a conversation.
  • 豊富なイベントシステムを使用してダイアログをサポートしているので、モデリングの中断、取り消し、実行計画のセマンティクスは、簡単に説明して管理することができます。Support and sit on top of a rich event system for dialogs, so modeling interruptions, cancellation, and execution planning semantics are a lot easier to describe and manage.
  • 入力認識とルールベースのイベント処理を行うBring input recognition and rule-based event handling
  • メッセージ交換モデル (ダイアログ) と出力生成を組み合わせて、1つのまとまりのある自己完結型のユニットにします。Combine the conversation model (dialog) and output generation into one cohesive, self-contained unit.
  • 認識、イベントルール、機械学習のための拡張ポイントをサポートします。Support extensibility points for recognition, event rules and machine learning.
  • 最初から宣言型として設計されています。Was designed to be declarative from the start. これにより、会話をモデル化するためのビジュアル キャンバスを提供する Bot Framework Composer のような製品を含むツールが可能になります。This enables tooling including products like Bot Framework Composer that provides a visual canvas to model conversations.

アダプティブ ダイアログの構造Anatomy of an adaptive dialog

Adaptive_dialog_anatomy

トリガーTriggers

すべてのアダプティブ ダイアログには_トリガー_と呼ばれる 1 つ以上のイベント ハンドラーの一覧が含まれています。各トリガーには、省略可能な Condition と、1 つ以上の_アクション_の一覧が含まれています。All adaptive dialogs contain a list of one or more event handlers called triggers, and each trigger contains an optional Condition and a list of one or more actions. トリガーとは、イベントのキャッチと応答を可能にするものです。その Condition が満たされた場合に、その Actions が実行され、イベントが処理されると、そのイベントに対してそれ以上のアクションは実行されません。Triggers are what enable you to catch and respond to events, if its Condition is met its Actions will execute and once an event is handled no further action is taken on that event. トリガーの Condition が満たされない場合、イベントは評価のために次のイベント ハンドラーに渡されます。If the triggers Condition is not met, the event is passed to the next event handler for evaluation.

アダプティブ ダイアログの_トリガー_の詳細については、「アダプティブ ダイアログのイベントとトリガー」の記事を参照してください。See the Events and triggers in adaptive dialogs article for more information on triggers in adaptive dialogs.

ActionsActions

_アクション_では、トリガーによって特定のイベントがキャプチャされたときの会話フローを定義します。Actions define the conversation flow when a specific event is captured via a Trigger. 各ステップが関数であるウォーターフォール ダイアログとは異なり、アダプティブ ダイアログの各アクションはそれ自体がダイアログです。Unlike a waterfall dialog where each step is a function, each action in an Adaptive dialog is in itself a dialog. これにより、アダプティブ ダイアログが強力かつ柔軟になり、アダプティブ ダイアログで、コンテキストまたは現在の状態に基づいて、条件付きで中断および分岐を簡単に処理できます。This makes adaptive dialogs both powerful and flexible and enables adaptive dialogs to easily handle interruptions and branch conditionally based on context or current state.

Bot Framework SDK には、メモリ操作、ダイアログ管理、ボットの会話フローの制御など、さまざまなアクションを実行できる多くの組み込みアクションが用意されています。The Bot Framework SDK provides many built in actions to enable you to perform various actions such as memory manipulation, dialog management, and controlling the conversational flow of your bot. アクションはファクト ダイアログにあるため、拡張可能で、独自のカスタム アクションを作成できます。Since actions are in fact dialogs, they are extensible, making it possible to create your own custom actions.

アダプティブ ダイアログの_アクション_の詳細については、「アダプティブ ダイアログのアクション」の記事を参照してください。See the Actions in adaptive dialogs article for more information on actions in adaptive dialogs.

入力Inputs

_入力_はアダプティブ ダイアログに対するもので、プロンプトは基本ダイアログ クラスに対するものです。Inputs are to adaptive dialogs what prompts are to the base dialog class. 入力は、アダプティブ ダイアログで、ユーザーからの情報を要求して検証するために使用できる特殊なアクションです。検証に合格した場合、入力をメモリに受け入れます。Inputs are specialized actions that you can use in an adaptive dialog to request and validate information from a user, then if the validation passes, accept the input into memory. Bot Framework SDK のすべての入力クラスは、次のことを行うように設計されています。All input classes in the Bot Framework SDK are designed to do the following:

  • 入力を求める前に、ボットが既に持っている情報の入力を求めないように、存在チェックを実行します。Perform existential checks before prompting, to avoid prompting for information the bot already has.
  • 入力が想定されるエンティティの型と一致する場合、指定したプロパティに入力を保存します。Save the input to the specified property if it matches the type of entity expected.
  • 制約を受け入れます (最小、最大など)。Accept constraints - min, max, etc.

アダプティブダイアログの_入力_の詳細については、「アダプティブダイアログを使用したユーザー入力の要求」を参照してください。See the Asking for user input using adaptive dialogs article for more information on inputs in adaptive dialogs.

認識エンジンRecognizers

_認識エンジン_により、ボットがユーザーの入力から意味のある情報を理解して、抽出でき ます。Recognizers enable your bot to understand and extract meaningful pieces of information from user's input. すべての認識エンジンでは、認識エンジンがユーザーの発話から意図を取得する (またはエンティティを抽出する) ときに発生する recognizedIntent イベントなどのイベントが生成されます。All recognizers emit events such as the recognizedIntent event that fires when the recognizer picks up an intent (or extracts entities) from a user utterance. アダプティブ ダイアログで認識エンジンを使用する必要はありませんが、使用しないと、recognizedIntent イベントが発生しなくなり、代わりに unknownIntent イベントが発生します。You are not required to use recognizers with an adaptive dialog, but if you don't no recognizedIntent events will ever fire, instead the unknownIntent event will fire.

アダプティブ ダイアログの_認識エンジン_の詳細については、「アダプティブ ダイアログの認識エンジン」の記事を参照してください。See the Recognizers in adaptive dialogs article for more information on recognizers in adaptive dialogs.

ジェネレーターGenerator

_ジェネレーター_によって、特定の言語生成システムがアダプティブ ダイアログに結び付けられます。Generator ties a specific language generation system to an adaptive dialog. これは、認識エンジンと共に、特定のダイアログの Language Understanding アセットと言語の生成アセットの明確な分離とカプセル化を可能にします。This, along with the recognizer enables clean separation and encapsulation of a specific dialog's Language Understanding and Language Generation assets. 言語の生成機能により、ジェネレーターを .lg ファイルに関連付けたり、ジェネレーターを TemplateEngine インスタンスに設定したりできます。このインスタンスでは、アダプティブ ダイアログを強化する 1 つ以上の .lg ファイルを明示的に管理します。With the Language Generation feature, you can associate the generator with a .lg file or set the generator to a TemplateEngine instance where you explicitly manage the one or more .lg files that power the adaptive dialog.

アダプティブ ダイアログの_ジェネレーター_の詳細については、「アダプティブ ダイアログでの言語の生成」 の記事を参照してください。See the Language Generation in adaptive dialogs article for more information on generators in adaptive dialogs.

メモリ スコープと状態の管理Memory scopes and managing state

アダプティブ ダイアログは、メモリにアクセスして管理するための方法を提供します。Adaptive dialogs provide a way to access and manage memory. すべてのアダプティブ ダイアログでは、既定でこのモデルが使用されるため、メモリを消費するか、メモリに寄与するすべてのコンポーネントには、適切なスコープでの情報の読み取りと書き込みを行うための共通のメソッドがあります。All adaptive dialogs by default use this model so all components that consume or contribute to memory have a common method to read and write information in the appropriate scope. すべてのスコープのすべてのプロパティはプロパティ バッグであり、格納されるプロパティを動的に変更することができます。All properties in all scopes are property bags which gives you the ability to dynamically modify what properties are stored.

アダプティブ ダイアログの_メモリ スコープ_と_状態の管理_に関する詳細については、アダプティブ ダイアログでのメモリ スコープと状態の管理に関する記事を参照してください。See the Memory scopes and managing state in adaptive dialogs article for more information on Memory scopes and managing state in adaptive dialogs.

宣言型アセットDeclarative assets

アダプティブ ダイアログでは、クラス ソース ファイルに新しい AdaptiveDialog オブジェクトを作成し、トリガーとアクションを定義することによって、ダイアログをクラスとして定義できますが、宣言型アプローチを使用して、ダイアログを作成することもできます。この方法では、.dialog のファイル拡張子が付いた JSON ファイルに、ダイアログのすべての属性を定義します。Adaptive dialogs enable you to define your dialog as a class by creating a new AdaptiveDialog object and defining your triggers and actions in the classes source file, but you can also create your dialog using a declarative approach where you define all the attributes of your dialog in a JSON file with a file extension of .dialog. ダイアログを定義するためにソースコードは必要なく、同じボットで両方の方法を使用して、複数のダイアログを指定することもできます。No source code is required to define your dialogs and you can have multiple dialogs using both approaches in the same bot. 実行時に、ボットによって、これらの宣言型ダイアログ ファイルに定義されているとおりに、ダイアログ コードが生成され実行されます。At runtime your bot will generate and execute the dialog code as defined in these declarative dialog files.

アダプティブダイアログでの_宣言型アセット_の使用の詳細については、「宣言型アセットの使用」を参照してください。See the Using declarative assets article for more information on using declarative assets in adaptive dialogs.

まとめTying it all together

アダプティブ ダイアログの実行時の動作The adaptive dialog runtime behavior

次の架空の_旅行代理店ボット_は、アダプティブ ダイアログの実行時の動作を示すのに役立ちます。The following fictitious Travel agent bot will help illustrate the runtime behavior of adaptive dialogs. 実際のアプリケーションでは、フライト、ホテルの客室、車両を検索して予約し、さらに天気もチェックする機能など多数の機能を用意して、これらをそれぞれ固有のダイアログで処理することになります。A real world application would have multiple capabilities like the ability to search for and book flights, hotel rooms, cars and even check the weather and each of these would be handled in their own specialized dialog.

ボットとの会話の途中で、ユーザーが想定されない何かを行った場合はどうなるでしょうか。What happens when the user does something unexpected while in the middle of a conversation with your bot?

次のようなシナリオがあるとします。Consider this scenario:

    User: I’d like to book a flight
    Bot:  Sure. What is your destination city?
    User: How’s the weather in Seattle?
    Bot:  Its 72 and sunny in Seattle
    ...

ユーザーは質問に回答しなかっただけでなく、件名を完全に変更しました。これにより、別のダイアログに存在するまったく異なるコード (アクション) を実行する必要があります。The user not only did not answer the question, but they changed the subject entirely, which will require completely different code (Action) that exists in a different dialog to execute. 次の図に示すように、アダプティブ ダイアログを使用して、このシナリオを処理できます。Adaptive dialogs enables you to handle this scenario which is shown in the following diagram:

Adaptive_dialog_runtime_behavior

このボットには、次の 3 つのアダプティブ ダイアログがあります。This bot has the following three adaptive dialogs:

  1. rootDialog には、固有の 'LUIS' モデルと一連のトリガーおよびアクションがあり、それらの一部では、特定のユーザー要求を処理するように設計された子ダイアログを呼び出します。The rootDialog that has its own 'LUIS' model and a set of triggers and actions, some of which will call a child dialog that is designed to handle specific user requests.
  2. bookFlightDialog には、フライトの予約に関する会話を処理する固有の ' LUIS ' モデルと一連のトリガーおよびアクションがあります。The bookFlightDialog that has its own 'LUIS' model and a set of triggers and actions that handles conversations about booking flights.
  3. weatherDialog には、気象情報の取得に関する会話を処理する固有の ' LUIS ' モデルと一連のトリガーおよびアクションがあります。The weatherDialog that has its own 'LUIS' model and a set of triggers and actions that handles conversations about getting weather information.

ユーザーが次のように言った場合のフローを示します。I'd like to book a flightHere's the flow when user says: I'd like to book a flight

Adaptive_dialog_conversation_flow_example

アクティブ ダイアログ (rootDialog) の認識エンジンによって、OnIntent トリガーで処理できる recognizedIntent イベントが生成されます。The active dialog (rootDialog) recognizer emits a recognizedIntent event that you can handle with an OnIntent trigger. この例では、ユーザーが "I’d like to book a flight" " と言ったため、これは rootDialog に定義されている意図に一致し、OnIntent トリガーに、実行する BeginDialog アクション (ダイアログ bookFlightDialog を呼び出す) が含まれます。In this case the user said "I’d like to book a flight" which matches an intent defined in rootDialog and causes the OnIntent trigger contains a BeginDialog action to execute, which calls the dialog bookFlightDialog. フライトの予約ダイアログで、そのアクションが実行され、それらの 1 つで、到着先の市区町村が尋ねられます。The book a flight dialog executes its actions, one of them is asking for the city you want to fly to.

ユーザーは応答に何でも指定できますが、場合によっては、応答が尋ねられた質問と関係ないことがあり、この例ではユーザーが How's the weather in Seattle? と応答しています。The user can provide anything in response, in some cases the response may have nothing to do with the question that was asked and in this case the user responded with How's the weather in Seattle?

Adaptive_dialog_interruption_example

ダイアログ bookFlightDialog には、このユーザー要求を処理する OnIntent トリガーがないため、ボットによって、このユーザー入力の処理が、会話スタックの上方の、すべての呼び出し元のダイアログを経由してルート ダイアログまで伝達されます。この例では、1 つだけ上のダイアログに進み、rootDialog には、weather 意図を処理する OnIntent トリガーがあるため、このトリガーによって、ダイアログ weatherDialog を呼び出すその BeginDialog アクションが実行され、ユーザーの質問が渡されます。Since the dialog bookFlightDialog has no OnIntent trigger to handle the users request, the bot propagates the handling of this user input up the conversation stack, up through all the calling dialogs all the way to the root dialog, which in this case is up just one dialog, and since rootDialog has an OnIntent trigger to handle the weather intent, this trigger executes its BeginDialog action that calls the dialog weatherDialog, passing along the users question. weatherDialog がユーザーの質問に応答して完了すると、ボットによって、元のダイアログに制御が戻され、この_中断_の前に離れた箇所で会話フローが続行され、ユーザーに再度到着先の市区町村についての入力が求められます。Once weatherDialog finishes by responding to the users question, the bot returns control back to the originating dialog and the conversation flow continues where it left off prior to this interruption, and prompts the user again for the destination city.

まとめると次のようになります。To summarize:

各ダイアログの_認識エンジン_によって、ユーザーの入力が分析され、ユーザーの意図が判断されます。Each dialog's recognizer analyzes the user's input to determine the user intent. 意図が判断されると、_認識エンジン_によって、OnIntent トリガーを使用してダイアログで処理される IntentRecognized イベントが生成されます。Once the intent is determined, the recognizer emits an IntentRecognized event which the dialog handles using an OnIntent trigger. アクティブなダイアログにその意図を処理できる OnIntent トリガーがない場合は、ボットによってダイアログの親ダイアログにそれが送信されます。If there is no OnIntent trigger in the active dialog that can handle that intent, the bot will send it to the dialog's parent dialog. 親ダイアログにその意図を処理するトリガーがない場合は、ルート ダイアログに到達するまで、上方に通知されます。If the parent dialog does not have a trigger to handle the intent it bubbles up until it reached the root dialog. その意図を処理するトリガーが完了すると、このプロセスを開始したダイアログに制御が戻され、そこで中断していた会話フローを続行できます。Once the trigger that handles that intent completes, it sends control back to the dialog that started this process where it can continue the conversational flow where it left off.

関連情報Additional information

アダプティブの概念Adaptive concepts

アダプティブダイアログを使用して bot を開発する方法How to develop a bot using adaptive dialogs