有没有一种方法可以在填充对话框流中所需的插槽时触发不同的查询

问题描述 投票:6回答:1

我有一个意图订单比萨饼和实体,如@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中,当用户要求提供披萨选项,然后机器人再次提示相同的问题时

我希望漫游器回答用户查询,或者漫游器可以显示选项(不同的重新提示),而不是相同的重新提示

是否有处理此用例的方法

node.js dialogflow actions-on-google
1个回答
1
投票

为此的最佳设置是具有两个意图。

  1. 订购披萨意向(“订购x披萨”)
  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代理如下所示:

enter image description here

每个后续意图均以其中一个实体为例:

  • 缺少PizzaTypes,@ PizzaOption实体为经过训练的短语
  • 缺少PizzaSize,@ PizzaSize实体为经过训练的短语
  • 缺少数量,@ system.integer为训练短语

[设置完这些之后,您需要启用这些后续功能,并将它们添加到与订单意图相同的处理程序中。现在已经设置好意图,我们需要添加保留上下文并保存任何有效数据。

// 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}`);
      },
    );

最终结果

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.