Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在意图中提示用户缺少实体,并等待它们响应_C#_Azure_Botframework_Azure Language Understanding - Fatal编程技术网

C# 在意图中提示用户缺少实体,并等待它们响应

C# 在意图中提示用户缺少实体,并等待它们响应,c#,azure,botframework,azure-language-understanding,C#,Azure,Botframework,Azure Language Understanding,我一直在试图解决这个问题,我想这可能很容易,但我只是找不到一个方法来实现它 我有一个非常简单的路易斯意图,如下所示: [LuisIntent("xxx")] public async Task xxx(IDialogContext context, LuisResult result) { var entities = new List<EntityRecommendation>(result.Entities); //do stuff eg. Prompt.Text

我一直在试图解决这个问题,我想这可能很容易,但我只是找不到一个方法来实现它

我有一个非常简单的路易斯意图,如下所示:

[LuisIntent("xxx")]
public async Task xxx(IDialogContext context, LuisResult result)
{
    var entities = new List<EntityRecommendation>(result.Entities);
    //do stuff eg. Prompt.Text(contenxt, "Enter your name");
    //await prompt
    //store new response into the variable
}
[LuisIntent(“xxx”)]
公共异步任务xxx(IDialogContext上下文,LuisResult结果)
{
var实体=新列表(结果实体);
//做一些事情,例如Prompt.Text(contenxt,“输入你的名字”);
//等待提示
//将新响应存储到变量中
}
我想要实现的是提示用户查询中缺少的任何实体,并将其保存以供以后使用。问题在于,意图并不等待用户响应,而是继续正常执行

这一次我遗漏了什么


提前感谢。

您需要调用一个新对话框来提示输入其余的实体。 我将使用一个基于您试图捕获的所有实体的FormFlow对话框。基本上,您希望假设您的实体中没有一个符合Luis意图,这样您就可以提示用户所有信息。 因此,使用FormFlow,可以指定FromFlow的初始状态。为此,请创建一个实例,并用收到的实体填充属性。FormFlow将跳过任何已填充字段的步骤。 或者,当启动FormDialog时,可以传入“FormOptions.PromptFieldsWithValues”。这将告诉对话框仍然提示用户输入所有值,但将使用填充值作为默认值。如果您想让用户选择更改某些内容,您可以这样做

下面是我从github中提取的一个基本示例

这是定义您的状态的类。您将基于您想要接收的实体来构建此功能

public class SampleQuestion
{
    public string FavoriteColor;
    public string FavoritePizza;
}
这是一个通用的对话框方法,但它将是您的意图方法的样子

    async Task StartAsync(IDialogContext context)
    {
        var question = new SampleQuestion();

        // Pre-populate a field. This is where you fill in with the entities you got from LUIS
        question.FavoriteColor = "blue";

       //Now call FormBuilder to ask the user for the remaining entities
        context.Call<SampleQuestion>(new FormDialog<SampleQuestion>(question), OnSampleQuestionAnswered);
    }

    //this is the return from you FormBuilder. This is where you get back into you LUIS dialog and continue processing with, hopefully, all the entities you need now
    public async Task OnSampleQuestionAnswered(IDialogContext context, IAwaitable<SampleQuestion> sampleQuestion)
    {
        var result = await sampleQuestion;
    }
异步任务StartAsync(IDialogContext上下文) { var question=新的SampleQuestion(); //预先填充一个字段。这是您填写从LUIS获得的实体的地方 question.FavoriteColor=“蓝色”; //现在调用FormBuilder向用户询问剩余的实体 调用(新表单对话框(问题),OnSampleQuestionResponsed); } //这是您FormBuilder的返回。这就是你回到你的LUIS对话框并继续处理你现在需要的所有实体的地方 SampleQuestionResponsed上的公共异步任务(IDialogContext上下文,IAwaitable sampleQuestion) { var结果=等待样本问题; }
希望这有帮助。

您需要调用一个新对话框来提示输入其余的实体。 我将使用一个基于您试图捕获的所有实体的FormFlow对话框。基本上,您希望假设您的实体中没有一个符合Luis意图,这样您就可以提示用户所有信息。 因此,使用FormFlow,可以指定FromFlow的初始状态。为此,请创建一个实例,并用收到的实体填充属性。FormFlow将跳过任何已填充字段的步骤。 或者,当启动FormDialog时,可以传入“FormOptions.PromptFieldsWithValues”。这将告诉对话框仍然提示用户输入所有值,但将使用填充值作为默认值。如果您想让用户选择更改某些内容,您可以这样做

下面是我从github中提取的一个基本示例

这是定义您的状态的类。您将基于您想要接收的实体来构建此功能

public class SampleQuestion
{
    public string FavoriteColor;
    public string FavoritePizza;
}
这是一个通用的对话框方法,但它将是您的意图方法的样子

    async Task StartAsync(IDialogContext context)
    {
        var question = new SampleQuestion();

        // Pre-populate a field. This is where you fill in with the entities you got from LUIS
        question.FavoriteColor = "blue";

       //Now call FormBuilder to ask the user for the remaining entities
        context.Call<SampleQuestion>(new FormDialog<SampleQuestion>(question), OnSampleQuestionAnswered);
    }

    //this is the return from you FormBuilder. This is where you get back into you LUIS dialog and continue processing with, hopefully, all the entities you need now
    public async Task OnSampleQuestionAnswered(IDialogContext context, IAwaitable<SampleQuestion> sampleQuestion)
    {
        var result = await sampleQuestion;
    }
异步任务StartAsync(IDialogContext上下文) { var question=新的SampleQuestion(); //预先填充一个字段。这是您填写从LUIS获得的实体的地方 question.FavoriteColor=“蓝色”; //现在调用FormBuilder向用户询问剩余的实体 调用(新表单对话框(问题),OnSampleQuestionResponsed); } //这是您FormBuilder的返回。这就是你回到你的LUIS对话框并继续处理你现在需要的所有实体的地方 SampleQuestionResponsed上的公共异步任务(IDialogContext上下文,IAwaitable sampleQuestion) { var结果=等待样本问题; }
希望这能有所帮助。

我认为最简单的方法是使用表单从用户手中收集数据。这将有以下优点 1) 你将得到所有必须的数据,这将使你对谈话有很强的控制力 2) 与每次用户错过实体时请求用户添加实体相比,您对LUIS应用程序的调用次数将减少。请相信我,从长远来看,节省路易的数量最终会为你节省一些钱。 因此,使用表单流从用户手中收集数据。我添加了以下链接,以帮助您熟悉表单流的概念



我认为最简单的方法是使用表单从用户手中收集数据。这将有以下优点 1) 你将得到所有必须的数据,这将使你对谈话有很强的控制力 2) 与每次用户错过实体时请求用户添加实体相比,您对LUIS应用程序的调用次数将减少。请相信我,从长远来看,节省路易的数量最终会为你节省一些钱。 因此,使用表单流从用户手中收集数据。我添加了以下链接,以帮助您熟悉表单流的概念


您不能像这样使用“Prompt.Text”-您必须将实体请求作为正常回复发送,然后当用户回复时,您的机器人必须合并se