Динамическая подсказка с помощью Bot Framework C # v4

Я создаю чат-бота для планирования встреч с людьми. На данный момент я построил простую модель водопада. Где 1-й запрос находит намерение, а следующий завершает задачу

  1. Сколько времени?
  2. С кем?
  3. Какая тема?

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

Например, «Назначьте встречу с Адитьей и Джоном на 10:30 завтра в качестве завтрака».

Моя цель - запросить динамическое приглашение, основанное на том, чего не хватает в первом запросе. Например, «Запланировать встречу на завтра в 10:30», будет запрашиваться имя и тема. Или «Запланировать встречу с Адитьей на завтрак» подскажет время.

Я звоню Луису для каждого ответа от пользователя, поскольку он лучше, чем Hardcode, а также «Завтра в 10:30» вернет мне DateTime Formate для того же, и мне не нужно выяснять дату завтра на основе Сегодня.


person Aditya Rao    schedule 11.11.2018    source источник


Ответы (1)


Aditya, Настройте объект состояния для нужных вам сущностей. Это будет кто, что и когда, я думаю? Похоже, вы уже тренируете Луиса, поэтому убедитесь, что вы также тренируете его, чтобы улавливать сущности из высказываний. Когда Луис вернется с вашим новым намерением о встрече, у него также будут сущности, которые он смог извлечь. Сохраните найденные сущности в ваших государственных объектах. Теперь, когда вы выполняете шаги водопада, сначала проверьте объект состояния. Если у вас уже есть этот объект, пропустите запрос. Если вы этого не сделаете, продолжайте с подсказкой. Взгляните на этот образец на github. Это довольно сложно, но показывает, о чем я говорю. Особо обратите внимание на метод GetAllRequiredPropertiesAsync. Вот где samepl делает то, что я впервые описал. Вы на 100% на правильном пути, и это должно привести вас туда, куда вы хотите.

Я редактирую, чтобы добавить образец кода.

В коде с github конструктор объявляет два шага водопада:

var waterfallSteps = new WaterfallStep[]
{
    GetAllRequiredPropertiesAsync,
    BookTableAsync,
};

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

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

 var options = new PromptOptions()
    {
        Prompt = MessageFactory.Text(reservationResult.NewReservation.GetMissingPropertyReadOut()),
    };
    // Start the prompt with the first missing piece of information.
    return await stepContext.PromptAsync(GetLocationDateTimePartySizePrompt, options);

Теперь взгляните на GetLocationDateTimePartySizePrompt. Этот диалог объявлен на той же странице в строке 53. Он проверяет, завершено ли резервирование, если нет, он считывает то, что ему уже известно, а затем запрашивает остальное. Это происходит примерно так: 101, затем строка 109 в этом коде обрезана await promptValidatorContext.Context.SendActivityAsync(newReservation.GetMissingPropertyReadOut());

Этот метод объявлен здесь. Это действительно просто понять. Он вызывается повторно, пока не вернет пустую строку, означающую, что все свойства были заполнены.

надеюсь, это поможет

person Ed Boykin    schedule 11.11.2018