node.js - 为 Bot Framework 中的确认提示展开可识别的输入
问题描述
我目前正在开发一个聊天机器人,它在与我的用户的整个对话中使用确认提示。它被用于简单的是/否问题,但这些问题中的大多数也可以用不同的句子来回答,例如:
“这是正确的产品吗?”
- 是的
- 是的
- 那是正确的产品
当我使用确认提示时,前两个选项可以正常工作,但是当有人说“这是正确的产品”时,确认提示不会将其识别为有效输入。我已经研究过使用自定义验证器,但是如果您想验证已识别的输入,这似乎很有用,而不是扩展已识别输入本身的方法。
有没有办法可以扩展这些提示的可能有效输入?例如通过使用 LUIS?
提前致谢。
解决方案
您的机器人发生的情况是,它基本上将前两个响应的“是”部分视为同一件事,而忽略了第二个响应的其余部分。它没有看到您的第三个响应的原因是因为它不是以“是”开头的。话虽如此,您有两个选择:
选项 1:您可以使用“选择提示”,而不是使用“确认提示”。ChoicePrompt 有一个“同义词”属性,您可以在构建您的选择提示时设置它:
return await step.prompt(CHOICE_PROMPT, {
prompt: 'Please enter your mode of transport.',
choices: ChoiceFactory.toChoices([
{value:"my vehicle", synonyms:["car", "truck"]},
{value:"public transporation", synonyms:["bus", "shuttle"]},
{value: "slowly", synonyms:["walk", "bicycle"]}],
)
})
正如您在此处看到的,它为用户可能输入的内容提供了一点回旋余地。
选项 2:如果您认为您的用户只会对聊天机器人的提示做出非常有限的响应,那么同义词路线就是您想要去的地方。如果您想扩展客户对此类问题的反应方式的选择,实际上您将需要某种语言模型。正如您在问题中所问的那样,LUIS 将是您的选择。
您可以通过制作一个与 LUIS 交互的识别器组件来构建它,它可能看起来像这样。
export class LuisComponent {
private recognizer: LuisRecognizer;
constructor(config: LuisApplication) {
const luisConfig: LuisApplication = {applicationId: "LuisAppId", endpoint: "LuisAPIHostName" , endpointKey: "LuisAPIKey"}
this.recognizer = new LuisRecognizer(luisConfig, {}, true)
};
public async executeLuisQuery(context: TurnContext): Promise<RecognizerResult> {
const result = await this.recognizer.recognize(context);
return result;
};
}
这会将您的查询发送到 LUIS 并返回查询结果。您唯一需要做的就是创建一个自定义提示,该提示使用此组件并从提示返回结果。
export class ConfirmPrompt extends Prompt<boolean> {
private luis: LuisComponent ;
constructor(id: string, recognizer: LuisComponent )
super(id, validator);
this.luis = recognizer;
};
protected async onRecognize(context: TurnContext, state: object, options: PromptOptions): Promise<PromptRecognizerResult<boolean>> {
const luisResult = await this.luis.executeLuisQuery(context);
const topIntent = LuisRecognizer.topIntent(luisResult);
let result: PromptRecognizerResult<boolean> = { succeeded: false, value: undefined };
switch (topIntent) {
case "Confirm": {
result.succeeded = true;
result.value = true;
break;
};
case "No": {
result.succeeded = true;
result.value = false;
};
default: {
result.succeeded = false;
};
};
return result;
};
protected async onPrompt(context: TurnContext, state: object, options:
PromptOptions, isRetry: boolean): Promise<void> {
if (isRetry && options.retryPrompt) {
await context.sendActivity(options.retryPrompt, undefined, InputHints.ExpectingInput);
} else if (options.prompt) {
await context.sendActivity(options.prompt, undefined, InputHints.ExpectingInput);
};
};
};
对于像确认这样简单的事情,您只需添加人们可能会说的确认选项。您可以在下面的模型中看到,我有 5 页可能的话语作为确认发送:
这个特定的意图只使用我认为的“常用短语”,所以我基本上添加了我认为用户可能会如何确认某事的所有选项。
此外(这超出了您的问题范围,但信息很好)LUIS 和其他语言理解服务还允许使用所谓的“实体”,因此您可以放置部分话语,并将其余部分标记为实体,这允许用户响应的一些变化。以下是来自 Bot Framework Core Bot示例的“预订航班”意图的屏幕截图:
如您所见,此意图具有标签“实体”“机场”和“日期时间”,因此可以进一步表达一个人如何说“为我预订飞往 XYZ 的航班”,而不必担心放置每一个可能的机场在他们的模型中的世界。
随着您扩展聊天机器人,使用像 LUIS 这样的语言理解服务将使您能够与客户/用户进行更自然的对话流程。祝你的机器人好运!
推荐阅读
- python - 如何将字符串数组的 numpy 数组转换为嵌套的 numpy 数组?
- typescript - Next.js 12 并删除 .babelrc,现在我收到 Typescript/Jsx 错误
- reactjs - 盖茨比阴影问题
- php - 如何通过分组来计算价值
- flutter - 如何显示选择的值?
- latex - 在 Latex 中添加图片时忽略边距并换行
- python - 如何将从 image_dataset_from_directory 获得的数据集拆分为数据和标签?
- vue.js - 为什么从另一个文件导入的 SCSS 变量在 Vue 3 中不起作用?
- autodesk-forge - 如何检查模型是否超出查看器容器?
- rust - 无法指定 `edition2021` 以在 Rust 中使用不稳定的包