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