Есть ли способ запустить другой запрос при заполнении необходимых слотов в диалоговом потоке - PullRequest
6 голосов
/ 30 мая 2020

У меня есть намерение заказать пиццу и объекты как @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, когда пользователь запрашивает параметры пиццы, бот повторно запрашивает тот же вопрос

Я хочу, чтобы бот ответил на запрос пользователя, или бот может представить параметры (другое повторное приглашение) вместо того же повторного запроса

есть ли способ справиться с этим вариантом использования

1 Ответ

1 голос
/ 31 мая 2020

Лучшая настройка для этого - иметь 2 намерения.

  1. Намерение заказа пиццы («Заказать x Пиццу»)
  2. Получить намерение варианта пиццы («Какие варианты пиццы делают у вас есть? ")

Причина в том, что пользователь пытается получить от вашего бота два совершенно разных результата. Когда пользователь спрашивает тип пиццы, он не всегда заказывает пиццу, он может просто интересоваться вашими доступными типами.

  • Параметр «Получить пиццу» означает, что вы просто возвращаете ответ, который дает пользователю пример доступных видов пиццы.
  • Если вы убедитесь, что оба эти намерения не требуют какого-либо контекста ввода, вы сможете реализовать вариант использования, для которого go пытаетесь.

Если вы используйте эту настройку и убедитесь, что параметры не установлены должным образом, вы должны иметь возможность переключаться между этими двумя намерениями во время заполнения слота. В приведенном вами примере вы можете видеть, что ваш бот в 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. 

Заполнение слота в веб-перехватчике

Поскольку мы решили не делать требуемые параметры, теперь у нас есть сохранить и проверить все параметры самостоятельно. Каждый раз, когда пользователь упоминает заказ, мы должны проверять его выполнение.


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 и amount.

Поскольку маловероятно, что пользователь когда-либо сделает это, нам нужно расширить код, чтобы можно было разделить заказ на несколько этапов и понять, на каком этапе мы находимся . Мы сделаем это, добавив контекст и последующие намерения.

Запоминание порядка пользователей

Во-первых, давайте добавим последующее намерение. Поскольку мы хотим иметь возможность разделить резервирование, мы должны добавить последующее намерение для каждого шага. Мой агент диалога, который я использовал для тестирования, выглядит следующим образом:

enter image description here

Каждое последующее намерение принимает одну из сущностей в качестве примера фразы:

  • Missing PizzaTypes, сущность @PizzaOption как обученная фраза
  • Missing PizzaSize, сущность @PizzaSize как обученная фраза
  • Missing Quantity, @ 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

...