Любой пайплайн обработки данных начинается одинаково. На вход валится поток сырых записей, и первое, что нужно сделать, — понять, что это вообще такое. Какой тип, какой формат, какие атрибуты, стоит ли тратить на запись дорогие шаги ниже по течению. Обычно выбирают из двух плохих вариантов: отдать работу большой языковой модели — дорого и медленно на каждой записи, либо зашить в регэкспы и эвристики — дёшево, но хрупко и слепо к смыслу.
Между этими полюсами появился третий вариант — модели класса System One. Я поигрался с одной из них, Jev от TypeSafe, и зафиксировал вывод: самое ценное применение такой модели — не в середине пайплайна, а на самом входе, как слой разметки и обогащения.
Что такое System One и чем он не LLM
Большая языковая модель — это «System Two» в терминах Канемана: она рассуждает, генерирует текст, тратит время и токены на размышление. System One — рефлекс. Jev не пишет текст вообще. Он принимает «состояние» — кусок данных — и набор типизированных вопросов, и возвращает типизированные ответы:
- choice — выбор из заданных вариантов, с вероятностями по каждому и общей уверенностью;
- score — оценка по рубрике (0, 1, 2…), тоже с распределением;
- noul — булев вопрос «верно ли утверждение», как число от 0 до 1.
Все вопросы считаются за один параллельный проход по одному и тому же состоянию. На практике это ~400 мс и доли цента за запись с десятком-другим вопросов — порядок-два дешевле и быстрее, чем гонять ту же классификацию через LLM.
Ключевое свойство: ответ нельзя получить вне заданной схемы. Модель физически не может сгенерировать «а ещё я подумала, что…». Для разметки это не ограничение, а фича — ты получаешь ровно те поля, которые просил, в предсказуемой форме. Именно это определяет, куда модель стоит ставить.
Почему именно вход пайплайна
Сырая запись на входе почти всегда недоразмечена. У неё есть пара очевидных полей и большой кусок неструктурированного текста, из которого весь смысл надо ещё извлечь. И этот смысл нужен сразу всем: фильтру-гейту (пускать ли дальше), маршрутизатору (в какую ветку), скорингу (как оценивать).
Классический антипаттерн — извлекать эти атрибуты позже, внутри дорогого LLM-шага, и каждый раз заново. Ты платишь за рассуждение там, где нужна просто классификация. Смысл оказывается заперт внутри одного шага, недоступный тем, кто выше по течению.
System One на входе переворачивает этот порядок. Один дешёвый вызов — и запись обогащена: формат, категория, набор булевых признаков, грейд, флаги. Дальше весь пайплайн читает структурированные факты из полей, а не перечитывает текст. Гейт стал видеть то, чего раньше не видел. Скоринг получил вход, который раньше сам же и добывал. Политики — что с чем делать — переехали в конфиг и читают готовые атрибуты, без единого дополнительного вызова модели.
Три приёма, которые делают это рабочим
Сама по себе дешёвая модель на входе — ещё не решение. Рабочей её делают три приёма.
Уверенность — сигнал маршрутизации
Каждый ответ приходит с confidence. Низкая уверенность на конкретном поле — бесплатный триггер «эскалировать именно эту запись в дорогую модель», а остальное принять как есть. Дёшево по умолчанию, дорого — только на спорном. System One и LLM работают не «или-или», а каскадом.
Калибровка порога, а не 0.5 с потолка
Когда я сверил ответы System One с эталонной разметкой, почти все расхождения оказались в узкой полосе около 0.5 — там, где модель честно не уверена. У булевых признаков noul ещё и гуляет от прогона к прогону в этой зоне. Подняв отсечку с 0.5 до ~0.65, я убрал все расхождения разом: граница встала выше зоны дрожания, и вывод стал и точнее, и стабильнее. Уверенные ответы — экстремальные значения — это не задело вообще.
Мораль: смотри на распределение noul, ставь порог в щель между «не уверен» и «уверенно да».
Теневой режим перед продом
Новый классификатор нельзя сразу делать авторитетным — он может молча ломать решения. Правильный путь: сначала он размечает параллельно старому механизму, расхождения только логируются. Собрал телеметрию, увидел, где и как расходится, откалибровал — и только потом переключил флаг: «теперь твои ответы главные, старая модель — валидатор на расхождениях». Один тумблер в конфиге, мгновенный откат.
Где System One не помощник
Соблазн зарулить в дешёвую модель вообще всё. Но граница проходит там же, где между классификацией и генерацией.
| Тип задачи | Куда | Почему |
|---|---|---|
| Типизированные решения (формат, категория, булевы флаги, грейд) | System One | Нативные типы модели |
| Нюансные оценки (рубрика + контекст, а не факт) | Мерить против текущей модели | Сдвиг двигает пороги ниже по течению |
| Свободный текст (объяснения, саммари, цитаты) | LLM | System One не генерирует текст |
Правильная архитектура — не «заменить LLM», а снять с неё дешёвый слой разметки и оставить ей ровно то, ради чего её держат: рассуждение и генерацию.
System One стоит ставить на вход
System One на входе пайплайна — недостающий дешёвый слой между хрупкими регэкспами и дорогим LLM. Один вызов превращает сырой поток в размеченные записи за доли цента, отдаёт уверенность как сигнал для каскада и при аккуратной калибровке берёт на себя всю рутинную классификацию, не трогая нюансное ядро.
Самое ценное здесь — перестановка шага в начало. Не «извлечём смысл, когда понадобится», а «разметим на входе, один раз, дёшево, и дальше весь конвейер читает подготовленные факты». Перестановка одного шага меняет экономику всего пайплайна — посчитайте, сколько раз ваш конвейер переизвлекает одно и то же из одного и того же текста.