Laya — открытая Python-библиотека для быстрых типизированных решений по тексту: подаёшь на вход состояние (письмо, тикет, JSON-документ) и набор вопросов, а на выходе получаешь готовые ответы с числовой уверенностью. Никакой генерации текста — значит, нечего парсить и негде взяться галлюцинациям. Пригодится тем, кто строит маршрутизацию обращений, автотриаж поддержки, гардрейлы для промптов и любые пайплайны, где решение нужно принимать за десятки миллисекунд.
Вопросы описываются в трёх типах: choice (выбрать вариант из списка критериев), score (оценить по шкале) и noul (вероятность «да/нет»). Все вопросы по одному состоянию обрабатываются за один forward pass — около 33 мс на вопрос и 7,2 мс/вопрос в батче, если верить замерам на T4. Модель неавторегрессивная, движок решений типа System 1, обучена через RLCD против строго корректных скоринговых правил. Но «из коробки» оба чекпоинта переуверены, поэтому пороги по уверенности (выше 0.85 — действуем автоматически, ниже — отправляем на человека) имеет смысл ставить только после подгонки температуры: она сдвигает средний ECE с 0.466 до 0.081 у laya и с 0.314 до 0.106 у мультиязычного. У laya-multilingual подобранных температур нет вовсе — их нужно подобрать прежде, чем опираться на его вероятности.
Внутри три чекпоинта и роутер, который сам решает, какой из них использовать под конкретный запрос:
- laya на ModernBERT-large, 421M параметров, контекст 512 — для английского;
- laya-multilingual на mmBERT-base, 322M, контекст 1024 — 100+ языков и примерно вдвое быстрее;
- laya-typed-decisions на ModernBERT-large, 421M, контекст 1024 — под воркфлоу типизированных решений.
Роутер определяет письменность и язык менее чем за 0,5 мс на чистом Python, ещё до прогона модели, и возвращает метаданные с объяснением выбора — например, «не латиница, деванагари, английский чекпоинт это не прочитает». Решение маршрутизации можно посмотреть и без запуска инференса, через router.route(). Разница видна на бенчмарке из 17 416 вопросов: английский чекпоинт даёт 0.306 на 13 неанглийских языках MASSIVE против 0.451 у мультиязычного, а на кхмерском вообще 0.000 точности при 0.952 уверенности — то есть отсечка по confidence там не спасает.
Для продакшена важно не забыть про preload. По умолчанию в памяти держится один чекпоинт, и при смене языка модель пересобирается — медианно 7,4 с на CPU и 10,3 с на T4. С Router(preload=True) все чекпоинты остаются в памяти, и переключение языка стоит только детекции. Можно подгрузить только нужные, привязать уже созданный агент через attach(), чтобы не дублировать VRAM, поднять max_loaded или освободить память вручную.
Ограничения авторы описывают прямо. Базовые чекпоинты на бенчмарке типизированных решений почти не отличаются от угадывания — 0.362 и 0.342 против 0.461 у majority-class, а результат 0.766 получен на чекпоинте, дообученном на обучающей части этого же бенчмарка: Laya — быстрая база для специализации, а не zero-shot движок решений. Вопросы с 50+ вариантами тоже проседают: при дефолтном бюджете head_max_len на 77 меток Banking77 остаётся 3–4 токена на вариант, и точность падает до 0.425 — нужно поднимать head_max_len и max_len либо разбивать выбор на два шага, от грубого к точному.
Если нужен один конкретный чекпоинт под выделенный пайплайн, роутер можно обойти и загрузить модель напрямую через laya.load(). Есть и готовые пресеты схем вопросов: интеллектуальный роутер запросов между маленькими и топовыми моделями, защита промптов от джейлбрейков, инъекций и утечек, модерация контента (токсичность, харассмент, угрозы) и триаж тикетов поддержки (интент, срочность, раздражение, риск ухода). Ставится одной командой: pip install laya. Лицензия Apache 2.0, так что модель запускается у себя и без оплаты по токенам. Проект живёт на GitHub, в репозитории есть бенчмарки, ноутбуки, тесты и исследовательские материалы.