首页 > 解决方案 > 为 Bot Framework 中的确认提示展开可识别的输入

问题描述

我目前正在开发一个聊天机器人,它在与我的用户的整个对话中使用确认提示。它被用于简单的是/否问题,但这些问题中的大多数也可以用不同的句子来回答,例如:

“这是正确的产品吗?”

  1. 是的
  2. 是的
  3. 那是正确的产品

当我使用确认提示时,前两个选项可以正常工作,但是当有人说“这是正确的产品”时,确认提示不会将其识别为有效输入。我已经研究过使用自定义验证器,但是如果您想验证已识别的输入,这似乎很有用,而不是扩展已识别输入本身的方法。

有没有办法可以扩展这些提示的可能有效输入?例如通过使用 LUIS?

提前致谢。

标签: node.jstypescriptbotframeworkazure-language-understanding

解决方案


您的机器人发生的情况是,它基本上将前两个响应的“是”部分视为同一件事,而忽略了第二个响应的其余部分。它没有看到您的第三个响应的原因是因为它不是以“是”开头的。话虽如此,您有两个选择:

选项 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示例的“预订航班”意图的屏幕截图:

从 LUIS 预订航班意图

如您所见,此意图具有标签“实体”“机场”和“日期时间”,因此可以进一步表达一个人如何说“为我预订飞往 XYZ 的航班”,而不必担心放置每一个可能的机场在他们的模型中的世界。

随着您扩展聊天机器人,使用像 LUIS 这样的语言理解服务将使您能够与客户/用户进行更自然的对话流程。祝你的机器人好运!


推荐阅读