首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一旦消息根据意图从LUIS转发到QnA,而不是从第二个实例返回到c#中的LUIS。该怎么办呢?

一旦消息根据意图从LUIS转发到QnA,而不是从第二个实例返回到c#中的LUIS。该怎么办呢?
EN

Stack Overflow用户
提问于 2018-09-17 11:04:28
回答 1查看 64关注 0票数 0

我试图连接LUIS和QnA,但是从消息控制器到第一个实例,它将被发送到luis,如果需要的话,它会相应地转到QnA,但是在QnA中,下一个消息不会被发送给只由QnA执行的消息。有人能帮忙吗?

messageControler.cs

代码语言:javascript
复制
public virtual async Task<HttpResponseMessage> Post([FromBody] Activity activity)
        {
            //await Conversation.SendAsync(activity, () => new BasicLuisDialog());
            // check if activity is of type message
            if (activity.GetActivityType() == ActivityTypes.Message)
            {
                //await Conversation.SendAsync(activity, () => new BasicQnAMakerDialog());
                await Conversation.SendAsync(activity, () => new BasicLuisDialog());
            }
            else
            {
                //await Conversation.SendAsync(activity, () => new BasicQnAMakerDialog());
                HandleSystemMessage(activity);
            }
            return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
        }
        private Activity HandleSystemMessage(Activity message)
        {
            if (message.Type == ActivityTypes.DeleteUserData)
            {
                // Implement user deletion here
                // If we handle user deletion, return a real message
            }
            else if (message.Type == ActivityTypes.ConversationUpdate)
            {
                // Handle conversation state changes, like members being added and removed
                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
                // Not available in all channels
            }
            else if (message.Type == ActivityTypes.ContactRelationUpdate)
            {
                // Handle add/remove from contact lists
                // Activity.From + Activity.Action represent what happened
            }
            else if (message.Type == ActivityTypes.Typing)
            {
                // Handle knowing tha the user is typing
            }
            else if (message.Type == ActivityTypes.Ping)
            {
            }
            return null;
        }
    }
}

BasicLuisDialog.cs --这是基本亮度对话框的代码,从这里开始,如果意图匹配,那么它应该提供所需的回复,如果没有,它会将搜索重定向到基本的qna。这只在第一个实例中执行。从二审开始,如果是qna,就不会从luis开始。

代码语言:javascript
复制
public class BasicLuisDialog : LuisDialog<object>
    {
        [LuisIntent("")]
        [LuisIntent("None")]
        public async Task None(IDialogContext context, IAwaitable<IMessageActivity> message, LuisResult result)
        {
            var mForward = await message as Activity;
            var username = context.Activity.From.Name;
            string reply = $"Hello {username}! Your query we are taking forward, as we are not aware about what exactly you want to know.";
            //await context.PostAsync(reply);
            await context.Forward(new IDialog(), this.ResumeAfterQnA, mForward, CancellationToken.None);
        }

        private async Task ResumeAfterQnA(IDialogContext context, IAwaitable<object> result)
        {
           context.Wait(MessageReceived);
        }

        [LuisIntent("leave.apply")]
        public async Task ApplyLeave(IDialogContext context, IAwaitable<IMessageActivity> message, LuisResult result)
        {
            var username = context.Activity.From.Name;
            string reply = $"Hello {username}! we are processing it";
            await context.PostAsync(reply);
        }

        [LuisIntent("it")]
        public async Task IT(IDialogContext context, IAwaitable<IMessageActivity> message, LuisResult result)
        {
            var username = context.Activity.From.Name;
            string reply = $"Hello {username}! we would look into your IT problems shortly";
            await context.PostAsync(reply);
        }
    }

BasicQnAMakerDialog Basic QnA代码如下所示。请帮我找出问题到底在哪里。

代码语言:javascript
复制
public class IDialog : IDialog<object>
    {
        public async Task StartAsync(IDialogContext context)
        {
            /* Wait until the first message is received from the conversation and call MessageReceviedAsync 
            *  to process that message. */
            context.Wait(this.MessageReceivedAsync);
        }

        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
        {


            /* When MessageReceivedAsync is called, it's passed an IAwaitable<IMessageActivity>. To get the message,
             *  await the result. */
            var message = await result;
            var activity = await result as Activity;
            var qnaAuthKey = ConfigurationManager.AppSettings["QnAAuthKey"]; 
            var qnaKBId = ConfigurationManager.AppSettings["QnAKnowledgebaseId"];
            var endpointHostName = ConfigurationManager.AppSettings["QnAEndpointHostName"];


            // QnA Subscription Key and KnowledgeBase Id null verification
            if (!string.IsNullOrEmpty(qnaAuthKey) && !string.IsNullOrEmpty(qnaKBId))
            {
                // Forward to the appropriate Dialog based on whether the endpoint hostname is present
                if (string.IsNullOrEmpty(endpointHostName)) { 
                    await context.Forward(new BasicQnAMakerPreviewDialog(), AfterAnswerAsync, message, CancellationToken.None);
                    }
                else
                {
                    await context.Forward(new BasicQnAMakerDialog(), AfterAnswerAsync, message, CancellationToken.None);
                }

                }
            else
            {
                await context.PostAsync("Please set QnAKnowledgebaseId, QnAAuthKey and QnAEndpointHostName (if applicable) in App Settings. Learn how to get them at https://aka.ms/qnaabssetup.");
            }
            //var activity = await result as Activity;
            //await context.Forward(new BasicLuisDialog(), ResumeAfterLuisDialog, activity, CancellationToken.None);
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-19 00:15:07

当对话框完成它应该做的事情时,您需要调用context.Done(new MyDialogResult())。bot框架为每个会话保留一个对话框堆栈,每当您执行context.Forward时,它都会将一个新的对话框推入堆栈,而发送给bot的每条消息都会从位于堆栈顶部的对话框中跳过下面的其他对话框,因此当您执行context.Done时,它会弹出堆栈中的当前对话框,会话返回到前面的对话框。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52366309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档