在使用 LUIS 的对话框中处理图像输入的正确流程是什么?

What's the correct flow to handle image inputs in a dialog that uses LUIS?

我正在用 c# 构建一个机器人,它接受用户的图像输入和文本输入。我使用 LUIS 作为 AI 框架来确定对话模式中的意图。但是,这两种类型的输入似乎不能共存:LUIS 和附件。我想知道这种情况下是否有推荐的模式。请帮忙! :|

您可以在 MessageController 中过滤掉带有附件的消息。

您可以使用

检查附件
activity.Attachments == null

在 MessageController 中,您可以获得 image/attachments 个值

activity.Attachments    

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

LuisDialog 将处理文本消息,除了文本,它会将所有其他内容视为 null 参数。但是,

The Prompts.attachment() method will ask the user to upload a file attachment like an image or video. The users response will be returned as an IPromptAttachmentResult.

Here是引用link.

所以我找到了一个更好的模式,尽管它与 Praveen 的回答是一致的。

您要在 MesssageController 中检查附件 activity.Attachments == null 但除此之外,您必须创建所谓的 RootDialog 并将所有对话发送到那里,您可以从那里将对话转发到其他对话框。

在我的例子中,我将我希望 LUIS 处理的消息转发到一个对话框 class,该对话框继承了 LUIS 作为服务。其他消息(例如附件)被发送到另一个对话框 class 进行处理。

获取附件并在对话代码中处理它的另一种方法是使用 PromptAttachment 调用作为用户输入附件的捕获器:

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

干杯! :)

您也可以在 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!");
        }

    }