有没有办法在对话框流中填充所需的插槽时触发不同的查询

Is there a way to trigger different query while filling the required slots in dialogflow

我有意向 orderPizza 和实体为 @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 中,当用户询问披萨选项时,机器人会重新提示相同的问题

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

有没有办法处理这个用例

最好的设置是有 2 个意图。

  1. 订购披萨意向("Order x Pizza")
  2. 获取披萨选项意图("What pizza options do you have?")

这是因为用户试图从你的机器人那里得到两个完全不同的结果。当用户询问披萨类型时,他们并不总是订购披萨,他们可能只是对您提供的类型感兴趣。

  • Get Pizza 选项旨在让您 return 给出一个响应 用户可用披萨类型的示例。
  • 如果您确保这两个意图都不需要任何输入上下文, 你应该能够实现你想要去的用例 对于.

如果您使用此设置并确保未按要求设置参数,则您应该能够在插槽填充期间在这两个意图之间切换。在您提供的示例中,您可以看到 Case2 中的机器人不断询问用户有关披萨类型的信息,这是因为它需要披萨类型实体作为输入。

一些示例对话是:

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 代理看起来像这样:

每个后续意图都以其中一个实体作为示例短语:

  • 缺少 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}`);
      },
    );

最终结果