Как только сообщение пересылается из LUIS в QnA в зависимости от намерения, не возвращается в LUIS в c # из второго экземпляра.Что делать? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытался соединить LUIS и QnA, но из контроллера сообщений в первом случае он собирается в luis и, если требуется, соответственно, в QnA, но однажды в QnA следующие сообщения не отправляются в LUIS, только выполняемые QnA,Кто-то может помочь?

messageControler.cs

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 Это код для базового luisdialog, отсюда, если намерениесоответствует, то предполагается, что он должен предоставить требуемый ответ, иначе, если ни один из них не будет перенаправлен на поиск в основной qna.это выполняется только для первого экземпляра.начиная со второго экземпляра, если он находится в qna, он не начинается с luis.

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 Базовый код QnA приведен ниже.пожалуйста, помогите мне найти, где именно проблема.

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);
        }

1 Ответ

0 голосов
/ 19 сентября 2018

Вам нужно позвонить context.Done(new MyDialogResult()), когда диалог закончил делать то, что должен был сделать.Каркас бота поддерживает стек диалогов для каждого разговора, и всякий раз, когда вы выполняете context.Forward, он выталкивает новый диалог в стек, и каждое сообщение для бота всегда будет переходить к диалогу, который находится наверху стека, и пропускать остальные ниже.поэтому, когда вы выполняете context.Done, он выталкивает текущий диалог из стека и диалог возвращается к предыдущему диалогу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...