在 Bot Framework 中扩展可识别的输入以确认提示
Expand recognisable input for confirm prompt in Bot Framework
我目前正在开发一个聊天机器人,它在与我的用户的整个对话过程中使用确认提示。
它用于简单的 yes/no 问题,但大多数问题也可以用不同的句子来回答,例如:
"Is this the correct product?"
- 是
- 是的
- 这是正确的产品
当我使用确认提示时,前两个选项工作正常,但当有人说 "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 的对话流程更加自然。祝你的机器人好运!
我目前正在开发一个聊天机器人,它在与我的用户的整个对话过程中使用确认提示。 它用于简单的 yes/no 问题,但大多数问题也可以用不同的句子来回答,例如:
"Is this the correct product?"
- 是
- 是的
- 这是正确的产品
当我使用确认提示时,前两个选项工作正常,但当有人说 "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 的对话流程更加自然。祝你的机器人好运!