Я собираю бота на С#, который принимает входные изображения от пользователя, а также ввод текста. Я использую LUIS в качестве ИИ-фреймворка для определения намерений в шаблоне диалога. Однако похоже, что оба типа ввода не могут сосуществовать: LUIS и вложения. Я хотел бы знать, есть ли рекомендуемый шаблон для этого сценария. Пожалуйста помоги! :|
Каков правильный поток для обработки входных данных изображения в диалоговом окне, использующем LUIS?
Ответы (4)
В MessageController вы можете получить значения изображений/вложений
activity.Attachments
await Conversation.SendAsync(activity, () => new RootLuisDialog();
LuisDialog
будет обрабатывать текстовые сообщения, кроме текста все остальное будет рассматриваться как параметр null
. Но,
Метод Prompts.attachment() предложит пользователю загрузить вложенный файл, например изображение или видео. Ответ пользователя будет возвращен как IPrompAttachmentResult.
Вот реферальная ссылка.
Вы можете отфильтровать сообщения с вложениями в MessageController.
Вы можете проверить наличие вложений, используя
activity.Attachments == null
Вы также можете справиться с этим в самом диалоговом окне 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!");
}
}
Итак, я нашел лучший образец, хотя и соответствует ответу Правина.
В 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);
Ваше здоровье! :)