ダイアログ ライブラリ
適用対象: SDK v4
ダイアログ は SDK の中心的な概念であり、ユーザーとの長時間の会話を管理する方法を提供します。 ダイアログは、会話スレッドの一部または完全な会話スレッドを表すことができるタスクを実行します。 1 ターンまたは多数のターンにまたがり、短い期間または長い期間にまたがる場合があります。
この記事では、ダイアログ ライブラリのコア クラスと機能について説明します。
- ボットのしくみ (ターンを含む) と状態の管理について理解している必要があります。
- 各ダイアログは、完了まで実行して収集された情報を返すことができる会話タスクを表します。
- 各ダイアログは、制御フローの基本的な単位を表します。開始、続行、終了が可能です。一時停止と再開。または取り消されます。
- ダイアログは、プログラミング言語のメソッドまたは関数に似ています。 ダイアログの開始時に引数またはパラメーターを渡すことができます。また、ダイアログの終了時に戻り値を生成することもできます。
ヒント
Bot Framework を使用してボットを開発したり、新しい会話エクスペリエンスを作成したりするのが初めてである場合は、 Bot Framework Composer から始めます。 Composer で作成されていない既存の SDK 優先ボットの場合は、ボットを スキル として公開し、将来のボット開発に Composer を使用することを検討してください。
ダイアログの状態
ダイアログは 複数ターンの会話を実装できるため、ターン間で 永続化された状態 に依存します。 ダイアログの状態がないと、ボットは会話のどこにいたのか、どの情報が既に収集されているかを知りません。
会話内のダイアログの場所を保持するには、ダイアログの状態を取得し、各ターンのメモリに保存する必要があります。 これは、ボットの会話状態で定義されたダイアログ状態プロパティ アクセサーを介して処理されます。 このダイアログの状態は、すべてのアクティブなダイアログとアクティブなダイアログの子の情報を管理します。 これにより、ボットは最後に中断した場所を選択し、さまざまな会話モデルを処理できます。
実行時に、ダイアログ状態プロパティには、ダイアログ インスタンス オブジェクトの形式で内部的に収集された情報など、 ダイアログ が論理プロセス内のどこにあるかに関する情報が含まれます。 繰り返しますが、これはボットに読み込み、各ターンのメモリに保存する必要があります。
ダイアログ インフラストラクチャ
さまざまな種類のダイアログと共に、次のクラスが会話の設計と制御に関与します。 通常、これらのクラスを直接操作する必要はありませんが、ボットのダイアログを設計するときに、それらのクラスとその目的を認識することは役立ちます。
| クラス | 説明 |
|---|---|
| ダイアログ セット | 相互に参照し、連携して動作できるダイアログのコレクションを定義します。 |
| ダイアログ コンテキスト | すべてのアクティブなダイアログに関する情報が含まれます。 |
| ダイアログ インスタンス | 1 つのアクティブなダイアログに関する情報が含まれています。 |
| ダイアログ ターンの結果 | アクティブまたは最近アクティブなダイアログの状態情報が含まれます。 アクティブなダイアログが終了した場合、その戻り値が含まれます。 |
ダイアログの種類
ダイアログ ライブラリには、ボットの会話を管理しやすくするためのいくつかの種類のダイアログが用意されています。 これらの型の一部については、この記事の後半で詳しく説明します。
| Type | 説明 |
|---|---|
| ダイアログ (dialog) | すべてのダイアログの基本クラス。 |
| コンテナー ダイアログ | コンポーネントダイアログやアダプティブ ダイアログなど、すべての コンテナー ダイアログの基本クラス。 内部ダイアログ セットが保持され、ダイアログのコレクションを 1 つの単位として扱うことができます。 |
| コンポーネント ダイアログ | 一連のダイアログをカプセル化し、セット全体を再利用できるようにする汎用型のコンテナー ダイアログ。 コンポーネント ダイアログが開始されると、そのコレクション内の指定されたダイアログで始まります。 内部プロセスが完了すると、コンポーネント ダイアログが終了します。 |
| ウォーターフォール ダイアログ | 一連のステップを定義し、ボットが線形プロセスをユーザーに案内できるようにします。 通常、これらはコンポーネント ダイアログのコンテキスト内で動作するように設計されています。 |
| プロンプト ダイアログ | ユーザーに入力を依頼し、結果を返します。 プロンプトは、有効な入力が取得されるか、取り消されるまで繰り返されます。 ウォーターフォール ダイアログを操作するように設計されています。 |
| アダプティブ ダイアログ | Composer が、より自然な会話フローを提供するために使用するコンテナー ダイアログの種類。 SDK 優先ボットで直接使用することを意図していません。 |
| アクション ダイアログ | Composer でのアクションの実装をサポートするダイアログの種類。 SDK 優先ボットで直接使用することを意図していません。 |
| 入力ダイアログ | Composer での入力アクションの実装をサポートするダイアログの種類。 SDK 優先ボットで直接使用することを意図していません。 |
| [スキル] ダイアログ | スキル コンシューマーから 1 つ以上のスキル ボットの管理を自動化します。 Composer は、スキルをアクションとして直接サポートします。 |
| QnA Maker ダイアログ | QnA Maker ナレッジ ベースへのアクセスを自動化します。 このダイアログは、Composer 内のアクションとしても機能するように設計されています。 |
重要
アダプティブ ダイアログは、 C# SDK のバージョン 4.9 で最初に追加されました。 アダプティブ ダイアログは Bot Framework Composer を サポートしており、SDK 優先ボットで直接使用することを意図したものではありません。
ダイアログ パターン
ボットからダイアログを開始および管理するための主なパターンは 2 つあります。
- Bot Framework Composer を使用して会話ダイアログを作成し、より自然で自由に会話できる機能を利用することをお勧めします。 詳細については、「 Bot Framework Composer の概要」を参照してください。 このようなボットは、必要に応じてコードで拡張できます。
- いずれかの SDK 言語でボットを開発し、ルート ダイアログの 実行 拡張メソッドを使用します。 コンポーネント ダイアログで実行メソッドを使用する方法の詳細については、 コンポーネントダイアログとウォーターフォール ダイアログ について、および シーケンシャルな会話フローを実装する方法を参照してください。
ダイアログ スタック
ダイアログ コンテキストには、すべてのアクティブなダイアログに関する情報が含まれ、すべてのアクティブなダイアログの呼び出し履歴として機能するダイアログ スタックが含まれています。 各コンテナー ダイアログには、制御しているダイアログの内部セットがあるため、アクティブな各コンテナー ダイアログでは、状態の一部として内部ダイアログ コンテキストとダイアログ スタックが導入されます。
スタックに直接アクセスすることはできませんが、スタックが存在し、その機能を理解することは、ダイアログ ライブラリのさまざまな側面がどのように機能するかを理解するのに役立ちます。
コンテナー ダイアログ
コンテナー ダイアログ は、より大きなダイアログ セットの一部にすることができます。 各コンテナーには、管理される内部ダイアログ セットがあります。
各ダイアログ セットは、ダイアログ ID を解決するためのスコープを作成します。
SDK では現在、コンポーネント ダイアログとアダプティブ ダイアログの 2 種類のコンテナー ダイアログが実装されています。
この 2 つの概念構造は大きく異なります。 ただし、Composer ボットでは両方を利用できます。
ダイアログ ID
ダイアログ セットにダイアログを追加するときは、そのセット内で一意の ID を割り当てます。 セット内のダイアログは、ID によって相互に参照されます。
実行時に 1 つのダイアログが別のダイアログを参照すると、ダイアログの ID によって参照されます。 ダイアログ コンテキストは、イミディエイト ダイアログ セット内の他のダイアログに基づいて ID の解決を試みます。 一致するものがない場合は、包含ダイアログ セットまたは外部ダイアログ セット内の一致が検索されます。 一致するものが見つからない場合は、例外またはエラーが生成されます。
コンポーネント ダイアログ
コンポーネント ダイアログは会話にシーケンス モデルを使用し、コンテナー内の各ダイアログはコンテナー内の他のダイアログを呼び出す役割を担います。 コンポーネント ダイアログの内部ダイアログ スタックが空の場合、コンポーネントは終了します。
ボットに、より動的な会話フローを必要としない比較的単純な制御フローがある場合は、コンポーネントダイアログとウォーターフォールダイアログの使用を検討してください。
コンポーネントダイアログとウォーターフォールダイアログについて 、コンポーネント、ウォーターフォール、プロンプトダイアログについて詳しく説明します。
アダプティブ ダイアログ
アダプティブ ダイアログを使用すると、Composer はコンテキストとイベントに基づいて会話フローを動的に更新できます。 これにより、ダイアログをより自然で自由にフローできるようになります。 このようなボットでは、次のことができます。
- ユーザーが自分の考えを変え、会話の前に回答した質問に再回答できるようにします。
- ユーザーが 1 つの回答で 2 つの質問に回答できるようにします。
- 会話の途中でユーザーのコンテキストを別のトピックに切り替えることができます。
これは、会話の途中で会話コンテキストの切り替えや中断を処理する場合に特に便利です。 アダプティブ ダイアログは、リッチ イベント システムをサポートし、その上に置きます。
Bot Framework Composer の概要では、Composer でサポートされる機能とアダプティブ ダイアログについて説明します。言語認識と言語生成のサポート、会話フローをモデル化するためのトリガーとアクションの使用、メモリ スコープへのアクセスなどです。
その他のダイアログ
QnA Maker ダイアログとスキル ダイアログは、スタンドアロン ダイアログとして、またはコンテナー内のダイアログのコレクションの一部として使用できます。
QnA Maker ダイアログ
QnA Maker ダイアログは QnA Maker ナレッジ ベースにアクセスし、QnA Maker のフォローアップ プロンプトとアクティブ ラーニング機能をサポートします。
- フォローアップ プロンプト (マルチターン プロンプトとも呼ばれます) を使用すると、ナレッジ ベースは質問に回答する前にユーザーに詳細情報を求められます。
- アクティブ ラーニングの提案により、ナレッジ ベースは時間の経過とともに改善されます。 QnA Maker ダイアログは、アクティブな学習機能に対する明示的なフィードバックをサポートしています。
詳細については、次を参照してください。
- QnA Maker とは
- SDK では、 QnA Maker を使用して質問に回答する方法について説明します。
- Composer で、 QnA Maker ナレッジ ベースをボットに追加する方法。
[スキル] ダイアログ
スキル ダイアログは、1 つ以上のスキルにアクセスして管理します。 スキル ダイアログでは、親ボットからスキル ボットにアクティビティがポストされ、スキルの応答がユーザーに返されます。
詳細については、次を参照してください。