我有一个意图订单比萨饼和实体,如@pizzaOptions @pizzaSize @qty
幸福的道路(工作正常)
user: order 2 pizza
bot: which pizza you want?
user: pepperoni
bot: and pizza size?
user: large
bot: okay! your order for 2 large pepperoni pizza has been placed.
CASE_2
user: order 2 pizza
bot: which pizza you want?
user: which pizza options do you have?
bot: which pizza you want?
因此在情况2中,当用户要求提供披萨选项,然后机器人再次提示相同的问题时
我希望漫游器回答用户查询,或者漫游器可以显示选项(不同的重新提示),而不是相同的重新提示
是否有处理此用例的方法
为此的最佳设置是具有两个意图。
之所以这样,是因为用户正试图从您的机器人中获得两个完全不同的结果。当用户要求输入披萨类型时,他们并不总是在订购披萨,他们可能只是对您可用的类型感兴趣。
如果使用此设置,并确保未按要求设置参数,则应该在插槽填充期间能够在这两种意图之间切换。在您提供的示例中,您可以看到Case2中的bot不断询问用户有关披萨类型的信息,这是因为它希望输入披萨类型的实体。
一些示例对话为:
User: I want to order a pizza.
Bot: Sure, which Pizza do you want? // Order Pizza Intent
User: I don't know, which pizzas do you have?
Bot: We currently sell Pepperoni Pizza and Vegan Pizza, what else can I Help you with? // Get Pizza Option Intent
User: I'd like to order 2 large Pepperoni Pizzas
Bot: Okay! your order for 2 large pepperoni pizza has been placed. // Order Pizza Intent
User: Hey, what types of pizza do you have? // Order Pizza Intent
Bot: We currently sell Pepperoni Pizza and Vegan Pizza, what else can I help you with? // Get Pizza Option Intent
User: Hhm, I'm looking for something else, I'll go look somewhere else.
Bot: Sorry to hear that, I hope you have a nice day.
Webhook中的插槽填充
因为我们选择不设置所需参数,所以我们现在保存并检查了所有参数。每次用户提及订单时,我们都应检查其是否完整。
function orderIntent(conv) {
const pizzaOption = conv.paramters.pizzaOption;
const pizzaSize = conv.parameters.pizzaSize;
const quantity = conv.parameters.qty;
if (!pizzaOption) {
return conv.ask("Which pizza do you want?");
}
if (!pizzaSize) {
return conv.ask("Which size pizza do you want?");
}
if (!quantity) {
return conv.ask("How many pizzas do you want?");
};
现在,这将使我们提示用户,直到他们提供完成订单的所有信息为止。如果您使用此代码,则漫游器将一直循环运行,直到用户提及一个包含PizzaType,pizzaSize和数量实体的短语。
由于用户不太可能执行此操作,因此我们需要扩展代码以允许将订单分为多个步骤并了解我们所处的步骤。我们将通过添加上下文和后续操作来做到这一点。目的。
记住用户订单
首先,请添加后续意图。因为我们希望能够拆分预留,所以我们应该为每个步骤添加后续意图。我用来测试的dialogflow代理如下所示:
每个后续意图均以其中一个实体为例:
[设置完这些之后,您需要启用这些后续功能,并将它们添加到与订单意图相同的处理程序中。现在已经设置好意图,我们需要添加保留上下文并保存任何有效数据。
// All the order follow-ups and the order intent use the same handler.
app.intent(
["Order Intent", "Complete Order - Missing PizzaType", "Complete Order - Missing Pizza Amount", "Complete Order - Missing PizzaSize"],
(conv) => {
// Check if any reservation info is available.
const order = conv.contexts.get("reservation");
// If the user has already mentioned pizza info, use context, otherwise take it from the user input.
const pizzaType = order?.parameters.pizzaType ?? conv.parameters.pizzaType;
const pizzaSize = order?.parameters.pizzaSize ?? conv.parameters.pizzaSize;
const pizzaAmount = order?.parameters.pizzaAmount ?? conv.parameters.pizzaAmount;
// Allow the fallback intents to be triggered
conv.contexts.set("OrderIntent-followup", 2);
// Validate the input
if (!pizzaAmount) {
return conv.ask("How many pizza's would you like to order?");
}
// Save input if valid
conv.contexts.set("reservation", 5, { pizzaAmount });
if (!pizzaType) {
return conv.ask("Which pizza would you like?");
}
conv.contexts.set("reservation", 5, { pizzaAmount, pizzaType });
if (!pizzaSize) {
return conv.ask("What size should your pizza be?");
}
return conv.ask(`Alright, your order has been completed: ${pizzaAmount} ${pizzaSize} ${pizzaType}`);
},
);
最终结果