Конфигурация движка разметки
Все ключи блока labeling_engine: источники и методы уверенности, пулы людей, траты на краудсорсинг, бюджеты, лимиты, функции и то, что отклоняет валидация.
Всё, что делает движок разметки, задаётся в одном блоке 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 находятся пять ключей:
| Ключ | По умолчанию | Значение |
|---|---|---|
enabled | false | Включает движок. Включённому движку нужен хотя бы один источник. |
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 | ИИ-эндпоинт, например vllm, openai, anthropic, gemini, ollama, openrouter, openai_vision, ollama_vision, laya или systemone. Для detector по умолчанию yolo. |
model | по умолчанию эндпоинта | Имя модели. |
base_url | нет | URL сервера для эндпоинтов на своих серверах или совместимых с OpenAI. |
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 других источников. |
aggregation | plurality | Только для jury. Правило относительного большинства единственное. |
field / predictions_file | нет | Только для static. Где лежат существующие метки. Поле содержит {scheme: label} или просто метку, если источник размечает одну схему. Если поле имеет неверную форму на каждом объекте, прогон завершается ошибкой с сообщением, которое его называет. |
error_rate, seed | нет | Только для fixture. Синтетический источник с известной долей ошибок, для тестов. |
revision | нет | Ревизия модели, которую нужно записать в версию, например хеш чекпойнта. |
Всё, что может изменить ответ (модель, промпт, температура, параметры), входит в хеш версии источника. Новая версия делает stale каждый контракт, зависящий от этого источника.
Ответ, который не является допустимым значением схемы, например метка не из её списка, нечисловое значение в числовом поле или список в схеме «один из N», записывается как ошибка и никогда как метка, а сообщение прогона подсчитывает такие ошибки. Объект, вызовы по которому завершились сбоем, запрашивается снова в последующих прогонах, не больше трёх раз на версию источника, после чего ждёт изменённого источника (исправленный ключ или промпт даёт новую версию). Прогон, в котором сбоит один источник, не останавливает остальные уровни. Следующий уровень размечает каждый объект, а potato label run завершается со статусом 1 и называет сбойный источник.
Методы уверенности
Правила принятия движка ставят порог по уверенности каждого предсказания, поэтому то, как источник выражает уверенность, определяет, сколько движок сможет принять. confidence.method принимает одно из пяти значений:
confidence.method | Применяется к | Что делает |
|---|---|---|
verbalized | llm, vlm, judge | Модель называет число от 0 до 100 в ответе. Один вызов, наименее надёжный метод. |
k_sample | llm | samples ответов (по умолчанию 5) при sample_temperature (по умолчанию 0.7). Меткой становится самый частый ответ, а уверенностью его доля. Стоит k вызовов. |
logprob | llm | Метки обозначаются буквами, модель отвечает одной буквой, а уверенность считывается из вероятностей первого токена. Один вызов, обычно откалиброван лучше всех. Нужен бэкенд, который возвращает logprobs (vLLM, совместимые с OpenAI), и не больше 20 меток, а схема с большим числом является ошибкой валидации. |
native | decision, detector, trained | Собственные вероятности модели. В источнике llm это ошибка валидации. |
auto | все | native, где источник его поддерживает, иначе verbalized. |
Параметры отдельных видов
Пять видов источников читают собственные параметры:
decisionохватывает Laya внутри процесса или любой сервер/v1/systemone, например размещённые Jev или OpenJev. Один прямой проход возвращает вероятность для каждого варианта, и это работает на схемахradio,select,likertиslider.endpoint_typeдолжен бытьlayaилиsystemone, иsystemoneнуженbase_url, корень сервера (URL, оканчивающийся на/v1/systemone, тоже принимается). В обоих случаях состояние отправляется как{"text": ...}, поэтому один чекпойнт даёт одинаковые ответы внутри процесса и за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, который спрашивает дважды с обратным порядком меток и превращает меняющийся вердикт в воздержание. На схемах для трасс агентов (process_reward,trajectory_eval, ...) судья размечает каждый шаг.vlmиспользует визуальный эндпоинт (openai_vision,anthropic_vision,ollama_vision). Для модели на своём сервере за совместимым с OpenAI сервером используйтеopenai_visionсbase_url.trainedпринимаетartifact_dir,trainer(по умолчаниюsklearn-text) иrun_id. Этот источник обычно создаёт дистилляция, а не написанная вручную конфигурация.
humans
Блок humans задаёт, кто размечает и как движок отбирает объекты для людей:
| Ключ | По умолчанию | Значение |
|---|---|---|
pools | [team] | Кто размечает: team, crowd, solo. |
calibration_rate | auto | Доля объектов, отбираемых для слепой калибровки. auto выбирает долю по прогнозам контрактов: достаточно меток на класс, чтобы его можно было проверить, но не больше половины небольшого исследования и пятой части исследования свыше 1 000 объектов. |
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 | Как метки нескольких людей на одном объекте превращаются в метку, по которой проверяют контракты: majority или dawid_skene. |
verify_visibility | shown | Показывает ли запрос на проверку ответ машины (shown) или нет (blind). |
crowd
Блок crowd действует, когда crowd входит в humans.pools, и 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 | Объектов в одном фиксируемом фрагменте. Прерванный прогон продолжается со следующего фрагмента без повторных вызовов. |
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 | Маскировать адреса электронной почты, URL, IP-адреса, номера карт, SSN, номера телефонов и @-имена, прежде чем текст уйдёт в сторонний API. Журнал вызовов записывает замаскированное в виде категорий и хешей, но никогда не текстом. |
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 | Обучать также на машинных метках, сертифицированных контрактом, с пометкой silver. |
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; - контракт на схеме, которую не может разметить ни один источник каскада, с причиной для каждого источника;
- контракт на схеме, которую движок не умеет оценивать (свободный текст, попарные схемы);
- источник
decision, чейendpoint_typeне является моделью принятия решений, и источникllm,vlmилиjudge, чейendpoint_typeею является; no_worse_than_humanсhumans.overlap_kменьше 3.
Валидация также предупреждает, когда budgets.human_labels слишком мал, чтобы сертифицировать контракт selective_risk, даже если бы все ответы машины были верны. Увеличивайте бюджет или ослабляйте error, пока это предупреждение не исчезнет.
Дополнительные материалы
- Движок разметки
- Контракты движка разметки
- Командная строка, REST API, инструменты MCP и SDK
- Поддержка ИИ, где описаны типы эндпоинтов, общие для источников и остального Potato
Подробности реализации смотрите в исходной документации.