コンテンツへスキップ

LLM とエージェントのトレースのための人手レビューキュー

トレースがどのように人手のレビューキューに届くか、レビュアーが何にラベルを付けるか、そして Langfuse、LangSmith、Potato がラベルをスコアと評価データセットにどう変えるかを解説します。

人手のレビューキューは、人間によるラベル付けを待つ LLM やエージェントのトレースのリストで、Langfuse と LangSmith はこの機能をアノテーションキューと呼んでいます。Langfuse、LangSmith、Arize AX はアノテーションキューをトレースツールに組み込み、Braintrust は Review ページでログをレビュアーに割り当て、Arize Phoenix ではレビュアーがトレースビューからスパンにアノテーションを付けられます。Potato は、無料のセルフホスト型レビューツールです。Langfuse、ウェブフック、またはエクスポートからトレースを取り込み、各トレースを複数のレビュアーに送り、レビュアー間の一致度を報告し、統合した回答をスコアとして Langfuse や LangSmith に書き戻します。

トレースは LLM アプリケーションの一回の実行を記録し、スパン(Langfuse ではオブザベーション)は、その実行内のモデル呼び出しやツール呼び出しのような一つのステップを記録します(OpenTelemetry のトレース)。エージェントのトランスクリプトは、複数ステップのエージェントまたは複数ターンのチャットのトレースです。レビュアーがトレースにラベルを付ける理由は二つあります。第一に、人間のラベルは、LLM-as-a-judge が本番のトラフィックを単独で採点する前に、照合される基準です(Zheng ら、2023)。第二に、レビュー済みのトレースが評価データセットになります。評価データセットとは、新しいプロンプトやモデルのバージョンごとにテストされる、入力と期待される出力の固定されたセットです。アノテーター間一致度は、二人のレビュアーが同じラベルを付ける頻度です。一致度は通常、Cohen のカッパまたは Krippendorff のアルファとして報告されます。

AI エージェント評価ツールの比較は、プラットフォームを機能ごとに比較します。LLM の人手評価と選好データのツールの比較は、選好データを扱います。エージェントのトラジェクトリのアノテーションは、ステップ単位のエラー分類の設計を扱います。

レビューキューへのトレースの供給元

チームがすべてのトレースをレビューすることはまれです。そのため各ツールは、人間に届くトレースを選ぶ方法を提供しています。Langfuse では、テーブルでトレース、オブザベーション、セッションを選択して Add to queue を選ぶか、アイテムの詳細ページから一つのアイテムにアノテーションを付けます。LangSmith のキューは、手動または自動化ルールで追加された実行とスレッド全体を受け入れます。手動の追加では、一度の操作で最大 100 件の実行またはスレッドをキューに入れられます。LangSmith のスレッドルールは、会話がアイドル状態になった時点で会話を追加します。Arize AX は、キューを時間範囲のスパン、またはデータセットの例で満たします。

Potato は、三つの方法でトレースを読み込みます。

  • エクスポート。 python -m potato.trace_converter は、15 のトレース形式を Potato の JSONL に変換します。LangSmith の実行エクスポート用の langchain、langfuse、そして Phoenix や Braintrust のエクスポーターからの OpenTelemetry と OpenInference のスパン用の otel を含みます。
  • ウェブフック。 trace_ingestion を有効にすると、Potato は /api/traces/webhook、/api/traces/langsmith、/api/traces/otel に投稿されたトレースを受け入れ、レビュアーが作業している間に各トレースをキューに追加します。
  • Langfuse のポーリング。 trace_ingestion.sources の下にある langfuse エントリは、Langfuse プロジェクトから一定間隔で新しいトレースを取得します。

Potato は、どの受信トレースをどの順序でレビュアーに届けるかを選びます。自動化ルールは、フィールドと割合によって受信トレースをサンプリングします。トリアージキューは、エラーになったトレース、低評価のフィードバック、低い自動スコアのトレースを、レビュアーに優先して提供します。

レビュアーがトレースに付けるラベル

レビュアーが付けるラベルの種類は、そのラベルを後で何に使うかによって決まります。合格か不合格かの判定は成功率を与え、基準ごとのルーブリックスコアはジャッジが合わせるべき対象を与えます。修正された出力は、学習例を与えます。以下の表の各種類のラベルには、そのラベルを記録する Potato のスキームがあります。

ラベル例Potato のスキーム
合格か不合格かエージェントはリクエストを解決したか?radio
ルーブリックスコア正確さ、トーン、安全性を 1 から 5 の尺度でrubric_eval、likert
エラースパン幻覚の文をハイライトし、タイプと重大度を付けるerror_span
ステップの正しさ最初の誤ったステップに印を付けるか、すべてのステップを判定するprocess_reward、trajectory_eval
ツール呼び出し正しいツール、正しい引数tool_call_review
マルチエージェントの実行での責任どのエージェントのどのステップが失敗の原因かfailure_attribution、agent_scorecard
修正された出力最終回答または誤ったステップを書き直すtext_edit、trajectory_edit
二つの実行間の選好応答 A、応答 B、または引き分けpairwise

トレースプラットフォームは、同じ判断をスコアとして記録します。Langfuse は、修正された出力をトレースまたはオブザベーションに保存します。LangSmith のレビュアーは、データセットの例の期待される出力になるアサーションを書き、Braintrust は自由形式のスコアを expected フィールドに書き込めます。LangSmith のペアワイズキューは、二つの実験の実行を並べて表示し、レビュアーは A、B、または Equal を選びます。

ツール別のレビューキュー機能

Potato チームは、以下のライセンス、プラン、機能を、2026-11-02 時点の各プロジェクト自身のページで確認しました。

ツール動作形態ライセンスまたは価格レビュー機能
Langfuseホスト型クラウドまたはセルフホストMIT。アノテーションキュー付きでセルフホストは無料。Cloud の Hobby は無料でキュー 1 つ、Core は月 29 ドルで 3 つ、Pro は月 199 ドルでキュー無制限トレース、オブザベーション、セッションのキュー。修正された出力。二つのスコア名の間の Cohen のカッパ
LangSmithホスト型クラウドDeveloper は 1 シートで無料。Plus は 1 シートあたり月 39 ドル。セルフホストは Enterprise のみ単一実行とペアワイズのキュー、スレッドのレビュー、実行ごとに設定したレビュアー数、Add to Dataset
Arize Phoenixpip または Docker でセルフホストElastic License 2.0人間、LLM、コードによる、カテゴリ、連続値、自由形式のアノテーション。それぞれ作成者付きで一覧表示
Arize AXホスト型プラットフォーム商用スパンまたはデータセットの例のキュー。ALL または RANDOM の割り当て方式
Braintrustホスト型クラウドStarter は無料でプロジェクトあたり人手レビューのスコア 1 つ。Pro は月 249 ドル。オンプレミス展開は Enterprise割り当てられたレビュアー、ブラインドレビュー、expected に書き込まれるスコア
Label StudioウェブアプリApache-2.0 の Community Edition。トレースレビューのテンプレートには Enterprise が必要ノートブックで取得した Langfuse や Braintrust のトレースに対する、ターンごとおよびトレースごとの合格か不合格か
ArgillaDocker または Hugging Face Space 上のウェブアプリApache-2.0ChatField によるチャットレコード。レコードごとの最小回答数
Potato自分のマシン上の Python ウェブサーバーGPL-3.0-or-later、無料トレースごとに複数のブラインドレビュアー、一致度、ステップ単位のスキーム、Langfuse や LangSmith に書き戻されるスコア

Argilla のリポジトリは、元の作者が離れており、プロジェクトはバグ修正とパッチを公開するが、新機能は公開しないと述べています。ホスト型プラットフォームは、すでにそのいずれかのプラットフォームで本番のトラフィックをトレースしているチームに適しています。ホスト型プラットフォームでは、レビュアーは、エンジニアがトレースをデバッグするのと同じツールでトレースを開きます。

Humanloop の移行ガイドは、Humanloop のプラットフォームが 2025 年 9 月 8 日に終了し、その日以降プラットフォームとすべてのデータに永久にアクセスできなくなると述べています。2025 年 8 月 13 日に、TechCrunch は、共同創業者とチームの大半が Anthropic に加わったと報じ、Anthropic の広報担当者は、Anthropic が Humanloop の資産や知的財産を取得していないと述べました。自動評価と人手レビューを一つのホスト型製品で行うには、最も近いホスト型の代替は Langfuse、LangSmith、Braintrust、Arize です。すべてのトレースでブラインドレビュアー間の一致度が必要なチームは、この四つのプラットフォームのどれかと並べて Potato を追加できます。

トレースごとのレビュアーと一致度

トレースごとに一人のレビュアーでは、そのラベルを確認する手段がなく、二人のブラインドレビュアーがいれば、どのトレースが曖昧か、またルーブリックが明確かどうかがわかります。LangSmith のキューは実行ごとのレビュアー数を設定し、LangSmith のレビュアーは互いのフィードバックを見られません。Braintrust は、レビュアーが送信するまで他のレビュアーのスコアを隠します。Require all scores をオンにすると、Braintrust の行は、割り当てられたすべてのレビュアーがその行を採点した時点で完了します。Phoenix は、スパン上のすべてのアノテーションを作成者付きで一覧表示します。Langfuse のフォーラムでは、2025 年 11 月 7 日に、キュー内で二人が同じトレースを独立してアノテーションすることがまだできないとユーザーが報告しました。ディスカッションでの回避策は、レビュアーごとに一つのスコア設定を使うことです。最新のコメントの日付は 2026 年 4 月 22 日で、今も回避策を述べています。Langfuse のスコア分析は、任意の二つのスコア名の間の Cohen のカッパを、二つずつ計算します。

Potato では、num_annotators_per_item が各トレースを見るレビュアーの人数を設定します。/admin/iaa ダッシュボードは、カテゴリのスキームについて Cohen のカッパ、Fleiss のカッパ、Krippendorff のアルファを、順序のスキームについて重み付きカッパを報告し、/admin/api/step_agreement はステップ単位のラベルの一致度を報告します。裁定者は /adjudicate ページで不一致を解決し、裁定と不一致の解消は、裁定をいつ行うべきかを扱います。アノテーター間一致度の解説は、係数の選び方を扱います。

ラベルをトレースツールと評価データセットに戻す

レビュー済みのラベルが役に立つのは、次のバージョンをテストする評価データセットに届いてからです。LangSmith のレビュアーは、キューから実行またはスレッド全体をデータセットに追加します。Langfuse は、元のトレースへのリンク付きでオブザベーションをデータセットに追加し、Langfuse のスコア API は、修正された出力を CORRECTION タイプのスコアとして返します。Phoenix はスパンのアノテーションをデータセットに伝播し、Braintrust はレビュー済みのログからデータセットを構築します。

Potato は、三つの方法でラベルを返します。

  • 元のトレースへのスコア。 trace_ingestion.writeback を使うと、Langfuse のポーラーまたは LangSmith のウェブフックから届いたトレースは、min_annotators 人が回答した時点で、スキームごとに一つのスコアを受け取ります。radio の回答は多数派のラベルで、multiselect の回答は、半数を超えるレビュアーが選んだクラスの集合です。コメントとメタデータには、アノテーターの人数と、一致したレビュアーのペアの割合が記録されます。同票の場合は、裁定を待ちます。process_reward のようなステップ単位のスキームは、各 Langfuse のオブザベーションにもスコアを付けます。
  • 学習データ。 trajectory_correction エクスポーターは、SFT/DPO のためのトラジェクトリ編集で説明されているとおり、修正された各トレースを SFT レコード(prompt、completion)と DPO レコード(prompt、chosen、rejected)として書き出します。
  • ファイルとデータセット。 Potato は、CSV、JSONL、Parquet、Hugging Face のデータセット、agent_eval にエクスポートします。agent_eval エクスポートは、トレースごとにスコアを集計します。Potato のデータセットは、バージョン管理された評価セットを保持します。

Langfuse から供給される Potato のレビューキュー

以下の設定では、Potato は 60 秒ごとに Langfuse のプロジェクトをポーリングし、各トレースを二人のレビュアーに渡します。レビュアーは三つの質問に答え、二人のレビュアーがともに回答すると、Potato は各回答を、review.outcome、review.failure_mode、review.step_correctness という名前の Langfuse のスコアとしてトレースに送り返します。この設定は完全で、python -m potato.validate_cli --strict に合格します。

yaml
annotation_task_name: Support agent trace review, two reviewers per trace
task_dir: .
output_annotation_dir: annotation_output/
data_files:
  - data/traces.jsonl
item_properties:
  id_key: id
  text_key: task_description
user_config:
  allow_all_users: true
  users: []
 
# Pull new traces from Langfuse every 60 seconds, and send each merged
# answer back to the trace as a Langfuse score once two people have judged it
trace_ingestion:
  enabled: true
  api_key: change-me
  sources:
    - type: langfuse
      api_url: https://cloud.langfuse.com
      public_key: pk-lf-...
      secret_key: sk-lf-...
      poll_interval: 60
  writeback:
    trigger: fully_annotated
    min_annotators: 2
    score_prefix: review
 
# Two reviewers per trace, so agreement can be measured on every trace
num_annotators_per_item: 2
 
instance_display:
  fields:
    - key: steps
      type: agent_trace
      label: Agent trace
 
annotation_schemes:
  - annotation_type: radio
    name: outcome
    description: Did the agent resolve the customer's request?
    labels: [pass, fail]
  - annotation_type: multiselect
    name: failure_mode
    description: Which problems does the trace show?
    labels: [wrong_tool, hallucinated_fact, ignored_instruction, unsafe_action, none]
  - annotation_type: process_reward
    name: step_correctness
    description: Mark the first step that went wrong.
    steps_key: steps
    mode: first_error

サーバーは potato start config.yaml -p 8000 で起動します。書き戻しが届くのは、Langfuse または LangSmith から届いたトレースだけで、data/traces.jsonl から読み込んだトレースは Potato の中に留まります。ファイルとしてエクスポートされたトレースは、先にエクスポートを変換してください。

bash
python -m potato.trace_converter --input langfuse_traces.json --output data/traces.jsonl --input-format langfuse

Potato は、api_key を使ってウェブフックのエンドポイントを保護します。書き戻しは、LANGFUSE_PUBLIC_KEY と LANGFUSE_SECRET_KEY の両方の変数が設定されている場合はそこから、そうでない場合は langfuse ソースから Langfuse のキーを読み込みます。curl -H "X-API-Key: $KEY" http://localhost:8000/admin/api/trace_writeback は、保留中、送信済み、失敗、保留扱いのスコアの数を表示します。

レビューキューとしての Potato の限界

  • 本番のトレース機能なし。 Potato はトレースツールからトレースを読み込み、トレースツールの代わりにはなりません。
  • レビュアーの提供なし。 自分のチームを招待するか、クラウドソーシング連携で説明されているとおり、Prolific でレビュアーを募集してください。
  • 二つのサービスへの書き戻し。 スコアの送信先は Langfuse と LangSmith のみです。テキストの回答は決して送信されず、LangSmith が受け取るのはトレースレベルのフィードバックのみです。Potato のドキュメントは、LangSmith への配信は LangSmith が公開している API に従っており、サービスに対して実行されたことはないと述べています。
  • ポーリングは Langfuse のみ。 LangSmith の実行は、ウェブフックまたはエクスポートで届きます。

よくある質問

エージェントと LLM のトレースのアノテーションキューとは何ですか?

アノテーションキューは、チームが人間のラベル付けのために取り置いたトレース、スパン、会話のリストで、各アイテムに対して決まった質問のセットがあります。レビュアーは次のアイテムを開き、質問に答え、アイテムを完了としてマークします。Langfuse、LangSmith、Arize AX は、この機能をアノテーションキューと呼んでいます。Potato は同じワークフローを自分のサーバーで実行し、トレースごとに複数のレビュアーを置き、一致度を報告します。

どのツールが LLM トレースの人手レビューとラベル付けに対応していますか?

Langfuse、LangSmith、Braintrust、Arize Phoenix、Arize AX は、トレースツールの内部で、人間のラベルをトレースに付けます。Label Studio Enterprise では、レビュアーはテンプレートを通じて Langfuse と Braintrust のトレースにラベルを付けます。Potato は、Langfuse、LangSmith、OpenTelemetry、およびほかの 12 の形式のトレースをレビュアーに表示し、レビュアー間の一致度を測定し、結果を Langfuse または LangSmith に送り返します。

評価と人手レビューのための Humanloop の代替は何ですか?

Humanloop のホスト型の代替には、Langfuse、LangSmith、Braintrust、Arize があります。この四つのプラットフォームはそれぞれ、トレース、自動評価、人手レビューを組み合わせており、Langfuse は MIT ライセンスで、セルフホストは無料です。Humanloop のプラットフォームは 2025 年 9 月 8 日に終了しました。Potato は、人手レビューの部分のための無料のセルフホスト型の代替であり、ブラインドレビュアー間の一致度と、Langfuse や LangSmith に書き戻されるスコアを備えています。

関連資料

参考文献

  1. Zheng, L., Chiang, W.-L., Sheng, Y., et al. (2023). Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. NeurIPS 2023 Datasets and Benchmarks. https://arxiv.org/abs/2306.05685