在 Bot Framework 中扩展可识别的输入以确认提示

Expand recognisable input for confirm prompt in Bot Framework

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

"Is this the correct product?"

  1. 是的
  2. 这是正确的产品

当我使用确认提示时,前两个选项工作正常,但当有人说 "That is the correct product" 时,确认提示不将此识别为有效输入。我已经研究过使用 ,但如果您想验证已识别的输入,这似乎很有用,没有那么多方法可以扩展已识别的输入本身。

有什么方法可以扩展这些提示的可能有效输入吗?例如使用 LUIS?

提前致谢。

我不太了解这些验证器,因为我只用 C# 编写机器人,但我猜它们更具体,比如确认一个数字是实数,例如 - 我绝对认为 LUIS 是去这里的路。

不要忘记,在 LUIS UI 中,您可以很容易地随着时间的推移增加词汇量,方法是查看人们所说的内容并确保其符合正确的意图。事实上,我建议在你的应用程序中设置遥测,只要它无法识别某些东西,你就会提醒你,这样你就可以在 "failure".

之后快速训练它

为了解释,假设您包含了上面给出的 3 个示例,但是在一周后用户尝试了另一个您从未想过的示例 - 您会从您的应用中收到警报,请登录 LUIS UI 并处理新条目,从那时起它就是词汇表的一部分,您无需重新部署全新版本的应用程序。

所以,长话短说,这更适合 LUIS,这正是它的设计目的。

您的机器人发生的情况是,它基本上是在同一件事上看到前两个响应的 'yes' 部分,而忽略第二个响应的其余话语。它没有将您的第三个响应视为相同的原因是因为它不是以 'yes' 开头。也就是说,您有两个选择:

选项 1:您可以使用 'choice prompt' 而不是 'confirm prompt'。 ChoicePrompt 有一个 'synonym' 属性,您可以在构建选择提示时设置它:

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 并 return 查询结果。您唯一需要做的就是创建一个使用此组件的自定义提示,并 return 提示的结果。

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 页可能的话语用于发送确认信息:

此特定意图仅使用我认为的 'stock phrases',因此我基本上添加了我认为用户可能会确认某事的所有选项。

另外(这超出了你的问题的范围,但是很好的信息)LUIS 和其他语言理解服务也允许使用所谓的 'entities',所以你可以说出部分话语,并且将其余部分标记为一个实体,这允许用户做出一些不同的响应。以下是 'book flight' 意图的屏幕截图,来自 Bot Framework Core Bot 示例:

如您所见,此意图具有标签 'entities' "Airport" 和 "DateTime",因此可以进一步表达一个人如何说 'Book me a flight to XYZ',而不必担心在他们的模型中放入世界上每一个可能的机场。

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