Botframework 记住前面的答案来指导对话

Botframework 记住前面的答案来指导对话,botframework,azure-language-understanding,Botframework,Azure Language Understanding,我正在使用LUIS模板创建一个聊天机器人,我有一个名为StartTest的意图,其中包含如下语句: Begin [TestNameEntity] on [GearEntity] and [RPMEntity] Begin [TestNameEntity] on [GearEntity] Begin [TestNameEntity] 如果用户输入与第一句话相匹配,我就有了所需的所有实体。但是,如果它的输入与第二个语句相匹配,我必须询问他RPM。对于第三句话,我要问一下齿轮和转速 但是对于第二个和

我正在使用LUIS模板创建一个聊天机器人,我有一个名为StartTest的意图,其中包含如下语句:

Begin [TestNameEntity] on [GearEntity] and [RPMEntity]
Begin [TestNameEntity] on [GearEntity]
Begin [TestNameEntity]
如果用户输入与第一句话相匹配,我就有了所需的所有实体。但是,如果它的输入与第二个语句相匹配,我必须询问他RPM。对于第三句话,我要问一下齿轮和转速

但是对于第二个和第三个语句,我需要知道用户对
[TestNameEntity]
说了什么,比如:

User: Begin test 1 on second gear
Bot: What RPM?
User: 2500

如何实现这一点?

一旦调用了Intent方法,就可以使用此逻辑

result.Entities[0].Type to get entity name
因此,您可以迭代
result.Entities
,以获取用户输入的所有实体。如果三个实体中的任何一个丢失,您可以请求提示。这是一个如何实现它的示例代码

//global variables
public string CurrentGear { get; set; }
public string CurrentRpm { get; set; }



[LuisIntent("StartTest")]
public async Task StartTestIntent(IDialogContext context, LuisResult result)
{
     if (result.Entities != null && result.Entities.Count >0)
    {
        //sample you will get selected entity type 
         //var ent1=result.Entities[0].Type;

        var userValues=GetUserEntities(result);
        if(userValues["GearEntity"]==null)
            showGearPrompt(context);
        if(userValues["RPMEntity"]==null)
            showRpmPrompt(context);
    }
}

private string[] GetUserEntities(LuisResult result)
{
    //your logic here
    //return list of entities;
}

private async Task showGearPrompt(IDialogContext context)
{
     PromptDialog.Text(  
        context: context,  
        resume: OnGearOptionReceivedAsync,  
        prompt: "please enter Gear Value",  
        retry: "Sorry, I didn't understand that. Please try again."  
    );  

}

 public virtual async Task OnGearOptionReceivedAsync(IDialogContext context, IAwaitable<string> gear)
{
    string response = await gear;  
    CurrentGear = response; 
}

private async Task showRpmPrompt(IDialogContext context)
{
    PromptDialog.Text(  
        context: context,  
        resume: OnRpmOptionReceivedAsync,  
        prompt: "please enter RPM Value",  
        retry: "Sorry, I didn't understand that. Please try again."  
    );  
}

 public virtual async Task OnRpmOptionReceivedAsync(IDialogContext context, IAwaitable<string> rpm)
{
    string response = await rpm;  
    CurrentRpm  = response; 
}
//全局变量
公共字符串CurrentGear{get;set;}
公共字符串CurrentRpm{get;set;}
[LuisIntent(“StartTest”)]
公共异步任务StartSettings(IDialogContext上下文,LuisResult结果)
{
如果(result.Entities!=null&&result.Entities.Count>0)
{
//示例:您将获得选定的实体类型
//var ent1=result.Entities[0]。类型;
var userValues=GetUserEntities(结果);
if(userValues[“GearEntity”]==null)
showGearPrompt(上下文);
if(userValues[“RPMEntity”]==null)
showRpmPrompt(上下文);
}
}
私有字符串[]GetUserEntities(LuisResult结果)
{
//你的逻辑在这里
//返回实体清单;
}
专用异步任务showGearPrompt(IDialogContext上下文)
{
PromptDialog.Text(
上下文:上下文,
简历:OnGearOptionReceivedAsync,
提示:“请输入档位值”,
重试:“对不起,我不明白。请再试一次。”
);  
}
公共虚拟异步任务OnEarOptionReceivedAsync(IDialogContext上下文,IAwaitable gear)
{
串响应=等待档位;
CurrentGear=响应;
}
专用异步任务showRpmPrompt(IDialogContext上下文)
{
PromptDialog.Text(
上下文:上下文,
恢复:OnRpmOptionReceivedAsync,
提示:“请输入RPM值”,
重试:“对不起,我不明白。请再试一次。”
);  
}
公共虚拟异步任务OnRpmOptionReceivedAsync(IDialogContext上下文,IAwaitable rpm)
{
字符串响应=等待rpm;
CurrentRpm=响应;
}

链接到如何使用

您可以尝试在UserData中维护以前匹配的实体。我将通过direct line api在移动应用程序中使用我的机器人。它还能工作吗?您必须使用一些中间件(存储机制)来存储每个(userId、conversationId)的结果,您可以在其中存储和检索值,一些选项是Azure表存储/sqldb/一些缓存数据库(redis…)。。。