Skip to content
Guides2 min read

ループを閉じる:エージェントのエラーとジャッジの不一致を人間に戻す

エージェント評価において、人間によるレビュー時間は最も希少なリソースです。Potato 2.6 はシグナルベースのトリアージキューとジャッジ=人間の整合性を組み合わせ、最も問題のあるトレースを優先的に人間へ届け、LLM ジャッジを継続的に改善します。

Potato Team

ある程度の規模でエージェントを評価し始めると、制約は「これをラベル付けできるか」ではなく「誰の注意を、何に費やすか」になります。何千件もの本番トレースがあるのに、レビュアーはほんの数人です。LLM ジャッジはすべてを事前スクリーニングできますが完璧ではなく、ジャッジが間違える事例こそが、まさに人間の時間を費やす価値のある事例です。

Potato 2.6 の 2 つの機能が連携して、この希少性を管理します。シグナルベースのトリアージキューは、人間が最初に何を見るかを決めます。ジャッジ=人間の整合性は、ジャッジにどこまで頼れるかを測定し、それを改善します。両者を一緒に動かせば、能動的な評価ループが得られます。ジャッジが簡単で大量の案件を処理し、疑わしい案件はキューを飛び越えて人間に届き、不一致はより良いジャッジへとフィードバックされます。

この記事では両方の半分と、それらがどうつながるかを扱います。

アノテーション中の優先度バッジ。なぜその項目がレビュー対象として印を付けられたかを説明しているPotato のトリアージキュー・バッジ

トリアージの半分:先入れ先出しではなく、最悪のものを最初に

デフォルトでは、アノテーションキューは FIFO(先入れ先出し)です。項目は読み込まれた順に配信されます。レビュー時間が希少なときには、これは誤った順序です。クリーンなトレースと、エージェントがエラーを投げたトレースとでは、費やすべき人間の注意の量がまったく異なるのに、FIFO は両者を同じに扱います。

トリアージキューは、項目ごとの品質シグナルでキューを並べ替えます。シグナルは、エージェントのエラー、本番でのサムズダウン、自動スコアの低さ、あるいはデータ内の任意のフィールドにできます。

yaml
triage:
  enabled: true
  order: desc            # high priority first (default)
  show_badge: true       # banner during annotation explaining the priority
  rules:                 # evaluated in order; highest matching priority wins
    - name: "Agent errored"
      priority: 100
      when:
        field: status
        equals: error
    - name: "Negative feedback"
      priority: 80
      when:
        field: feedback
        in: [thumbs_down, negative]
    - name: "Low quality score"
      priority: 60
      when:
        field: score
        lt: 0.5
 
assignment_strategy: priority

ルールは上から下へ評価され、マッチした中で最も高い優先度が勝ちます。そのため、ネガティブなフィードバックも持つエラー済みのトレースも、やはり 100 に着地します。rules をまるごと省略すると、Potato は妥当なデフォルトセット(エラーステータスは 100、ネガティブなフィードバックは 80、スコア 0.5 未満は 60)にフォールバックするので、何かを調整する前のターンキー動作も妥当です。

条件演算子は、実際に必要な比較をカバーしています。

Operator意味
equals完全一致(文字列は大文字小文字を区別しない)
in値がリストのいずれかである
containsリストが含む、または部分文字列の一致
lt / lte / gt / gte数値の比較
existsフィールドが存在するか、しないか

シグナルがすでに数値である場合は、ルールを書く代わりにフィールドから直接読み取れます。

yaml
triage:
  enabled: true
  signal_field: quality_score
  invert_signal: true           # lower score => higher priority

ライブトラフィックでも機能する

優先度スコアは、項目が読み込まれるか取り込まれるときに一度だけ計算され、その後項目に保存されるため、割り当ては常に安価なままです。同じ設計により、ランタイムでの取り込みもそのまま機能します。セッションの途中で webhook エンドポイントや Langfuse ポーラー経由でプッシュされたトレースは、到着時にスコアリングされ、優先度順に収まります。午後 2 時に到着した低スコアまたはエラー済みのトレースは、今朝からまだ待っているクリーンなトレースを追い越します。assignment_strategy: priority を設定することが、キューを実際にその順序で配信させるものです。show_badge は独立しているため、別の戦略を維持していても「なぜこれが印を付けられたのか」というバナーは表示されます。

整合性の半分:ジャッジをどこまで信頼するか

トリアージは、人間が何を見るかを決めます。整合性は、残りのどれだけを監督なしでジャッジに任せられるかを決め、時間とともにジャッジを引き締めます。

ジャッジ整合性は、アノテーターがすでにラベル付けしたインスタンスに対して設定可能な LLM ジャッジを実行し、人間のゴールドに対する Cohen's κ(コーエンのカッパ、一致度の指標)、混同行列、不一致リストを報告します。標準的な手法(ジャッジをおよそ 100〜200 件のゴールドラベルに整合させ、どこで不一致になるかを点検し、rubric を書き直して再実行する)こそ、この機能が中心に据えるループです。

yaml
ai_support:
  enabled: true
  endpoint_type: "ollama"
  ai_config:
    model: "llama3.2"
    temperature: 0.0
 
judge_alignment:
  enabled: true
  schemas:
    correctness:
      rubric: >
        Label 'correct' only if the agent's answer is factually right and fully
        satisfies the request; otherwise 'incorrect'.
  inline:
    enabled: true                # show the judge verdict beside the human label
    schemas: [correctness]

ジャッジは管理 API から実行し、予測はプロンプトのバージョンごとにキャッシュされるため、再実行は安価です。

bash
curl -X POST localhost:8000/admin/api/judge-alignment/run \
  -H "X-API-Key: <admin-key>" \
  -H "Content-Type: application/json" \
  -d '{"max_per_schema": 200}'

キャリブレーションしたいときは、編集した rubric を渡します。それによって新しいプロンプトバージョンが作成されるので、ラウンド間で κ を比較し、書き直しが本当に役立ったかどうかを実際に確認できます。

bash
curl -X POST localhost:8000/admin/api/judge-alignment/run \
  -H "X-API-Key: <admin-key>" -H "Content-Type: application/json" \
  -d '{"rubrics": {"correctness": "Stricter rubric text..."}}'

このレポートは JSON として、または /admin/judge-alignment のレンダリングされたページとして利用でき、Landis–Koch の解釈付きの κ、混同行列、ジャッジの推論を伴う不一致テーブル、そしてプロンプトバージョンの履歴を表示するため、キャリブレーションの進捗がラウンドをまたいで可視化されます。

インラインモードはそれをアノテーターの目の前に置く

inline.enabled を有効にすると、各アノテーションページは人間のラベルの隣にジャッジのキャッシュされた判定(その選択、信頼度、展開可能な推論)を、タスクのリアルタイム κ とともに表示します。「承認」をクリックすると、一致する選択肢が入力されます。人間が保存するたびに人間↔ジャッジの比較が記録され、リアルタイムの一致度に反映されるため、あなたが目標としている κ は人々が作業するにつれて更新されます。

2 つを組み合わせる

これらの機能は、1 つのループに組み合わさるよう設計されています。

本番のシグナルが優先度キューに供給され、人間が上位の項目をレビューし、彼らのラベルがジャッジの kappa を測定し、洗練された rubric がフィードバックされる能動的な評価ループ:トリアージ、人間によるレビュー、ジャッジ整合性、rubric の洗練

  1. トリアージは、エラー済みで信頼度の低いトレースを人間のキューの先頭に押し出します。
  2. 人間がレビューし、これらの価値の高い項目について、システムが最も確信を持てないまさにその場所で新鮮なゴールドラベルを生み出します。
  3. 整合性は、そのゴールドに対してジャッジをスコアリングし、不一致リストはジャッジと人間がどこで袂を分かつかを正確に示します。
  4. あなたは rubric を洗練し、再実行し、κ が動くのを見守り、その後、より良く較正されたジャッジに簡単な大量の案件をより多く吸収させ、人間の時間が難しい案件へ流れ続けるようにします。

ループが一周するたびに、人間の注意が最も価値のある場所に費やされ、それがもう一歩信頼できるジャッジへと変換されます。それこそが要点です。人をエージェント評価から取り除くのではなく、彼らの照準を定めることです。

両機能とも Potato 2.6 に同梱されています。完全なリファレンスはトリアージキューのドキュメントジャッジ整合性のドキュメントを、優先順位付けされたトレースをすばやく読むには eval_trace 表示をご覧ください。