FormFlowがあまりにも制限的な場合は、ダイアログを使用することを検討する必要があります。彼らははるかに開いた会話を可能にします。
私は、次の操作を行います:
1)カテゴリを選択するようにユーザーに確認して下さい。
可能であれば、ボタンを使用して、選択可能なカテゴリのリストをユーザーに提供します。つまり、ユーザーが選択したカテゴリについてLUISに問い合わせる必要はありません。
それ以外の場合は、カテゴリを入力してLUISに渡すことができます。 LUISからの応答にはエンティティが含まれます。エンティティはカテゴリの名前を保持します。そのカテゴリのエンティティによって
が前方に次の質問
[LuisIntent("AskQuestionAboutCategory")]
public async Task AskQuestion(IDialogContext context, LuisResult result)
{
//get Entity from LUIS response
string category = result.Entities.FirstOrDefault(e => e.Type == "Category")?.Entity;
switch (category)
{
case "Category 1":
//forward to Dialog for Category1
await
context.Forward(new Category1Dialog(), ResumeAfter,
new Activity {Text = result.Query}, CancellationToken.None);
break;
case "Category 2":
//forward to Dialog for Category2
await
context.Forward(new Category2Dialog(), ResumeAfter,
new Activity {Text = result.Query}, CancellationToken.None);
break;
}
}
private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result)
{
context.Wait(MessageReceived);
}
3を尋ねるを担当する適切なダイアログに、LUISから返されたダイアログに転送
2))ダイアログ内で質問する
ダイアログの中で、プロンプトダイアログを使用して質問1を求めます。質問1の回答にスイッチを使用してd質問2のために何を求めるか決定してください。 このような会話を続けてください。
[Serializable]
public class Category1Dialog : IDialog<object>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var prompt = "what is the answer to question 1 ?";
//ASK QUESTION 1
PromptDialog.Text(context, ResumeAfterQuestion1, prompt);
}
private async Task ResumeAfterQuestion1(IDialogContext context, IAwaitable<string> result)
{
var input = await result;
switch (input)
{
//ASK QUESTION 2, DEPENDING ON WHAT WAS ANSWERED FOR QUESTION 1
case "Answer A":
PromptDialog.Text(context, ResumeAfterQuestion2, "what is the answer to question 2 ?");
break;
case "Answer B":
PromptDialog.Text(context, ResumeAfterQuestion2, "what is the answer to question 2 ?");
break;
}
}
private async Task ResumeAfterQuestion2(IDialogContext context, IAwaitable<string> result)
{
var input = await result;
switch (input)
{
//ASK QUESTION 3
case "Answer C":
PromptDialog.Text(context, ResumeAfterQuestion3, "what is the answer to next question after Answer C ?");
break;
case "Answer D":
PromptDialog.Text(context, ResumeAfterQuestion3, "what is the answer to next question after Answer D ?");
break;
}
}
スイッチのステートメントを使用して次に質問する必要があるようです。
click here for more info on Dialogs
これは私が必要なもの – r3plica
である。これは、前方:(機能していないことが取り組んでいるMessageReceivedAsync – r3plica
にそれを作ることはありません、それはそこに表示されるのに役立ちますので、私はあなたに1を与えています3.2.1のバグだった – r3plica