Bot Framework C#v4的动态提示

时间:2018-11-11 10:42:31

标签: c# botframework luis

我正在建立一个聊天机器人来安排与人的会议, 到目前为止,我已经建立了一个简单的瀑布模型。在第一个查询找到意图的地方,以下查询完成任务

  1. 什么时候?
  2. 和谁在一起?
  3. 主题是什么?

但是,这感觉像是该人正在填写表格。我还构建了没有瀑布模型的基本bot,但是用户必须在单个查询中包含所有上述信息。

例如,“安排明天上午10:30与Aditya和Jhon开会作为早餐”

我的目标是根据第一个查询中缺少的内容询问动态提示 例如,“安排明天上午10:30开会”,将提示您输入姓名和主题。或者“与Aditya安排早餐会面”会提示您输入时间。

对于用户的每个响应,我都会打电话给Luis,因为它比Hardcode更好,而且“明天上午10:30”将为我返回DateTime Formate,而我不必弄清楚明天的日期基于今天。

1 个答案:

答案 0 :(得分:3)

Aditya, 为所需的实体设置状态对象。我猜这些将是谁,什么以及何时? 看来您已经在训练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。这真的很容易理解。它会反复调用,直到返回空字符串,表示所有属性均已填写。

我希望这对您有帮助