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

Vik*_*dar 6 node.js actions-on-google dialogflow-es

我有一个意图 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.
Run Code Online (Sandbox Code Playgroud)

案例_2

user: order 2 pizza
bot: which pizza you want?
user: which pizza options do you have?
bot: which pizza you want?
Run Code Online (Sandbox Code Playgroud)

所以在情况 2 当用户要求比萨选项然后机器人重新提示相同的问题

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

有没有办法处理这个用例

Jor*_*rdi 1

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

  1. 订购披萨意图(“订单 x 披萨”)
  2. 获取披萨选项意图(“您有哪些披萨选项?”)

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

  • “获取披萨”选项的目的是返回一个响应,为用户提供可用披萨类型的示例。
  • 如果您确保这两个意图不需要任何输入上下文,您应该能够实现您想要实现的用例。

如果您使用此设置并确保未按要求设置参数,则您应该能够在插槽填充期间在这两个意图之间切换。在您提供的示例中,您可以看到 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

Run Code Online (Sandbox Code Playgroud)
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. 
Run Code Online (Sandbox Code Playgroud)

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?");
};

Run Code Online (Sandbox Code Playgroud)

现在,我们可以提示用户,直到他们提供完成订单的所有信息,如果您使用此代码,机器人将继续循环,直到用户提到包含 PizzaType、pizzaSize 和数量实体的单个短语。

因为用户不太可能这样做,所以我们需要扩展代码以允许将订单拆分为多个步骤并了解我们处于哪个步骤。我们将通过添加上下文和后续意图来做到这一点。

记住用户的订单

首先,让我们添加后续意图。因为我们希望能够拆分预订,所以我们应该为每个步骤添加后续意图。我用来测试的对话流代理如下所示:

在此输入图像描述

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

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

Run Code Online (Sandbox Code Playgroud)

最终结果

在此输入图像描述