Динамическая подсказка с Bot Framework C # v4 - PullRequest
0 голосов
/ 11 ноября 2018

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

  1. Во сколько?
  2. С кем?
  3. Что такое предмет?

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

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

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

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

1 Ответ

0 голосов
/ 11 ноября 2018

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());

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

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

...