使用 Bot Framework C# v4 的动态提示

Dynamic Prompt with Bot Framework C# v4

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

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

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

例如,"Schedule a meeting with Aditya and Jhon at 10:30 AM Tomorrow as Breakfast"

我的目标是根据第一个查询中缺少的内容来询问动态提示 例如,"Schedule a meeting Tomorrow at 10:30 AM" 会提示输入姓名和主题。或者 "Schedule meeting with Aditya for Breakfast" 会提示输入时间。

我正在为用户的每个响应调用 Luis,因为它比 Hardcode 更好,而且 "Tomorrow at 10:30 AM" 会给我返回一个 DateTime Formate,我不必弄清楚 Date基于今天的明天。

阿迪亚, 为您需要的实体设置一个状态对象。我猜这些人会是什么人、什么事、什么时候? 看起来您已经在训练 Luis,因此请确保您也在训练它以从话语中提取实体。 当 Luis 返回您的新约会意向时,它还将具有能够提取的实体。将找到的实体保存在您的状态对象中。现在,当您执行瀑布步骤时,首先检查状态对象。如果您已经拥有该实体,请跳过提示。如果不这样做,请按照提示继续。 看看这个sample on github。它相当复杂,但显示了我在说什么。具体注意'GetAllRequiredPropertiesAsync'方法。这就是 samepl 正在做我第一次描述的事情的地方。 你 100% 走在正确的轨道上,这应该会让你到达你想去的地方。

我正在编辑以添加一些示例代码。

在 github 的代码中,构造函数声明了两个瀑布步骤:

var waterfallSteps = new WaterfallStep[]
{
    GetAllRequiredPropertiesAsync,
    BookTableAsync,
};

方法'GetAllRequiredPropertiesAsync'正在检查每条所需数据以预订table。该方法真的很长,所以我将只展示一小部分相关代码。

经过一系列设置后,这段代码最终会提示用户输入 table 预订中缺少的任何部分

 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。这真的很容易理解。它被反复调用,直到它 returns 表示所有属性都已填充的空字符串。

希望对您有所帮助