ユーザー入力を収集するために独自のプロンプトを作成するCreate your own prompts to gather user input

適用対象: 対象 SDK v4 対象外 SDK v3 APPLIES TO: yesSDK v4 no SDK v3

多くの場合、ボットとユーザー間の会話では、ユーザーに情報の入力を求め、ユーザーの応答を解析し、その情報に基づいてアクションを実行する必要があります。A conversation between a bot and a user often involves asking (prompting) the user for information, parsing the user's response, and then acting on that information. お使いのボットは会話のコンテキストを追跡する必要があります。これにより、自身の動作を管理し、以前の質問に対する回答を記憶することができます。Your bot should track the context of a conversation, so that it can manage its behavior and remember answers to previous questions. ボットの "状態" は、受信メッセージに適切に応答するためにボットが追跡する情報です。A bot's state is information it tracks to respond appropriately to incoming messages.

ヒント

ダイアログ ライブラリにはプロンプトが組み込まれており、ユーザーが使用できる機能がさらに用意されています。The dialogs library provides built in prompts that provide more functionality that users can use. これらのプロンプトの例については、「連続して行われる会話フローの実装」を参照してください。Examples of those prompts can be found in the Implement sequential conversation flow article.

前提条件Prerequisites

サンプル コードについてAbout the sample code

サンプル ボットでは、ユーザーに対して一連の質問を行い、その回答の一部を検証して、入力を保存します。The sample bot asks the user a series of questions, validates some of their answers, and saves their input. 次の図は、ボット、ユーザー プロファイル、および会話フロー クラスの間の関係を示しています。The following diagram shows the relationship between the bot, user profile, and conversation flow classes.

custom-prompts

  • ボットによって収集されるユーザー情報を表す UserProfile クラス。A UserProfile class for the user information that the bot will collect.
  • ユーザー情報を収集しているときに、会話状態を制御する ConversationFlow クラス。A ConversationFlow class to control our conversation state while gathering user information.
  • 会話の進行状況を追跡するための内部 ConversationFlow.Question 列挙型。An inner ConversationFlow.Question enumeration for tracking where we are in the conversation.

ユーザー状態では、ユーザーの名前、年齢、および選択した日付が追跡されます。また、会話状態では、ユーザーに質問した内容が追跡されます。The user state will track the user's name, age, and chosen date, and conversation state will track what we've just asked the user. このボットはデプロイする予定がないため、"メモリ ストレージ" を使用するように、ユーザー状態と会話情報の両方を構成します。Since we don't plan to deploy this bot, we'll configure both user and conversation state to use memory storage.

会話のフローと入力のコレクションの管理には、ボットのメッセージ ターン ハンドラーと、ユーザーおよび会話状態のプロパティを使用します。We use the bot's message turn handler plus user and conversation state properties to manage the flow of the conversation and the collection of input. ボットでは、メッセージ ターン ハンドラーの各イテレーション中に受信した状態のプロパティ情報を記録します。In our bot, we'll record the state property information received during each iteration of the message turn handler.

会話およびユーザー オブジェクトを作成するCreate conversation and user objects

ユーザーおよび会話状態オブジェクトはスタートアップ時に作成され、依存関係がボット コンストラクターに挿入されます。The user and conversation state objects are created at startup and dependency injected into the bot constructor.

Startup.cs [!code-csharpStartup]Startup.cs [!code-csharpStartup]

Bots/CustomPromptBot.cs [!code-csharpcustom prompt bot]Bots/CustomPromptBot.cs [!code-csharpcustom prompt bot]

プロパティ アクセサーを作成するCreate property accessors

最初に、プロパティ アクセサーを作成します。このプロパティ アクセサーにより、OnMessageActivityAsync メソッド内の BotState へのハンドルが提供されます。We begin by creating property accessors that give us a handle to the BotState inside the OnMessageActivityAsync method. 次に、GetAsync メソッドを呼び出して、適切に範囲指定されたキーを取得します。Then, we call the GetAsync method to get the properly scoped key:

Bots/CustomPromptBot.cs [!code-csharpcustom prompt bot]Bots/CustomPromptBot.cs [!code-csharpcustom prompt bot]

最後に、SaveChangesAsync メソッドを使用してデータを保存します。And finally, we save the data using the SaveChangesAsync method.

await _conversationState.SaveChangesAsync(turnContext);
await _userState.SaveChangesAsync(turnContext);

ボットのメッセージ ターン ハンドラーThe bot's message turn handler

メッセージ アクティビティを処理するために、SaveChangesAsync() を使用して状態を保存する前に、FillOutUserProfileAsync() ヘルパー メソッドを使用します。To handle message activities, we use the helper method FillOutUserProfileAsync() before saving the state using SaveChangesAsync(). 完全なコードを次に示します。Here is the complete code.

Bots/CustomPromptBot.cs [!code-csharpcustom prompt bot]Bots/CustomPromptBot.cs [!code-csharpcustom prompt bot]

入力を解析して検証するParse and validate input

次の条件を使用して、入力を検証します。We'll use the following criteria to validate input.

  • name は、空でない文字列にする必要があります。The name must be a non-empty string. 空白文字を削除することで正規化します。We'll normalize by trimming white-space.
  • age は、18 から 120 の値にする必要があります。The age must be between 18 and 120. 整数を返すことで正規化します。We'll normalize by returning an integer.
  • date は、1 時間以上未来の日付または時刻にする必要があります。The date must be any date or time at least an hour in the future. 解析された入力の日付部分のみを返すことで正規化します。We'll normalize by returning just the date portion of the parsed input.

注意

age と date の入力については、Microsoft/Recognizers-Text ライブラリを使用して、初期解析を実行します。For the age and date input, we use the Microsoft/Recognizers-Text libraries to perform the initial parsing. サンプル コードは提供されますが、テキスト認識エンジン ライブラリの動作方法については説明されていません。また、これは入力を解析する方法の一例にすぎません。While we provide sample code, we do not explain how the text recognizers libraries work, and this is just one way to parse the input. これらのライブラリの詳細については、リポジトリの README を参照してください。For more information about these libraries, see the repository's README.

次の検証メソッドをお使いのボットに追加します。Add the following validation methods to your bot.

Bots/CustomPromptBot.cs [!code-csharpcustom prompt bot]Bots/CustomPromptBot.cs [!code-csharpcustom prompt bot]

ボットをローカルでテストするTest the bot locally

ボットをローカルでテストするための Bot Framework Emulator をダウンロードし、インス―ルします。Download and install the Bot Framework Emulator to test the bot locally.

  1. ご自身のマシンを使ってローカルでサンプルを実行します。Run the sample locally on your machine. 手順については、README ファイルで C# サンプルまたは JS サンプルを参照してください。If you need instructions, refer to the README file for C# sample or JS sample sample.
  2. 次に示すように、エミュレーターを使用してテストします。Test it using the emulator as shown below.

primitive-prompts

その他のリソースAdditional resources

ダイアログ ライブラリには、会話の管理に関するさまざまな側面を自動化するクラスが用意されています。The Dialogs library provides classes that automate many aspects of managing conversations.

次のステップNext step