File: RelevanceTruthAndCompletenessRating.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.JsonSerialization;
using Microsoft.Extensions.AI.Evaluation.Quality.Utilities;
 
namespace Microsoft.Extensions.AI.Evaluation.Quality;
 
internal sealed class RelevanceTruthAndCompletenessRating
{
    public static RelevanceTruthAndCompletenessRating Inconclusive { get; } =
        new RelevanceTruthAndCompletenessRating(
            relevance: 0,
            relevanceReasoning: string.Empty,
            relevanceReasons: [],
            truth: 0,
            truthReasoning: string.Empty,
            truthReasons: [],
            completeness: 0,
            completenessReasoning: string.Empty,
            completenessReasons: []);
 
    [JsonRequired]
    public int Relevance { get; set; }
 
    [JsonRequired]
    public string RelevanceReasoning { get; set; }
 
    [JsonRequired]
    public string[] RelevanceReasons { get; set; }
 
    [JsonRequired]
    public int Truth { get; set; }
 
    [JsonRequired]
    public string TruthReasoning { get; set; }
 
    [JsonRequired]
    public string[] TruthReasons { get; set; }
 
    [JsonRequired]
    public int Completeness { get; set; }
 
    [JsonRequired]
    public string CompletenessReasoning { get; set; }
 
    [JsonRequired]
    public string[] CompletenessReasons { get; set; }
 
    private const int MinValue = 1;
    private const int MaxValue = 5;
 
#pragma warning disable S1067 // Expressions should not be too complex.
    public bool IsInconclusive =>
        Relevance < MinValue || Relevance > MaxValue ||
        Truth < MinValue || Truth > MaxValue ||
        Completeness < MinValue || Completeness > MaxValue;
#pragma warning restore S1067
 
    [JsonConstructor]
#pragma warning disable S107 // Methods should not have too many parameters.
    public RelevanceTruthAndCompletenessRating(
        int relevance, string relevanceReasoning, string[] relevanceReasons,
        int truth, string truthReasoning, string[] truthReasons,
        int completeness, string completenessReasoning, string[] completenessReasons)
#pragma warning restore S107
    {
        (Relevance, RelevanceReasoning, RelevanceReasons,
        Truth, TruthReasoning, TruthReasons,
        Completeness, CompletenessReasoning, CompletenessReasons) =
            (relevance, relevanceReasoning, relevanceReasons ?? [],
            truth, truthReasoning, truthReasons ?? [],
            completeness, completenessReasoning, completenessReasons ?? []);
    }
 
    public static RelevanceTruthAndCompletenessRating FromJson(string jsonResponse)
    {
        ReadOnlySpan<char> trimmed = JsonOutputFixer.TrimMarkdownDelimiters(jsonResponse);
        return JsonSerializer.Deserialize(trimmed, SerializerContext.Default.RelevanceTruthAndCompletenessRating)!;
    }
}