FormFlow を含むボットを作成しました。「I want to launch a product」と入力すると、LUIS はどのダイアログに移動する必要があるかを通知します。
internal static IDialog<AssesmentHelper> CreateProduct()
{
return Chain.From(() => FormDialog.FromForm(AssesmentHelper.BuildForm))
.Do(async (context, profileForm) =>
{
try
{
var completed = await profileForm;
}
catch (FormCanceledException<AssesmentHelper> e)
{
string reply;
if (e.InnerException == null)
{
reply = $"You quit on {e.Last}--maybe you can finish next time!";
}
else
{
reply = Responses.ShortCircuit;
}
await context.PostAsync(reply);
}
});
}
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
stLuis = await LuisHelper.ParseUserInput(activity.Text);
switch (stLuis.topScoringIntent.intent)
{
case "CreateProduct":
await Conversation.SendAsync(activity, CreateProduct);
break;
case "EditProduct":
await Conversation.SendAsync(activity, EditProduct);
break;
case "None":
break;
default:
break;
}
}
ダイアログに入ると、ユーザーに番号を選択するように求めます。
番号を選択してください:
- アズール
- ウィンドウズ
今、私が1,2と答えるとします。Luis はそれを None インテントとして返すため、メッセージは対応するダイアログに移動しません。それは常にNoneケースに行きます。
ダイアログのコードは次のとおりです。
public static IForm<AssesmentHelper> BuildForm()
{
return new FormBuilder<AssesmentHelper>()
.Message(Responses.NumberSelection)
.Field(nameof(Program))
.Field(nameof(Product))
.Build();
}
プログラムと製品の列挙:
[Serializable]
public enum Program
{
None = 0,
A = 1,
};
[Serializable]
public enum Product
{
None = 0,
Azure = 1,
Windows = 2
};
このダイアログに入るとすぐに、プログラムを選択するための番号を選択するように求められます。今私が1,2を選択した場合。Luis はそれを None インテントとして返します。したがって、Case "None" が実行されます。
私が欲しいのは、コントロールを同じダイアログにリダイレクトすることです。製品の編集にも同様のダイアログがあります。そのため、数値を製品の意図として理解するように luis アプリをトレーニングすることはできません。そうしないと、Edit Product の番号を選択するたびに、別のケースに移動します。
以前は何らかの形で正しいインテントを識別していましたが、今日、luis アプリを再公開したところ、識別が停止しました。