BOT запросить объект на втором этапе

Создав простой бот для обслуживания клиентов, разработали модель LUIS, и она отлично работает, когда номер заказа. предоставляется на первом шаге. например, для каков статус моего заказа ABC0898787? где намерение обнаружено правильно и ABC0898787 идентифицируется как объект.

Однако нужно адаптировать бота для разговора следующим образом:

Пользователь: каков статус моего заказа

Бот: укажите номер заказа

Пользователь: (Это ABC0986767) или (ABC0986767)

Бот должен иметь возможность сопоставить номер с сущностью и обработать запрос.

код для метода намерения, как лучше всего интегрировать второй шаг без настройки модели LUIS для принятия отдельных слов как сущности?

   [LuisIntent("OrderStatus")]
        public async Task OrderStatus(IDialogContext context, LuisResult result)
        {
            var returnMsg = "You wanted to check the order status";
            var orderStatus = "Dispatched";
            var deliveryDate = DateTime.Now.AddDays(3);

            var entities = new List<EntityRecommendation>(result.Entities);
            if(entities.Any((entity)=> entity.Type == "Order"))
            {
                var orderEntity = entities.Where((entity) => entity.Type == "Order").FirstOrDefault();
                var resolutionStr = orderEntity.Entity;
                if(!string.IsNullOrEmpty(resolutionStr))
                {
                    returnMsg = "Your order " + resolutionStr + " is " + orderStatus + " and expected to arrive " + deliveryDate.Humanize();
                }
            }

            await context.PostAsync(returnMsg);
            context.Wait(MessageReceived);
        }

person Vikram    schedule 22.09.2016    source источник


Ответы (1)


Замените MessageReceived именем вашего метода, который будет принимать вводимые пользователем данные. Перед этим проверьте, существует ли сущность. Если существует, используйте MessageReceived, в противном случае - этот метод.

Псевдокод:

if (entity.exists) 
    OutputResult()
    Context.Wait(MessageReceived)
else //entitiy doesn't exist
    SendMessage("Please enter order number")
    Context.Wait(MyMethod)

Метод MyMethod начинается так:

public async Task MyMethod(IDialogContext context, IAwaitable<IMessageActivity> argument) 
{
    var response = await argument;
    string text = response.Text;

Я думаю, что Microsoft недостаточно ясно дала понять, что MessageReceived - это просто имя метода (которого вы не видите), и его можно заменить именем любого другого метода. В методе также может быть несколько context.Waits в зависимости от условия, если код не достигает context.Wait () дважды, прежде чем пользователь отправит новое сообщение.

person Community    schedule 22.09.2016
comment
Пытался сделать это, но если я использую аргумент IAwaitable ‹string›, context.Wait выдает ошибку компиляции. Если я использую IAwaitable ‹IMessageActivity›, он компилируется нормально. но окончательное поведение НЕ правильно. - person Vikram; 22.09.2016
comment
в основном, BOT должен предложить пользователю указать номер заказа. - person Vikram; 22.09.2016
comment
в основном, бот должен запрашивать у пользователя номер ссылки (который сопоставлен с сущностью в моей модели LUIS), и он должен использовать этот ввод одного слова с высказыванием до этого, а LUIS должен обнаруживать сущность для того же самого. Не уверен, что это достаточно хорошо объясняет - person Vikram; 22.09.2016
comment
Я обновил свой ответ, дайте мне знать, если он все еще не решает проблему - person ; 22.09.2016
comment
к сожалению, это все еще не ... dl.dropboxusercontent.com/u/11374665 /Luis-error.JPG - person Vikram; 22.09.2016
comment
Мне все же удалось сделать это по-другому, и он тоже работает, хотя не думаю, что это лучший способ ... dl.dropboxusercontent.com/u/11374665/Luis-Different-Way.JPG - person Vikram; 22.09.2016
comment
Вместо строкового ответа вы должны использовать var response или IMessageActivity response. - person ; 22.09.2016