Daily MaverickNONUTRO: I’m not nuts about the disappearance of ProNutroPunchEkiti deploys CNG buses to cut transport fares by 50%The Jerusalem PostOne person injured, one killed after light aircraft crashes in northern IsraelBollywood HungamaSamantha Ruth Prabhu wins big in Bombay High Court: Unauthorised use of her name, image and voice on AI platforms barredCNN TürkFon Koordinasyon Kurulu 2’nci kez toplanıyorRTP DesportoJudo/Mundiais: Ausência de Alice Bellandi abre incógnita nos -78 kgInquirerThinking Trillanes is ‘not welcome’ in trial is a ‘baseless assumption’ – TongolSky TG24Esenzione bollo auto 2027, le risposte dell'ACI alle domande più frequentiBBC News'I was not going to let others die' - pilot of Flydubai flight describes cockpit attack by co-pilotNotJustOkLALAKULA Lyrics by Txmmyily, Famous Pluto & ZayleveltenSoompiCha Seung Won, Ra Mi Ran, Park Hyung Sik, And More Confirmed For New Action Comedy FilmХабрИстория одного пулреквеста в DKMS: когда сообщение об ошибке — это баг
The Daily Newsstand · Free, Always
Friday, October 2, 2026

Разбор Jev — модели, которая не умеет писать

Translate

Утро началось с того, что ко мне в личку пришел друг и спросил: «Кто это такой, этот Jev? Ты работаешь с ИИ, должен знать».

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

Что такое Jev

Пока вендор в этой категории один — TypeSafe, он же и главный разработчик. Модель залистили на OpenRouter 18 сентября 2026, модальность выхода в каталоге — decisions.

Jev представляет класс моделей решений (decisions). На вход подается список вариантов и вопрос/критерии к ним. А, на выходе вероятности по каждому из элементов в зависимости от того на сколько хорошо элемент списка соостветствует критериям или отвечает на вопрос. Модель закрытая, контекст составляет 32 000 токенов, цена за вход — 0,042 $ за миллион токенов и бесплатный выход, которого по факту практически нет.

Вопросы бывают трех типов — noul (булев), choice и score. Примеры выглядят так:

// вопросы задаются словарем: ключ — имя решения, значение — критерии и тип
"is_bug": { criteria: {
    false: "Клиент задает вопрос или просит новую функциональность.",
    true:  "Клиент описывает поломку или неожиданное поведение продукта." },
  instructions: "Клиент сообщает о дефекте?", type: "noul" }
"team": { criteria: { "account": "Доступы, биллинг, учетная запись",
    "frontend": "Интерфейс, верстка, поведение в браузере",
    "payments": "Платежи, списания, возвраты" },
  instructions: "Какая команда должна забрать тикет?", type: "choice" }

"urgency": { criteria: [ "Может подождать следующего релиза",
    "Надо починить на этой неделе", "Прямо сейчас режет выручку" ],
  instructions: "Насколько срочный тикет?", type: "score" }

Ответ приходит по тем же ключам, и главное в нем — распределение:

res.answers.is_bug.probabilities   // { false: 0.07, true: 0.93 }
res.answers.team.probabilities     // { account: 0.06, frontend: 0.11, payments: 0.83 }
res.answers.urgency.probabilities  // [ 0.12, 0.61, 0.27 ] — по уровням шкалы

Все это быстро и дешево: на моих замерах медиана вызова — 418 мс (с учетом прокси в виде OpenRouter), а 1 000 запросов стоит 33 цента. Числа и методику приведу ниже.

Дополнительно про модель

Это новый класс моделей, и метод обучения авторы описывают в анонсе как «Reinforcement Learning for Calibrated Decisions (RLCD)». Работу Jev можно эмулировать обычной LLM: попросить ее вернуть JSON с оценкой по каждому варианту. Получится то же самое по смыслу, но медленнее и дороже. 

Насколько именно, я померил в этой же статье: LLM-промпт на том же входе дал медиану 2 129 мс против 418 и 2,16 $ за 1 000 запросов против 0,33 $. Ответ приходит текстом, и его надо парсить - это может сломаться если LLM модель начнет галлюцинировать или сыпать артефактами. Придется посылать запрос заново что приведет к х2 по времени и х2 по затратам на LLM, класс Jev - архитектурно сделан так, чтобы избежать проблем.

Для каких задач

Где применять? Везде, где варианты известны заранее, но неизвестен правильный: классификация, роутинг, выбор из множества, гейты, оценка качества и другие похожие задачи.

В своих сценариях я думаю использовать его как быструю систему принятия решений, а LLM — как главный мозг. Модель на выходе дает вероятности, а это хороший инструмент, чтобы алгоритмически принимать решения: например, при a = 0,8 и b = 0,7 решение может отличаться от случая, когда a = 0,8 и b = 0,3. 

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

Вендор обещает разницу в десятки и сотни раз. У меня получилось скромнее, но в ту же сторону. На одной и той же задаче реранкинга медиана Jev — 418 мс против 2 129 мс у LLM с промптом, то есть впятеро, а по 99-му перцентилю — 976 мс против 10 секунд. Для realtime это разница между «успеваем» и «не успеваем», но счет идет на разы, а не на сотни раз (в измерение входят пинг и задержки OpenRouter).

За счет высокой скорости некоторые умельцы уже научили модель играть в Doom, змейку или T-Rex-игру из Chrome. Если передать текущий стейт игры и управление, то можно научить ее играть практически в любую игру. Для более сложных вариантов, скорее всего, понадобится LLM, чтобы задавать долгосрочный план.

В реальных задачах

Когда я увидел Jev, мне сразу в голову пришла идея заменить реранкер в моем RAG — ведь это прямо то, что нужно. Посчитаем, какие чанки валидны для запроса пользователя, а какие нет. И будто должно получиться дешевле.

Что такое реранкер и где он стоит

RAG (retrieval-augmented generation) — это когда модель отвечает не из весов, а по найденным в вашей базе кускам текста. 

Реранкер в этой схеме работает валидатором: пересортировывает найденное и отсекает лишнее, чтобы не тащить в контекст LLM мусор. 

Путь запроса такой:

1. запрос пользователя;

2. query expander — разворачиваем запрос и убираем опечатки;

3. search — ищем блоки текста;

4. reranker — переранжируем блоки, чтобы оставить только валидные;

5. ответ — генерируем ответ пользователю.

Пример кода использования Jev в пайплайне RAG:

const res = await client.alpha.decisions.create({
  model: '~typesafe/Jev-latest',
  state: { query, documents },        // 20 чанков одним куском
  questions: Object.fromEntries(
    documents.map((_, i) => [doc_${i}, {
      type: 'score',
      criteria: ['not relevant', 'weakly relevant', 'relevant', 'highly relevant'],
    }]),
  ),
});

const score = (i) => res.answers[doc_${i}].probabilities; // score = EV по уровням

Еще до прогона видна деталь формата: вероятности возвращаются округленными до сотых, и если мерить релевантность бинарно — «релевантен/нерелевантен» — score принимает всего 100 возможных значений.

На 20 документах tie score неизбежны, а при равных score такие документы будут попадать в LLM в случайном, относительно друг друга, порядке.

Поэтому я сразу взял ординальный score-вопрос с четырьмя уровнями релевантности: score считается как математическое ожидание по распределению, и шкала расширяется до сотен уникальных значений — tie score становится вдвое с лишним меньше.

Tie score — это когда двум документам модель выставила одинаковый score. Порядок между ними тогда не определен и решается тем, как отработала сортировка: обычно остается исходный порядок поиска. Чем грубее шкала, тем чаще такое случается и тем меньше от реранкера пользы.

Округление никуда не делось и на ординальной шкале: одинаковые score получают около 17% документов против 42% на бинарной. Это уже терпимо, но держать в голове стоит.

ИИ‑роутер — доступ к 300+ моделям из одной панели

Подключите OpenAI‑совместимый шлюз по единому API‑ключу. Настраивайте сквозную аналитику, отслеживайте лимиты и квотируйте ресурсы.

Запустить ИИ‑роутер →

Как я мерил

50 вопросов по публичной документации, у каждого вопроса один ожидаемый документ. Для каждого вопроса заготовлены топ-20 блоков из гибридного поиска, одни и те же для всех методов, — так что сравниваем мы реранкер, а не поиск. Четыре вызываемых конфигурации × 50 вопросов × 3 раунда = 600 вызовов.

Участники:

  • qwen3-reranker-8b — кандидат под замену, нативный /rerank;

  • Jev — Decisions API, вызовы шли через OpenRouter;

  • gemini-2.5-flash с промптом «оцени релевантность каждого чанка, верни JSON» — в двух конфигурациях, с обрезкой документа до 2 000 и до 500 символов. В таблице ниже — вариант с 2 000; вариант с 500 оказался не хуже (и даже чуть лучше по MRR — 0,861), его числа есть в паке;

  • baseline — исходный порядок поиска, без реранка. Вызовов не делает, поэтому в 600 не входит.

Реранкинг ложится на Decisions API двумя способами, и я померил оба. Бинарный choice-вопрос на документ — это основной прогон. Ординальный (порядковый) score-вопрос с четырьмя уровнями, про который я писал выше, — отдельные три раунда на тех же кандидатах. 

В таблице стоит ординальный, потому что именно его я и хочу использовать; бинарный на тех же данных дает hit@1 0,767 и MRR 0,830, то есть разницу внутри шума. Ординальный прогон — это еще 150 вызовов сверх 600. Оба лежат в паке целиком, пересчитать можно любой.

Потолок называю сразу: ожидаемый документ есть в кандидатах только у 47 вопросов из 50. Выше 0,94 по hit@10 не прыгнет никто.

Метрика

baseline

qwen3-reranker-8b

Jev

gemini-2.5-flash

hit@1

0,68

0,82

0,80

0,80

hit@3

0,82

0,88

0,92

0,90

hit@5

0,86

0,88

0,92

0,90

hit@10

0,88

0,90

0,94

0,92

MRR

0,754

0,856

0,849

0,848

NDCG@10

0,671

0,674

0,683

0,700

Как читать таблицу, объясняю ниже.

hit@k — доля вопросов, где ожидаемый документ в первых k позициях. hit@1 — точность верхней строки, hit@10 — «не потеряли ли вовсе» (в топ-10 попадает то, что уедет в контекст LLM). Пример: Jev hit@10 = 0,94 — у 47 из 50 вопросов документ в десятке, это потолок набора.

MRR — среднее 1/позиция первого релевантного: нашел на 1-й — 1,0, на 3-й — 0,33. Чувствителен к высоте попадания, а не только к факту.

NDCG@10 — качество порядка всей десятки: чем выше релевантный документ, тем больше вклад. Важно, когда генератору важен весь контекст, а не одна верхняя строка.

baseline — порядок поиска без реранкера; главный ориентир, добавляет ли реранкер вообще (по hit@1 добавляет +0,12…+0,14, статистически значимо). Различия между реранкерами при 50 вопросах статистически незначимы: p по всем парам и метрикам лежит между 0,32 и 1,0.

Экономика и хвост латентности

Половина выводов дальше опирается на деньги и время, поэтому вот они — по тем же 150 вызовам каждого метода:

qwen3-reranker-8b

Jev

gemini-2.5-flash

$/1000 запросов

1,07 $

0,33 $

2,16 $

p50

595 мс

418 мс

2 129 мс

p95

1 460

540

3 188

p99

1 776

976

10 072

max

3 567

1 233

18 191

Jev дешевле Qwen в три раза, а LLM-промпта — в шесть раз. Абсолютные числа маленькие, и это важно для выводов дальше: экономия в 0,74 $ на тысячу запросов — реальная, но ее надо сравнивать не с ценой реранка, а с ценой всего запроса.

Ортогональный сигнал

Самое интересное, что я нашел, — попарные корреляции Спирмена между векторами score:

Пара

ρ

qwen ↔ gemini

0,67

Jev ↔ gemini

0,37

Jev ↔ qwen

0,34

Корреляция Спирмена (ρ) — мера того, насколько совпадают два порядка. 1 — порядки совпадают полностью, 0 — связи между ними нет, −1 — они противоположны.

Qwen с Gemini согласуются на 0,67 — то есть делают похожие выводы, а Jev с кем угодно дает 0,34–0,37, он стоит особняком. Модель оценивает релевантность принципиально иначе: она не повторяет ошибки ни поиска, ни классических реранкеров. Туда же, вероятно, и ее чуть более высокий hit@10.

Score, пороги и калибровка

Реранкер можно использовать в двух режимах: сортировать чанки по score или фильтровать — выкидывать все, что ниже порога. С сортировкой все понятно, а вот можно ли по score отсекать массив чанков? Я прогнал каждый score как классификатор: чанк из ожидаемого документа — «релевантный», остальные — «нерелевантные» (50 вопросов × 20 чанков × 3 раунда = 3 000 точек на метод).

Метод

Average Precision

Порог лучшего F1

P / R на нем

Jev

0,663

0,51

0,54 / 0,85

gemini-2.5-flash

0,562

≈0 (тривиальный)

0,48 / 0,94

qwen3-reranker-8b

0,553

≈0 (тривиальный)

0,45 / 1,00

Как читать таблицу:

  • Порог лучшего F1 — граница «score выше → считаем релевантным», подобранная так, чтобы точность (precision) и полнота (recall) были максимальны одновременно. Порог 0 у Qwen и Gemini значит: как ни отсекай чанки, лучше ничего не выкидывать;

  • P / R на нем — точность и полнота на этом пороге. У Qwen recall 1,00 и precision 0,45 — это «пропустить все»: фильтр не работает;

  • Average Precision — площадь под PR-кривой, качество score как «релевантен/нерелевантен» в целом, без выбора порога.

Вывод: у двух методов из трех порог лучшего F1 — около нуля. Единственная стратегия, которую подтверждает перебор порогов, — не фильтровать вовсе: их score годятся только как ключ сортировки. Score Jev — единственный, которым можно отсекать чанки.

Что это значит на практике. У нас порог фильтрации — 0,3, подобранный под шкалу обычного реранкера. Шкала Jev сдвинута вверх, поэтому 0,3 для нее ничего не значит: выше порога проходят почти все чанки — и релевантные, и мусор. Резать надо примерно посередине: в диапазоне 0,49–0,51. Но и там разделение скромное: релевантные чанки в среднем score 0,68, нерелевантные — 0,55. Разница невелика.

И про сами числа score. Честная ли это вероятность? Нет: ECE 0,170, Brier 0,245 — до «score 0,9 = девять из десяти релевантных» далеко. Score 0,97 реально означает релевантность примерно в 8 случаях из 10, в средней зоне (0,4–0,7) модель стабильно завышает. Вывод: сортировать по score — можно, верить абсолютному значению — нельзя.

Доходит ли это до пользователя

Ранжирование — не самоцель, поэтому финальный замер на реальных запросах: 4 метода × 50 вопросов × 2 раунда = 400 сгенерированных ответов и 400 слепых судейств по шкале 1–5. Контексты собраны репликой прод-логики из записанных score, промпт один в один прод-промпт сервиса сборки контекста, судья не знает, какой метод оценивает.

Метод

Judge score (из 5)

Δ vs baseline

p (парный bootstrap)

baseline (порядок поиска)

3,96

—

—

Jev

4,01

+0,05

1,0

qwen3-reranker-8b

4,13

+0,17

0,23

gemini-2.5-flash

4,26

+0,30

0,023

Шум между двумя раундами одного и того же метода — средняя абсолютная разница оценки 0,32–0,42 балла, одинаковую оценку судья ставит в 62–70% случаев. Это сопоставимо с разницей между методами: Jev↔Qwen (0,12, p=0,54) тонет в нем полностью. Значимо лучше baseline оказался только вариант с LLM-промптом — тот самый, который уже похоронен по цене.

Зато вот что видно отчетливо: когда ожидаемый документ доехал в контекст, оценка ответа 4,21–4,49, когда не доехал — 1,6–1,8. Разрыв около 2,6 балла, корреляция позиции первого нужного чанка с оценкой ответа −0,66…−0,80. Генератор соберет нормальный ответ и с третьей позиции; он не соберет никакого, если документа в контексте нет.

Вывод формулирую прямо: разница между реранкерами почти не доходит до пользователя. Выбор реранкера — решение про цену и хвост латентности, а не про качество ответов. Решает же то, доехал документ в контекст или нет, то есть recall поиска важнее тонкостей топ-1.

В прод?

Дешевле, быстрее, с таким же качеством как было — можно лить в прод? Думаю, пока не стоит спешить, конкретно на моей задаче с RAG:

Революции на моей задаче не произошло. Различия внутри группы реранкеров при 50 вопросах статистически неразличимы. Модель хорошо справляется с такой задачей как реранкинг — и это хороший сигнал, но специализированные модели решают это также хорошо.

Выигрыш реальный, но не той величины, чтобы окупить зависимость. Втрое дешевле — это 0,74 $ на 1 000 запросов, и только на шаге реранка. Реранк — не пренебрежимая часть запроса (на его вход уходит около 8 000 токенов против 4 500 на вход генерации), но и не та статья расходов, ради которой заводят зависимость от вендора на раннем доступе: доля экономии в цене всего запроса зависит от того, какой моделью вы генерируете ответ. Со временем та же история: по медиане выигрыш у реранка составляет 150 миллисекунд, и на фоне генерации ответа их не видно.

Юридическая рамка еще не готова к проду. Опубликованного SLA нет. Вместо него в Master Customer Agreement (далее MCA): «TYPESAFE не гарантирует, что использование Клиентом Сервисов будет бесперебойным или безошибочным. Сервисы предоставляются «КАК ЕСТЬ» (AS IS) и «ПО МЕРЕ ДОСТУПНОСТИ» (AS AVAILABLE).». Возможно, для энтерпрайза есть непубличный документ — публично его нет.

Право менять API прописано явно: «Такие изменения могут привести к несовместимости API.». Справедливости ради, там же вендор обязуется прилагать «коммерчески разумные усилия» к предупреждению заранее.

Хранение. «TypeSafe не несёт обязанности по хранению или удержанию Данных Клиента и вправе удалять Данные Клиента в любое время по своему единоличному усмотрению.». Срока хранения в privacy policy нет — только «в той мере, в какой это разумно необходимо».

Потолок ответственности — «БОЛЬШЕЕ ИЗ: (A) СУММЫ, УПЛАЧЕННОЙ… И (B) 50 ДОЛЛАРОВ США». Обратите внимание на конструкцию: 50 $ здесь не потолок, а пол, и для заметно платящего клиента реальный предел выше. Но если вы только пробуете — какой бы ущерб ни случился, вы получите пятьдесят долларов.

Хостинг только в США: «Сервисы размещаются на территории Соединенных Штатов Америки (США).». Для части компаний это самостоятельный стоп-фактор. Я не юрист, весь legal проверял нейронкой, но выглядит не очень хорошо, по крайней мере на данный момент.

Задачи, для которых Jev должен подойти лучше

Задачу для замеров я взял из своего текущего пайплайна — давайте подумаем, где Jev может раскрыться лучше.

Agentic RAG

В классическом RAG Jev конкурирует с реранкером. Но есть место, где его свойства могут раскрыться лучше — Agentic RAG. И почти в каждой точке нужно ровно то, что делает decision-модель:

Решение

Тип ответа

Откуда паттерн

Нужен ли ретрив

choice (yes/no/continue)

Self-RAG

Релевантен ли документ

noul

Self-RAG, CRAG

Подкреплен ли ответ источниками

choice (full/partial/none)

Self-RAG

Что делать при неуверенности

choice (Correct/Incorrect/Ambiguous)

CRAG

Какая стратегия под сложность запроса

choice

Adaptive-RAG

Нужен ли еще hop

noul

IRCoT

В какой источник идти

choice

routing, RAGRoute

Какой инструмент дернуть

choice

ReAct

  • Self-RAG — модель сама решает, когда ходить в поиск, и оценивает релевантность найденного и подкрепленность своего ответа. Для этого ее дообучают на спецтокены рефлексии;

  • CRAG (Corrective RAG) — перед генерацией score ретрива проверяется порогами: нашлось хорошо → отвечаем, плохо → переписываем запрос и ищем заново, неоднозначно → идем в веб-поиск;

  • Adaptive-RAG — простые запросы идут коротким путем (один ретрив), сложные — многошаговым. Классификатор сложности выбирает стратегию заранее.

Такой контракт уже исследован — только «изнутри» модели. Self-RAG дообучает модель под спецтокены рефлексии (Retrieve ∈ {yes, no, continue}, IsRel ∈ {relevant, irrelevant}, IsSup ∈ {fully, partially, no support}) — это буквально choice и noul. CRAG пропускает score ретрива через два порога — Correct / Ambiguous / Incorrect. 

Decision-модель делает то же самое, но без дообучения и с вероятностью на выходе. А сегодня такая точка в цикле — вызов LLM с просьбой вернуть JSON: медленно, парсинг ломается (если принять ходовую отраслевую оценку в 97% успешных вызовов со схемой, то цикл из десяти шагов пройдет без единой ошибки валидации в 0,97¹⁰ ≈ 74% случаев).

Почему Jev тут может раскрыться: решений в цикле много, каждое на горячем пути — значит, важны плоская латентность и цена втрое ниже; дальше по коду ветвление, а не текст — значит, важен типизированный ответ. Это гипотеза которая приходит мне на ум — на практике нужно тестить.

Пак данных

Все, на чем построены числа выше, лежит в данных: golden set из 50 вопросов, кандидаты с исходными score поиска, 600 замеренных вызовов со score, латентностью и стоимостью, агрегаты, статистика, пять исследований модели и результаты E2E-судейства. Оба маппинга реранкинга — и бинарный, и ординальный, на котором построена главная таблица, — лежат там целиком, так что любую строку можно пересчитать с нуля.

Если пересчитаете и получите другое — напишите, мне интересно.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.