我将c#中的机器人放在一起,接受来自用户的图像输入以及文本输入。我使用LUIS作为AI框架来确定对话模式中的意图。但是,似乎两种类型的输入都不能共存:LUIS和附件。我想知道这种情况是否有推荐的模式。请帮忙! :|
答案 0 :(得分:2)
在MessageController中,您可以获取图像/附件值
activity.Attachments
await Conversation.SendAsync(activity, () => new RootLuisDialog();
LuisDialog
会处理短信,除了文本外,它会将所有其他内容视为null
参数。但是,
Prompts.attachment()方法将要求用户上传文件附件,如图片或视频。用户响应将作为IPromptAttachmentResult返回。
Here是参考链接。
答案 1 :(得分:0)
您可以过滤掉MessageController中包含附件的邮件。
您可以使用
检查附件activity.Attachments == null
答案 2 :(得分:0)
您还可以在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!");
}
}
答案 3 :(得分:-1)
所以我发现了一个更好的模式,尽管与Praveen的答案一致。
在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);
干杯! :)