Архитектурный разбор модели Jev от TypeSafe AI: как устроен вероятностный слой быстрых решений внутри кода и агентных систем без лишних затрат на генеративные LLM.

Когда агенту нужно решить, в какой отдел направить письмо или безопасно ли выполнить консольную команду, разработчики обычно зовут большую языковую модель: Claude Sonnet, GPT-4o или DeepSeek. Модель прочитывает весь контекст, несколько секунд формирует цепочку рассуждений и возвращает JSON с единственным полем. Для задачи уровня «да/нет» или выбора одного варианта из трех это создает лишнюю задержку в несколько секунд, взвинчивает расходы на токены и заставляет постоянно следить за тем, чтобы парсер не сломался о синтаксис ответа.

В сентябре 2026 года лаборатория TypeSafe AI (созданная экс-исследователем OpenAI Диого Алмейдой и предпринимателем Эриком Гафни при поддержке фонда DCVC на $40M) предложила другое решение — модель Jev, названную в честь парадокса Джевонса.

Jev не генерирует текст для человека. Это модель класса System One: она принимает текущее состояние программы (state) и список типизированных вопросов, а на выходе сразу отдает готовые вероятности, категории и показатели уверенности для детерминированного кода.

В чем разница: System 1 против System 2

Подход опирается на классическую модель мышления Даниэля Канемана. Обычные LLM и reasoning-модели отвечают за медленное, пошаговое рассуждение (System 2). Модели класса System One рассчитаны на быстрое, интуитивное распознавание образов и оценку ситуаций (System 1).

ПараметрОбычная LLMJev (System One)
Входные данныеПромпт, сообщения, длинный контекстСостояние программы (state) + типизированные вопросы
Формат выводаСтрока текста (Markdown, JSON)Типизированные структуры (Noul, Choice, Score)
Способ вычисленияАвторегрессионный (генерация токен за токеном)Параллельный сэмплинг за один проход
Оценка вероятностейКосвенная (через logprobs) или отсутствуетНативное калиброванное распределение вероятностей
ТарифОплата входа и дорогого сгенерированного выхода$0.042 за 1M входных токенов, вывод бесплатный
Время ответаОт 1.5 до 15+ секундОт 70 до 500 миллисекунд
Ошибки схемыВозможны сбои валидации JSONИсключены на уровне интерфейса
НазначениеНаписание текстов, длинные рассуждения, кодМаршрутизация, triage, скоринг рисков, барьеры безопасности

Jev работает как смысловой if внутри программы. Компилятор без труда проверяет числовые границы (total > 1000), но не может сам ответить на вопросы: «похоже ли это сообщение на фишинг?», «требует ли действие подтверждения администратора?» или «к какой категории отнести запрос клиента?». Именно этот пласт решений берет на себя System One.

Три базовых типа: Noul, Choice и Score

Вместо длинных текстовых инструкций («ответь строго валидным JSON») логику описывают через три базовых типа:

flowchart TD
    State[Состояние программы: state] --> Jev[Jev Engine]
    Jev --> Noul[Noul: вероятность ответа да]
    Jev --> Choice[Choice: выбор варианта + уверенность]
    Jev --> Score[Score: взвешенный балл по рубрике]

1. Noul (вероятность бинарного исхода)

Возвращает вероятность ответа «да» в диапазоне от 0.0 до 1.0.

Noul — это не булево значение (true/false). Ответ 0.96 означает высокую вероятность наступления события, а 0.50 прямо сигнализирует о неопределенности модели при нехватке данных. Отдельного поля confidence здесь нет: вероятность сама по себе выражает распределение.

2. Choice (выбор из категорий)

Выбирает один вариант из заданного словаря (поддерживается до 255 вариантов).

Модель возвращает выбранный ключ, распределение вероятностей по всем вариантам и показатель уверенности (confidence). Если вариантов много, Jev выполняет внутренний двухэтапный отбор: сначала фильтрует кандидатов по релевантности, затем делает точный выбор.

3. Score (оценка по шкале)

Задает дискретную шкалу из 2–10 ступеней с понятным описанием каждой из них.

Итоговый score рассчитывается как взвешенное среднее индексов ступеней с учетом их вероятностей. Если модель дает 70% первому уровню и 30% второму, на выходе получается 1.30. Это позволяет использовать дробные пороги в бизнес-логике (if (urgency.score >= 1.8)), сохраняя привязку к исходным критериям.

Параллельный расчет: Speculative Fan-out

Главное архитектурное свойство Jev: все вопросы внутри одного запроса модель вычисляет параллельно и независимо над одним и тем же состоянием (state).

Ответ на первый вопрос никак не влияет на контекст второго. В итоге исчезает эффект взаимного зашумления контекста, который постоянно возникает при длинных диалогах с обычными LLM.

┌──> Noul: Клиент просит вернуть деньги? (0.97)
               ├──> Choice: В какую команду передать заявку? (billing: 0.89)
Состояние ────┼──> Score: Насколько критичен сбой? (2.4 / 3.0)
 (Тикет)       ├──> Noul: Есть ли признаки взлома или инъекции? (0.01)
               └──> Choice: Тональность сообщения? (angry: 0.82)

Вместо пяти последовательных обращений к модели разработчик получает полный срез нужных оценок за один сетевой запрос за 100–250 миллисекунд.

Архитектурный паттерн: децижн-слой для агентов

Поручать генеративной модели самостоятельный контроль над опасными действиями опасно. Если агент сам планирует шаги и сам решает, можно ли удалить таблицу в базе данных или списать средства с карты, злоумышленник может перехватить управление через prompt injection.

Надежная архитектура разделяет генерацию предложений и применение правил:

flowchart LR
    A[Генеративный агент на базе LLM] -->|Предлагает действие| S[Action Proposal]
    S --> J[Jev: Оценка рисков и типов]
    J -->|Вероятности + Уверенность| P[Детерминированный Policy Gate]
    P -->|Безопасно| E[Выполнение в коде]
    P -->|Повышенный риск| H[Подтверждение человека]
    P -->|Запрещено| B[Блокировка]
  1. Генеративная LLM рассуждает над задачей и формирует предложение (например, вызов инструмента с определенными аргументами).
  2. Jev параллельно оценивает предложение: проверяет деструктивность команды, наличие явного согласия пользователя и риски безопасности.
  3. Обычный код (Policy Engine) проверяет вероятности по жестким пороговым правилам и решает: выполнить команду автоматически, отправить уведомление человеку или сразу заблокировать операцию.

Практика подключения: SDK и Vercel AI Gateway

Использовать модель можно двумя путями: через нативный пакет @typesafe-ai/sdk или через шлюз Vercel AI Gateway.

Вариант 1. Node.js через нативный @typesafe-ai/sdk

Установка:

npm install @typesafe-ai/sdk

Пример маршрутизации входящих заявок в службу поддержки:

import { TypeSafeClient, choice, noul, score } from '@typesafe-ai/sdk';

const client = new TypeSafeClient({
  apiKey: process.env.TYPESAFE_API_KEY,
});

interface CustomerTicket {
  id: string;
  userEmail: string;
  message: string;
  plan: string;
}

export async function triageTicket(ticket: CustomerTicket) {
  const result = await client.systemOne({
    model: 'jev-latest',
    state: ticket,
    questions: {
      isRefund: noul('Does the customer explicitly ask for a refund of money?'),
      department: choice('Which department should handle this ticket?', {
        billing: 'Invoices, credit card charges, refund requests, subscriptions',
        tech_support: 'Bugs, error codes, service outages, API errors',
        sales: 'Upgrades, enterprise contracts, demo requests',
        other: 'General feedback, spam, unrelated messages',
      }),
      urgency: score('What is the operational urgency level of this request?', [
        'Low: General questions, minor visual issues',
        'Medium: Degraded performance, workaround available',
        'High: Production down, complete blockage, financial loss',
      ]),
    },
  });

  const { isRefund, department, urgency } = result.answers;

  // Если уверенность низкая — отдаем человеку
  if (department.confidence < 0.70) {
    return { action: 'manual_triage', reason: 'low_confidence' };
  }

  // Четкий запрос на возврат при низком приоритете — автоматическая очередь
  if (isRefund.noul > 0.95 && urgency.score < 1.0) {
    return { action: 'auto_refund_queue', department: 'billing' };
  }

  // Критический инцидент с высокой уверенностью — тревога дежурным
  if (urgency.score >= 1.8 && urgency.confidence >= 0.85) {
    return { action: 'escalate_pagerduty', department: department.choice };
  }

  return { action: 'standard_queue', department: department.choice };
}

Вариант 2. Подключение через Vercel AI Gateway

Модель каталогизирована в Vercel AI Gateway под именем typesafe-ai/jev. В коде используется функция experimental\_evaluate из Vercel AI SDK:

import { experimental_evaluate as evaluate } from 'ai';

const evaluation = await evaluate({
  model: 'typesafe-ai/jev',
  state: {
    command: 'rm -rf /var/cache/app-data',
    userRole: 'developer',
    environment: 'staging',
  },
  questions: {
    isDestructive: {
      type: 'boolean',
      instructions: 'Does this command permanently delete files or modify disk state?',
    },
    actionScope: {
      type: 'choice',
      instructions: 'What is the operational scope of this command?',
      criteria: {
        cache_cleanup: 'Cleaning temporary cache or build artifacts',
        system_mutation: 'Changing OS packages, core files or services',
        data_loss_risk: 'Deleting user data, databases or source repositories',
      },
    },
  },
  providerOptions: {
    gateway: {
      zeroDataRetention: true,
    },
  },
});

console.log(evaluation.answers);
// isDestructive -> { probability: 0.98 }
// actionScope -> { choice: 'cache_cleanup', confidence: 0.88 }

Конверт аудита (Audit Envelope)

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

{
  "timestamp": "2026-09-19T00:45:12Z",
  "workflow": "support_router_v2",
  "model_version": "jev-1.13.0",
  "state_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "answers": {
    "isRefund": 0.972,
    "department": "billing",
    "confidence": 0.914
  },
  "policy_version": "2026.09.1",
  "action_taken": "routed_to_billing",
  "human_override": false
}

Что показывают реальные бенчмарки

TypeSafe заявляет об ускорении до 193.6× и снижении затрат до 444.6× по сравнению с тяжелыми LLM на внутренних тестах. Но эти цифры получены на синтетических сценариях самой компании.

Гораздо показательнее независимые тесты сообщества:

ЗадачаУсловия тестаРезультат JevСравнениеВывод для практики
Фишинг (2 000 писем)Один прямой вопрос: «это фишинг?»Точность 62.6%, AUROC 0.689Claude Haiku 4.5: 81.3%В лоб Jev уступает универсальным языковым моделям
Фишинг (2 000 писем)Декомпозиция: 5 сигналов + логистическая регрессия в кодеТочность 95.0%, $0.038 за 1k писемHaiku (декомпозиция): 93.2%, $0.462 за 1kДекомпозиция обходит one-shot LLM при 12-кратной экономии
Реранкинг документов (8 датасетов)4-уровневая шкала ScorenDCG@10 0.692, задержка 422 мсCohere Rerank 4 Pro: 0.691, задержка 844 мсСтатистический паритет по качеству в 2 раза быстрее и в 5.6 раза дешевле
Prompt Injection (662 вектора)Детекция атак с описанием роли ассистентаТочность 96.5%, ROC-AUC 0.9927Профильные классификаторыНадежный барьер для первичной фильтрации входящего потока

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

Ограничения

Ограничения

Арифметика и точный подсчет: Jev не умеет надежно считать количество элементов в тексте или складывать числа.

Оценку смысла поручайте модели, а подсчеты и суммы вычисляйте кодом.

Календарные даты и время: Модель воспринимает даты как обычные строки.

Сравнение диапазонов, вычисление разницы дней и учет часовых поясов лучше сразу выносить в детерминированные функции.

Зашумление состояния (Context rot):

Хотя вопросы независимы между собой, длинный мусор во входном state снижает качество семантических решений.

Валидность схемы не защищает от инъекций:

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

Разная калибровка уверенности: Значение confidence = 0.90 в задаче безопасности не гарантирует 90% точности в клиентской поддержке.

Пороги требуют проверки на собственном размеченном датасете.

Антипаттерны

Антипаттерны

Один общий вопрос вместо декомпозиции: Попытка спросить «надежен ли клиент?» целиком дает нестабильный результат.

Надежнее измерить несколько конкретных факторов и соединить их логикой в коде.

Вера в безошибочность из-за строгой схемы:

Точное совпадение ответа со схемой не гарантирует, что само суждение модели истинно.

Установка порогов наугад:

Значения уверенности вроде 0.85 нельзя брать без предварительного расчета цены ложных срабатываний и пропусков.

Вызов нейросети вместо обычного правила:

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

Автоматизация без теневого режима:

Подключать модель к боевым действиям без предварительного прогона в shadow mode на реальном потоке данных рискованно.

Чеклист

Чеклист

Проверен детерминированный путь:

Подтверждено, что условие нельзя надежно и дешево закрыть обычным кодом.

Вопросы сформулированы атомарно:

Каждый вопрос оценивает ровно один фактор и не содержит двусмысленных отрицаний.

Описаны резервные варианты Choice:

Списки категорий включают вариант other или unknown для нестандартных кейсов.

Арифметика и даты вынесены в код:

Подсчеты сумм, количеств и временных интервалов переданы стандартным функциям.

Подготовлен контрольный датасет:

Собраны 50–100 реальных примеров с размеченными эталонными ответами.

Проведен теневой запуск:

Модель протестирована в shadow mode без прямого влияния на боевые процессы.

Оценена калибровка по диапазонам:

Измерена реальная доля ошибок при уверенности 0.7, 0.8 и 0.9.

Настроены пороги с учетом рисков:

При высокой цене ошибки предусмотрена передача человеку, при низкой — автоматизация.

Реализован запасной маршрут:

Прописано поведение системы при таймауте API или низкой уверенности (старшая LLM или ручная очередь).

Зафиксированы версии:

В репозитории закреплены точная версия модели, формулировки вопросов и правила обработки.

Включен аудит решений:

В журнал сохраняются хэш состояния, вероятности, итоговое действие и версия правил.

Ссылки

Ссылки