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);
 }
Exemple #3
0
        /// <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);
        }