кодло/ студия

Разбор · статья 1 из 5

Своя голова решений: обучение, калибровка и пределы System-1

Обучили свой решатель и проверили калибровку. На свободных формулировках качество резко упало.

15 мин чтения2743 словпо нашим артефактам

Мы строили System-1 как модель для короткого шага политики: прочитать состояние агента и выбрать действие. Такой компонент должен был заменить ручной скоринг и обращение к внешней LLM там, где требуется решение, а генерация текста не нужна. Замер показал границу: модель быстро распознаёт собственный шаблон и хорошо калибрована на нём. Это ещё не означает, что она умеет решать по входящему сообщению.

В итоговом контексте ранний результат macro-F1 0.732 отозван: он был посчитан на случайном энкодере. На свободных формулировках рабочая модель получила macro-F1 0.180, хотя знакомая запись тех же состояний дала 0.995. Мы проверили, что действительно обучили и какие замеры сохранили силу. Для рабочего отбора задач данных пока не хватает. Источники: CONTEXT.md, FRONTIER_30_09.md.

Задача и почему не правила

В эксперименте агент защищает репутацию, распространяет позицию или сохраняет аудиторию. Он получает слух, угрозу, вопрос, сообщение об успехе; решение зависит также от источника, ресурсов и истории взаимодействий. Пока модель выбирает поведение из заданного словаря. Классификатор рабочих поручений из неё ещё не получился.

Семь действий зафиксированы в генераторе и спецификации правил. Их смысл раскрыт в листе слепого аудита:

Действие Что означает
post Опубликовать собственное сообщение
amplify Публично поддержать или повторить чужое
reply Ответить напрямую
ignore Промолчать, не предпринимать публичных шагов
counter Публично возразить или оспорить
escalate Передать ситуацию в формальный механизм
exit Выйти из ситуации совсем

Источник словаря и количества действий: build_states.py, RULES_R1_R11.md; определения: blind_audit_200.md. Более ранняя история выбора именно этого словаря в артефактах не зафиксирована.

Ручной скоринг осложняют приоритеты правил. Спецификация требует проверять условия сверху вниз и брать первое сработавшее. Нехватка ресурсов может отменить публичное действие даже при угрозе; повторный конфликт меняет ответ с учётом отношения источника и доверия аудитории. Если заменить этот порядок суммой «важность плюс доверие минус усталость», придётся заново определять компромиссы между условиями. Это инженерный вывод из структуры правил, а не измеренный провал конкретного скоринга.

Правила сами служат учителем. Источники не доказывают, что они плохи. В правилах amplify относится к призыву от достаточно доверенного источника, а подтверждённый успех ведёт к post: подмена этого различия уже испортила ручную проверку, описанную в контексте. Источник: CONTEXT.md, RULES_R1_R11.md.

Мы хотели принимать решение по тексту без ручного разбора каждой формулировки. Модель должна была возвращать уверенность и работать локально. Преимущество над точным исполнением правил на готовых полях ещё нужно доказать. В гипотезах проекта отдельно поставлено сравнение содержательных решений с простыми правилами и шумом; замеры стоимости этот вопрос не закрывают. Источник: HYPOTHESES.md, RESULTS_29_09.md.

Данные: состояния, тексты и перефразы

Начальный генератор создаёт 200 состояний с сидом 1978. Он выбирает событие и серьёзность, роль источника, доверие и отношение, внимание и энергию, доверие аудитории, сетевые признаки, историю, счётчики, персону и цель. Для 60 состояний добавлены по две альтернативные записи: вместе получается 320 текстов, что можно пересчитать непосредственно по states и variants. Источники: build_states.py, states.json.

Перефраз здесь — другой способ сериализовать те же поля: обычное описание, обращение к агенту или блоки с обозначениями источника, сети и ресурсов. Это не новое состояние и не независимая разметка. Английский генератор сохраняет парность с русским набором, но шаблоны написаны отдельно. Источник: build_states_en.py.

Расширенная сборка содержит 4000 состояний, полученных на 20 сидах, по 200 на сид. Условие (nid % per_seed) < 10 оставляло перефразы только у 200 состояний, то есть 5% набора. Остальные 3800 имели единственный текст; всего было 4400 текстов. Это подтверждают генератор, JSON и итоговый разбор. Источники: build_states_en.py, states_en_4000.json, CONTEXT.md.

После исправления варианты есть у всех состояний. Текущий states_all3.json содержит те же 4000 состояний, каждое с основной записью и двумя вариантами. В разметке 12 000 уникальных текстов. Мы пересчитали их: пропущенных меток нет, действие внутри одного состояния не меняется. Источники: build_variants_all.py, states_all3.json, labels_all3.json.

Поэтому разделять обучение и проверку нужно по состояниям. Если основной текст попадёт в обучение, а его перефраз — в тест, модель уже видела ту же комбинацию признаков и её ответ. Такой тест измеряет устойчивость записи знакомого случая. Для проверки обобщения все формулировки состояния должны оставаться в одном разбиении; проверка незнакомого стиля добавляется отдельно. Число фолдов кросс-валидации и полный протокол раннего малого эксперимента в предоставленных артефактах не зафиксированы.

Шкалы ресурсов тоже расходятся. Спецификация описывает энергию на шкале 1–3, а генератор выбирает её от 0 до 10 и печатает соответствующий знаменатель. Перед применением к реальным сообщениям эту семантику нужно согласовать: модель может усвоить числовую форму, не соответствующую описанию задачи. Источники: RULES_R1_R11.md, build_states.py, states_all3.json.

Модель и дообучение: какие результаты сохранились

В контексте модель называется System-1/Laya. Таблица ёмкости перечисляет Laya multilingual на mmBERT-base и Laya english на ModernBERT-large. Точное имя исходного чекпоинта рабочего head_ft.pt и способ выбора обучаемых слоёв в источниках не зафиксированы. По соседней таблице определить базу рабочего артефакта нельзя. Источники: CONTEXT.md, CAPACITY_AND_CI.md.

Проверенный срез обучения выглядит так:

Режим Macro-F1 Ограничение интерпретации
Замороженная база и обучаемая голова 0.28–0.47 Диапазон результатов, не единый парный замер
Обучение шести слоёв, пять эпох 0.847 Проверка на собственном шаблоне
Обучение шести слоёв, десять эпох 0.955 Проверка на собственном шаблоне
Полная база, двадцать восемь слоёв, тот же learning rate 0.339 Редкие классы обнуляются; режим обучения не адаптирован

Все числа и условия таблицы: CONTEXT.md. Значение learning rate, оптимизатор и размер обучающего батча в этих источниках не зафиксированы.

Частичное дообучение существенно лучше замороженной базы внутри знакомой формы. Но проигрыш полной базы нельзя объяснять одной глубиной: сравнение одновременно меняет число обучаемых параметров и пригодность шага обучения. Сам контекст требует отдельного режима для полной базы.

Ранний результат 0.732 пришлось исправить. Контекст признаёт 0.732 результатом случайного энкодера; связанное с ним проверенное значение ECE в артефактах не зафиксировано. Другой ранний результат, 0.848, тоже отозван: база фактически не разморозилась. Эти числа нельзя использовать как ступени улучшения. Источник: CONTEXT.md.

Подход проверили и на внешней задаче. На Banking77, с 77 классами, человеческими метками и официальным английским разбиением, замороженная база получила macro-F1 0.775, дообучение шести слоёв — 0.916, TF-IDF с логистической регрессией — 0.874. Это свидетельство работоспособности подхода на другой классификации, но не доказательство переноса обученной домашней политики на рабочие сообщения. Источник: CONTEXT.md.

Калибровка: уверенность после обучения

Качество выбора класса и качество уверенности — разные свойства. Macro-F1 учитывает распознавание классов без преимущества частого действия. ECE сопоставляет уверенность с долей правильных ответов в группах предсказаний. Хорошая классификация может сопровождаться чрезмерной уверенностью; низкая ECE сама по себе не гарантирует хорошей классификации.

В постановке разбора предполагалось, что дообучение без калибровки испортило ECE, а температура вернула её. Полной числовой пары «до калибровки — после» для этого эпизода в предоставленных источниках нет. Возможный механизм такой: обучение усиливает разделение классов, но масштаб выходных оценок не обязан соответствовать вероятности ошибки. Насколько это произошло здесь, мы не знаем.

Температура меняет масштаб оценок перед преобразованием в вероятности, сохраняя порядок действий. Поэтому она корректирует уверенность, но не исправляет неверно выбранное действие. В итоговом контексте у рабочего артефакта T = 1.49. Порог 0.62 выбран на валидации по калиброванным вероятностям: покрытие 95.8%, точность среди отвеченных 0.963; на следующий уровень передано 8 ошибок из 23, лишних отказов — 18. Источник: CONTEXT.md.

При недостаточной уверенности решение уходит дальше. Такая маршрутизация работает, пока сама уверенность переносится на новые входы. В кросс-формулировочном тесте ECE выросла с 0.025 на знакомой форме до 0.073 на незнакомой. На Banking77 зафиксированы ECE 0.1705 у замороженной базы и 0.0267 у дообученной модели; это сравнение режимов, а не опубликованная пара до и после температуры. Источник: CONTEXT.md.

Контекст отдельно предупреждает об уверенных ошибках, которые температура не ловит. Поэтому отказной порог нужно проверять на новых формах и считать ошибочные автоматические решения, а не ограничиваться средней ECE.

Чего не хватило: классы, объём и свободный текст

Начальный набор содержит 200 состояний. Достоверная итоговая пара macro-F1/ECE именно для него в источниках не зафиксирована. Расширение до 4000 улучшило основу обучения на шаблоне, но прежняя редкость перефразов оставляла почти весь набор в одной форме. Источники: build_states.py, CONTEXT.md.

Прямой подсчёт основных меток показывает дисбаланс: ignore — 1475, reply — 1014, counter — 654, post — 338, exit — 251, amplify — 177, escalate — 91. Это количество состояний, без повторного учёта перефразов. Источник и способ расчёта: записи kind == "base" в labels_all3.json.

Веса классов могли бы изменить вклад редких действий в обучение, но их конкретные значения и проверенный эффект в источниках не зафиксированы. В контексте есть ошибка реализации: веса и метрики общего модуля были зашиты под домашние семь действий и падали на 77 классах. Наличие механизма взвешивания не доказывает, что редкие ветви решены. Источник: CONTEXT.md.

Действия exit и ignore различаются. Уход определяется ресурсами либо сочетанием повторного конфликта, враждебности и низкого доверия аудитории; молчание оставляет агента внутри ситуации. Спецификация описывает эти условия отдельно. Источник: RULES_R1_R11.md.

После расширения форм сначала проверили знакомый и альтернативные шаблоны: macro-F1 0.943, 0.813 и 0.801. Ответ менялся от записи у 12.8% и 12.2% состояний. Источник: CONTEXT.md.

Затем 200 тестовых состояний переписала Mistral-Nemo-12B в четырёх манерах, без правил и действий в промпте. Рабочая модель на свободном тексте получила accuracy 0.345, macro-F1 0.180; знакомая запись тех же состояний — по 0.995 для обеих метрик. TF-IDF достиг macro-F1 0.297, Opus с правилами — 0.686, вслепую — 0.283. Источник: FRONTIER_30_09.md.

По отдельным действиям там указаны escalate 0.00 при 5 примерах, post 0.06 при 18, exit 0.08 при 13. Рядом с этими значениями не названа поклассовая метрика. Без дополнительного источника назвать их полнотой нельзя. Результат не позволяет объявить готовность редких ветвей. Источник: FRONTIER_30_09.md.

Контроль показывает сильную зависимость от представления. Но свободный пересказ требует отдельной проверки сохранения смысла: в строке 8 аудита ресурс записан как 7/3, в строке 26 положительная оценка отношения названа враждебностью. Многие сообщения от коллеги опускают ресурсы. Метки наследуются от исходных полей. Часть расхождения может быть связана с потерей информации. Её величина в артефактах не зафиксирована. Источник: blind_audit_200.md.

Ёмкость и доверие к числам

Исправленный итог содержит три независимых сида: macro-F1 0.922 ± 0.038, диапазон 0.871–0.959; accuracy 0.940 ± 0.021. Ранее заявленные 0.895 ± 0.079 отозваны, поскольку сиды продолжали одно обучение. В источниках не сказано, какая статистика стоит после знака ±. Называть её доверительным интервалом нельзя. Источник: CONTEXT.md.

Отдельный отчёт даёт 95%-ные интервалы Вильсона для accuracy других задач. Например, user2_5nn_loo на 28 примерах: 0.9286, интервал 0.774–0.980; route_ru на том же объёме: 0.6786, интервал 0.493–0.821. Эти интервалы показывают неопределённость оценки. К домашнему macro-F1 они не относятся. Источник: CAPACITY_AND_CI.md.

Пересечение интервалов само по себе не заменяет тест разницы на парных предсказаниях. Для следующего сравнения разумно пересчитывать разницу метрик по независимым состояниям и отдельно учитывать вариативность обучения. Число перевыборок для бутстрэпа в источниках не зафиксировано. Для статистического вывода нужно заранее выбрать метод и уровень доверия, затем проверить, исключает ли интервал разницы отсутствие изменения. Для практического применения результат должен быть устойчив между запусками и давать выигрыш по цене ошибок. Разница округлённых средних этого не доказывает.

Ёмкость ограничена и памятью. Для RTX 5060 Ti с 16 ГБ таблица оценивает веса Laya multilingual в 0.65 ГБ, Laya english — в 0.85 ГБ. Расчёт большого числа персон с LoRA — оценка размещения; измеренного одновременного обслуживания такого количества агентов нет. Источник: CAPACITY_AND_CI.md.

В ранней таблице энкодер при батче 32 даёт 4.40 мс на шаг, 227.3 шага/с и 1.22 GPU-часа на миллион шагов. Поздний замер рабочего артефакта: одиночная медиана 18.7 мс, p95 19.5 мс, батч 64 — 11.8 мс на текст, холодный старт 5.5 с. Это разные срезы; переносить лучшую раннюю пропускную способность на итоговый сервис нельзя. Источники: CAPACITY_AND_CI.md, CONTEXT.md.

В LM Studio решение без размышления у Qwen3-0.6B занимает 0.065 с, у Qwen3-1.7B — 0.063 с. Это сравнение задержек конкретных конфигураций, а не доказательство преимущества по качеству. Более ранний отчёт прямо признаёт сломанное извлечение батчевых ответов генеративных моделей. Источники: LMSTUDIO_BENCH_29_09.md, RESULTS_29_09.md.

Что дальше: данные для настоящего отбора задач

Следующий набор должен состоять из реальных входящих сообщений вместе с доступным на момент решения контекстом. Для перехода к отбору задач сначала нужен согласованный словарь рабочих действий и цена ошибок. Домашние репутационные действия автоматически таким словарём не становятся.

Нужны независимые человеческие метки, разбор неоднозначных случаев, примеры пропущенных полей и целевая выборка редких ветвей. Контекст предлагает аудит 150–200 реальных входов двумя разметчиками. Существующий лист свободных текстов содержит 200 строк, но колонка ответов пуста: завершённый человеческий аудит в нём не зафиксирован. Источники: CONTEXT.md, blind_audit_200.md.

При добавлении новых формулировок нужно проверять, сохранились ли существенные поля. Отложенная оценка должна включать новые состояния, незнакомые стили и сообщения с недостатком информации. Температуру и отказной порог нужно выбирать до финальной проверки и оценивать вместе с долей ошибочных автоматических решений.

Источники предлагают следующий вариант: извлекать поля отдельными головами, проверять полноту и исполнять правила кодом. Это позволяет различать ошибку чтения сообщения и ошибку политики. Пока сравнения на реальных входах нет. У нас есть быстрый классификатор заданной формы и протокол, который помогает находить его ограничения. Источник: FRONTIER_30_09.md.

Что проверить скептику

— Какие веса действительно оценивали. В CONTEXT.md отозваны результат случайного энкодера, неразмороженная база и зависимые сиды. Проверить соответствие заявленного режима рабочему артефакту; подробных логов обучения среди источников нет. — Не посчитаны ли тексты независимыми наблюдениями. Сопоставить state_id и kind в labels_all3.json с протоколом разбиения. Перефразы не увеличивают число независимых состояний; сам JSON не доказывает отсутствия утечки между сплитами. — Сохранился ли смысл при пересказе. Проверить ресурсы, знаки отношений и полноту полей в blind_audit_200.md против states_all3.json. Метка исходного состояния может стать недостижимой по сокращённому тексту. — Что скрывает среднее качество. Проверить редкие действия и уверенные ошибки по FRONTIER_30_09.md и пороговый срез в CONTEXT.md. ECE и accuracy среди отвеченных не заменяют учёт пропущенных опасных решений. — Совпадают ли режимы измерения скорости. Разделить ранний расчёт из CAPACITY_AND_CI.md, итоговую задержку из CONTEXT.md и серверные замеры LMSTUDIO_BENCH_29_09.md. Батчевая цена текста, одиночная задержка и холодный старт отвечают на разные вопросы.

Написано по артефактам студии; ссылки на файлы — имена наших исходников, они живут в репозитории, а не в вебе.