Skip to content

Конфигурация движка разметки

Все ключи блока labeling_engine: источники и методы уверенности, пулы людей, траты на краудсорсинг, бюджеты, лимиты, функции и то, что отклоняет валидация.

Всё, что делает движок разметки, задаётся в одном блоке labeling_engine. Неверный блок останавливает сервер при запуске и перечисляет все проблемы сразу. Чтобы разметчики получали запросы движка, задайте также assignment_strategy: engine. Эта стратегия без включённого движка является ошибкой валидации.

Блок состоит из следующих разделов, каждый из которых описан ниже:

yaml
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 находятся пять ключей:

КлючПо умолчаниюЗначение
enabledfalseВключает движок. Включённому движку нужен хотя бы один источник.
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} подставляется.
temperature0.0От 0 до 2.
max_tokens256Лимит выходных токенов на вызов.
timeoutпо умолчанию эндпоинтаСекунд на вызов.
promptстроится по схемеШаблон промпта. Его изменение создаёт новую версию источника.
confidence{method: auto}Как источник выражает уверенность. См. Методы уверенности.
concurrencyruntime.concurrencyПараллельные вызовы к этому источнику.
schemasвсе схемы движкаОграничивает источник этими схемами.
options{}Параметры конкретного вида, перечислены ниже.
judge{}Только для judge. Те же параметры, что и в options, под собственным ключом, и где заданы оба, побеждает options.
membersнетТолько для jury. Не меньше двух id других источников.
aggregationpluralityТолько для jury. Правило относительного большинства единственное.
field / predictions_fileнетТолько для static. Где лежат существующие метки. Поле содержит {scheme: label} или просто метку, если источник размечает одну схему. Если поле имеет неверную форму на каждом объекте, прогон завершается ошибкой с сообщением, которое его называет.
error_rate, seedнетТолько для fixture. Синтетический источник с известной долей ошибок, для тестов.
revisionнетРевизия модели, которую нужно записать в версию, например хеш чекпойнта.

Всё, что может изменить ответ (модель, промпт, температура, параметры), входит в хеш версии источника. Новая версия делает stale каждый контракт, зависящий от этого источника.

Ответ, который не является допустимым значением схемы, например метка не из её списка, нечисловое значение в числовом поле или список в схеме «один из N», записывается как ошибка и никогда как метка, а сообщение прогона подсчитывает такие ошибки. Объект, вызовы по которому завершились сбоем, запрашивается снова в последующих прогонах, не больше трёх раз на версию источника, после чего ждёт изменённого источника (исправленный ключ или промпт даёт новую версию). Прогон, в котором сбоит один источник, не останавливает остальные уровни. Следующий уровень размечает каждый объект, а potato label run завершается со статусом 1 и называет сбойный источник.

Методы уверенности

Правила принятия движка ставят порог по уверенности каждого предсказания, поэтому то, как источник выражает уверенность, определяет, сколько движок сможет принять. confidence.method принимает одно из пяти значений:

confidence.methodПрименяется кЧто делает
verbalizedllm, vlm, judgeМодель называет число от 0 до 100 в ответе. Один вызов, наименее надёжный метод.
k_samplellmsamples ответов (по умолчанию 5) при sample_temperature (по умолчанию 0.7). Меткой становится самый частый ответ, а уверенностью его доля. Стоит k вызовов.
logprobllmМетки обозначаются буквами, модель отвечает одной буквой, а уверенность считывается из вероятностей первого токена. Один вызов, обычно откалиброван лучше всех. Нужен бэкенд, который возвращает logprobs (vLLM, совместимые с OpenAI), и не больше 20 меток, а схема с большим числом является ошибкой валидации.
nativedecision, 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_rateautoДоля объектов, отбираемых для слепой калибровки. auto выбирает долю по прогнозам контрактов: достаточно меток на класс, чтобы его можно было проверить, но не больше половины небольшого исследования и пятой части исследования свыше 1 000 объектов.
dev_fraction0.5Доля калибровочных меток, по которым выбираются пороги. Остальные их проверяют.
min_calibration_per_class10Минимум на класс, прежде чем проверяются контракты по классам.
audit_rate0.02Доля новых принятых машинных меток, которые вслепую отправляются обратно людям, чтобы следить за дрейфом.
overlap0.0Доля калибровочных объектов, размечаемых несколькими людьми.
overlap_k3Людей на объект с перекрытием. Контракту no_worse_than_human нужно 3.
distribution_k5Людей на объект для контрактов distributional.
truthmajorityКак метки нескольких людей на одном объекте превращаются в метку, по которой проверяют контракты: majority или dawid_skene.
verify_visibilityshownПоказывает ли запрос на проверку ответ машины (shown) или нет (blind).

crowd

Блок crowd действует, когда crowd входит в humans.pools, и Prolific является единственной краудсорсинговой платформой, которой может управлять движок:

КлючПо умолчаниюЗначение
providerprolificКраудсорсинговая платформа.
study_idнетИсследование Prolific, размер которого нужно менять.
reward_usdнетВознаграждение за место, для прогнозов стоимости.
per_worker_quota20Запросов на исполнителя. Число мест равно 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_size32Объектов в одном фиксируемом фрагменте. Прерванный прогон продолжается со следующего фрагмента без повторных вызовов.
concurrency4Параллельных вызовов на источник; собственный concurrency источника имеет приоритет.
cachetrueПовторно использовать ответы на одинаковые запросы к той же версии источника.
retries2Дополнительные попытки после тайм-аута, ошибки соединения, 429 или 5xx. Каждая попытка записывается в журнал.
planner_interval30Секунд между проходами планировщика на сервере.
hold_minutes60Минут, которые человек может держать запрос без ответа, прежде чем тот вернётся в пул. Объект также исчезает с его страницы, так что оставленная открытой вкладка не сможет ответить на него позже.

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 движок обучает дешёвую модель на метках исследования и ставит её первой в каскаде:

КлючПо умолчаниюЗначение
trainersklearn-textТренер из potato/training.
min_labels200Обучать, только когда есть столько меток.
include_silvertrueОбучать также на машинных метках, сертифицированных контрактом, с пометкой silver.
every2.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, пока это предупреждение не исчезнет.

Дополнительные материалы

Подробности реализации смотрите в исходной документации.