Skip to content
Announcements7 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 там, где исследование зависит от непрерывного входа. Уже сохранённая разметка не затрагивается.

Три старых ключа выводят примечание при запуске. icl_labeling, judge_calibration и pre_annotation работают в точности как раньше, и каждый пишет в stderr строку, начинающуюся с NOTE:, где назван его эквивалент в движке. Примечания носят информационный характер, поэтому potato validate --strict из-за них не падает. Эти ключи планируется удалить в 3.0, а potato label migrate-config сам пишет эквивалентный блок labeling_engine.

Движок разметки

Движок рассчитан на исследования, где объектов больше, чем способны разметить люди, а модель права в большинстве случаев. Модели для него служат источниками: он опрашивает их каскадом в том порядке, в каком вы их перечислили, и после последнего источника отправляет объект человеку. Источниками могут быть LLM, визуально-языковые модели, модели принятия решений вроде Laya, детекторы YOLO, LLM-судьи, жюри, модели, обученные на метках самого исследования, или метки, которые у вас уже есть.

То, что проверяет движок, называется контрактом. Главный из них, selective_risk, ограничивает долю ошибочных среди принятых машинных меток. Движок выбирает порог уверенности на одной половине слепой выборки и проверяет его на другой односторонним биномиальным тестом по процедуре fixed-sequence Learn-then-Test. Каждый новый тест идёт на более строгом уровне, поэтому повторная сертификация до первого успешного теста не завышает доверие. Контракт ppi сообщает распространённость каждой метки с интервалом, построенным методом prediction-powered inference, который остаётся корректным при любом качестве модели. no_worse_than_human запускает тест альтернативного разметчика для замены человека или судьи, а distributional сравнивает распределение меток модели с тем, как расходятся люди на субъективных объектах.

Конфигурация, которая сертифицирует одну LLM на схеме тональности, добавляет к обычному исследованию два ключа:

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} берёт уверенность модели из вероятностей её токенов. Это один вызов на объект, и обычно среди методов оценки уверенности в движке этот откалиброван лучше всех. Контракт допускает не более 10% ошибочных принятых меток, а его доверие 90% является значением Potato по умолчанию. budgets.human_labels ограничивает число запросов к людям, которые может открыть движок, и 400 взято из текстового примера, поставляемого с Potato.

Текстовый пример из поставки Potato пропускает 481 отзыв через каскад, где Laya стоит перед Gemma 12B. В этом прогоне контракт на 10% был выполнен на 165 человеческих метках, и движок принял 316 машинных меток, все от Gemma, потому что порог Laya так и не был зафиксирован. Их измеренная ошибка относительно эталонных меток составила 7,6%. Пример с трассами агентов содержит 288 синтетических трасс с эталонными исходами. Судья был прав в 80% из них, но ставил уверенность 1,0 каждому вердикту, так что selective_risk было не на чем выбирать порог, и контракт остался невыполнимым. Интервал PPI для успешности задачи по тем же данным, [0,57; 0,76], накрыл эталонную долю 0,60, тогда как один судья давал 0,76.

Пределы выполненного контракта

Выполненный контракт говорит о согласии с людьми, которые разметили выборку. Движок не проверяет, правы ли эти люди, поэтому контракт, проверенный на небрежных разметчиках, сертифицирует согласие с небрежными разметчиками. Три правила обеспечивают, чтобы это утверждение было верным. Калибровочные запросы слепые: пока человек работает с таким запросом, страница не показывает ни предразметки, ни вердикта судьи, ни помощи ИИ. Пороги выбираются на одной половине выборки и проверяются на другой. Сертифицируют только человеческие метки, а любое изменение источника, промпта или схемы помечает затронутые контракты как stale, пока их не проверят заново.

Интерфейсы движка

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

  • potato label run|status|certify|certificate|export|calls|distill|optimize|migrate-config в командной строке;
  • REST API по адресу /api/engine/v1;
  • пять инструментов engine_* в MCP-сервере;
  • potato.labeling_engine.sdk.Study в Python;
  • админ-страница /admin/labeling-engine со статусом контрактов, кривой ошибки в зависимости от покрытия, диаграммой надёжности для каждого источника и журналом вызовов моделей.

potato label export записывает метки вместе с их происхождением, сертификат в форматах JSON, Markdown и HTML, карточку набора данных и журнал вызовов. Страница Движок разметки проводит через первое исследование, а Контракты движка разметки описывают, что проверяет каждый контракт и как он может не выполниться.

Solo Mode

Solo Mode теперь умеет скрывать свою подсказку. solo_mode.suggestions убирает метку LLM на всех объектах или на случайной выборке. Подсказка на экране тянет ответ к себе, поэтому при передаче решения согласие считывается по слепым объектам. Модели принятия решений (laya и любой сервер /v1/systemone) могут служить быстрым первым уровнем, а Solo Mode проверяет ai_budget.cap_usd проекта перед началом разметки и перед каждым пакетом. Также появились золотой набор, жюри разметки и упорядочивание по учебной программе. Когда движок включён, Solo Mode записывает свои предсказания в хранилище движка, чтобы тот мог их откалибровать и сертифицировать. Конфигурации приведены на странице Solo Mode.

Согласованность

/admin/iaa теперь сообщает согласованность для spatial_annotation, temporal_grounding, tiered_annotation и пяти схем для трасс агентов, которые раньше пропускались как неподдерживаемые. Для 3D-объектов и временных сегментов считается средняя согласованность сопоставленных множеств без поправки на случайность, а для шагов трасс агентов считаются альфа Криппендорфа и каппа Коэна, где единицей служит каждый шаг каждой трассы. /admin/api/agreement больше не сообщает структурированные схемы и отсылает к /admin/iaa, потому что после сведения к названиям меток эти схемы показывали полное согласие у любой пары разметчиков. Два одинаковых сегмента нулевой длины теперь считаются согласными. Publishing и Paper Mode исключают машинных оценщиков из золотых меток и показателей согласованности.

Исправления, которые затрагивают исследования на 2.10

Три исправления могут изменить числа, которые вы уже собрали или опубликовали:

  • Страница с изображением сама сохраняла предзаполненный ответ. В схеме image_annotation с pre_annotation холст сохранял предзаполненные фигуры как ответ разметчика, когда перестраивал раскладку после загрузки, и нетронутый объект считался отвеченным. Если в исследовании изображений на 2.10 была предразметка, то объект, сохранённые фигуры которого в точности совпадают с его предразметкой, мог остаться нетронутым, поэтому считайте такие объекты непроверенными, если данные о времени не говорят об обратном.
  • Paper Mode считал каппу собственным кодом. Теперь Paper Mode и модуль согласованности считают каппу Коэна той же функцией, что и /admin/iaa, поэтому каппа, полученная в Paper Mode до 2.11, может отличаться от той, что /admin/iaa показывает для тех же данных.
  • Арбитраж и автомасштабирование Prolific учитывали машинных оценщиков. Машинные разметчики могли отправить объект на арбитраж, min_human_annotations игнорировался, а автомасштабирование Prolific засчитывало машинную разметку в лимиты на объект.

Остальные исправления меняют то, что может исследование. Изображения с хостов, которые не отправляют заголовки CORS, например cocodataset.org, теперь загружаются. На таком изображении заливка, SAM и сегментация по текстовому запросу теперь сообщают, почему не могут его прочитать. Фигура из предразметки без color берёт цвет своей метки, а не отбрасывается. Кнопка «Generate prompt» в Solo Mode теперь просит модель ревизии написать первый промпт. Отказы через potato mcp connect возвращаются как ошибки инструмента, а не как успешные вызовы. Поиск пограничных случаев теперь работает на vLLM, который не возвращал поля пограничных случаев, пока их не добавили в схему ответа.

Установка 2.11

Обновитесь командой pip install --upgrade potato-annotation или скачайте образ ghcr.io/davidjurgens/potato:2.11.0. Встроенной модели принятия решений Laya нужен новый extra decision, pip install 'potato-annotation[decision]'. Он не входит в all, потому что тянет за собой torch. В заметках о выпуске перечислены все изменения, а на странице Что нового есть сводка по каждому выпуску 2.x.