テーマを切り替える

Agent 評価データセットの作り方:実タスク、軌跡ログ、回帰テストまで

Easton editorial illustration: production agent control room
4
サンプル階層
golden set、negative cases、edge cases、regression cases。
5
評価軸
ツール選択、引数形式、実行順序、最終回答、人間のラベルとの一致度。
6
重要な軌跡フィールド
traceId、span_id、tool_calls、state_events、approval records、human labels。
数据来源: このエンジニアリングチェックリストは、OpenAI、LangSmith、Phoenix、DeepEval、OpenAI Agents SDK の公式文書をもとに整理しています。API 名、platform の状態、製品 UI は公開後も公式文書で確認してください。

"OpenAI Evaluation best practices は、目標を定義し、データセットを集め、指標を決め、比較を実行し、継続的に評価することを推奨しています。テストデータは production data、historical data、domain samples、人間のラベル付けから取得できます。"

先週までは日報を問題なく生成していた Agent が、モデル更新後も「一見正しい」最終サマリーを返しました。ところが軌跡を見ると、権限チェックとデータ更新ツールが抜けています。カスタマーサポート Agent は最終回答こそ正しかったものの、返金ツールの引数を間違えていました。公開 benchmark では、このリスクは見えません。事故の振り返りには traceId、tool call、approvalId、state event、人間の判定が残っているのに、次回リリース前に必ず走るテストにはなっていない。そこが問題です。

この種の退化は、モデルを変えたり、demo を 1 回走らせたりするだけでは防げません。Agent 評価データセットは、実タスクの分布と本番の失敗軌跡から作る必要があります。ツール呼び出し、引数形式、状態遷移、承認記録、人間のラベルを含め、CI ゲートで回帰テストとして実行する。ここでは、失敗事例と実際のシナリオから、継続して使える eval dataset を作り、毎回のリリース品質を守る方法に絞ります。

1. なぜ公開 benchmark だけでは足りないのか

1.1 公開 benchmark の限界

公開 benchmark が測るのはモデル能力であって、あなたの業務タスクの品質ではありません。AgentBench や WebArena のような評価セットは標準タスクを提供しますが、チーム固有のツールチェーン、権限モデル、状態機械までは覆えません。

たとえば、あなたのレポート Agent が check_permission、refresh_data、generate_report の 3 つのツールを呼び、「チェック→更新→生成」の順で実行しなければならないとします。公開 benchmark はこのフローをテストしません。あなたの tool schema や権限境界を知らないからです。

公開 benchmark の点数が良くても、業務タスクが退化しないとは限りません。Agent 評価データセットが測るべきなのは、汎用的な推論能力ではなく、自分たちの実タスク分布です。

1.2 自前データセットの主要な価値

自前の eval dataset は、公開 benchmark では見えないリスクを捕まえます。典型例を比べると次のようになります。

シナリオ公開 benchmark自前 eval dataset
レポート Agent が権限チェックを漏らす見えない。このツールと権限モデルが存在しない軌跡制約として捕捉:check_permission を必ず呼ぶ
サポート Agent が返金引数を間違えるそのツールも返金 schema もない期待ツール呼び出しリスト + 引数形式制約
モデル更新後に状態遷移が悪化するその状態機械がない状態軌跡の断言:チェック→承認→実行
事故の振り返りがテスト化されない事故データがない失敗事例を negative cases に入れる

公開 benchmark はモデル選定に使い、自前データセットはリリースゲートを守るために使います。両者は補完関係であり、互いの代わりにはなりません。Agent 評価 benchmark の比較を読んでいれば、どの公開評価セットが選定に向くかは把握できているはずです。ここでは、自分たちの本番環境から評価データを作る方法に集中します。

2. Agent eval dataset の中核フィールド

2.1 必須フィールド

Agent eval dataset は、ユーザー入力と期待回答を保存するだけのものではありません。ツール呼び出しの軌跡、状態遷移、人間の判定を記録する必要があります。必須フィールドは次のとおりです。

フィールド説明ソース
inputユーザーのタスク記述本番 trace / 手動設計
expected output期待される最終回答人間の annotation / golden set
expected tool calls期待されるツール呼び出しリスト軌跡分析。例:["check_permission", "refresh_data"]
trajectory assertions軌跡制約(必須/禁止/順序)状態機械 + 承認フロー
human labels人間の判定(正しい/誤り/一部正しい)事故の振り返り / ラベル付けキュー

LangSmith の Evaluation concepts では、Agent 評価は最終回答だけでなく、ツール選択、引数形式、実行軌跡を覆うべきだとされています。OpenAI Agents SDK Tracing は trace_id、workflow_name、span などのフィールドでツール呼び出しや状態イベントを記録できます。ただし、それらの生フィールドは脱感作と抽出を経てからでないと、データセットには入れられません。

2.2 任意フィールド

業務上必要であれば、次のフィールドを追加します。

フィールド説明用途
approval records承認記録(承認者、時刻、結果)権限モデル上、承認が必要なツール呼び出し
state transitions状態遷移シーケンス状態機械の制約。例:["init", "check", "approve"]
metadatatraceId、環境、モデルバージョン振り返りでの特定とバージョン比較

Agent の権限モデル(N157)と人間の承認設計(N155)を読んでいれば、approval records には承認ステップ、承認者、承認結果を記録し、高リスク操作が承認を通ったか検証する必要があるとわかるはずです。

2.3 脱感作とプライバシー

本番 trace は、そのまま評価セットに入れられません。OpenAI Agents SDK Tracing の文書は、一部の span がモデルの入出力や function tool の入出力を取得する可能性があるため、機微データを含めるかどうか設定が必要だと示しています。

必ず脱感作するフィールド:PII(氏名、メール、電話番号)、secret(API key、DB パスワード)、顧客データ(注文番号、取引金額)。

残すフィールド:traceId、span_id(調査用)、workflow_name(分類用)、ツール名、状態名(断言用)。

脱感作の方法には、<user_id> のようなプレースホルダーへの置換、ハッシュ化、削除があります。Phoenix の Running Evals on Traces 文書では、trace を評価入力に変換できるとされています。ただし、それでも label/score/rubric が必要です。完全な生 trace を eval dataset に直接入れてはいけません。

3. 本番 trace から eval example へ

3.1 データ収集フロー

本番 trace から eval example を作るには、脱感作、ラベル付け、階層分け、保存の 4 ステップが必要です。一度きりの実装ではなく、継続運用です。

チェックリスト:

  1. 監視 platform から失敗 trace をエクスポートする(Agent の監視と失敗復旧を参照)。
  2. 失敗タイプで分類する:ツール呼び出しエラー、引数形式エラー、状態遷移エラー、最終回答エラー。
  3. 脱感作する:PII/secret/顧客データを削除し、traceId、span_id、workflow_name を残す。
  4. 人間がラベル付けする:正しい/誤り/一部正しい + 失敗理由。
  5. 階層に分けて保存する:golden set / negative cases / edge cases。

Phoenix datasets の文書では、examples は production、staging、evaluations、manual から収集できるとされています。本番環境は実タスク分布を提供し、staging 環境のテストケースは境界シナリオを補えます。

3.2 階層分けの基準

階層基準用途
golden set100% 正しい + 高頻度タスクリリースゲートで必須通過、pass rate のしきい値
negative cases典型的な失敗パターン回帰テストのアラート。同じ失敗の再発を防ぐ
edge cases長尾/境界シナリオ補助的なカバレッジ。必要に応じて組み込む

ラベル付けの次元(LLM-as-judge rubric に対応):ツール選択の正しさ、引数形式の正しさ、実行順序の正しさ、最終回答の品質、人間のラベルとの一致度。

OpenAI Evaluation best practices は、typical、edge、adversarial cases を含むテストデータと、human expert labellers の利用を推奨しています。ここでの階層分けはその考え方に対応しますが、評価セットの目的はリリースゲートを守ることなので、高頻度タスクと典型的な失敗パターンをより重視します。

4. Trajectory assertions の書き方

4.1 軌跡制約の種類

Trajectory assertions は、Agent が守るべきツール呼び出し、引数形式、状態遷移、承認ルールを定義します。代表的な制約は次の 5 種類です。

制約タイプ例失敗条件
必須ツールリスト["check_permission", "refresh_data", "generate_report"]いずれかの必須ツールが欠ける
禁止ツールリスト["delete_user", "drop_table"]禁止ツールを呼ぶ
引数形式制約{"refund_amount": "number", "user_id": "uuid"}引数の型が違う
状態遷移順序["init", "check", "approve", "execute"]状態が飛ぶ、または重複する
承認ステップの存在["need_approval", "approval_granted"]承認イベントが欠ける

LangSmith の Evaluation concepts は、Agent 評価で trajectory、tool selection、argument formatting を評価すべきだと述べています。Phoenix の Running Evals on Traces 文書では、span_id を使って評価結果を特定の実行区間に関連付けています。つまり、軌跡断言は失敗した span までたどれる形にできます。

Agent の計画能力評価(N158)と状態機械・prompt 境界を読んでいれば、状態軌跡フィールドが state/event/checkpoint から来ることがわかります。これにより、状態遷移が期待どおりの順序か検証できます。

4.2 コード例

以下は、一般的な Agent 評価で使える trajectory assertions の擬似コード例です。

# trajectory assertions の例
def assert_trajectory_correct(result):
    # ツール呼び出しリストを抽出する
    tools_called = [call.tool for call in result.tool_calls]

    # 必須ツール
    required_tools = ["check_permission", "refresh_data"]
    for tool in required_tools:
        assert tool in tools_called, f"Missing required tool: {tool}"

    # 禁止ツール
    forbidden_tools = ["delete_user"]
    for tool in forbidden_tools:
        assert tool not in tools_called, f"Called forbidden tool: {tool}"

    # 引数形式制約
    for call in result.tool_calls:
        if call.tool == "refund":
            assert isinstance(call.args["refund_amount"], (int, float)), "refund_amount must be number"
            assert len(call.args["user_id"]) == 36, "user_id must be uuid format"

    # 状態遷移順序
    expected_states = ["init", "check", "approve", "execute"]
    actual_states = [event.state for event in result.state_events]
    assert actual_states == expected_states, "State transition order mismatch"

    # 承認ステップの存在
    approval_events = [e for e in result.state_events if e.type == "approval"]
    assert len(approval_events) >= 1, "Missing approval step"

このコードは、必須ツール、禁止ツール、引数形式、状態遷移順序、承認ステップをどう確認するかを示しています。実装では LangSmith の trajectory assertion や Phoenix の trace eval を使えますが、中核ロジックは同じです。

Agent の計画能力評価を読んでいれば、計画軌跡も回帰サンプルに変換し、タスク分解や自己修正能力の検証に使えるとわかるはずです。

5. LLM-as-judge の階層型 rubric

5.1 なぜ総合点だけでは足りないのか

LLM-as-judge が総合点だけを返すと、揺れが大きく、原因の切り分けが難しくなります。80 点という結果は、ツール選択は間違っているが回答はたまたま正しい、あるいは回答は誤っているが形式は整っている、という意味かもしれません。prompt、tool schema、検索、状態機械のどこに問題があるのか区別できません。

LangSmith の Evaluation concepts は、Agent の主要コンポーネントごとに品質基準を定義することを推奨しています。correct tool selection、proper argument formatting、trajectory です。各コンポーネントを分けて採点することで、モデル更新や prompt 変更後の退化を素早く見つけられます。

Prompt エンジニアリング上級実践を読んでいれば、DeepEval も TaskCompletenessMetric のような階層指標を重視しており、最終出力だけを見ないことがわかります。

5.2 階層型スコア表

次の rubric は、Agent 評価を 5 つの次元に分け、それぞれ 0〜2 点で採点します。

次元0 点1 点2 点
ツール選択の正しさ誤ったツール一部正しい完全に正しい
引数形式の正しさ型エラー一部フィールドに形式エラー完全に正しい
実行順序の正しさ状態が飛ぶ順序にずれがある完全に正しい
最終回答の品質要求を満たさない一部満たす完全に満たす
人間のラベルとの一致度専門家判断と矛盾一部一致高度に一致

LangSmith や Phoenix で使える rubric 設定例です。

rubric:
  dimensions:
    - name: tool_selection
      weight: 0.3
      criteria:
        0: "誤ったツールを呼び出した"
        1: "一部の正しいツールを呼び出した"
        2: "ツール選択が完全に正しい"

    - name: argument_formatting
      weight: 0.2
      criteria:
        0: "引数の型が誤っている"
        1: "一部フィールドの形式が誤っている"
        2: "引数形式が完全に正しい"

    - name: execution_order
      weight: 0.2
      criteria:
        0: "状態遷移が飛ぶ、または重複する"
        1: "実行順序にずれがある"
        2: "実行順序が完全に正しい"

    - name: final_answer_quality
      weight: 0.2
      criteria:
        0: "ユーザー要求を満たしていない"
        1: "要求を一部満たしている"
        2: "要求を完全に満たしている"

    - name: human_alignment
      weight: 0.1
      criteria:
        0: "専門家判断と矛盾している"
        1: "一部一致している"
        2: "高度に一致している"

ツール選択の重みが最も高い(0.3)のは、Agent の中核が正しいツールを呼ぶことだからです。人間のラベルとの一致度は最も低い(0.1)重みとし、LLM-as-judge と専門家判断の一致を校正するために使います。

6. リリースゲートと回帰テスト

6.1 CI 連携手順

Agent eval dataset の価値は、CI に接続してリリースゲートにすることで生まれます。連携手順は次のとおりです。

チェックリスト:

  1. CI pipeline に eval 実行ステップを追加する(pytest、LangSmith offline eval、Phoenix experiments など)。
  2. pass rate のしきい値を設定する(例:90%)。
  3. golden set は全件通過(100%)を条件にする。
  4. negative cases のアラートルールを設定する(通知はするが、必要に応じてブロックしない)。
  5. ベースラインバージョンと現在バージョンを比べる version comparison(improvement/regression)を設定する。
  6. ゲートの発火タイミングを定義する(PR / merge / canary)。

LangSmith の Evaluation concepts は、offline evaluations を regression testing、unit testing、backtesting に使えるとしています。対象は datasets 内の examples です。Phoenix experiments の文書は、prompt、LLM、アプリケーションロジックの変更を比較し、improvement/regression を判断できると説明しています。DeepEval は pytest-native eval をうたい、CI/CD や Python scripts で実行でき、LLMTestCase と TaskCompletenessMetric で Agent trace を階層的に採点できます。

6.2 しきい値設定表

指標しきい値失敗時の動作
pass rate≥ 90%マージをブロック
golden set100% 通過マージをブロック
negative casesアラート発火ブロックはせず、チーム責任者に通知
version comparisonregression なしマージをブロック

CI 設定例です。

evaluation:
  triggers:
    - pull_request
    - merge_to_main
    - canary_deployment

  conditions:
    pass_rate: 0.9
    golden_set: 1.0
    no_regression: true

  notifications:
    on_failure: ["team-lead", "on-call"]
    on_negative_alert: ["team-lead"]

ゲートの発火タイミングには、問題のあるコードを main branch に入れないための PR、merge 後も条件を満たすことを確認する merge、production traffic の前に検証する canary があります。コスト制御とモデルルーティング(N156)を読んでいれば、コストしきい値もゲート条件にできるとわかるはずです。ここでは評価しきい値に絞ります。

7. 実ケースの振り返り

7.1 シナリオ説明

日報 Agent は先週、正常にレポートを生成していました。check_permission で権限を確認し、refresh_data でデータを更新し、generate_report でレポートを生成する流れです。モデル更新後も Agent は「一見正しい」最終サマリーを返しましたが、軌跡では check_permission と refresh_data が抜けていました。

ユーザーが受け取ったのは、権限チェックもデータ更新もされていないレポートです。しかし表面上はわかりません。公開 benchmark では、このリスクを検出できません。あなたの tool schema と状態機械を持っていないからです。

7.2 問題の特定

監視 platform から失敗 trace をエクスポートします(Agent の監視と失敗復旧を参照)。軌跡を分析すると、ツール呼び出しリストに check_permission と refresh_data がなく、状態遷移は init から execute へ直接飛び、check と approve が欠けていました。最終回答は正しく見えますが、データソースは更新されていません。

ラベルは「ツール選択エラー + 状態遷移ジャンプ」です。

7.3 データセット更新

失敗事例を negative cases に追加します。同時に golden set も補強します。先週成功した日報タスクを探し、完全なツール呼び出しシーケンスを含め、正しいケースとしてラベル付けします。

trajectory assertions を更新します。必須ツールリストに check_permission と refresh_data を追加し、状態遷移順序の断言を ["init", "check", "approve", "execute"] にします。

7.4 CI ゲートによる検知

次回 PR で eval が実行されます。negative case がアラートを出します:check_permission のツール呼び出しが欠けています。golden set は全件通過しているため、成功ケースの基準は壊れていません。

原因は prompt でした。更新後のモデルは「レポートを生成する」という指示を直接実行寄りに解釈し、前段の権限チェックとデータ更新を無視していました。

7.5 修正と回帰確認

prompt を修正し、「レポート生成前に必ず権限を確認し、データを更新する」と明記します。eval を再実行すると、pass rate は 85% から 95% に上がり、negative case はアラートなしで通過し、golden set は全件通過します。version comparison も regression なしの improvement を示します。

マージしてリリースします。CI ゲートが、この退化を production 前に止めました。

7.6 フィールド対応表

段階使用するフィールド
問題特定traceId、span_id、tool_calls、state_events
データセット更新input、expected tool calls、trajectory assertions、human labels
CI ゲートpass rate、golden set、negative cases
修正検証pass rate、version comparison

このループは、本番失敗から回帰テストまでの流れを示しています。事故の振り返りごとに、traceId、tool call、approvalId、state event、人間の判定を eval example として固定すれば、次回リリース前に同じ失敗を防げます。

8. 次に読むもの

  • Agent 状態機械と prompt 境界:状態遷移制約と軌跡断言フィールドの出どころを理解する
  • Agent 権限モデル:承認記録フィールドと高リスクツール呼び出しルールを理解する
  • 人間の承認設計:approval records と承認フローをテストとして固定する方法を理解する
  • コスト制御とモデルルーティング:コストしきい値をゲート条件にする考え方を理解する
  • Agent の監視と失敗復旧:失敗 trace のエクスポートと事故振り返りループを理解する

Agent 評価データセットと回帰テストを構築する

実際の Agent タスク、本番 trace、失敗事例、ツール呼び出しの軌跡、人間のラベルを、CI のリリースゲートで実行できるバージョン付き eval dataset に整理します。

⏱️ 目安時間: 60 分

  1. 1

    ステップ 1: 候補タスクを集める

    production、staging、手動テスト、事故の振り返りから実タスクを集めます。高頻度、高リスク、すでに退化が起きたフローを優先します。
  2. 2

    ステップ 2: 実行 trace をひも付ける

    各タスクに traceId、span_id、state events、tool calls、approval records、最終出力をひも付け、失敗箇所を追跡できるようにします。
  3. 3

    ステップ 3: 原データを脱感作する

    PII、secret、顧客データ、実在の注文番号、ツール返却値の機微情報を削除または置換します。評価に必要な構造化情報だけを残します。
  4. 4

    ステップ 4: dataset schema を抽出する

    input、expected output、expected tool calls、trajectory assertions、rubric、risk tags、human labels、バージョン情報を各サンプルに補います。
  5. 5

    ステップ 5: 階層に分けて保存する

    サンプルを golden set、negative cases、edge cases、regression cases に分け、それぞれに通過しきい値とアラートルールを設定します。
  6. 6

    ステップ 6: 評価器を設定する

    code evaluator、rule evaluator、LLM-as-judge、人間の annotation を評価軸ごとに使い分けます。単一の総合点だけに依存しないようにします。
  7. 7

    ステップ 7: リリースゲートへ接続する

    regression suite を CI、モデル更新、prompt 変更、tool schema 変更前のゲートに接続します。
  8. 8

    ステップ 8: 事故後に継続更新する

    事故の振り返りごとに新しい case を追加し、dataset version、変更理由、適用範囲、データ保持ポリシーを記録します。

FAQ

本番 trace をそのまま eval dataset に使えますか?
使えません。本番 trace はまず脱感作し、PII、secret、顧客データを削除します。そのうえで、正しい、誤り、一部正しいといった人間のラベルを付け、golden set、negative cases、edge cases に分けて保存します。OpenAI Agents SDK Tracing の文書でも、一部の span が機微な入出力を取得する可能性があるため、何を含めるか制御する必要があるとされています。
Agent のツール呼び出しに expected trajectory をどう書けばよいですか?
成功ケースからツール呼び出しの順序を抽出し、必須ツールと禁止ツールを定義します。さらに状態遷移の順序制約を追加します。Agent 評価では、最終回答だけでなく、ツール選択、引数形式、実行軌跡も確認します。
失敗ケースはすべて regression suite に入れるべきですか?
すべて入れる必要はありません。高頻度、高リスク、実際に事故を起こしたもの、重要な状態遷移を覆うもの、同じ退化を防げるものを優先します。長尾の境界ケースは edge cases に置き、リスクが高まった時点で強いゲートに入れます。
LLM-as-judge の点数が揺れるとき、リリースゲートのしきい値はどう決めますか?
総合点だけを見ないことです。golden set は全件通過、pass rate は業務リスクに応じて 90% などに設定します。ツール選択、引数形式、軌跡、最終回答、人間のラベルとの一致度を分けて採点し、コード断言やルール断言と組み合わせます。
データセットにユーザーの生入力やツール返却値を保存すべきですか?
脱感作後に限ります。ユーザー入力は PII を削除または置換してから保存し、ツール返却値は重要フィールドだけを残します。traceId と span_id は調査用に残せますが、完全な生 trace を eval dataset に直接入れるべきではありません。
モデル更新後に古いタスクが悪化した場合、どう素早く原因を絞りますか?
CI ゲートのアラートから始めます。pass rate と regression 比較を確認し、失敗した test case を開き、ツール選択、引数形式、状態遷移を見ます。原因は prompt、tool schema、検索、権限モデル、状態機械の境界にあることが多いです。
自前の eval dataset と公開 benchmark はどう使い分けますか?
公開 benchmark は汎用能力を測り、モデル選定に向いています。自前のデータセットは、自社プロダクトのタスク、ツール、権限、データ分布、失敗パターンを測るため、リリース判断の主な材料になります。両者は補完関係にあり、置き換えられません。
OpenAI Evals platform が終了する場合、どうすればよいですか?
2026-07-07 時点の OpenAI 公式文書では、Evals platform は 2026-10-31 に既存ユーザー向け read-only となり、2026-11-30 に shutdown する予定です。regression system を単一 platform に固定せず、test data、ground truth、grader を JSON/YAML で定義し、移行しやすい形式を保つのが安全です。

9分で読めます · 公開日: 2026年10月21日

コメント

GitHubアカウントでログインしてコメントできます

Easton BlogEaston Blog