使用 Bot Framework C# v4 的动态提示
Dynamic Prompt with Bot Framework C# v4
我正在构建一个聊天机器人来安排与人的会议,
截至目前,我已经构建了一个简单的瀑布模型。第一个查询找到意图的地方,下面完成任务
- 什么时间?
- 和谁一起?
- 主题是什么?
但这感觉就像是在填写表格。我还构建了一个没有瀑布模型的基本机器人,但用户必须在单个查询中包含上述所有信息。
例如,"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 表示所有属性都已填充的空字符串。
希望对您有所帮助
我正在构建一个聊天机器人来安排与人的会议, 截至目前,我已经构建了一个简单的瀑布模型。第一个查询找到意图的地方,下面完成任务
- 什么时间?
- 和谁一起?
- 主题是什么?
但这感觉就像是在填写表格。我还构建了一个没有瀑布模型的基本机器人,但用户必须在单个查询中包含上述所有信息。
例如,"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 表示所有属性都已填充的空字符串。
希望对您有所帮助