Skip to content
Announcements1 min read

Potato 2.11:ラベリングエンジンと証明された機械ラベル

Potato 2.11はモデルでデータセットにラベルを付け、ブラインドの人手サンプルで機械ラベルを検定し、証明書を出力します。アイドル状態のセッションは8時間でサインアウトされるようになりました。

Potato Team

Potato 2.11ではラベリングエンジンが加わりました。ラベリングエンジンはモデルでデータセットにラベルを付け、ブラインドで集めた人手ラベルのランダムサンプルを使って、モデルがどのくらいの頻度で誤るかを測定します。完成したラベルが満たすべき条件は、たとえば「受理した機械ラベルのうち誤りは最大10%、信頼度90%で」のように自分で指定します。エンジンは統計的検定が裏付ける機械ラベルを受理し、残りの項目を人に回し、何をいくつの人手ラベルで検定したかを記録した証明書を出力します。このリリースでは、一致度レポートが3Dオブジェクト、時間的グラウンディング、階層型アノテーション、エージェントトレースにも対応し、手を付けていない項目が回答済みとして数えられることがある画像のバグも修正されています。

bash
pip install --upgrade potato-annotation

アップグレード時の注意

アイドル状態のセッションは、デフォルトで8時間後にサインアウトされるようになりました。 2.11より前は、session_timeout_minutesは実際に配信されるアプリでは何の効果もありませんでした。チェックが登録されていたのが、potato startが破棄するアプリオブジェクトだったためです。現在は、設定値より長くアイドル状態のセッションはクリアされ、次のリクエストはログインページに送られます。一晩中サインインしたままのキオスク端末や共用の研究室マシンではサインアウトが起きるようになるので、サインインを保つ必要がある研究ではsession_timeout_minutesを引き上げてください。すでに保存されたアノテーションには影響しません。

3つの古いキーは起動時に注記を出力します。 icl_labeling、judge_calibration、pre_annotationはこれまでとまったく同じように動作し、それぞれNOTE:で始まる行を標準エラー出力に書き出して、対応するエンジンの設定を示します。注記は情報提供のためのものなので、potato validate --strictはこれで失敗しません。これらのキーは3.0で削除される予定で、potato label migrate-configを使えば同等のlabeling_engineブロックが自動で書き出されます。

ラベリングエンジン

エンジンは、人がラベルを付けきれないほど多くの項目があり、ほとんどの場合に正しいモデルがある研究のためのものです。エンジンはモデルをソースとして扱い、並べた順にカスケードで試し、最後のソースの後で項目を人に回します。ソースには、LLM、視覚言語モデル、Layaなどの意思決定モデル、YOLO検出器、LLM判定者、ジュリー、その研究自身のラベルで学習したモデル、手元にある既存のラベルを使えます。

コントラクトは、エンジンが検定する対象です。中心となるselective_riskは、受理した機械ラベルのうち誤っているものの割合に上限を設けます。エンジンはブラインドサンプルの半分で信頼度のしきい値を選び、残りの半分で片側二項検定によってそれを検定します。その際には固定順序のLearn-then-Testを使います。新たに検定するたびにより厳しい水準で実行されるため、検定に通るまで証明をやり直しても信頼度は水増しされません。ppiコントラクトは、各ラベルの出現率をprediction-powered inferenceで構成した区間とともに報告します。この区間はモデルの品質にかかわらず有効です。no_worse_than_humanは、人や判定者を置き換えるためのalternative annotator testを実行し、distributionalは、主観的な項目について、モデルのラベル分布を人の意見の分かれ方と比較します。

感情スキーマで1つのLLMを証明する設定では、通常の研究に2つのキーを追加します。

yaml
assignment_strategy: engine
 
labeling_engine:
  enabled: true
  sources:
    - id: gemma
      kind: llm
      endpoint_type: vllm
      model: google/gemma-4-12B-it-qat-w4a16-ct
      base_url: http://localhost:8001/v1
      confidence: {method: logprob}
  contracts:
    - id: accuracy
      kind: selective_risk
      schema: sentiment
      error: 0.1
      confidence: 0.9
  budgets:
    human_labels: 400

confidence: {method: logprob}は、モデルのトークン確率から信頼度を読み取ります。この方法は項目ごとに1回の呼び出しで済み、通常はエンジンの信頼度の求め方の中で最もよく較正されています。このコントラクトが許す誤りは受理したラベルの最大10%で、信頼度90%はPotatoのデフォルトです。budgets.human_labelsはエンジンが開ける人への依頼の数に上限を設け、400は付属のテキストの例で使っている上限です。

Potatoに付属するテキストの例では、Layaを先頭、Gemma 12Bをその次に置いたカスケードで481件のレビューを処理します。この実行では、10%のコントラクトは165件の人手ラベルで満たされ、エンジンは316件の機械ラベルを受理しました。Layaのしきい値が一度も確定しなかったため、それらはすべてGemmaのものです。参照ラベルに対して測った誤りは7.6%でした。エージェントトレースの例には、参照となる結果付きの合成トレースが288件あります。判定者はそのうち80%で正しかったものの、すべての判定に1.0の信頼度を付けたため、selective_riskにはしきい値を設ける手がかりがなく、infeasibleのままでした。同じデータから得たタスク成功率のPPI区間[0.57, 0.76]は参照値の0.60を含んでいましたが、判定者単独では0.76という値でした。

満たされたコントラクトの限界

満たされたコントラクトとは、サンプルにラベルを付けた人々との一致についての言明です。エンジンはその人々が正しいかどうかを確認しないので、注意の足りないアノテーターに対して検定したコントラクトは、注意の足りないアノテーターとの一致を証明することになります。この言明を成り立たせるルールは3つあります。キャリブレーションの依頼はブラインドなので、人がそれを受け持っている間、ページにはプレアノテーションも判定者の判定もAIヘルプも表示されません。しきい値はサンプルの半分で選び、もう半分で検定します。証明できるのは人手ラベルだけで、ソース、プロンプト、スキーマのいずれかを変更すると、影響を受けるコントラクトは再び検定されるまでstaleになります。

エンジンを操作するインターフェース

すべてのインターフェースは同じengine.sqliteファイルを使うので、研究をあるインターフェースで始めて、別のインターフェースで証明できます。

  • コマンドラインのpotato label run|status|certify|certificate|export|calls|distill|optimize|migrate-config
  • /api/engine/v1以下のREST API
  • MCPサーバーの5つのengine_*ツール
  • Pythonのpotato.labeling_engine.sdk.Study
  • /admin/labeling-engineの管理ページ(コントラクトのステータス、誤り率とカバレッジの曲線、ソースごとの信頼性ダイアグラム、モデル呼び出しログを表示)

potato label exportは、出自付きのラベル、JSON・Markdown・HTML形式の証明書、データセットカード、呼び出しログを書き出します。ラベリングエンジンでは最初の研究の進め方を、ラベリングエンジンのコントラクトでは各コントラクトが何を検定し、どのように失敗するかを説明しています。

Solo Mode

Solo Modeは提案を隠せるようになりました。solo_mode.suggestionsは、すべての項目またはランダムサンプルでLLMのラベルを伏せます。画面に表示された提案は答えをそちらに引き寄せるため、引き継ぎの判断ではブラインドの項目での一致度を読みます。意思決定モデル(layaと任意の/v1/systemoneサーバー)を高速な第1段として使えるようになり、Solo Modeはラベリングの開始前と各バッチの前に、プロジェクトのai_budget.cap_usdを確認します。ゴールドセット、ラベリングのジュリー、カリキュラム順序付けも新しく加わりました。エンジンが有効なとき、Solo Modeは予測をエンジンのストアに書き込むので、エンジンはそれをキャリブレーションし、証明できます。設定はSolo Modeにあります。

一致度

/admin/iaaは、これまでサポート外としてスキップしていたspatial_annotation、temporal_grounding、tiered_annotation、および5つのエージェントトレーススキーマについても一致度を報告するようになりました。3Dオブジェクトと時間セグメントには平均マッチド集合一致度(偶然一致の補正はなし)が、エージェントトレースのステップには、各トレースの各ステップを単位とするKrippendorffのアルファとCohenのカッパが与えられます。/admin/api/agreementは構造化スキーマを報告しなくなり、代わりに/admin/iaaを案内します。ラベル名だけに還元すると、これらのスキーマではすべてのアノテーターの組の間で完全一致と表示されていたためです。同一の長さゼロのセグメント2つは、一致として数えられるようになりました。PublishingとPaper Modeは、ゴールドラベルと一致度の数値から機械の評定者を除外します。

2.10の研究に影響する修正

次の3つの修正は、すでに収集または報告した数値を変える可能性があります。

  • 画像ページが事前入力された答えを勝手に保存していました。 pre_annotationを持つimage_annotationスキーマで、キャンバスが読み込み後にレイアウトし直す際に、事前入力された図形をアノテーターの答えとして保存していたため、手を付けていない項目が回答済みとして数えられていました。プレアノテーションを使った2.10の画像研究では、保存された図形がプレアノテーションと完全に一致する項目は一度も触れられていない可能性があるので、タイミングデータが別のことを示していない限り、そうした項目は未レビューとして扱ってください。
  • Paper Modeは独自のコードでカッパを計算していました。 Paper Modeと一致度モジュールは、/admin/iaaと同じ関数でCohenのカッパを計算するようになりました。そのため、2.11より前にPaper Modeから報告したカッパは、同じデータに対して/admin/iaaが表示する値と異なることがあります。
  • 裁定とProlificの自動スケーリングが機械の評定者を数えていました。 機械のアノテーターが項目を裁定に回すことがあり、min_human_annotationsは無視され、Prolificの自動スケーリングは機械のアノテーションを項目ごとの上限に数えていました。

残りの修正は、研究でできることを変えるものです。cocodataset.orgのようにCORSヘッダーを送らないホストの画像が読み込めるようになりました。そうした画像では、塗りつぶし、SAM、テキストプロンプトによるセグメンテーションが、画像を読めない理由を表示するようになりました。colorのないプレアノテーションの図形は、破棄されずにそのラベルの色を使います。Solo Modeの「Generate prompt」は、最初のプロンプトをリビジョンモデルに書かせるようになりました。potato mcp connect経由の拒否は、成功ではなくツールのエラーとして返ります。エッジケースの発見はvLLMでも動作するようになりました。vLLMは、エッジケースのフィールドがレスポンススキーマに追加されるまでそれらを返していませんでした。

2.11のインストール

pip install --upgrade potato-annotationでアップグレードするか、ghcr.io/davidjurgens/potato:2.11.0をpullしてください。プロセス内で動くLaya意思決定モデルには新しいdecisionエクストラ(pip install 'potato-annotation[decision]')が必要です。これはtorchを取り込むため、allには含まれていません。リリースノートにはすべての変更が、What's Newには2.xの各リリースの概要があります。