Bot Framework 中的形式和意图,wit.ai

德米特罗·日卢克坚科

我有一个问题:我的机器人不遵循形式,它只是继续威胁下一个答案作为意图。

http://g.recordit.co/GultDCEndR.gif

当我输入第一条消息“порахуй”时,它会启动我的表单 Exams.BuildForm,但接下来我的回答导致离开表单,因为意图不同,正如我所知道的。

我期望什么:在我定义的意图机器人上开始形成并不断提出问题,直到他们得到回答。

它在“порахуй конкурсний бал”案中启动表格。并在消息的意图与大小写不匹配时离开。这是预期的行为吗?如果是这样,我应该如何更改我的代码以让表单提出问题,直到所有问题都得不到回答?

我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using com.valgut.libs.bots.Wit;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.FormFlow;
using Microsoft.Bot.Connector;

namespace IoT_NULP_Bot.Controllers
{
    [Serializable]
    public class Exams
    {
        [Prompt("Для початку, ваш результат з Математики?")]
        public float Math { get; set; }

        [Prompt("Українська мова та Література?")]
        public float Ukrainian { get; set; }

        [Prompt("Вибіркова дисціпліна - Іноземна мова, Фізика або Історія України")]
        public float LanguagePhysics { get; set; }

        public static IForm<Exams> BuildForm()
        {
            return new FormBuilder<Exams>()
                .Message("Давайте порахуємо ваш конкурсний бал при вступі на ІоТ :) Для цього дайте мені відповіді на наступні запитання")
                .Field(nameof(Ukrainian))
                .Field(nameof(Math))
                .Field(nameof(LanguagePhysics))
                .Build();
        }
    }

    [BotAuthentication]
    public class MessagesController : ApiController
    {
        private static IoT_BotDbEntities db = new IoT_BotDbEntities();

        /// <summary>
        /// POST: api/Messages
        /// Receive a message from a user and reply to it
        /// </summary>
        public async Task<HttpResponseMessage> Post([FromBody] Activity activity)
        {
            ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
            var wit = new WitClient("RKIJ5LVF4GKLEWJ5O5NPUPXVCQMKGLJW");
            switch (activity.Type)
            {
                case ActivityTypes.Message:

                    var msg = wit.Converse(activity.From.Id, activity.Text);

                    var intent = string.Empty;
                    double conf = 0;
                    try
                    {
                        var a = msg.entities["intent"];
                        if (a != null)
                        {
                            foreach (var z in msg.entities["intent"])
                            {
                                if (z.confidence > conf)
                                {
                                    conf = z.confidence;
                                    intent = z.value.ToString();
                                }
                            }
                        }
                    }
                    catch (KeyNotFoundException)
                    {
                    }
                    Activity reply = activity.CreateReply();

                    switch (intent)
                    {
                        case "порахуй конкурсний бал":
                            await Conversation.SendAsync(activity, MakeRoot);
                            break;
                        case "статистика вступу":
                            reply.Attachments = new List<Attachment>();
                            Attachment attachment = new Attachment();
                            attachment.ContentType = "image/png";
                            attachment.ContentUrl =
                                @"http://image.prntscr.com/image/ee2502f6a68041e1813f1bcd125a8bb2.png";
                            Attachment secondAttachment = new Attachment();
                            secondAttachment.ContentType = "image/png";
                            secondAttachment.ContentUrl =
                                @"http://image.prntscr.com/image/258aa8e844d74ab7b63447a9f551ecbd.png";
                            reply.Attachments.Add(attachment);
                            reply.Attachments.Add(secondAttachment);
                            reply.Text = GetReplyFromDb(intent);
                            break;
                        case "фото":
                            var photo = GetRandomPhoto();
                            reply.Attachments = new List<Attachment>();
                            Attachment attachment1 = new Attachment();
                            attachment1.ContentType = "image/png";
                            attachment1.ContentUrl = photo.photoLink;
                            reply.Attachments.Add(attachment1);
                            reply.Text = photo.descrip;
                            break;
                        default:
                            reply.Text = GetReplyFromDb(intent);
                            break;
                    }
                    await connector.Conversations.ReplyToActivityAsync(reply);
                    break;
                default:
                    break;
            }

            var response = Request.CreateResponse(HttpStatusCode.OK);
            return response;
        }

        internal static IDialog<Exams> MakeRoot()
        {
            return Chain.From(() => FormDialog.FromForm(Exams.BuildForm));
        }

        private static Photo GetRandomPhoto()
        {
            var arrToRandomFrom = db.Photos.ToArray();
            return arrToRandomFrom[new Random().Next(arrToRandomFrom.Length)];
        }

        private static string GetReplyFromDb(string intent)
        {
            var arrToRandomFrom = db.Responses.Where(x => x.Intent.content == intent).ToArray();
            if (arrToRandomFrom.Length > 0)
                return arrToRandomFrom[new Random().Next(arrToRandomFrom.Length)].content;
            else
            {
                var noreply = db.Responses.Where(x => x.Intent.content == "noreply").ToArray();
                return noreply[new Random().Next(noreply.Length)].content;
            }
        }
    }
}
以西结·贾迪布

我认为问题在于您如何拥有代码。一旦检测到启动表单的意图,您就不应处理任何其他意图(这意味着您不应允许通过其他 switch/case 语句)。表单启动时的后续消息应该点击await Conversation.SendAsync(activity, MakeRoot)以使其正常工作。

我的建议是重新做你的逻辑。首先,您需要一个根对话框,您的大部分逻辑都应驻留在该对话框中;将它放在控制器上不是一个很好的做法。一旦你这样做了,你就可以等待Conversation.SendAsync(activity, () => YourDialog),在MessageReceived你的对话中,你可以调用 wit.ai、处理意图、启动表单等。

我认为进行这些更改可能就足够了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

wit.ai与Microsoft Bot Builder

来自分类Dev

是否可以在Wit.ai中设置默认意图?

来自分类Dev

Facebook Messenger如何与Wit.ai Bot Engine连接?

来自分类Dev

如何正确构造wit.ai意图?

来自分类Dev

如何正确构造wit.ai意图?

来自分类Dev

Microsoft Bot Framework 和 Microsoft Teams

来自分类Dev

在wit.ai中正确处理意图

来自分类Dev

Bot Framework语言翻译

来自分类Dev

Bot Framework 的波斯历

来自分类Dev

如何在Microsoft Bot Framework + C#中安排任务?

来自分类Dev

带Facebook Messenger中按钮的Microsoft Bot Framework消息

来自分类Dev

如何在Microsoft Bot Framework中给出延迟的响应

来自分类Dev

在Microsoft Bot Framework V3中触发系统消息

来自分类Dev

Markdown在Bot Framework Twilio频道中不起作用

来自分类Dev

在Bot Framework中的方法内部进行简单的用户输入

来自分类Dev

使用MS Bot Framework的TelegramBot中的自定义键盘

来自分类Dev

如何解决Microsoft Bot Framework中的内容类型错误?

来自分类Dev

如何使用状态访问器获取Bot Framework中的属性

来自分类Dev

扩展可识别的输入以在Bot Framework中确认提示

来自分类Dev

如何在bot-framework-composer中定义当前时间?

来自分类Dev

Bot Framework 4.9中无法AzureBlobStorage初始化

来自分类Dev

从下拉列表C#Bot Framework中获取值

来自分类Dev

如何解决Microsoft Bot Framework中的内容类型错误?

来自分类Dev

Markdown在Bot Framework Twilio频道中不起作用

来自分类Dev

在Microsoft Bot Framework V3中触发系统消息

来自分类Dev

如何在Microsoft Bot Framework + C#中安排任务?

来自分类Dev

Microsoft Bot Framework中的FormFlow与对话框

来自分类Dev

Microsoft Bot Framework中的C#.net或Node.Js?

来自分类Dev

在Microsoft Bot Framework网络聊天中唯一标识用户

Related 相关文章

  1. 1

    wit.ai与Microsoft Bot Builder

  2. 2

    是否可以在Wit.ai中设置默认意图?

  3. 3

    Facebook Messenger如何与Wit.ai Bot Engine连接?

  4. 4

    如何正确构造wit.ai意图?

  5. 5

    如何正确构造wit.ai意图?

  6. 6

    Microsoft Bot Framework 和 Microsoft Teams

  7. 7

    在wit.ai中正确处理意图

  8. 8

    Bot Framework语言翻译

  9. 9

    Bot Framework 的波斯历

  10. 10

    如何在Microsoft Bot Framework + C#中安排任务?

  11. 11

    带Facebook Messenger中按钮的Microsoft Bot Framework消息

  12. 12

    如何在Microsoft Bot Framework中给出延迟的响应

  13. 13

    在Microsoft Bot Framework V3中触发系统消息

  14. 14

    Markdown在Bot Framework Twilio频道中不起作用

  15. 15

    在Bot Framework中的方法内部进行简单的用户输入

  16. 16

    使用MS Bot Framework的TelegramBot中的自定义键盘

  17. 17

    如何解决Microsoft Bot Framework中的内容类型错误?

  18. 18

    如何使用状态访问器获取Bot Framework中的属性

  19. 19

    扩展可识别的输入以在Bot Framework中确认提示

  20. 20

    如何在bot-framework-composer中定义当前时间?

  21. 21

    Bot Framework 4.9中无法AzureBlobStorage初始化

  22. 22

    从下拉列表C#Bot Framework中获取值

  23. 23

    如何解决Microsoft Bot Framework中的内容类型错误?

  24. 24

    Markdown在Bot Framework Twilio频道中不起作用

  25. 25

    在Microsoft Bot Framework V3中触发系统消息

  26. 26

    如何在Microsoft Bot Framework + C#中安排任务?

  27. 27

    Microsoft Bot Framework中的FormFlow与对话框

  28. 28

    Microsoft Bot Framework中的C#.net或Node.Js?

  29. 29

    在Microsoft Bot Framework网络聊天中唯一标识用户

热门标签

归档