Potato 2.11: движок разметки и сертифицированные машинные метки
Potato 2.11 размечает данные моделями, проверяет их метки на слепой выборке человеческих меток и пишет сертификат. Неактивные сессии завершаются через 8 часов.
В Potato 2.11 появился движок разметки. Он размечает набор данных моделями и по слепой случайной выборке человеческих меток измеряет, как часто модели ошибаются. Вы указываете, каким условиям должны удовлетворять готовые метки, например что не более 10% принятых машинных меток ошибочны с доверием 90%. Движок принимает те машинные метки, которые подтверждает статистический тест, отправляет остальные объекты людям и пишет сертификат, где записано, что проверялось и на скольких человеческих метках. Кроме того, отчёт о согласованности теперь охватывает 3D-объекты, временную привязку, многоуровневую разметку и трассы агентов, а ошибка в разметке изображений, из-за которой нетронутые объекты могли считаться отвеченными, исправлена.
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 на схеме тональности, добавляет к обычному исследованию два ключа:
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: 400confidence: {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.