ラベリングエンジンの設定
labeling_engineブロックのすべてのキー。ソースと信頼度の求め方、人のプール、クラウドソーシングへの支出、予算、実行時の制限、機能、検証で拒否される内容を扱います。
ラベリングエンジンの動作はすべて、1つのlabeling_engineブロックで設定します。ブロックが無効な場合、サーバーは起動時に停止し、すべての問題をまとめて一覧表示します。アノテーターにエンジンの依頼を提示するには、assignment_strategy: engineも設定してください。エンジンを有効にせずにこの戦略を設定すると、検証エラーになります。
ブロックには次のセクションがあり、それぞれ以下で説明します。
assignment_strategy: engine
labeling_engine:
enabled: true
schemas: [sentiment] # default: every scheme a source can label
sources: []
cascade: [laya, gemma] # default: the first source alone
contracts: []
humans: {}
crowd: {}
budgets: {}
runtime: {}
features: {}
redaction: {}
distill: {}トップレベルのキー
labeling_engineの直下には5つのキーがあります。
| キー | デフォルト | 意味 |
|---|---|---|
enabled | false | エンジンを有効にします。有効なエンジンには少なくとも1つのソースが必要です。 |
schemas | すべて | エンジンがラベルを付けるアノテーションスキーマ。assignment_strategy: engineのもとでは、ここから外したスキーマは、すべての項目ではなく、エンジンが自分のスキーマのために人に回した項目でのみ回答され、検証でその旨の警告が出ます。どのソースもラベルを付けられないスキーマ(たとえば自由記述)はエンジンに含められないので、この戦略のもとではすべての項目で回答されることはありません。すべての項目で回答させる必要がある場合は、別の割り当て戦略を使ってください。 |
sources | [] | モデル。ソースを参照してください。 |
cascade | 最初のソース | 試す順に並べたソースのid。最後のソースの後は人に回ります。 |
contracts | [] | ラベルが満たすべき条件。コントラクトを参照してください。 |
ソース
ソースとは、各項目に対してラベルと信頼度を提案するモデル、または既存のラベルの集合です。すべてのソースは一意のidとkindを持ち、ソースに未知のキーがあるとエラーになります。
| キー | デフォルト | 意味 |
|---|---|---|
id | 必須 | cascade、呼び出しログ、証明書で使う名前。 |
kind | 必須 | llm、vlm、decision、detector、judge、jury、trained、static、fixture、asr、lf、simulatorのいずれか。 |
endpoint_type | llm、vlm、decision、judgeでは必須 | AIエンドポイント。vllm、openai、anthropic、gemini、ollama、openrouter、openai_vision、ollama_vision、laya、systemoneなど。detectorのデフォルトはyoloです。 |
model | エンドポイントのデフォルト | モデル名。 |
base_url | なし | セルフホストまたはOpenAI互換のエンドポイントのサーバーURL。 |
api_key | なし | バージョンのハッシュに含まれることはなく、エクスポートもされません。${ENV_VAR}は置換されます。 |
temperature | 0.0 | 0から2。 |
max_tokens | 256 | 呼び出しごとの出力トークンの上限。 |
timeout | エンドポイントのデフォルト | 呼び出しごとの秒数。 |
prompt | スキーマから生成 | プロンプトのテンプレート。変更すると新しいソースのバージョンになります。 |
confidence | {method: auto} | ソースが信頼度をどう示すか。信頼度の求め方を参照してください。 |
concurrency | runtime.concurrency | このソースへの並列呼び出し数。 |
schemas | エンジンのすべてのスキーマ | ソースをこれらのスキーマに限定します。 |
options | {} | 種類ごとのオプション(下記参照)。 |
judge | {} | judgeのみ。optionsと同じオプションを独自のキーの下に置きます。両方で同じものを設定した場合はoptionsが優先されます。 |
members | なし | juryのみ。他のソースのidを少なくとも2つ。 |
aggregation | plurality | juryのみ。使えるルールは相対多数のみです。 |
field / predictions_file | なし | staticのみ。既存のラベルの場所。フィールドは{scheme: label}を保持するか、ソースが1つのスキーマにラベルを付ける場合はラベルそのものを保持します。すべての項目でフィールドの形式が誤っていると、そのフィールドを示すメッセージとともに実行が失敗します。 |
error_rate, seed | なし | fixtureのみ。誤り率が既知の合成ソースで、テスト用です。 |
revision | なし | バージョンに記録するモデルのリビジョン。たとえばチェックポイントのハッシュ。 |
答えを変えうるもの(モデル、プロンプト、temperature、オプション)はすべてソースのバージョンハッシュに含まれます。新しいバージョンになると、そのソースに依存するすべてのコントラクトがstaleになります。
スキーマが保持できない値の答え、たとえば一覧にないラベル、数値でない数値フィールド、N択の単一選択スキーマに対するリストなどは、エラーとして記録され、ラベルとして記録されることはありません。実行時のメッセージはこうしたエラーの数を示します。呼び出しが失敗した項目は、以後の実行で再び依頼されます。これはソースのバージョンごとに最大3回までで、その後はソースが変わるまで待機します(キーやプロンプトを修正すると新しいバージョンになります)。1つのソースが失敗した実行でも、他の段は止まりません。次の段がすべての項目にラベルを付け、potato label runはステータス1で終了し、失敗したソースの名前を示します。
信頼度の求め方
エンジンの受理ルールは各予測の信頼度にしきい値を設けるので、ソースが信頼度をどう示すかによって、エンジンがどれだけ受理できるかが決まります。confidence.methodは次の5つの値のいずれかを取ります。
confidence.method | 対象 | 動作 |
|---|---|---|
verbalized | llm、vlm、judge | モデルが返答の中で0〜100の値を述べます。1回の呼び出しで済みますが、最も信頼性の低い方法です。 |
k_sample | llm | sample_temperature(デフォルトは0.7)でsamples回(デフォルトは5回)返答させます。ラベルは最も多かった答えで、信頼度はその割合です。k回の呼び出しがかかります。 |
logprob | llm | ラベルにアルファベットを振り、モデルは1文字で答え、最初のトークンの確率から信頼度を読み取ります。1回の呼び出しで済み、通常は最もよく較正されています。logprobsを返すバックエンド(vLLM、OpenAI互換)と20個以下のラベルが必要で、それより多いスキーマは検証エラーになります。 |
native | decision、detector、trained | モデル自身の確率。llmソースでは検証エラーになります。 |
auto | すべて | ソースが持っていればnative、そうでなければverbalized。 |
種類ごとのオプション
5種類のソースが独自のオプションを読みます。
- **
decision**は、プロセス内のLaya、またはホスト版のJevやOpenJevなど任意の/v1/systemoneサーバーを対象とします。1回のフォワードパスですべての選択肢の確率を返し、radio、select、likert、sliderのスキーマで動作します。endpoint_typeはlayaかsystemoneでなければならず、systemoneにはサーバーのルートであるbase_urlが必要です(/v1/systemoneで終わるURLも受け付けます)。どちらの場合も状態は{"text": ...}として送られるので、1つのチェックポイントはプロセス内でもlaya-serveの背後でも同じ答えを返します。options: {state_key: ""}を指定すると、代わりに文字列そのものを送ります。評定尺度(likert、slider)では、Layaのスコアは尺度をほとんど追えないことがあるので、頼る前にいくつかの項目で確認してください。プロセス内のlayaエンドポイントにはpip install 'potato-annotation[decision]'が必要です。 - **
detector**は、image_annotationスキーマで物体検出器からボックスを読み取ります。keep_threshold(0.35)は、ボックスが予測に含まれるスコアの下限です。candidate_threshold(0.05)とkeep_thresholdの間にあるボックスは、画像の信頼度を下げます。label_mapは検出器のクラスをスキーマのラベルに対応付け、対応付けのないクラスは無視されます。image_fieldは、画像のパスまたはURLを持つ項目フィールドの名前です。パスはアノテーションページと同じ方法で解決され、/media/x.jpgはタスクのmedia_directoryの下、相対パスはtask_dirの下になります。 - **
judge**は、rubric(デフォルトはスキーマの説明)、fields(判定者に示す項目フィールドを順に指定)、swap_order(ラベルの順序を逆にして2回尋ね、判定が入れ替わった場合は棄権扱いにする)を取ります。エージェントトレースのスキーマ(process_reward、trajectory_eval、...)では、判定者は各ステップにラベルを付けます。 - **
vlm**は視覚エンドポイント(openai_vision、anthropic_vision、ollama_vision)を使います。OpenAI互換サーバーの背後にあるセルフホストのモデルには、base_urlを付けてopenai_visionを使ってください。 - **
trained**は、artifact_dir、trainer(デフォルトはsklearn-text)、run_idを取ります。このソースは通常、手書きの設定ではなく蒸留によって作られます。
humans
humansブロックは、誰がラベルを付けるか、エンジンがそれをどうサンプリングするかを設定します。
| キー | デフォルト | 意味 |
|---|---|---|
pools | [team] | ラベルを付ける人:team、crowd、solo。 |
calibration_rate | auto | ブラインドのキャリブレーション用に抽出する項目の割合。autoはコントラクトの見積もりから割合を決めます。クラスごとに検定できるだけのラベルを確保し、小規模な研究では最大で半分、1,000項目を超える研究では最大で5分の1です。 |
dev_fraction | 0.5 | しきい値の選択に使うキャリブレーションラベルの割合。残りでそれを検定します。 |
min_calibration_per_class | 10 | クラスごとのコントラクトを検定する前に必要な、クラスあたりの最小数。 |
audit_rate | 0.02 | 新たに受理した機械ラベルのうち、ドリフトを見張るためにブラインドで人に戻す割合。 |
overlap | 0.0 | キャリブレーション項目のうち、複数の人がラベルを付ける割合。 |
overlap_k | 3 | 重複項目あたりの人数。no_worse_than_humanコントラクトには3が必要です。 |
distribution_k | 5 | distributionalコントラクトのための項目あたりの人数。 |
truth | majority | 1つの項目に対する複数人のラベルから、コントラクトの検定基準となるラベルを決める方法。majorityまたはdawid_skene。 |
verify_visibility | shown | 検証の依頼で機械の答えを表示するか(shown)、しないか(blind)。 |
crowd
crowdブロックはhumans.poolsにcrowdが含まれる場合に適用されます。エンジンが操作できるクラウドソーシングのプラットフォームはProlificだけです。
| キー | デフォルト | 意味 |
|---|---|---|
provider | prolific | クラウドソーシングのプラットフォーム。 |
study_id | なし | 枠数を変更するProlificの研究。 |
reward_usd | なし | 枠あたりの報酬。費用の見積もりに使います。 |
per_worker_quota | 20 | ワーカーあたりの依頼数。枠の数はceil(open requests / quota)です。 |
クラウドソーシングでの募集はデフォルトでドライランで、プランナーは何を行うかを報告します。実際にお金を使うにはfeatures.crowd_live_spend: trueとbudgets.human_usdの上限が必要で、上限なしで実際の支出を有効にした設定は拒否されます。Prolificの研究自体の設定はクラウドソーシングで説明しています。
budgets
budgetsブロックは、上限を超える前に支出を止めます。
| キー | 意味 |
|---|---|
model_usd | この金額を使った時点で、料金のかかるモデルの呼び出しを止めます。各呼び出しは、まず見積もった費用を確保します。料金のないモデルや、localhost上のセルフホストのモデルはこの上限の対象外です。 |
human_usd | クラウドソーシングへの支出の上限。クラウドソーシングで実際に支出する場合は必須です。 |
human_labels | エンジンが開ける人への依頼の最大数。各依頼を開いた時点で数えます。 |
runtime
runtimeブロックは、バッチ処理、並列度、人が依頼を受け持てる時間を制御します。
| キー | デフォルト | 意味 |
|---|---|---|
batch_size | 32 | コミットする1チャンクあたりの項目数。強制終了された実行は、呼び出しを繰り返すことなく次のチャンクから再開します。 |
concurrency | 4 | ソースごとの並列呼び出し数。ソース自身のconcurrencyで上書きされます。 |
cache | true | 同じソースバージョンへの同一リクエストに対する返答を再利用します。 |
retries | 2 | タイムアウト、接続エラー、429、5xxの後に行う追加の試行回数。すべての試行が記録されます。 |
planner_interval | 30 | サーバー内でのプランナー処理の間隔(秒)。 |
hold_minutes | 60 | 人が回答せずに依頼を受け持てる時間(分)。過ぎると依頼はプールに戻ります。項目はその人のページからも消えるので、開いたままのタブが後から回答することはできません。 |
features
driftを除き、すべての機能はデフォルトで無効です。
| キー | 有効にする内容 |
|---|---|
drift | デフォルトで有効。監査の結果に基づいて動作します。受理されたラベルの誤り率が目標を上回ることが監査で示されると、コントラクトはviolatedとなり、そのスキーマでは機械ラベルが受理されなくなり、新たなキャリブレーションラベルが抽出されます。証明のたびに新しい監査系列が始まるので、修正後に再び証明すると受理が再開されます。falseにすると違反を報告するだけになり、コントラクトの表示は「met, audits breached」になります。 |
distill | 研究のラベルでモデルを学習し、カスケードの先頭に置きます(distillを参照)。 |
optimize | プランナーの各処理で、カスケードのすべての部分集合をdevラベルでスコア付けし、コントラクトのカバレッジを保つ最も安価なものをGET /api/engine/v1/schemes/<name>/optimizeで報告します。何も適用されません。カスケードの採用は設定の変更であり、新たな証明が必要になるためです。 |
crowd_recruit | プランナーにProlificの研究の規模を決めさせます。crowd_live_spendが有効でない限りドライランです。 |
crowd_live_spend | Prolificの研究を実際に変更します。crowdプールとbudgets.human_usdが必要です。 |
pii_redaction | テキストが外部のAPIに送られる前に、メールアドレス、URL、IPアドレス、カード番号、SSN、電話番号、@ハンドルをマスクします。呼び出しログには、マスクした内容がカテゴリとハッシュとして記録され、テキストそのものは記録されません。 |
payload_capture | プロンプトと返答の全文を<task_dir>/engine_payloads/に保存します。デフォルトでは無効で、呼び出しログにはハッシュだけが残ります。 |
redaction
redaction.categoriesは、email、url、ip、card、ssn、phone、handleのうちどれをマスクするかを列挙し、デフォルトはすべてです。マスクはfeatures.pii_redactionが有効な場合に、外部のAPIに対してのみ適用されます。セルフホスト型のエンドポイント(vllm、ollama、laya、yolo、...)は、どこで動いていてもマスクされず、base_urlが同じマシン上にあるエンドポイントもマスクされません。
distill
features.distillが有効な場合、エンジンは研究のラベルで安価なモデルを学習し、カスケードの先頭に置きます。
| キー | デフォルト | 意味 |
|---|---|---|
trainer | sklearn-text | potato/trainingのトレーナー。 |
min_labels | 200 | ラベルがこの数に達してから学習します。 |
include_silver | true | コントラクトが証明した機械ラベルにもシルバーの印を付けて学習に使います。 |
every | 2.0 | ラベル数がこの倍率まで増えたら再学習します。 |
certと監査の分割に含まれる項目は学習セットに入らないので、蒸留モデルが学習に使ったラベルで検定されることはありません。
検証
potato validate config.yamlは、設定の他の部分とともにlabeling_engineブロックを確認し、各エラーにはlabeling_engine.sources[1].kind must be one of ...やlabeling_engine.contracts[0].error is required for selective_riskのようにキーの名前が示されます。検証では次のものも拒否されます。
errorの綴り間違いなど、そのコントラクトの種類が読まないコントラクトのキー- カスケードのどのソースもラベルを付けられないスキーマに対するコントラクト(各ソースの理由付き)
- エンジンがスコア付けできないスキーマ(自由記述、ペアワイズ)に対するコントラクト
endpoint_typeが意思決定モデルでないdecisionソース、およびendpoint_typeが意思決定モデルであるllm、vlm、judgeソースhumans.overlap_kが3未満のno_worse_than_human
また、すべての機械の答えが正しかったとしてもselective_riskコントラクトを証明できないほどbudgets.human_labelsが小さい場合にも、検証で警告が出ます。その警告が消えるまで、予算を増やすかerrorを緩めてください。
参考資料
- ラベリングエンジン
- ラベリングエンジンのコントラクト
- コマンドライン、REST API、MCPツール、SDK
- ソースがPotatoの他の部分と共有するエンドポイントの種類については、AIサポート
実装の詳細については、ソースドキュメントを参照してください。