File: RelevanceTruthAndCompletenessEvaluator.Rating.cs
Web Access
Project: src\src\Libraries\Microsoft.Extensions.AI.Evaluation.Quality\Microsoft.Extensions.AI.Evaluation.Quality.csproj (Microsoft.Extensions.AI.Evaluation.Quality)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.Extensions.AI.Evaluation.Quality.Utilities;
 
namespace Microsoft.Extensions.AI.Evaluation.Quality;
 
public partial class RelevanceTruthAndCompletenessEvaluator
{
    internal sealed class Rating
    {
        public static Rating Inconclusive { get; } = new Rating(relevance: -1, truth: -1, completeness: -1);
 
        public int Relevance { get; }
        public string? RelevanceReasoning { get; }
        public string[] RelevanceReasons { get; } = [];
 
        public int Truth { get; }
        public string? TruthReasoning { get; }
        public string[] TruthReasons { get; } = [];
 
        public int Completeness { get; }
        public string? CompletenessReasoning { get; }
        public string[] CompletenessReasons { get; } = [];
 
        public string? Error { get; }
 
        private const int MinValue = 1;
        private const int MaxValue = 5;
 
#pragma warning disable S1067 // Expressions should not be too complex.
        public bool IsInconclusive =>
            Error is not null ||
            Relevance < MinValue || Relevance > MaxValue ||
            Truth < MinValue || Truth > MaxValue ||
            Completeness < MinValue || Completeness > MaxValue;
#pragma warning restore S1067
 
        public Rating(int relevance, int truth, int completeness, string? error = null)
        {
            (Relevance, Truth, Completeness, Error) = (relevance, truth, completeness, error);
        }
 
        [JsonConstructor]
#pragma warning disable S107 // Methods should not have too many parameters.
        public Rating(
            int relevance, string? relevanceReasoning, string[] relevanceReasons,
            int truth, string? truthReasoning, string[] truthReasons,
            int completeness, string? completenessReasoning, string[] completenessReasons,
            string? error = null)
#pragma warning restore S107
        {
            (Relevance, RelevanceReasoning, RelevanceReasons,
            Truth, TruthReasoning, TruthReasons,
            Completeness, CompletenessReasoning, CompletenessReasons,
            Error) =
                (relevance, relevanceReasoning, relevanceReasons ?? [],
                truth, truthReasoning, truthReasons ?? [],
                completeness, completenessReasoning, completenessReasons ?? [],
                error);
        }
 
        public static Rating FromJson(string jsonResponse)
        {
            ReadOnlySpan<char> trimmed = JsonOutputFixer.TrimMarkdownDelimiters(jsonResponse);
            return JsonSerializer.Deserialize(trimmed, SerializerContext.Default.Rating)!;
        }
    }
}