File: ContentHarmEvaluator.cs
Web Access
Project: src\src\Libraries\Microsoft.Extensions.AI.Evaluation.Safety\Microsoft.Extensions.AI.Evaluation.Safety.csproj (Microsoft.Extensions.AI.Evaluation.Safety)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Shared.Diagnostics;
 
namespace Microsoft.Extensions.AI.Evaluation.Safety;
 
/// <summary>
/// An <see cref="IEvaluator"/> that utilizes the Azure AI Foundry Evaluation service to evaluate responses produced by
/// an AI model for the presence of a variety of harmful content such as violence, hate speech, etc.
/// </summary>
/// <remarks>
/// <see cref="ContentHarmEvaluator"/> can be used to evaluate responses for all supported content harm metrics in one
/// go. You can achieve this by omitting the <paramref name="metricNames"/> parameter.
///
/// <see cref="ContentHarmEvaluator"/> also serves as a base class for <see cref="HateAndUnfairnessEvaluator"/>,
/// <see cref="ViolenceEvaluator"/>, <see cref="SelfHarmEvaluator"/> and <see cref="SexualEvaluator"/> which can be
/// used to evaluate responses for one specific content harm metric at a time.
/// </remarks>
/// <param name="metricNames">
/// A optional dictionary containing the mapping from the names of the metrics that are used when communicating
/// with the Azure AI Foundry Evaluation service, to the <see cref="EvaluationMetric.Name"/>s of the
/// <see cref="EvaluationMetric"/>s returned by this <see cref="IEvaluator"/>.
///
/// If omitted, includes mappings for all content harm metrics that are supported by the Azure AI Foundry Evaluation
/// service. This includes <see cref="HateAndUnfairnessEvaluator.HateAndUnfairnessMetricName"/>,
/// <see cref="ViolenceEvaluator.ViolenceMetricName"/>, <see cref="SelfHarmEvaluator.SelfHarmMetricName"/> and
/// <see cref="SexualEvaluator.SexualMetricName"/>.
/// </param>
#pragma warning disable SA1118 // Parameter should not span multiple lines
public class ContentHarmEvaluator(IDictionary<string, string>? metricNames = null)
    : ContentSafetyEvaluator(
        contentSafetyServiceAnnotationTask: "content harm",
        metricNames ??
            new Dictionary<string, string>
            {
                ["hate_fairness"] = HateAndUnfairnessEvaluator.HateAndUnfairnessMetricName,
                ["violence"] = ViolenceEvaluator.ViolenceMetricName,
                ["self_harm"] = SelfHarmEvaluator.SelfHarmMetricName,
                ["sexual"] = SexualEvaluator.SexualMetricName
            })
#pragma warning restore SA1118
{
    /// <inheritdoc/>
    public sealed override async ValueTask<EvaluationResult> EvaluateAsync(
        IEnumerable<ChatMessage> messages,
        ChatResponse modelResponse,
        ChatConfiguration? chatConfiguration = null,
        IEnumerable<EvaluationContext>? additionalContext = null,
        CancellationToken cancellationToken = default)
    {
        _ = Throw.IfNull(chatConfiguration);
        _ = Throw.IfNull(modelResponse);
 
        EvaluationResult result =
            await EvaluateContentSafetyAsync(
                chatConfiguration.ChatClient,
                messages,
                modelResponse,
                additionalContext,
                contentSafetyServicePayloadFormat: ContentSafetyServicePayloadFormat.Conversation.ToString(),
                cancellationToken: cancellationToken).ConfigureAwait(false);
 
        result.Interpret(
            metric => metric is NumericMetric numericMetric ? numericMetric.InterpretContentHarmScore() : null);
 
        return result;
    }
}