// 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); } }
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")); }
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"); }
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; }
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(); }
/// <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")); }
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("適切な回答が見つかりませんでした"); } } } }
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); } }
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); } } } }); }
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}"); } } } }
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."); } } } }
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; } } } }
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; } }