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

Я собираю бота на С#, который принимает входные изображения от пользователя, а также ввод текста. Я использую LUIS в качестве ИИ-фреймворка для определения намерений в шаблоне диалога. Однако похоже, что оба типа ввода не могут сосуществовать: LUIS и вложения. Я хотел бы знать, есть ли рекомендуемый шаблон для этого сценария. Пожалуйста помоги! :|


person Dustin    schedule 18.01.2017    source источник


Ответы (4)


В MessageController вы можете получить значения изображений/вложений

activity.Attachments    

Свойства вложений

 await Conversation.SendAsync(activity, () => new RootLuisDialog();    

LuisDialog будет обрабатывать текстовые сообщения, кроме текста все остальное будет рассматриваться как параметр null. Но,

Метод Prompts.attachment() предложит пользователю загрузить вложенный файл, например изображение или видео. Ответ пользователя будет возвращен как IPrompAttachmentResult.

Вот реферальная ссылка.

person Praveen R    schedule 19.01.2017
comment
Спасибо за ответ, Правин! По совпадению, я только что ответил на тот же вопрос после некоторого исследования, и мы пришли к аналогичным выводам. Единственное, что я хотел бы добавить, это концепция RootDialogs и то, что вы можете фильтровать сообщения с вложениями с помощью свойства activity.Attachment. - person Dustin; 19.01.2017

Вы можете отфильтровать сообщения с вложениями в MessageController.

Вы можете проверить наличие вложений, используя

activity.Attachments == null
person pl0x    schedule 18.01.2017

Вы также можете справиться с этим в самом диалоговом окне LUIS.

Вот пример использования PromptDialog.Attachment:

[LuisIntent("SomeIntent")]
    public async Task SomeIntent(IDialogContext context, LuisResult result)
    {

        PromptDialog.Attachment(
               context: context,
               resume: ResumeAfterExpenseUpload,
               prompt: "I see you are trying to add an expense. Please upload a picture of your expense and I will try to perform character recognition (OCR) on it.",
               retry: "Sorry, I didn't understand that. Please try again."
           );
     }

    private async Task ResumeAfterExpenseUpload(IDialogContext context, IAwaitable<IEnumerable<Attachment>> result)
    {
        var attachment = await result as IEnumerable<Attachment>;
        var attachmentList = attachment.GetEnumerator();
        if (attachmentList.MoveNext())
        {
            //output link to the uploaded file
            await context.PostAsync(attachmentList.Current.ContentUrl); 

        }
        else
        {
            await context.PostAsync("Sorry, no attachments found!");
        }

    }
person Sam EA    schedule 20.06.2018

Итак, я нашел лучший образец, хотя и соответствует ответу Правина.

В MesssageController вы хотите проверить наличие вложений activity.Attachments == null, но, кроме того, вы должны создать то, что называется RootDialog, и отправлять туда все разговоры, из которых вы можете перенаправлять разговоры в другие диалоги.

В моем случае я перенаправляю сообщения, которые должен обрабатывать LUIS, в диалоговый класс, который наследует LUIS как службу. Другие сообщения, такие как вложения, отправляются в другой класс диалога для обработки.

Другой способ получить вложение и обработать его в коде диалога — использовать вызов PromptAttachment в качестве ловушки для пользовательского ввода вложения:

 var dialog = new PromptDialog.PromptAttachment(message.ToString(), "Sorry, I didn't get the receipt. Try again please.", 2);
        context.Call(dialog, AddImageToReceiptRecord);

Ваше здоровье! :)

person Dustin    schedule 19.01.2017