private async Task EmitTraceInfoAsync(ITurnContext turnContext, Activity messageActivity, QueryResult[] result, QnAMakerOptions options) { AnswerSpanRequest answerSpanRequest = null; if (options.EnablePreciseAnswer) { answerSpanRequest = new AnswerSpanRequest(); answerSpanRequest.Enable = options.EnablePreciseAnswer; } var traceInfo = new QnAMakerTraceInfo { Message = messageActivity, QueryResults = result, KnowledgeBaseId = _endpoint.KnowledgeBaseId, ScoreThreshold = options.ScoreThreshold, Top = options.Top, StrictFilters = options.StrictFilters, Context = options.Context, QnAId = options.QnAId, IsTest = options.IsTest, RankerType = options.RankerType, AnswerSpanRequest = answerSpanRequest }; var traceActivity = Activity.CreateTraceActivity(QnAMaker.QnAMakerName, QnAMaker.QnAMakerTraceType, traceInfo, QnAMaker.QnAMakerTraceLabel); await turnContext.SendActivityAsync(traceActivity).ConfigureAwait(false); }
private async Task EmitTraceInfoAsync(ITurnContext turnContext, Activity messageActivity, QueryResult[] result, QnAMakerOptions options) { var traceInfo = new QnAMakerTraceInfo { Message = (Activity)messageActivity, QueryResults = result, KnowledgeBaseId = _endpoint.KnowledgeBaseId, ScoreThreshold = options.ScoreThreshold, Top = options.Top, StrictFilters = options.StrictFilters, MetadataBoost = options.MetadataBoost, }; var traceActivity = Activity.CreateTraceActivity(QnAMakerName, QnAMakerTraceType, traceInfo, QnAMakerTraceLabel); await turnContext.SendActivityAsync(traceActivity).ConfigureAwait(false); }
/// <summary> /// Generates an answer from the knowledge base. /// </summary> /// <param name="turnContext">The Turn Context that contains the user question to be queried against your knowledge base.</param> /// <param name="options">The options for the QnA Maker knowledge base. If null, constructor option is used for this instance.</param> /// <returns>A list of answers for the user query, sorted in decreasing order of ranking score.</returns> public async Task <QueryResult[]> GetAnswersAsync(ITurnContext turnContext, QnAMakerOptions options = null) { if (turnContext == null) { throw new ArgumentNullException(nameof(turnContext)); } if (turnContext.Activity == null) { throw new ArgumentNullException(nameof(turnContext.Activity)); } if (options == null) { options = _options; } ValidateOptions(options); var messageActivity = turnContext.Activity.AsMessageActivity(); if (messageActivity == null) { throw new ArgumentException("Activity type is not a message"); } if (string.IsNullOrEmpty(turnContext.Activity.Text)) { throw new ArgumentException("Null or empty text"); } var requestUrl = $"{_endpoint.Host}/knowledgebases/{_endpoint.KnowledgeBaseId}/generateanswer"; var request = new HttpRequestMessage(HttpMethod.Post, requestUrl); var jsonRequest = JsonConvert.SerializeObject( new { question = messageActivity.Text, top = options.Top, strictFilters = options.StrictFilters, metadataBoost = options.MetadataBoost, }, Formatting.None); request.Content = new StringContent(jsonRequest, System.Text.Encoding.UTF8, "application/json"); var isLegacyProtocol = _endpoint.Host.EndsWith("v2.0") || _endpoint.Host.EndsWith("v3.0"); if (isLegacyProtocol) { request.Headers.Add("Ocp-Apim-Subscription-Key", _endpoint.EndpointKey); } else { request.Headers.Add("Authorization", $"EndpointKey {_endpoint.EndpointKey}"); } AddUserAgent(request); var response = await _httpClient.SendAsync(request).ConfigureAwait(false); if (!response.IsSuccessStatusCode) { return(null); } var jsonResponse = await response.Content.ReadAsStringAsync().ConfigureAwait(false); var results = isLegacyProtocol ? ConvertLegacyResults(JsonConvert.DeserializeObject <InternalQueryResults>(jsonResponse)) : JsonConvert.DeserializeObject <QueryResults>(jsonResponse); foreach (var answer in results.Answers) { answer.Score = answer.Score / 100; } var result = results.Answers.Where(answer => answer.Score > options.ScoreThreshold).ToArray(); var traceInfo = new QnAMakerTraceInfo { Message = (Activity)messageActivity, QueryResults = result, KnowledgeBaseId = _endpoint.KnowledgeBaseId, ScoreThreshold = options.ScoreThreshold, Top = options.Top, StrictFilters = options.StrictFilters, MetadataBoost = options.MetadataBoost, }; var traceActivity = Activity.CreateTraceActivity(QnAMakerName, QnAMakerTraceType, traceInfo, QnAMakerTraceLabel); await turnContext.SendActivityAsync(traceActivity).ConfigureAwait(false); return(result); }