我正在建立一个聊天机器人来安排与人的会议,
到目前为止,我已经建立了一个简单的瀑布模型。第一个查询找到意图的地方,以下查询完成任务
几点了?
与谁?
主题是什么?
但这感觉就像是人在填写表格。我还构建了没有瀑布模型的基本bot,但是用户必须在单个查询中包含所有上述信息。
例如,“安排明天上午10:30与Aditya和Jhon开会作为早餐”
我的目标是根据第一个查询中缺少的内容提出动态提示
例如,“安排明天上午10:30开会”,将提示您输入姓名和主题。或者“与Aditya安排早餐会面”会提示您输入时间。
我打电话给用户的Luis是因为它比Hardcode更好,而且“ Tomorrow at 10:30 AM”将为我返回同样的DateTime Formate,而我不必弄清楚明天的日期根据今天。
最佳答案
阿迪亚
为所需的实体设置状态对象。我猜这些将是谁,什么以及何时?
看来您已经在训练Luis,所以请确保您也在训练它以便从话语中拾取实体。
当Luis带着新的约会意图回来时,它还将具有能够提取的实体。将找到的实体保存在状态对象中。现在,当您执行瀑布式步骤时,请首先检查状态对象。如果您已经拥有该实体,请跳过提示。如果没有,请继续进行提示。
看看这个sample on github。它相当复杂,但显示了我在说什么。特别注意“ GetAllRequiredPropertiesAsync”方法。那就是samepl在做我最初描述的地方。
您100%处在正确的轨道上,这应该可以助您一臂之力。
我正在编辑添加一些示例代码。
在github的代码中,构造函数声明了两个瀑布步骤:
var waterfallSteps = new WaterfallStep[]
{
GetAllRequiredPropertiesAsync,
BookTableAsync,
};
方法“ GetAllRequiredPropertiesAsync”正在检查所需数据的每一条以预订表格。该方法的确很长,因此我将只显示一小段相关的代码。
经过一堆设置之后,这段代码最终会提示用户输入表保留中缺少的任何内容
var options = new PromptOptions()
{
Prompt = MessageFactory.Text(reservationResult.NewReservation.GetMissingPropertyReadOut()),
};
// Start the prompt with the first missing piece of information.
return await stepContext.PromptAsync(GetLocationDateTimePartySizePrompt, options);
现在,看看“ GetLocationDateTimePartySizePrompt”。该对话框在第53行的同一页上声明。它检查保留是否完成,如果没有完成,则读出已经知道的内容,然后询问其余内容。这种情况发生在101左右,然后在此代码的第109行被截断
await promptValidatorContext.Context.SendActivityAsync(newReservation.GetMissingPropertyReadOut());
该方法为declared here。这真的很容易理解。它被反复调用,直到返回空字符串,表明所有属性均已填写。
我希望这有帮助