Я создаю чат-бота для планирования встреч с людьми. На данный момент я построил простую модель водопада. Где 1-й запрос находит намерение, а следующий завершает задачу
- Сколько времени?
- С кем?
- Какая тема?
Но это похоже на то, что человек заполняет форму. Я также создал базового бота без модели водопада, но пользователь должен был включить всю вышеуказанную информацию в один запрос.
Например, "Назначьте встречу с Адитьей и Джоном на 10:30 завтра в качестве завтрака".
Моя цель - запросить динамическое приглашение, основанное на том, чего не хватает в первом запросе. Например, "Запланировать встречу на завтра в 10:30", будет запрашиваться имя и тема. Или "Запланировать встречу с Адитьей на завтрак" подскажет время.
Я звоню Луису для каждого ответа от пользователя, поскольку он лучше, чем Hardcode, а также "Завтра в 10:30" вернет мне DateTime Formate для того же, и мне не нужно выяснять дату завтра на основе Сегодня.
Ответ 1 · рейтинг 3 · Ed Boykin
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());
Этот метод объявлен здесь. Это действительно просто понять. Он вызывается повторно, пока не вернет пустую строку, означающую, что все свойства были заполнены.
надеюсь, это поможет