Разверните распознаваемый ввод для подтверждения запроса в Bot Framework - PullRequest
1 голос
/ 09 января 2020

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

«Это правильный продукт?»

  1. Да
  2. Да, это
  3. Это правильный продукт

Когда я использую запрос подтверждения, первые два варианта работает нормально, но когда кто-то говорит «Это правильный продукт», запрос на подтверждение не распознает это как допустимый ввод. Я уже рассматривал возможность использования пользовательских валидаторов , но это показалось бы полезным, если вы хотите проверить распознанный ввод, не так уж много способов расширить сам распознанный ввод.

Есть ли способ, где я могу расширить возможные допустимые данные для этих подсказок? Например, используя LUIS?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 09 января 2020

Что происходит с вашим ботом, так это то, что он в основном видит часть «да» первых двух ответов одновременно и игнорирует остальную часть высказывания второго ответа. Причина, по которой ваш третий ответ не выглядит таким же, в том, что он не начинается с «да». При этом у вас есть два варианта:

ОПЦИЯ 1 : Вместо использования «Подтверждение запроса» вы можете использовать «Выбор запроса». ChoicePrompt имеет свойство 'synonym', которое вы можете установить при создании подсказки выбора:

return await step.prompt(CHOICE_PROMPT, {
    prompt: 'Please enter your mode of transport.',
        choices: ChoiceFactory.toChoices([
            {value:"my vehicle", synonyms:["car", "truck"]}, 
            {value:"public transporation", synonyms:["bus", "shuttle"]}, 
            {value: "slowly", synonyms:["walk", "bicycle"]}],
        )
    })

Как вы можете видеть здесь, это дает немного места для маневра в том, что пользователь может ввести.

options

synonym example

ВАРИАНТ 2 : маршрут синонима - это место, где вы захотите go, если вы думаете, что ваши пользователи будут только добавлять ОЧЕНЬ ОГРАНИЧЕННЫЕ ответы на приглашения чат-бота. Если вы хотите расширить свои возможности реагирования клиента на этот тип вопроса, вам фактически потребуется какая-то языковая модель. Как вы спросили в своем вопросе, LUIS будет выбором.

Вы можете создать это, сделав компонент распознавателя, который взаимодействует с LUIS, он может выглядеть примерно так:

export class LuisComponent {
private recognizer: LuisRecognizer;

  constructor(config: LuisApplication) {
    const luisConfig: LuisApplication = {applicationId: "LuisAppId", endpoint: "LuisAPIHostName" , endpointKey: "LuisAPIKey"} 
    this.recognizer = new LuisRecognizer(luisConfig, {}, true)
  };

  public async executeLuisQuery(context: TurnContext): Promise<RecognizerResult> {
    const result = await this.recognizer.recognize(context);
    return result;
  };
}

Это отправит ваши запросы в LUIS и вернет результат запроса. Единственное, что вам нужно сделать, это создать настраиваемое приглашение, которое использует этот компонент и возвращает результат из приглашения.

export class ConfirmPrompt extends Prompt<boolean> {

private luis: LuisComponent ;

constructor(id: string, recognizer: LuisComponent ) 
  super(id, validator);
  this.luis = recognizer;
};

protected async onRecognize(context: TurnContext, state: object, options: PromptOptions): Promise<PromptRecognizerResult<boolean>> {

  const luisResult = await this.luis.executeLuisQuery(context);
  const topIntent = LuisRecognizer.topIntent(luisResult);

  let result: PromptRecognizerResult<boolean> = { succeeded: false, value: undefined };

  switch (topIntent) {

    case "Confirm": {
      result.succeeded = true;
      result.value = true;
      break;
    };

    case "No": {
      result.succeeded = true;
      result.value = false;
    };

    default: {
      result.succeeded = false;
    };
  };

  return result;
};

protected async onPrompt(context: TurnContext, state: object, options: 
  PromptOptions, isRetry: boolean): Promise<void> {

    if (isRetry && options.retryPrompt) {
      await context.sendActivity(options.retryPrompt, undefined, InputHints.ExpectingInput);
  } else if (options.prompt) {
      await context.sendActivity(options.prompt, undefined, InputHints.ExpectingInput);
    };
  };
};

Для чего-то такого простого, как подтверждение, вы просто добавляете возможные параметры для что люди могут сказать в качестве подтверждения. Вы можете видеть в моей модели ниже, что у меня есть 5 СТРАНИЦ возможных высказываний для того, что может быть отправлено в качестве подтверждения:

testing confirm intent

Это конкретное намерение использует только то, что я считаю «фондовыми фразами», поэтому я в основном добавил каждую опцию того, как, я думаю, пользователь может что-то подтвердить

Кроме того (это выходит за рамки вашего вопроса, но хорошая информация) LUIS и другие службы понимания языка также позволяют использовать так называемые «сущности», так что вы можете поставить частичное высказывание и отметить остаток как сущность, которая допускает некоторые вариации ответов от пользователей. Ниже приведен снимок экрана с намерением «забронировать рейс» из Bot Framework Core Bot sample:

Book Flight Intent from LUIS

As Вы можете видеть, что это намерение имеет метки «сущности» «Аэропорт» и «DateTime», так что дальнейшие высказывания о том, как человек может сказать «Закажи мне рейс в XYZ», не беспокоясь о том, чтобы поместить в КАЖДЫЙ ОДИН ВОЗМОЖНЫЙ аэропорт мир в их модели.

По мере расширения вашего чат-бота использование службы понимания языка, такой как LUIS, позволит вам вести более естественный диалог с вашими клиентами / пользователями. Удачи на вашем боте!

0 голосов
/ 09 января 2020

Я не знаю много об этих валидаторах, так как я пишу ботов только в C#, но я предполагаю, что они более конкретны c, как, например, подтверждение того, что число является действительным числом - например, я определенно думаю, LUIS - это путь к go здесь.

Не забывайте, что вы можете очень легко увеличивать словарный запас с течением времени в пользовательском интерфейсе LUIS, просматривая то, что говорят люди, и следя за тем, чтобы они соответствовали правильным намерениям. На самом деле, я бы предложил настроить телеметрию в вашем приложении, чтобы в любое время, когда оно не может что-то идентифицировать, вы предупреждали его, чтобы вы могли очень быстро обучить его после «сбоя».

Чтобы объяснить Допустим, вы включили эти 3 примера, которые вы привели выше, но затем через неделю пользователь попробует другой пример, о котором вы никогда не думали - вы получите предупреждение из своего приложения, войдите в интерфейс LUIS и обработаете новую запись, и с тех пор это часть словарного запаса, без необходимости повторного развертывания совершенно новой версии вашего приложения.

Итак, короче говоря, это лучше подходит для LUIS, и это именно то, для чего он предназначен .

...