Decision models: я спросил «да или нет?»
Роман Хомутов
Эксперименты 22 сентября — 1 октября 2026
Итог на трёх наших задачах
Для следующего локального прототипа я выбрал бы Decider: качество немного выше, чем у Clef-Flash, а измеренные задержка и память ниже.
Julia выгодна по CPU-ресурсам, но её не подходят для этих задач без дальнейшей работы.
Это вывод по малому авторскому набору и конкретным схемам входа, а не общий рейтинг моделей.
Приложению нужен выбор из списка, а не текст
Отдел для этого обращения
Jev
Выбирает действие по ответу: например, ставит обращение в очередь billing
Decision models полезны, когда приложению нужен конечный выбор, несколько типизированных вопросов или score, а подробный ответ формировать не требуется.
Запрос: контекст, вопрос и описания вариантов
Запрос к Jev · POST /v1/evaluate через Vercel AI Gateway
Ответ ·
Схема задаёт форму ответа: выбор из списка и вероятности. Правильность выбора она не гарантирует.
Запись реального запроса из прогона 22 сентября.
15 конфигураций: два API, открытые веса и правила
Через API
- JevDecision model от TypeSafe, вызов через Vercel AI Gateway
- DeepSeek FlashLLM: выбор и вероятности в JSON-ответе, reasoning выключен
Открытые веса
- Decider 4B v2, Kev 4B, SemIf 4BКачество на RTX 3090 в BF16, задержки ещё и на Xeon в FP32
- Clef-Flash 9BОфициальный runtime, Xeon, FP32
- Julia 1144,3 млн параметров, основа mmBERT-small
- CLM 8B Q8llama.cpp, CPU и RTX 3090
- Laya multi, GLiNER2.5 multi, small EN, Decide EN, multi-DecideCPU
Базовая линия
- ПравилаРегулярные выражения
У каждой модели свой штатный интерфейс, но тексты, инструкции и описания вариантов одни и те же. Тонкая настройка на этом наборе не проводилась.
Три задачи: 100 строк из 59 исходных ситуаций
Маршрутизация
50строк
25 ситуаций на русском и английском
billingtechnicalaccountsalesotherВозврат выполнен?
32строки
16 ситуаций на русском и английском. Засчитывается хотя бы частичное перечисление
truefalseПолитика команд
18команд
allow, review или deny по явной политике. Команды только классифицировались, не выполнялись
allowreviewdeny41 пара переводов — это не 82 независимые ситуации. После многократной диагностики набор уже не служит нетронутым test set.
Ещё 54 перестановки вариантов, 10 текстовых инъекций и 16 перефразировок — варианты тех же случаев, а не новые задачи.
Спросим модель сейчас
Jev и DeepSeek — 99 и 100 из 100, лучшие открытые — 96 и 95
Верных ответов на 100 строках. Линия — результат правил. GLiNER Decide EN () и GLiNER small EN () проверены на английской части, поэтому на этой шкале их нет.
Результат по задачам
тон ячейки — доля ошибок. У GLiNER Decide EN — 41 английский текст и 18 команд, у GLiNER small EN — только 41 английский текст.
Перестановка вариантов, инъекции и перефразировки
тон ячейки — доля смен или ошибок. Смена — ответ отличается от ответа на исходный пример. Новая ошибка — исходный ответ был верным, а новый нет.
У Clef-Flash исходный и переставленный запросы дают одинаковые token hashes: runtime сортирует ключи. Ноль смен здесь показывает каноникализацию API, а не доказанную устойчивость. Ноль ошибок на десяти инъекциях не доказывает безопасность.
Тот же текст — ответы всех конфигураций
Записи прогонов 22 сентября — 1 октября, повторных вызовов нет. Уверенность — оценка модели внутри вариантов, а не вероятность правильности; у DeepSeek её пишет сама модель.
На чём ошибаются сильные модели
- Jev
Одна ошибка:
refund-03-ru, завершённый возврат принят за незавершённый с p = 0,57. Английская версия того же текста — верно. - Decider 4B v2
Исправляет этот случай, но отвечает billing на «Возврат денег мне не нужен» (
routing-09-ru) и запрещает три безопасные строки: echo, printf и rg с опасным текстом внутри. - Clef-Flash 9B
Просроченное приглашение на RU и EN → technical вместо account; частичный возврат на EN → false; echo и rg с опасным текстом → deny вместо allow.
- SemIf 4B
Конфликтующие темы, возврат с нерешённым входом в аккаунт и частичный возврат; встречаются ошибки с p ≥ 0,99.
Схема входа и API меняют результат
- CLM Q8
С исходным длинным вопросом — billing на всех 50 строках маршрутизации. Короткий вопрос поднял результат с 10/50 до 15/50 в отдельной post-hoc диагностике; основная таблица сохраняет исходную схему.
- GLiNER Decide
Чувствителен к передаче prompt и имени задачи. Вариант names-only — диагностическая смена постановки.
- Julia 1
Запускалась через native legacy logits с исходными описаниями: named noul API подменяет их строками false/true. Проверены веса, native logits, порядок вариантов и отсутствие truncation — всё равно 37/100.
- Clef
Нужны joint schema head и все hidden states. Файл GGUF с backbone сам по себе не восстанавливает decision API; в трёх community GGUF-репозиториях joint head нет.
Совпадение типа интерфейса не обеспечивает перенос на наш домен.
Горячий запрос: от 52 мс на GPU до 13 с на CPU
P50 по 30 последовательным запросам после прогрева, без HTTP и очереди сервиса. Decider, Kev и SemIf: FP32 на CPU, BF16 на GPU; CLM — Q8. Kernels и serving не оптимизировались до предела.
Jev и DeepSeek — P50 исходного HTTP-прогона, включая сеть; сравнение с локальным Python не является чистым сравнением архитектур.
Холодный старт: от 7 до 29 секунд до первого ответа
Медиана трёх новых процессов на конфигурацию: запуск процесса, импорты, загрузка и первый ответ. Веса локальные, page cache ОС не сбрасывался. У Jev серверный холодный старт и память провайдера недоступны.
Четыре вопроса за один вызов
Один контекст, по три повтора каждого режима: это микроопыт, а не оценка качества на независимой выборке. Медиана; таймер суммирует время HTTP или инференса, паузы для квоты исключены.
Объединение экономит повторное кодирование, но не исправляет неверное понимание контекста. У Laya ответы на этом state содержат ошибки.
Токены на 100 запросов стоят доли цента
Стоимость токенов этих запросов по тогдашним ставкам, а не текущий прайс, полный счёт эксперимента или стоимость сервера. Собственный CPU/GPU, хранение и инженерная работа не оценены.
Память: у каждой строки своя метрика
| Конфигурация | Память | Что измерено |
|---|---|---|
| Decider CPU FP32 | 24,35 GiB | Peak RSS процесса |
| Kev CPU FP32 | 24,44 GiB | Peak RSS процесса |
| SemIf CPU FP32 | 24,33 GiB | Peak RSS процесса |
| Decider RTX 3090 BF16 | 8,05 GiB VRAM + 8,79 GiB RAM | Peak PyTorch allocated VRAM и отдельный peak RSS |
| Julia CPU FP32 | 0,99 GiB | RSS после последовательного прогрева |
| CLM Q8 CPU | 8,48 GiB | Сумма текущих RSS encoder и клиента после hot |
| CLM Q8 GPU | 7,94 GiB VRAM + 1,38 GiB RAM | Device usage и сумма текущих RSS после hot |
| Clef-Flash CPU FP32 | 36,11 GiB; peak 52,91 GiB | RSS после hot и HWM процесса, включая загрузку |
FP32-параметр занимает четыре байта, BF16 — два: только веса 4B — около 14,9 GiB в FP32 и 7,45 GiB в BF16. Наши 24 GiB на CPU — footprint процесса, а не размер файла модели.
Peak и текущая память несопоставимы без подписи; VRAM и RAM относятся к разным устройствам.
Извлечение полей: регулярка держится на известном шаблоне
Новые форматы — дополнительная авторская диагностика после основного прогона. У EN и multilingual разные выборки.
GLiNER решает и извлечение сущностей и полей. Низкий score на наших decision-задачах не оценивает качество NER: это отдельная операция.
Каскад: неуверенные ответы Jev уходят DeepSeek
100 основных примеров, отсортированных по уверенности Jev. Replay двух сохранённых прогонов, а не сквозной benchmark сервиса: стоимость и время рассчитаны. Порог — иллюстрация, а не рекомендация для production.
Когда decision model уместна
- Подходит
Приложению нужен конечный выбор, несколько типизированных вопросов или score, а подробный ответ формировать не требуется.
- Цена
Стоимость операции определяется всем путём: кодированием state, схемой, head, устройством, кешем и serving.
- Граница
Для выполнения shell-команд нужны разбор синтаксиса и контроль разрешений. Классификатор из 18 строк эту границу не заменяет.
Что взять в следующий прототип
Открытый кандидат: , P50 на RTX 3090
API-база для сравнения: , HTTP P50
Fallback на неоднозначные случаи: , HTTP P50
Проверить отдельно на простом высокочастотном routing, где её задержка даёт выигрыш ( на CPU). Наш набор такой выбор не подтверждает
На CPU FP32 преимуществ перед Decider не дала
Выбирать только после замеров соответствующей конфигурации
Ограничения и следующая проверка
Ограничения
- Малый авторский набор59 исходных ситуаций, из них 41 пара переводов
- Набор не нетронутыйЕго много раз использовали для диагностики
- Уверенность не вероятность правильностиПорог нельзя переносить между API без отдельной калибровки
- Инъекций всего десятьНоль ошибок на них не доказывает безопасность
Следующая проверка
- Новый доменный наборС независимой разметкой
- Отдельный отложенный тестНе использованный при диагностике
- КалибровкаЧтобы порог уверенности что-то значил
- Цена ошибокОценка цены false allow и false deny
Это план дальнейших экспериментов; в опубликованные цифры он не включён.
Вопросы и материалы
Вопросы?
- Лаборатория180 записанных примеров, каскад и живые запросы
- Итоговый отчётREPORT.md: методика, все таблицы и ограничения
- Все ответы и запросыanalysis/CASE-RESULTS.md и data/CASES.md в комплекте материалов