TL;DR
Если вы просите LLM разметить тексты по списку меток с определениями (кодбук, то есть инструкция разметки), общая точность почти ничего не гарантирует. Средний балл может выглядеть прилично, а редкие метки при этом размечаются плохо. Ответы плывут от прогона к прогону. Модель часто опирается на названия меток, а не на ваши определения. Рецепты «как писать кодбук» из других статей на ваших данных могут сработать наоборот.
Типичная боль такая. В отчёте «точность 60%», вы считаете частоты по категориям и делаете выводы. Но редкая метка размечается заметно хуже общего среднего. Модель к тому же ставит метки щедрее, чем эксперты, и завышает частоту явлений. Второй запуск на тех же текстах даёт другие цифры. Причина простая: итоговый балл усредняет все метки, и у частых категорий он высокий. Редкие метки в этом среднем почти не видны. Модель при этом читает название метки и достраивает смысл из общих знаний, а не из вашего определения.
Авторы предлагают минимальный набор проверок. Считать качество по каждой метке отдельно. Прогнать разметку несколько раз. Подменить названия меток нейтральными («Метка 1») или перемешать названия и определения, чтобы проверить, читает ли модель определения. Проверить кодбук на тексте из другого источника. Если промпт улучшала сама LLM, перечитать определения меток: они могли сдвинуться по смыслу.
Схема метода
ШАГ 1: Собери контрольную выборку, размеченную людьми → таблица «текст — эталонные метки»
ШАГ 2: Разметь её моделью и считай качество ПО КАЖДОЙ метке → найди худшую метку и разрыв со средним
ШАГ 3: Диагностика «читает ли модель определения» (три отдельных запроса):
• Label-Only — только названия, без определений
• Generic — названия заменены на «Метка 1, Метка 2…»
• Swapped — названия и определения перемешаны
ШАГ 4: Повтори разметку 3–10 раз → смотри разброс по меткам, усредняй
ШАГ 5: Проверь на тексте другого типа/источника → сравни метки
ШАГ 6: Если промпт правила LLM → сверь определения меток «до/после» вручную
Каждый шаг — отдельный запрос или отдельная серия запросов. Шаги 3–5 повторяют один и тот же промпт с одним изменением.
Пример применения
Задача: Вы руководитель поддержки на Wildberries-подобном маркетплейсе. Нужно разметить 5 000 отзывов покупателей по меткам: «Доставка», «Качество товара», «Возврат денег», «Несоответствие описанию», «Подозрение на подделку». Последняя метка редкая: в выборке из 200 отзывов её получили всего 6. Директору нужна доля отзывов про подделки по кварталам. Вы сначала проверяете, можно ли доверять модели.
Промпт (основной, запускается 5 раз на одной выборке из 200 отзывов):
Ты размечаешь отзывы покупателей маркетплейса. Для каждого отзыва выбери
все подходящие метки из списка. Опирайся ТОЛЬКО на определения ниже,
не додумывай то, чего нет в тексте.
Метки и определения:
1. Доставка — отзыв о сроках, упаковке при доставке, работе курьера или пункта выдачи.
2. Качество товара — отзыв о материалах, поломках, браке, износе.
3. Возврат денег — покупатель описывает попытку вернуть деньги или товар, или проблемы с возвратом.
4. Несоответствие описанию — товар отличается от фото, размера, цвета или характеристик в карточке.
5. Подозрение на подделку — покупатель прямо пишет, что товар, по его мнению, не оригинал
(поддельный бренд, отличия от оригинала, отсутствие маркировки).
Просто плохое качество — это НЕ подделка.
Ответ: JSON-список меток для каждого отзыва. Если ни одна не подходит — пустой список.
Отзывы:
{отзывы}
Промпт (диагностика Generic — тот же, но метки без смысла в названии):
Те же отзывы, те же определения, но названия меток заменены:
Метка A — отзыв о сроках, упаковке при доставке, работе курьера или пункта выдачи.
Метка B — отзыв о материалах, поломках, браке, износе.
...
Метка E — покупатель прямо пишет, что товар, по его мнению, не оригинал...
Результат: Вы получите пять таблиц разметки одной и той же выборки. Сравните их с ручной разметкой по каждой метке отдельно. Вероятно, у «Доставки» качество высокое, а у «Подозрения на подделку» заметно ниже и разброс между прогонами больше. По авторам, редкие метки страдают сильнее всего. Если в варианте Generic качество резко падает, модель опирается на названия меток. Тогда в определениях нужно явно прописать, чем «подделка» отличается от «просто плохого качества», и перепроверить. Если вы не посчитали частоты по прогонам, вы не узнаете, что доля подделок в отчёте директору «плавает».
Почему это работает
Слабость. Итоговая метрика (точность, общий F1) усредняет метки по числу примеров. Частые категории тянут среднее вверх, а редкие почти не влияют на итог. Модель к тому же не «читает определения как закон»: она генерирует ответ по общему впечатлению от текста и по названиям меток, которые для неё уже что-то значат. Плюс случайность генерации: при температуре выше нуля прогоны различаются.
Сильная сторона. Модель хорошо замечает формальные различия: заменили названия на «Метка 1» — результат изменился. Такие подмены дёшевы и однозначны. Сравнить свою разметку с ручной по каждой метке тоже просто.
Как метод это использует. Подмены и повторы превращают смутное «кажется, работает» в измеримые сигналы. Падение качества при Generic или Swapped означает, что модель опирается на названия. Большой разброс между прогонами означает, что метку нельзя брать из одного запуска. Большой разрыв между худшей меткой и средним означает, что по этой метке нельзя считать частоты.
Рычаги: - Число прогонов: 3 уже заметно сглаживает шум (по данным авторов), 10 даёт надёжнее; для дорогих моделей хватит 3. - Формат кодбука (короткий / полный / с пометками «определение:», «пример:»): не принимайте на веру, проверяйте на своих текстах. Авторы показали, что эффект зависит от данных. - Порядок меток: проверьте прямой и обратный порядок. - Редкие метки: держите в контрольной выборке достаточно примеров именно для них.
Шаблон промпта
Основной промпт разметки и три диагностических варианта (меняется только блок меток):
Ты размечаешь {тип_текстов}. Для каждого текста выбери {одну_или_несколько}
меток из списка. Опирайся ТОЛЬКО на определения ниже. Не додумывай то,
чего нет в тексте. Если ничего не подходит — верни пустой список.
[ВАРИАНТ 0: исходный]
{Название_1} — {определение_1}
{Название_2} — {определение_2}
...
[ВАРИАНТ Label-Only: без определений]
{Название_1}
{Название_2}
...
[ВАРИАНТ Generic: нейтральные названия]
Метка 1 — {определение_1}
Метка 2 — {определение_2}
...
[ВАРИАНТ Swapped: названия и определения перемешаны]
{Название_1} — {определение_2}
{Название_2} — {определение_1}
...
Формат ответа: JSON, для каждого текста список меток.
Тексты:
{тексты}
Подставляйте: тип текстов (отзывы, обращения, посты), метки с определениями, выборку 100–200 текстов с ручной разметкой для сравнения. Запускайте варианты по очереди и каждый несколько раз.
🚀 Быстрый старт — вставь в чат:
Вот шаблон аудита разметки по кодбуку. Адаптируй под мою задачу: {твоя задача: что размечаю и какие метки}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит, какие у вас тексты, метки и определения, и есть ли редкие метки. Ей нужны именно определения и редкость меток: от них зависит, какие диагностики сработают и что считать худшей меткой. Она соберёт четыре варианта промпта под вашу задачу.
Ограничения
⚠️ Нужна эталонная разметка. Без ручной разметки контрольной выборки сравнивать не с чем. Хотя бы 100–200 текстов размечают люди из вашей команды, и редкие метки в них должны быть представлены.
⚠️ Старые и малые модели. Основные эксперименты шли на компактной открытой модели (Mistral-7B) при небольшой случайности. Сравнение с пятью моделями есть, но это тоже небольшие и средние модели. Как это выглядит у самых сильных моделей сегодня, статья не показала.
⚠️ Универсального рецепта кодбука нет. Совет «пиши короче», «ставь структурные маркеры» или «ставь частые метки первыми» помогал на одних данных и вредил на других. Эти правила нужно проверять на своём материале.
⚠️ Нет победителя среди моделей. Лучшая модель на одной задаче оказывалась худшей на другой. Выбор «самой сильной» без теста на своих данных ненадёжен.
⚠️ Автооптимизация промпта. Авторы предупреждают, что автоматическая доработка кодбука по метрике может незаметно сдвигать смысл меток и усиливать провалы. Детали этой части в доступном тексте обрезаны. Здесь есть только заявленный вывод, без цифр.
⚠️ Статья не даёт готового промпта. Диагностики описаны, но шаблон выше собран на их основе.
Как исследовали
Исследователи взяли четыре набора данных. Два уже существовали: протесты в США (CCC, 4 метки) и влияние минимальной зарплаты (12 меток). Два новых создали сами по теме «создание ценности»: один по научным текстам (8 меток), второй по новостям (60 документов, чтобы проверить перенос на другой источник). Основной моделью была компактная Mistral-7B, дополнительно сравнили ещё четыре, включая GPT-4o-mini и DeepSeek-V3. Каждый эксперимент повторяли 10 раз, считали доверительные интервалы и проверяли значимость.
Главное в дизайне: отдельно считали качество по каждой метке, включая F1 худшей метки. Разрыв между микро-F1 и худшей меткой составил около 26–30 пунктов. В агрегированном отчёте это не видно. На научных текстах доля документов, где все метки угаданы верно, оказалась около 2%, хотя микро-F1 был около 45%. Точность по меткам оказалась ниже полноты в 17 из 24 меток: модель ставит метки щедрее, чем эксперты.
Дальше авторы взяли три совета из прежних работ: короче кодбук, структурные пометки, порядок меток. Применили каждый по отдельности. Результаты противоречили друг другу: пометки сильно помогли на самых длинных текстах и ухудшили остальные, упрощение кодбука вредило на двух наборах из трёх. Отсюда вывод: разные статьи приходят к противоположным рекомендациям, потому что проверяли их на разных данных.
Диагностика названий меток тоже дала неожиданный результат. Вариант «только названия, без определений» работал удивительно хорошо, а при замене на «Метка 1» или перемешивании результат падал. Значит, модель опирается на названия, а не на ваши определения. Повторные прогоны показали разброс, особенно на редких метках, и усреднение трёх прогонов его заметно сглаживало.
Адаптации и экстраполяции
🔧 Техника: добавить голосование по прогонам → стабильная метка. Запустите разметку 3 раза и берите метку, которую поставили минимум 2 из 3 прогонов. Для редких меток отдельно отмечайте тексты, где прогоны разошлись, и отправляйте их на ручную проверку. Усреднение трёх прогонов сглаживало разброс, по данным статьи. Голосование как правило — идея, а не из статьи.
🔧 Техника: усилить контрольную выборку редкими метками → честная оценка. Если в случайной выборке из 200 текстов нужная метка встретилась 5 раз, добавьте вручную ещё 20–30 примеров именно с ней и считайте качество по ней отдельно. Статья показывает, что редкие метки страдают сильнее всего. Способ добора примеров — это моя экстраполяция.
Ресурсы
- High Scores, Hidden Failures: Evaluating Codebook-Based LLM Content Analysis: Elena Senger, Yuri Campbell, Rob van der Goot, Barbara Plank.
- Университеты и институты: MaiNLP (LMU Munich & MCML), Fraunhofer ISI, IT University of Copenhagen.
- Данные: huggingface.co/datasets/ElenaSenger/value-creation-science, huggingface.co/datasets/ElenaSenger/value-creation-news
- Код: github.com/elenasenger/high-scores-hidden-failures
- Упоминаемые работы: Halterman & Keith (2025), диагностики Generic Label и Swapped Label; Ruckdeschel (2025), про переинтерпретацию; Abraham et al. (2025), Automatic Prompt Optimization; Zhao et al. (2025), SCALE.
