Exemplo n.º 1
0
        // Methods to get QnA result
        private async Task getQnAResult(ITurnContext context)
        {
            var qEndpoint = new QnAMakerEndpoint()
            {
                Host            = "https://contosocafeqnab8.azurewebsites.net/qnamaker",
                EndpointKey     = "0fa7f711-6a82-4155-9cf9-5c8168967df6",
                KnowledgeBaseId = "dfa449da-1fb7-449e-b753-53af1b1f7b5b"
            };
            var qOptions = new QnAMakerOptions()
            {
                ScoreThreshold = 0.4F,
                Top            = 1
            };
            var qnamaker = new QnAMaker(qEndpoint, qOptions);

            QueryResult[] qResult = await qnamaker.GetAnswers(context.Activity.Text);

            if (qResult.Length == 0)
            {
                await context.SendActivity("Sorry, I do not understand.");

                await context.SendActivity("You can say hi or book table or find locations");
            }
            else
            {
                await context.SendActivity(qResult[0].Answer);
            }
        }
Exemplo n.º 2
0
        public async Task QnaMaker_ReturnsAnswer()
        {
            if (!EnvironmentVariablesDefined())
            {
                Assert.Inconclusive("Missing QnaMaker Environment variables - Skipping test");
                return;
            }

            var qna = new QnAMaker(
                new QnAMakerEndpoint
            {
                KnowledgeBaseId = knowlegeBaseId,
                EndpointKey     = endpointKey,
                Host            = hostname
            },
                new QnAMakerOptions
            {
                Top = 1
            });

            var results = await qna.GetAnswers("how do I clean the stove?");

            Assert.IsNotNull(results);
            Assert.AreEqual(results.Length, 1, "should get one result");
            Assert.IsTrue(results[0].Answer.StartsWith("BaseCamp: You can use a damp rag to clean around the Power Pack"));
        }
Exemplo n.º 3
0
        public async Task QnaMaker_TestThreshold()
        {
            if (!EnvironmentVariablesDefined())
            {
                Assert.Inconclusive("Missing QnaMaker Environment variables - Skipping test");
                return;
            }

            var qna = new QnAMaker(
                new QnAMakerEndpoint
            {
                KnowledgeBaseId = knowlegeBaseId,
                EndpointKey     = endpointKey,
                Host            = hostname
            },
                new QnAMakerOptions
            {
                Top            = 1,
                ScoreThreshold = 0.99F
            });

            var results = await qna.GetAnswers("how do I clean the stove?");

            Assert.IsNotNull(results);
            Assert.AreEqual(results.Length, 0, "should get zero result because threshold");
        }
Exemplo n.º 4
0
        public async override Task OnReceiveActivity(IBotContext context)
        {
            if (HasActiveTopic)
            {
                await ActiveTopic.OnReceiveActivity(context);

                //return Task.CompletedTask;
            }

            var options = new QnAMakerOptions()
            {
                KnowledgeBaseId = "",
                SubscriptionKey = "",
                ScoreThreshold  = 0.7f
            };

            qnAMaker = new QnAMaker(options);
            var results = await qnAMaker.GetAnswers(context.Request.Text);

            this.State.answer = results.First().Answer;
            //context.Set(ChitChatKey, results.First().Answer);

            await this.SetActiveTopic(ANSWER_PROMPT)
            .OnReceiveActivity(context);

            this.OnSuccess(context, this.State.answer);

            //return Task.CompletedTask;
        }
Exemplo n.º 5
0
        public async Task OnProcessRequest(IBotContext context, MiddlewareSet.NextDelegate next)
        {
            await context.SendActivity("I'm QnAMakerMiddleware");

            if (context.Request.Type == ActivityTypes.Message)
            {
                var messageActivity = context.Request.AsMessageActivity();
                if (!string.IsNullOrEmpty(messageActivity.Text))
                {
                    var results = await qnAMaker.GetAnswers(messageActivity.Text.Trim());

                    if (results.Any())
                    {
                        if (!string.IsNullOrEmpty(qaOptions.DefaultAnswerPrefixMessage))
                        {
                            await context.SendActivity(qaOptions.DefaultAnswerPrefixMessage);
                        }

                        await context.SendActivity(results.First().Answer);

                        if (qaOptions.EndActivityRoutingOnAnswer)
                        {
                            return;
                        }
                    }
                }
            }
            await next();
        }
Exemplo n.º 6
0
        /// <summary>
        /// A helper method to get an answer from QnA maker and post it to the user
        /// </summary>
        /// <param name="context">The current current conversation context</param>
        /// <param name="userInput">The (translated) input from the user</param>
        /// <returns></returns>
        private async Task askQnAService(ITurnContext context, string userInput)
        {
            var qnaanswers = await qnaClient.GetAnswers(userInput);

            if (qnaanswers.Any())
            {
                await context.SendActivity((await translatorClient.Translate(qnaanswers.First().Answer, "de", userNativeLanguage)));

                await context.SendActivity(await translatorClient.Translate($"Ich hoffe das hilft Dir weiter. Ich habe in Summe {qnaanswers.Length} Antworten gefunden. Ich schaue auch noch nach passenden Dokumenten zu diesem Thema.", "de", userNativeLanguage));
            }
            else
            {
                await context.SendActivity(await translatorClient.Translate($"Leider habe ich darauf keine detailierte Antwort.Ich prüfe, ob ich Dokumente dazu finde.", "de", userNativeLanguage));
            }
        }
        public async Task QnaMaker_TestThreshold()
        {
            var qna = new QnAMaker(new QnAMakerOptions()
            {
                KnowledgeBaseId = knowlegeBaseId,
                SubscriptionKey = subscriptionKey,
                Top             = 1,
                ScoreThreshold  = 0.99F
            }, new HttpClient());

            var results = await qna.GetAnswers("how do I clean the stove?");

            Assert.IsNotNull(results);
            Assert.AreEqual(results.Length, 0, "should get zero result because threshold");
        }
        public async Task QnaMaker_ReturnsAnswer()
        {
            var qna = new QnAMaker(new QnAMakerOptions()
            {
                KnowledgeBaseId = knowlegeBaseId,
                SubscriptionKey = subscriptionKey,
                Top             = 1
            }, new HttpClient());

            var results = await qna.GetAnswers("how do I clean the stove?");

            Assert.IsNotNull(results);
            Assert.AreEqual(results.Length, 1, "should get one result");
            Assert.IsTrue(results[0].Answer.StartsWith("BaseCamp: You can use a damp rag to clean around the Power Pack"));
        }
Exemplo n.º 9
0
        public async Task OnTurn(ITurnContext context)
        {
            if (context.Activity.Type == ActivityTypes.Message)
            {
                if (!string.IsNullOrEmpty(context.Activity.Text))
                {
                    await qnaMaker.GetAnswers(context.Activity.Text.Trim()).ConfigureAwait(false);

                    if (!context.Responded)
                    {
                        await context.SendActivity("適切な回答が見つかりませんでした");
                    }
                }
            }
        }
Exemplo n.º 10
0
        public async Task <QueryResult[]> SearchQnaMaker(string message)
        {
            var options = new QnAMakerOptions()
            {
                KnowledgeBaseId = "",
                SubscriptionKey = "",
                ScoreThreshold  = 0.7f
            };

            qnAMaker = new QnAMaker(options);
            var results = await qnAMaker.GetAnswers(message);

            if (results.Count() > 0)
            {
                return(results);
            }
            else
            {
                return(null);
            }
        }
Exemplo n.º 11
0
 public None(QnAMakerEndpoint qnaEndpoint) : base(Id)
 {
     this.Dialogs.Add(Id, new WaterfallStep[]
     {
         async(dc, args, next) =>
         {
             QnAMaker qnaMaker = new QnAMaker(qnaEndpoint);
             if (!string.IsNullOrEmpty(dc.Context.Activity.Text))
             {
                 var results = await qnaMaker.GetAnswers(dc.Context.Activity.Text.Trim()).ConfigureAwait(false);
                 if (results.Any())
                 {
                     await dc.Context.SendActivity(results.First().Answer, results.First().Answer, InputHints.AcceptingInput);
                 }
                 else
                 {
                     await dc.Context.SendActivity("Sorry, I don't understand.", "Sorry, I don't understand.", InputHints.AcceptingInput);
                 }
             }
         }
     });
 }
Exemplo n.º 12
0
        public async Task OnTurn(ITurnContext context)
        {
            if (context.Activity.Type == ActivityTypes.Message)
            {
                var results = await qnaMaker.GetAnswers(context.Activity.Text.Trim()).ConfigureAwait(false);

                if (!context.Responded)
                {
                    if (!results.Any())
                    {
                        await context.SendActivity("適切な回答が見つかりませんでした");
                    }
                    else if (results.First().Score < 0.5f)
                    {
                        await context.SendActivity($"{results.First().Answer}");

                        if (results.Count() >= 2)
                        {
                            await context.SendActivity($"自信がないので他の回答もお伝えします\n\n{results[1].Answer}");
                        }
                    }
                }
            }
        }
        public async Task OnTurn(ITurnContext context)
        {
            if (context.Activity.Type is ActivityTypes.Message)
            {
                var dispatchResult = context.Services.Get<RecognizerResult>(LuisRecognizerMiddleware.LuisRecognizerResultKey) as RecognizerResult;
                var topIntent = dispatchResult?.GetTopScoringIntent();

                if (topIntent == null)
                {
                    await context.SendActivity("Unable to get the top intent.");
                }
                else
                {
                    // we can use the model name to index into our array of qna/luis models
                    var modelName = topIntent.Value.intent;

                    var targetModel = this.models[modelName];

                    if (targetModel is QnAMakerEndpoint qnaModel)
                    {
                        await context.SendActivity($"Dispatching to QnAMaker model {modelName}");
                        var qnaMaker = new QnAMaker(qnaModel);
                        var qnaResponse = await qnaMaker.GetAnswers(context.Activity.Text);
                        await context.SendActivity($"Result from QnAMaker: {qnaResponse.FirstOrDefault().Answer}");
                    }
                    else if (targetModel is LuisModel luisModel)
                    {
                        await context.SendActivity($"Dispatching to luis model {modelName}");

                        var luisRecognizer = new LuisRecognizer(luisModel);
                        var recognizerResult = await luisRecognizer.Recognize(context.Activity.Text, System.Threading.CancellationToken.None);
                        await context.SendActivity($"Result from luis: {recognizerResult.GetTopScoringIntent().intent}");
                    }
                }
            }
        }
Exemplo n.º 14
0
        public async Task OnTurn(ITurnContext context)
        {
            if (context.Activity.Type is ActivityTypes.Message)
            {
                var message = context.Activity.AsMessageActivity();
                // Get the intent recognition result from the context object.
                var              dispatchResult = context.Services.Get <RecognizerResult>(LuisRecognizerMiddleware.LuisRecognizerResultKey) as RecognizerResult;
                var              topIntent = dispatchResult?.GetTopScoringIntent();
                LuisRecognizer   luisRecognizer1, luisRecognizer2;
                RecognizerResult recognizerResult;

                var intentsList = new List <string>();
                var entitiesList = new List <string>();

                if (topIntent == null)
                {
                    await context.SendActivity("Unable to get the top intent.");
                }
                else
                {
                    if (topIntent.Value.score < 0.3)
                    {
                        await context.SendActivity("I'm not very sure what you want but will try to send your request.");
                    }
                    switch (topIntent.Value.intent.ToLowerInvariant())
                    {
                    case "l_homeautomation":
                        await context.SendActivity("Sending your request to the home automation system ...");

                        luisRecognizer1  = new LuisRecognizer(this.luisModelHomeAutomation);
                        recognizerResult = await luisRecognizer1.Recognize(message.Text, System.Threading.CancellationToken.None);

                        // list the intents
                        foreach (var intent in recognizerResult.Intents)
                        {
                            intentsList.Add($"'{intent.Key}', score {intent.Value}");
                        }
                        await context.SendActivity($"Intents detected by the home automation app:\n\n{string.Join("\n\n", intentsList)}");

                        // list the entities
                        entitiesList = new List <string>();
                        foreach (var entity in recognizerResult.Entities)
                        {
                            if (!entity.Key.ToString().Equals("$instance"))
                            {
                                entitiesList.Add($"{entity.Key}: {entity.Value.First}");
                            }
                        }

                        if (entitiesList.Count > 0)
                        {
                            await context.SendActivity($"The following entities were found in the message:\n\n{string.Join("\n\n", entitiesList)}");
                        }

                        // Here, you can add code for calling the hypothetical home automation service, passing in any entity information that you need

                        break;

                    case "l_weather":
                        await context.SendActivity("Sending your request to the weather system ...");

                        luisRecognizer2  = new LuisRecognizer(this.luisModelWeather);
                        recognizerResult = await luisRecognizer2.Recognize(message.Text, System.Threading.CancellationToken.None);

                        // list the intents
                        var intentsResult2 = new List <string>();
                        foreach (var intent in recognizerResult.Intents)
                        {
                            intentsResult2.Add($"'{intent.Key}', score {intent.Value}");
                        }
                        await context.SendActivity($"Intents detected by the weather app: \n\n{string.Join("\n\n", intentsResult2)}");

                        // list the entities
                        entitiesList = new List <string>();
                        foreach (var entity in recognizerResult.Entities)
                        {
                            if (!entity.Key.ToString().Equals("$instance"))
                            {
                                entitiesList.Add($"{entity.Key}: {entity.Value.First}");
                            }
                        }

                        if (entitiesList.Count > 0)
                        {
                            await context.SendActivity($"The following entities were found in the message:\n\n{string.Join("\n\n", entitiesList)}");
                        }

                        // Here, you can add code for calling the hypothetical weather service, passing in any entity information that you need

                        break;

                    case "none":
                    // You can provide logic here to handle the known None intent (none of the above).
                    // In this example we fall through to the QnA intent.
                    case "q_faq":
                        QnAMaker qnaMaker        = new QnAMaker(this.qnaOptions);
                        var      messageActivity = context.Activity.AsMessageActivity();
                        if (!string.IsNullOrEmpty(messageActivity.Text))
                        {
                            var results = await qnaMaker.GetAnswers(messageActivity.Text.Trim()).ConfigureAwait(false);

                            if (results.Any())
                            {
                                await context.SendActivity(results.First().Answer);
                            }
                            else
                            {
                                await context.SendActivity("Couldn't find an answer in the FAQ.");
                            }
                        }
                        break;

                    default:
                        // The intent didn't match any case, so just display the recognition results.
                        await context.SendActivity($"Dispatch intent: {topIntent.Value.intent} ({topIntent.Value.score}).");

                        break;
                    }
                }
            }
            else if (context.Activity.Type is ActivityTypes.ConversationUpdate)
            {
                foreach (var newMember in context.Activity.MembersAdded)
                {
                    if (newMember.Id != context.Activity.Recipient.Id)
                    {
                        await context.SendActivity("Hello and welcome to the LUIS Dispatch sample bot. This bot dispatches messages to LUIS apps and QnA, using a LUIS model generated by the Dispatch tool in hierarchical mode.");
                    }
                }
            }
        }
Exemplo n.º 15
0
        public async Task OnTurn(ITurnContext context)
        {
            if (context.Activity.Type is ActivityTypes.Message)
            {
                var conversationState = context.GetConversationState <Dictionary <string, object> >();

                // Establish dialog state from the conversation state.
                var dc = _dialogs.CreateContext(context, conversationState);

                // Continue any current dialog.
                await dc.Continue();

                // Every turn sends a response, so if no response was sent,
                // then there no dialog is currently active.
                if (!context.Responded)
                {
                    // if this isn't a response, call LUIS to get intent.
                    var luisResult = context.Services.Get <RecognizerResult>(LuisRecognizerMiddleware.LuisRecognizerResultKey);

                    TechBashLuisRecognizerResult recognizerResult = new TechBashLuisRecognizerResult();
                    recognizerResult.Convert(luisResult);

                    var dialogArgs = new Dictionary <string, object>();


                    switch (recognizerResult.TopIntent().intent)
                    {
                    case TechBashLuisRecognizerResult.Intent.None:
                        QnAMakerEndpoint endpoint = new QnAMakerEndpoint();
                        endpoint.KnowledgeBaseId = "UPDATE_THIS";
                        endpoint.EndpointKey     = "UPDATE_THIS";
                        endpoint.Host            = "https://UPDATE_THIS.azurewebsites.net/qnamaker";

                        QnAMaker qnaMaker = new QnAMaker(endpoint);
                        var      answers  = await qnaMaker.GetAnswers(context.Activity.Text.Trim()).ConfigureAwait(false);

                        if (answers.Any())
                        {
                            await context.SendActivity(answers.First().Answer);
                        }
                        else
                        {
                            await context.SendActivity($"Couldn't find an answer.");
                        }

                        break;

                    case TechBashLuisRecognizerResult.Intent.Evaluation:
                        dialogArgs.Add("RecognizerResult", recognizerResult);
                        await dc.Begin("sessionEvaluation", dialogArgs);

                        break;

                    case TechBashLuisRecognizerResult.Intent.Schedule:
                        dialogArgs.Add("RecognizerResult", recognizerResult);
                        await dc.Begin("schedule", dialogArgs);

                        break;

                    case TechBashLuisRecognizerResult.Intent.Registration:
                        dialogArgs.Add("RecognizerResult", recognizerResult);
                        await dc.Begin("ticketInfo", dialogArgs);

                        break;

                    //case "Help":
                    //    await context.SendActivity("<here's some help>");
                    //    break;
                    //case "Cancel":
                    //    // Cancel the process.
                    //    await context.SendActivity("<cancelling the process>");
                    //    break;
                    default:
                        // Received an intent we didn't expect, so send its name and score.
                        await context.SendActivity($"Intent: {recognizerResult.TopIntent().intent} ({recognizerResult.TopIntent().score}).");

                        break;
                    }
                }
            }
        }
Exemplo n.º 16
0
        public async Task OnTurn(ITurnContext context)
        {
            //TODO: is this the right way to handle cards?
            string  utterance = context.Activity.Text;
            JObject cardData  = (JObject)context.Activity.Value;

            if (cardData != null && cardData.Property("intent") != null)
            {
                utterance = cardData["utterance"].ToString();
            }

            var userState         = context.GetUserState <CafeBotUserState>();
            var conversationState = context.GetConversationState <CafeBotConvState>();

            switch (context.Activity.Type)
            {
            case ActivityTypes.ConversationUpdate:
                var newUserName = context.Activity.MembersAdded[0].Name;
                if (!string.IsNullOrWhiteSpace(newUserName) && newUserName != "Bot" && string.IsNullOrEmpty(userState.name))
                {
                    await context.SendActivity($"Hello {newUserName}! I'm the Cafe bot!");

                    // remember the user's name
                    userState.name = newUserName;

                    //userState.sendCards = true;

                    await context.SendActivity("I can help you find contoso cafe locations, book a table and answer questions about Contoso cafe!");

                    // send a welcome card
                    if (userState.sendCards)
                    {
                        await context.SendActivity(CreateCardResponse(context.Activity, createWelcomeCardAttachment()));
                    }
                }
                break;

            case ActivityTypes.Message:

                // create dialogContext
                var dc = _dialogs.CreateContext(context, conversationState);
                // continue with any active dialogs
                await dc.Continue();

                if (!context.Responded)
                {
                    // call LUIS and get results
                    LuisRecognizerOptions lOptions = new LuisRecognizerOptions()
                    {
                        Verbose = true
                    };
                    LuisModel lModel = new LuisModel(
                        "edaadd9b-b632-4733-a25c-5b67271035dd",
                        "be30825b782843dcbbe520ac5338f567",
                        new System.Uri("https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/"), Microsoft.Cognitive.LUIS.LuisApiVersion.V2);
                    LuisRecognizer lRecognizer = new LuisRecognizer(lModel, lOptions);
                    System.Threading.CancellationToken ct;
                    cafeLUISModel lResult = await lRecognizer.Recognize <cafeLUISModel>(context.Activity.Text, ct);

                    // top level dispatch

                    switch (lResult.TopIntent().intent)
                    {
                    case cafeLUISModel.Intent.Greeting:
                        //case "hi":
                        await context.SendActivity("Hello, I'm the contoso cafe bot. How can I help you?");

                        if (userState.sendCards)
                        {
                            await context.SendActivity(CreateCardResponse(context.Activity, createWelcomeCardAttachment()));
                        }
                        break;

                    case cafeLUISModel.Intent.Book_Table:
                        // case "book table":
                        await dc.Begin("BookTable");

                        break;

                    case cafeLUISModel.Intent.Who_are_you_intent:
                        // case "who are you?":
                        await dc.Begin("WhoAreYou");

                        break;

                    case cafeLUISModel.Intent.None:
                    default:
                        var qEndpoint = new QnAMakerEndpoint()
                        {
                            Host            = "https://contosocafeqnamaker.azurewebsites.net/qnamaker",
                            EndpointKey     = "09e2d55b-a44c-41b6-a08a-76a7df9ddffe",
                            KnowledgeBaseId = "b5534d70-bded-45e1-998a-5945174d4ff3"
                        };
                        var qOptions = new QnAMakerOptions()
                        {
                            ScoreThreshold = 0.4F,
                            Top            = 1
                        };
                        var           qnamaker = new QnAMaker(qEndpoint, qOptions);
                        QueryResult[] qResult  = await qnamaker.GetAnswers(context.Activity.Text);

                        if (qResult.Length == 0)
                        {
                            await context.SendActivity("Sorry, I do not understand.");

                            await context.SendActivity("You can say hi or book table or find locations");
                        }
                        else
                        {
                            await context.SendActivity(qResult[0].Answer);
                        }

                        //await context.SendActivity("Sorry, I do not understand.");
                        //await context.SendActivity("You can say hi or book table or find locations");
                        break;
                    }
                }
                break;
            }
        }