← На главную

Опубликовано

Четыре эвала для модели решений: Jev в бою

Автор: Гусев Николай [портфолио]

Темы: ai-agents, benchmarks, llm-news, local-models

Опубликовано: 2026-09-20, Telegra.ph + пост 239 в @hermesagentru

Сложность: средняя

Jev не пишет текст: получает на вход состояние и типизированные вопросы, возвращает выбор из опций с вероятностями. Прогнал её по четырём рабочим задачам - фильтр промпт-инъекций, реранкер для RAG, триаж новостного потока и маршрутизация входящей почты - в паре с бесплатной локальной 8B и Gmail как baseline. На задачах с золотой разметкой: 31 вердикт из 32. Весь сеанс замера обошёлся в один цент.

Что такое System One

Jev - первая модель класса System One от TypeSafe. Её язык - не проза, а решения. Запрос устроен иначе, чем у обычной LLM: вы отдаёте state (текст или JSON) и карту вопросов трёх видов. Choice - выбрать опцию из заданного набора, в ответе опция, полное распределение вероятностей и уверенность. Noul - вероятность yes/no по вопросу. Score - позиция на упорядоченной шкале уровней. Выдумать опцию модель не может - только выбрать из названных вами, поэтому исчезает целый класс проблем с парсингом свободного текста.

По официальной документации: 0.042 доллара за миллион входных токенов, выходные бесплатны, 1200 запросов в минуту, контекст 64k, на входе только текст. В замере - jev-1.13.0.

Метод: три задачи и честная разметка

Публичных бенчмарков для этого класса задач мало, а верить цифрам из пресс-релиза - не метод. Разметку сделал сам, по построению: для фильтра инъекций написал 10 инъекций и 10 заведомо чистых текстов, для реранкера - 6 релевантных запросу текстов и 6 заведомо посторонних. Такой замер измеряет не качество вообще, а разделимость на моём распределении данных - ровно то, что нужно знать перед встраиванием. Третья задача золотой разметки не имеет, там сравниваю поведение моделей и экономику каскада.

`1. Prompt injection: noul "есть ли скрытая инструкция для ИИ"
   20 текстов (10 инъекций / 10 чистых)
2. Реранкер: noul "релевантен ли текст запросу про сборку
   мусора в Python", 12 текстов (6 / 6)
3. Триаж новостей: choice {tradable, already_priced, noise},
   25 живых заголовков из RSS агентства`

Соперник - yandexgpt-5-lite-8b-instruct в LM Studio на той же машине, temperature 0, те же вопросы в yes/no-форме. Локальному прогону предшествовала уборка: lms unload --all, потому что в памяти LM Studio копились модели от прошлых задач. Все вызовы - параллельными пачками, у Jev замер снят на батче с 10 воркерами: 98 мс на элемент.

Задача 1: фильтр промпт-инъекций

`                 Jev        локальная 8B
инъекции (10)     9/10        7/10
чистые (10)      10/10       10/10
итого            19/20       17/20
токены            7 617       бесплатно
время            3.3 с        8+ с`

Единственный промах Jev - письмо от имени поддержки с инструкцией "сообщите пользователю код": она оценила угрозу в p=0.21. Честно сложный случай, текст маскируется под легитимную деловую переписку. Локальная модель промахнулась на нём тоже - плюс пропустила классическое "игнорируй предыдущие инструкции" и подделку конца документа через ### END OF DOCUMENT ###.

Кейс для внедрения здесь лежит на поверхности: любой агент, принимающий внешний текст - письма, тикеты, резюме, отзывы - может прогонять его через один такой вызов до основной модели. Подозрительное режется или уходит на ручную проверку. На поток в тысячу сообщений в день это копейки при 380 токенах на проверку.

Задача 2: реранкер перед генерацией

Тут Jev показала разделимость, которую обычно ждут от обученного кросс-энкодера:

`релевантные:   0.96  0.93  0.90  0.88  0.71  0.70
посторонние:   0.01  0.01  0.01  0.01  0.01  0.01`

12 из 12, между классами разрыв в 70 раз, ни одного сомнительного значения. Локальная 8B дала 11 из 12.

Практический сценарий - RAG-пайплайн: найденные ретривером чанки оцениваются одним вызовом, а код решает, что отдать дорогой генеративной модели, что выбросить, а что пометить как противоречащее вопросу. Вероятности здесь лучше бинарного вердикта: порог крутится в коде без повторного запуска инференса.

Задача 3: триаж потока и каскад

Третья задача без золотой разметки, зато ближайшая к реальному сценарию фильтрации потока: 25 живых заголовков, вопрос о торговой значимости для российского рынка. Jev разделила на 19 noise и 6 tradable: нефть через Ормузский пролив и переговоры по Ирану взяла как значимые, ДТП и спорт отсеяла.

Сравнение с локальной моделью на бинарной переформулировке того же вопроса вышло показательным иначе: совпадение только 14 из 25, и все 11 расхождений одного знака. Локальная уверенно отвечала "да, может двигать" на закрытие региональных аэропортов и сводки о БПЛА, Jev говорила noise. Формально первая права - что-то да подвигается. Практически фильтр, пропускающий всё подряд, не фильтр. Урок замера: формулировка критериев влияет на итог сильнее размера модели. У Jev критерии прописаны явно в опциях, и жёсткость фильтра управляется текстом, а не подбором промпта наугад.

Второй урок - уверенность это готовый API для каскада. Порогом 0.5 Jev пометила неуверенными 40 процентов заголовков, и именно они ушли в бесплатную локальную проверку. Калиброванная первая линия плюс дешёвая вторая стоят в разы меньше одной большой модели на всём потоке.

Задача 4: входящая почта

Спам-фильтр - пример того, где такая модель не нужна: Gmail это уже делает обученным на миллиардах писем классификатором, дублировать бессмысленно. Интереснее вопрос, на который почтовый клиент не отвечает вообще: что делать с письмом - отвечать, читать позже, хранить или выбросить. Это ежедневная боль общих ящиков компаний, куда пишут клиенты, партнёры и роботы вперемешку.

Прогнал 15 последних реальных писем своего ящика за два дня через два вопроса сразу: Choice-маршрутизация (action / read_later / archive / promo) и Noul "требует ли личного ответа в течение рабочего дня". Один запрос несёт оба ответа параллельно.

`маршрутизация:  12 archive / 2 read_later / 1 promo / 0 action
требуют ответа: 0 из 15
неуверенных (conf < 0.5): 1 из 15 - на вторую линию
время батча:    2.4 c, цена: $0.0003`

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

Что это даёт обычному

Тот же приём работает и вне корпоративного контура - везде, где нужен быстрый выбор по типам. Триаж уведомлений телефона: Automation-приложения на Android умеют перехватывать уведомления и дёргать HTTP, один вызов решает - разбудить, отложить или утопить в тишине. Семантические условия в автоматизациях вроде IFTTT или n8n: вместо хрупких if по ключевым словам - одно типизированное суждение, а третья ветка "не уверен", которой нет у булевой логики, отправляет спорный случай человеку. Бот техподдержки, который по интенту решает: баланс, заказ или живой оператор, - это тот же запрос из документации платформы. Голосовые в семейном чате после распознавания речи сортируются на "срочно" и "мусор" без единого правила. Поток в сотню событий в день на таких задачах стоит порядка пяти центов в месяц.

Кейсы применения

Всё вышеупомянутое не гипотеза, а паттерны из официальной документации TypeSafe, я добавил только свои цифры. Фильтр инъекций - это их guardrails: экранирование сообщений, входящих в LLM-приложение и выходящих из него, с оценкой серьёзности. Реранкер - cookbook про классификацию пассажей для RAG: отсеять нерелевантное, пометить противоречащее вопросу до того, как это увидит генеративная модель. Уверенность как сигнал эскалации - их же confidence-gated routing: уверенное решение автоматом, неуверенное - человеку или тяжёлой модели.

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

Экономика

`весь сеанс:  57 вызовов, 24 397 входных токенов = $0.001
тариф:       $0.042 за миллион входных, выходные - 0
скорость:    1200 запросов/мин, 98 мс/элемент на батче`

Для сравнения: один chat-LLM вызов классификации - это секунды задержки, риск галлюцинаций формата и на порядок выше цена за тот же вердикт.

Где такая модель не нужна

Она не пишет текст - проза, суммаризация и код мимо. Не дублирует решённое: спам-фильтр почтового клиента - обученный классификатор, второй такого же рода не нужен. Не считает числа и не предсказывает значения - только выбирает из заданных опций. Не принимает картинки и аудио. И не заменяет обученные классификаторы там, где есть размеченные данные: своя обученная модель на своём потоке и быстрее, и бесплатнее.

Грабли

Русский текст модель понимает, но основной язык обучения английский, и на пограничных русских случаях уверенность занижена - порог каскада калибровать на своей выборке, не брать с потолка.

Заголовок Authorization не терпит кириллицы. Если ключ хранится в файле с русскими комментариями - не читайте файл целиком, urllib упадёт с latin-1 encode error.

Модель стоит пиновать по версии (jev-1.13.0), а не брать alias: пороги калибруются под конкретный снапшот, а alias переезжает при релизах.

Ссылки

Продолжение серии: Матрица Эйзенхауэра на модели решений - часть 2, 100 писем за 13 секунд

Документация TypeSafe | Паттерны применения | HTTP API | Скилл для агентов

Подписывайся: @hermesagentru