クイック スタート: 応答の品質を評価する

このクイック スタートでは、OpenAI モデルからのチャット応答の品質を評価する MSTest アプリを作成します。 テスト アプリでは、Microsoft.Extensions.AI.Evaluation ライブラリを使用します。

このクイック スタートでは、評価 API の最も簡単な使用方法を示します。 特に、 応答キャッシュレポート 機能の使用は示されていません。これは、"オフライン" 評価パイプラインの一部として実行される単体テストを作成する場合に重要です。 このクイック スタートで示すシナリオは、運用コード内の AI 応答の "オンライン" 評価や、キャッシュとレポートが関連しないテレメトリへのスコアのログ記録などのユース ケースに適しています。 キャッシュとレポート機能を示すチュートリアルについては、「チュートリアル: 応答キャッシュとレポートを使用してモデルの応答を評価する」を参照してください。

[前提条件]

AI サービスを構成する

Azure ポータルを使用してAzure OpenAI serviceとモデルをプロビジョニングするには、「Create and deploy an Azure OpenAI Service resource」の手順を実行します。 [モデルのデプロイ] ステップで、 gpt-5 モデルを選択します。

テスト アプリを作成する

AI モデルに接続する MSTest プロジェクトを作成するには、次の手順を実行します。

  1. ターミナル ウィンドウで、アプリを作成するディレクトリに移動し、 dotnet new コマンドを使用して新しい MSTest アプリを作成します。

    dotnet new mstest -o TestAI
    
  2. TestAI ディレクトリに移動し、必要なパッケージをアプリに追加します。

    dotnet add package Azure.AI.OpenAI
    dotnet add package Azure.Identity
    dotnet add package Microsoft.Extensions.AI.Abstractions
    dotnet add package Microsoft.Extensions.AI.Evaluation
    dotnet add package Microsoft.Extensions.AI.Evaluation.Quality
    dotnet add package Microsoft.Extensions.AI.OpenAI
    dotnet add package Microsoft.Extensions.Configuration
    dotnet add package Microsoft.Extensions.Configuration.UserSecrets
    
  3. 次のコマンドを実行して、Azure OpenAI エンドポイントとテナント ID にapp シークレットを追加します。

    dotnet user-secrets init
    dotnet user-secrets set AZURE_OPENAI_ENDPOINT <your-Azure-OpenAI-endpoint>
    dotnet user-secrets set AZURE_TENANT_ID <your-tenant-ID>
    

    (環境によっては、テナント ID が必要ない場合があります。その場合は、 DefaultAzureCredentialをインスタンス化するコードから削除します。

  4. 任意のエディターで新しいアプリを開きます。

テスト アプリ コードを追加する

  1. Test1.cs ファイルの名前を MyTests.cs に変更し、ファイルを開き、クラスの名前を MyTests に変更します。

  2. プライベート ChatConfiguration とチャット メッセージと応答メンバーを MyTests クラスに追加します。 s_messages フィールドは、2 つのChatMessage オブジェクトを含むリストです。1 つはチャット ボットの動作を指示し、もう 1 つはユーザーからの質問です。

    private static ChatConfiguration? s_chatConfiguration;
    private static IList<ChatMessage> s_messages = [
        new ChatMessage(
            ChatRole.System,
            """
            You're an AI assistant that can answer questions related to astronomy.
            Keep your responses concise and try to stay under 100 words.
            Use the imperial measurement system for all measurements in your response.
            """),
        new ChatMessage(
            ChatRole.User,
            "How far is the planet Venus from Earth at its closest and furthest points?")];
    private static ChatResponse s_response = new();
    
  3. InitializeAsync メソッドを MyTests クラスに追加します。

    [ClassInitialize]
    public static async Task InitializeAsync(TestContext _)
    {
        /// Set up the <see cref="ChatConfiguration"/>,
        /// which includes the <see cref="IChatClient"/> that the
        /// evaluator uses to communicate with the model.
        s_chatConfiguration = GetAzureOpenAIChatConfiguration();
    
        var chatOptions =
            new ChatOptions
            {
                Temperature = 0.0f,
                ResponseFormat = ChatResponseFormat.Text
            };
    
        // Fetch the response to be evaluated
        // and store it in a static variable.
        s_response = await s_chatConfiguration.ChatClient.GetResponseAsync(s_messages, chatOptions);
    }
    

    このメソッドは、次のタスクを実行します。

  4. GetAzureOpenAIChatConfiguration メソッドを追加します。エバリュエーターがモデルとの通信に使用するIChatClientを作成します。

    private static ChatConfiguration GetAzureOpenAIChatConfiguration()
    {
        IConfigurationRoot config = new ConfigurationBuilder().AddUserSecrets<MyTests>().Build();
    
        string endpoint = config["AZURE_OPENAI_ENDPOINT"];
        string tenantId = config["AZURE_TENANT_ID"];
        string model = "gpt-5";
    
        // Get a chat client for the Azure OpenAI endpoint.
        AzureOpenAIClient azureClient =
            new(
                new Uri(endpoint),
                new DefaultAzureCredential(new DefaultAzureCredentialOptions() { TenantId = tenantId }));
        IChatClient client = azureClient.GetChatClient(deploymentName: model).AsIChatClient();
    
        return new ChatConfiguration(client);
    }
    
  5. モデルの応答を評価するテスト メソッドを追加します。

    [TestMethod]
    public async Task TestCoherence()
    {
        IEvaluator coherenceEvaluator = new CoherenceEvaluator();
        EvaluationResult result = await coherenceEvaluator.EvaluateAsync(
            s_messages,
            s_response,
            s_chatConfiguration);
    
        /// Retrieve the score for coherence from the <see cref="EvaluationResult"/>.
        NumericMetric coherence = result.Get<NumericMetric>(CoherenceEvaluator.CoherenceMetricName);
    
        // Validate the default interpretation
        // for the returned coherence metric.
        Assert.IsFalse(coherence.Interpretation!.Failed);
        Assert.IsTrue(coherence.Interpretation.Rating is EvaluationRating.Good or EvaluationRating.Exceptional);
    
        // Validate that no diagnostics are present
        // on the returned coherence metric.
        Assert.IsFalse(coherence.ContainsDiagnostics());
    }
    

    このメソッドは、次の処理を行います。

    • CoherenceEvaluatorを呼び出して、応答の一貫性を評価します。 EvaluateAsync(IEnumerable<ChatMessage>, ChatResponse, ChatConfiguration, IEnumerable<EvaluationContext>, CancellationToken) メソッドは、EvaluationResultを含むNumericMetricを返します。 NumericMetricには、通常、明確に定義された範囲内にある数値スコアを表す数値が含まれています。
    • EvaluationResultからコヒーレンス スコアを取得します。
    • 返されるコヒーレンス メトリックの 既定の解釈 を検証します。 エバリュエーターには、返されるメトリックの既定の解釈を含めることができます。 必要に応じて、特定の要件に合わせて既定の解釈を変更することもできます。
    • 返されたコヒーレンス メトリックに診断が存在しないことを検証します。 エバリュエーターは、返されるメトリックの診断を含めて、評価中に発生したエラー、警告、またはその他の例外条件を示すことができます。

テスト/評価を実行する

CLI コマンド dotnet test または テスト エクスプローラーを使用して、好みのテスト ワークフローを使用してテストを実行します。

リソースをクリーンアップする

必要がなくなった場合は、Azure OpenAI リソースと GPT-4 モデルのデプロイを削除します。

  1. Azure ポータルで、Azure OpenAI リソースに移動します。
  2. Azure OpenAI リソースを選択し、Delete を選択します。

次のステップ