Cortex: дистилляция восприятия в малую модель
Cortex — компактная языковая модель (transformer, 1.7B параметров), отображающая каждую реплику в структурный примитив доски: тип ячейки, направленное отношение «кто → кому» и ответственного. Мы показываем, что направленное извлечение (from → to) помещается в малую модель: дообученная 1.7B достигает off-diagonal F1 = 0.571 против 0.15 у лучшего промпт-бейзлайна — улучшение в ~3.8×. Мы документируем два пути коллапса обучения (мажоритарный класс и разбавление мультизадачей), рецепт их преодоления (оверсэмплинг) и приходим к каскадной архитектуре из двух специализированных голов на одной базе.
1. Задача и контракт
Реплика (плюс контекст) → примитив:
reply(+context) → {
type: topic | decision | action | fragment | none,
name: короткий императив,
from: говорящий,
to: ответственный (может ≠ говорящего),
op: request | commitment | assignment | decision | none
}
Главный таргет — направленность (from, to). Cortex не источник истины: он предлагает примитивы, которые фиксирует Ledger.
2. Метод: дистилляция, без API
Размечающим «учителем» выступает frontier-модель (через чат-агентов, не API): она строит directed-gold на корпусе реальных звонков. Малая модель обучается на этой разметке (LoRA). Метрика гейта — off-diagonal F1 на held-out (доля верно извлечённых кросс-партийных обязательств), с пред-зарегистрированными порогами.
3. Результат пилота: направленность помещается в 1.7B
Held-out, метрика off-diagonal F1:
| подход | off-diag F1 | |---|---| | qwen3:4b, нейтральный промпт (пол) | 0.07 | | qwen3:8b, хороший промпт (середина) | 0.15 | | FT 0.6B (наш) | 0.41 | | FT 1.7B (наш) | 0.571 |
Виден скейлинг по размеру (0.6B → 1.7B: 0.41 → 0.571). Дообученная модель бьёт лучший промпт-бейзлайн (даже 8B) в ~3.8×.
Контр-наблюдение к нарративу. Канон утверждал «компактные модели слепы к off-diag (0.3%)». При честном инференсе (constrained JSON) промпт-бейзлайны не слепы — они галлюцинируют: предсказывают 100–187 обязательств там, где их 14, с precision 0.04–0.08. Реальное узкое место — прецизия и абстенция, а не «видит ли модель направленность».
4. Два пути коллапса обучения
Коллапс A — мажоритарный класс. При directed-таргете ~5% позитивов наивный файнтюн минимизирует лосс, предсказывая «none» на всём: off-diag F1 = 0.0. Это артефакт рецепта, не предел ёмкости.
Лечение. Оверсэмплинг directed-примеров (off-diag до ~25% обучающего сета). После лечения — 0.571 (1.7B), 0.41 (0.6B).
Коллапс B — разбавление мультизадачей. При попытке одной головой выдавать и полный тип-классификатор (topic/decision/action), и направленность, задачи интерферируют: directed падает 0.571 → 0.267, типы остаются слабыми (macro-F1 ≈ 0.31). У задач противоположные оптимумы: тип-детекция «осторожна» (много action без владельца — монолог), directed «уверенно назначает».
| модель | off-diag F1 | type macro-F1 | |---|---|---| | directed-специалист (1.7B) | 0.571 | — | | full-board единый, v1 | 0.0 | 0.33 | | full-board единый, v2 (off-diag ×оверсэмплинг) | 0.267 | 0.31 |
5. Архитектурный вывод: каскад
Не пихать обе задачи в одну голову, а каскад из двух LoRA-голов на одной базе 1.7B:
реплика
│
▼ HEAD-T (тип + абстенция) ← полное покрытие доски
│ topic / decision / action / fragment / none
│
▼ HEAD-D (directed from → to) ← только на action/обязательствах
│ кто → кому ← специалист 0.571
▼ merge → {type, op, from, to, name} ← схема сервинга не меняется
Каждая голова работает в своём оптимуме; HEAD-D гоняется только на ~10–15% реплик (где есть действие) → почти бесплатно; контракт сервинга сохраняется. HEAD-D возвращает доказанные 0.571; HEAD-T даёт покрытие типов.
6. Текущие пределы (честно)
Тип-детекция упирается в масштаб данных: на текущем held-out редкие классы (decision, fragment) имеют единицы примеров, и их F1 нестабилен (вплоть до 0), что тянет macro-F1 ниже пред-зарегистрированного порога 0.55. Это не предел ёмкости модели, а предел разметки. Путь — масштаб directed/board-gold (active-learning: полу-авто-дистилл из готовых gold-досок 100 звонков + ручная разметка только ошибок модели).
7. Деплой-экономика и роадмап
Лёгкие реплики — локальная малая модель (~0.9 с/реплику, дёшево, realtime); трудные/неуверенные — эскалация. Роадмап восприятия: diffusion-декодинг (параллельное уточнение блоков вместо авторегрессии) для суб-100мс латентности.