0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Foundry における Harness モジュール:Evaluation

0
Posted at

AI Agent を作るとき、書けるだけでは足りません。さらに、それが「ちゃんと書けているか」も知る必要があります。この記事では、大ざっぱに言うと、Microsoft Foundry にすでに用意されている評価器群を、自分の Harness フレームワークでどう使うかを説明します。

まず、ざっくりした話をしましょう。あなたが AI の天気アシスタントを書いて、「東京の天気はどう?」と聞いたら、何らかの返答が返ってきたとします。ここで問題です。その返答は、いったい良いのでしょうか?

本当に天気を調べるツールを呼び出したのか、それとも自分で適当に作ったのか?
話に筋が通っているのか、それとも前後がちぐはぐなのか?
返答は、質問内容とちゃんと一致しているのか?

毎回、自分で一文ずつ確認するわけにはいきません。そこで登場するのが「評価器」(Evaluator)です。機械に採点させて、今回の応答が合格かどうかを教えてもらうのです。

では評価器を自作するのか? それは大変です。最初のうちは、たしかに自分でいくつかの評価ロジックを書きたくなります。たとえば「回答に都市名が入っているかを確認する」「長すぎないかを確認する」といった単純なルールなら、2行ほどのコードで済みます。ですが、もっと「曖昧」なものを評価したくなると、話は面倒になります。

  • 「この答えは信頼できるか」――これは賢いモデルに審判役をやらせる必要があります
  • 「ツールの使い方が正しいか」――その背後には一連の判断ロジックがあります
  • 「論理が一貫しているか」――これは if-else では書けません

こうした「ソフトな指標」は、ゼロから自作すると難しく、精度も出にくく、しかもミスしやすいです。

朗報です。Foundry にはすべて揃っています。

Microsoft Foundry を開いて「評価」→「計算器ディレクトリ」に入ると、Microsoft がすでに大量の評価器を用意しているのが分かります。すぐに使えます。

評価器名 ざっくり何をするか
Tool-Call-Accuracy(ツール呼び出し精度) Agent がツールを呼ぶべき場面で、正しく呼べているかを見る
Tool-Call-Success(ツール呼び出し成功) 呼ぶべきツールがすべて正しく呼べたかを見る
Tool-Input-Accuracy(ツール入力精度) ツールに渡したパラメータが正しいかを見る(0 または 1 の採点)
Tool-Output-Utilization(ツール出力利用率) Agent がツールの返却結果をちゃんと「使っている」かを見る。呼んだだけで終わっていないか
Tool-Selection(ツール選択) たくさんあるツールの中から、正しいものを選べたかを見る
Coherence(一貫性) 回答の論理が自然で、読んで違和感がないかを見る
Fluency(流暢さ) 話し方が自然で、人間らしいかを見る
Groundedness(事実根拠性) 回答に根拠があり、勝手に作っていないかを見る
Similarity / Retrieval(類似度 / 検索) 答えが正解にどれだけ近いか、検索がどれだけ正確かを見る
Task-Completion / Task-Adherence(タスク完了 / タスク遵守) Agent が仕事を最後まで終えたか、要求どおりに進めたかを見る

これらの大半は Microsoft 公式のものです(種類は builtin と書かれています)。バージョンも十数回は更新されていて、自分で書くよりずっと安定しています。

さらに、ディレクトリには自分のチームが作った評価器も表示されます。たとえばスクリーンショットにある HarnessEval は種類が custom で、つまり自作のものです。公式のものとカスタムのものを混ぜて使えます。

ここで重要なのは、Harness でこれをどう活用するかです。

Harness(この AI Agent オペレーティングシステムのフレームワーク)を作るとき、評価部分は自分で無理に実装する必要はありません。考え方は一つです。

ローカルでは処理の流れを回し、「採点」という面倒で大変な仕事は Foundry 上の既存評価器に外注する。

やり方は大きく 3 ステップで、とても簡単です。

ステップ1:ローカルで書けるものはローカルで書く

「ツールを呼んだか」「長すぎないか」「中国語で聞いたら中国語で返しているか」といった、ルールが明確な単純チェックは、ローカルで普通のコードとして書けばよいです。速いし安上がりで、Foundry に頼る必要はありません。

ステップ2:考える必要があるものは Foundry に任せる

一貫性(Coherence)やツール出力利用率(Tool-Output-Utilization)のように、意味を理解して採点する必要があるものは、Foundry に直接つなぎ、上にある既製の評価器を呼び出します。

コードでは、使いたい評価器を指定するだけです(たとえば tool_output_utilization と coherence)。採点ロジックはすでに Microsoft 側で用意されているので、自分で判定処理を書く必要はありません。

ステップ3:結果を回収して、まとめて見る

実行が終わると、Foundry は各項目の**スコア + なぜその点数になったか(Reason)**を返してくれます。Harness 側でまとめて受け取り、赤(不合格)と緑(合格)をひと目で見分けられます。

コードを見れば一発です。

言うだけでは分かりません。以下の C# コードは、上で説明した考え方をそのまま実装したものです。やっていることは 2 つです。まず天気 Agent を起動し、そのあと Foundry 上の評価器で採点します。

using AIConfig;
using Azure.AI.OpenAI;
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.AI.Evaluation;
using System.ClientModel;
using System.ComponentModel;

// Azure OpenAI の設定と認証情報を初期化する。
var aiConfig = new AzureOpenAIConfig("gpt-5.4-mini");
var credential = new ApiKeyCredential(aiConfig.Key);
var agent = new AzureOpenAIClient(new Uri(aiConfig.Endpoint), credential)
    .GetChatClient(aiConfig.DeploymentName)
    .AsIChatClient()
    .AsAIAgent(
        instructions: "あなたは天気予報サービスの案内役です",
        tools: [AIFunctionFactory.Create(GetWeather, name: "GetWeather")],
        name: "天気サービス予報員");
// 代理が応答し、後続の評価に使うためのユーザー質問を用意する。
var ask = "東京の天気はどうですか?";
// エージェントを実行して応答を取得する。
var response = await agent.RunAsync(new[] { new ChatMessage(ChatRole.User, ask) });
Console.WriteLine($"エージェントの応答: {response.Text}");
Console.WriteLine("-----------------------------");
var foundryConfig = new FoundryAgentConfig("azure-foundry");
var foundryCredential = new ClientSecretCredential(
    tenantId: foundryConfig.TenantId,
    clientId: foundryConfig.ClientId,
    clientSecret: foundryConfig.ClientSecret);
var aiProjectClient = new AIProjectClient(new Uri(foundryConfig.Endpoint), foundryCredential);
var foundry = new FoundryEvals(aiProjectClient, "gpt-5.4-mini", "tool_output_utilization", "coherence");
var evaluationResult = await agent.EvaluateAsync(
    new[]
    {
        "シアトルの天気はどうですか?",
        "週末はポートランドへ旅行する予定を立てましょう。",
        "パイクプレイス市場の近くにはどんなレストランがありますか?"
    },
    foundry, "FoundryEvalDemo");
// 全体の評価が通過したかを出力し、色で結果を区別する。
Console.Write($"Foundry 評価を通過したか: ");
Console.ForegroundColor = evaluationResult.Passed == 0 ? ConsoleColor.Red : ConsoleColor.Green;
Console.WriteLine(Convert.ToBoolean(evaluationResult.Passed));
Console.WriteLine();
// 各ローカル評価指標の詳細結果を出力する。
foreach (var itemResult in evaluationResult.Items)
{
    foreach (var checkResult in itemResult.Metrics)
    {
        Console.WriteLine($"Name: {checkResult.Value.Name}, Reason: {checkResult.Value.Reason}");
        if (checkResult.Value.Metadata != null && checkResult.Value.Metadata.Count > 0)
        {
            // 一部の評価項目には追加のメタデータが付くので、ここでも出力して調査しやすくする。
            Console.WriteLine("関連内容:");
            foreach (var kv in checkResult.Value.Metadata)
            {
                Console.WriteLine($" {kv.Key}: {kv.Value}");
            }
        }
    }
}

[Description("指定した場所の天気を取得する。")]
static string GetWeather([Description("天気を取得したい場所。")] string location)
{
    // ローカルのツールがエージェントから呼び出されたときの出力と戻り値を模擬する。
    Console.WriteLine($"GetWeather ツールが呼び出されました。場所: {location}");
    return $"{location} の天気は曇りで、最高気温は 15°C です。";
}

このコードは何をしているのか? 分解して見てみましょう。

① まず天気 Agent を作る

var agent = new AzureOpenAIClient(...)
    .GetChatClient(...)
    .AsAIAgent(
        instructions: "あなたは天気予報サービスの案内役です",
        tools: [AIFunctionFactory.Create(GetWeather, name: "GetWeather")],
        name: "天気サービス予報員");

つまり、「天気予報員」ロボットを用意し、天気を調べる GetWeather というツールを持たせています。

② まず一問答えさせて様子を見る

var response = await agent.RunAsync(...); // 「東京の天気はどうですか?」と質問する

③ Foundry に接続し、使う評価器を指定する

var foundry = new FoundryEvals(aiProjectClient, "gpt-5.4-mini",
    "tool_output_utilization", "coherence");

ここが「羊毛を刈る」重要ポイントです。自分で採点ロジックを書いておらず、Foundry 上の 2 つの既存評価器をそのまま指定しています。

  • tool_output_utilization(ツール出力利用率)
  • coherence(一貫性)

④ 3 つの質問をまとめて採点する

var evaluationResult = await agent.EvaluateAsync(
    new[] { "シアトルの天気はどうですか?", "週末はポートランドへ旅行する予定を立てましょう。", "パイクプレイス市場の近くにはどんなレストランがありますか?" },
    foundry,
    "FoundryEvalDemo");

⑤ 結果を回収して、赤・緑で分かりやすく表示する

Console.ForegroundColor = evaluationResult.Passed == 0 ? ConsoleColor.Red : ConsoleColor.Green;
// ...続けて各項目を走査し、スコア + Reason(なぜその点数か)を表示する

見てのとおり、最初から最後まで「一貫性をどう判定するか」というロジックは一切書いていません。難しい判断はすべて、Foundry 上の既製評価器が裏で静かにやってくれています。これがこの記事で言いたいことです。簡単な仕事はローカルで、頭を使う仕事は Foundry で。

最後に実行すると、Foundry の評価器画面で評価結果を確認できます。

画像

なぜこうするのが得なのか? 計算してみましょう。

自分で評価器を書く場合:

  • 難しくて時間がかかる
  • 「ソフトな指標」の評価は基本的に正確に書けない
  • Microsoft が更新したら、自分も追従して修正しなければならない

Foundry をそのまま使う場合:

  • すでに用意されているので、そのまま使える
  • 公式が保守しており、自動で更新される(バージョン番号が十数世代あるのを見れば分かる)
  • 自分の custom 評価器と組み合わせられる
  • ローカルの単純な処理 + クラウドの複雑な処理を組み合わせることで、安く、しかも正確にできる

一言でまとめると、簡単な仕事はローカルで、頭を使う仕事は Foundry で。使えるものは使ったほうがいい、ということです。

最後にもう一つ。Agent を作るうえで、「作る」ことは第一歩にすぎません。「正確に評価できる」ことこそが、本番環境に載せられるかどうかの鍵です。自分で評価器を大量に作り込むより、まず Foundry を見てみるほうがいいでしょう。たいてい、欲しい評価器は Microsoft がすでに作って置いてくれています。

巨人の肩の上に立つほうが、自分で背を伸ばすよりずっと早いのです。

(Translated by GPT)

元のリンク:https://mp.weixin.qq.com/s/rG6GS0netin2h8FXVIws1g?wt.mc_id=MVP_325642

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?