Nokia открыла исходный код AnyJev: слой без обучения, превращающий любую открытую LLM в калиброванную модель принятия решений
Команда прикладных исследований Nokia опубликовала в открытом доступе AnyJev — библиотеку Python, которая превращает открытую большую языковую модель в модель принятия решений. Обучение не требуется. Библиотека предназначена для распространённой производственной задачи: выбора одного ответа из фиксированного набора вместо написания предложения.
Можно ли использовать её в продакшене? Да, библиотека устанавливается из PyPI, распространяется по лицензии Apache-2.0 и включает бэкенды transformers и vLLM с оценкой общих префиксов.
Что такое AnyJev?
AnyJev заимствует свой интерфейс у Jev. Jev — это модель принятия решений System One, которую TypeSafe AI представила в сентябре 2026 года (наш материал). Вы задаёте AnyJev типизированный вопрос и получаете решение с вероятностью, для которой можно установить порог. Эта вероятность считывается из распределения следующего токена модели. Ничего не генерируется, не анализируется и не обучается.
Библиотека поддерживает 3 типа вопросов:
- Вопрос типа
choiceвыбирает один из K вариантов. - Вопрос типа
noulпредполагает ответ «да» или «нет». - Вопрос типа
scoreпомещает ответ в одну из нескольких упорядоченных категорий.
Проблема непосредственного чтения логитов
Многие открытые проекты уже ограничивают следующий токен метками вариантов и считывают оценки. Исследовательская команда Nokia указывает на 2 недостатка такого подхода. Во-первых, ответ может измениться при перестановке вариантов. Во-вторых, вероятности не откалиброваны.
В документе об уровнях названы 2 причины:
- Первая — априорное смещение: модель отдаёт предпочтение некоторым меткам, например «Да» вместо «Нет», независимо от входных данных.
- Вторая — позиционное смещение: модель отдаёт предпочтение определённым позициям в списке вариантов.
Как работает AnyJev: L0 и L1
Каждое решение содержит поле level.
L0 (нулевая маркировка, включена по умолчанию) применяет 2 исправления:
- Циклические сдвиги. Для вопроса с K вариантами список показывается в K циклических перестановках, поэтому каждый вариант один раз оказывается на каждой позиции. Результаты объединяются в логарифмическом пространстве как геометрическое среднее. Если позиционное смещение аддитивно в пространстве логитов, это полностью его устраняет.
- Коррекция априорных вероятностей. По умолчанию AnyJev использует пакетную калибровку. Она поддерживает скользящее среднее предсказанных распределений на реальных входных данных и делит на него с коэффициентом 0,75. Коррекция начинается после 8 элементов.
L0 требует K предварительных вычислений для каждого решения, выполняемых пакетно на основе общего префикса. При размере пакета 32 на одной H100 это составляет около 0,25 с на решение при K = 20.
L1 (от 100 до 500 меток на вопрос) добавляет температурное масштабирование поверх L0. Подобранные значения сохраняются в небольшом артефакте JSON. L1 изменяет форму уверенности, но не меняет ранжирование ответов.
Результаты бенчмарка
На Qwen3-8B с BANKING77 (20 вариантов, 300 тестовых элементов) показатели выглядят следующим образом:
| Метрика | Необработанные логиты | AnyJev L0 | AnyJev L1 |
|---|---|---|---|
| Требуемые метки | 0 | 0 | от 100 до 500 |
| Доля изменений при обратном порядке вариантов | 0.230 | 0.073 | 0.077 |
| Точность | 0.747 | 0.803 | 0.807 |
| Ошибка калибровки (ECE) | 0.240 | 0.184 | 0.095 |
| Доля автоматически принимаемых решений при ошибке 5% | 7.7% | 46.3% | 52.0% |
Ещё несколько результатов из репозитория:
- L0 уменьшил количество изменений порядка во всех 9 протестированных комбинациях моделей и задач.
- На наборе типизированных решений Qwen3-32B с L1 достигла ECE 0.036 против опубликованного для Jev показателя 0.144. По точности дообученная Laya по-прежнему лидирует.
- В полной таблице абляционного исследования представлены модели Qwen, OLMo, Granite, Phi и Mistral.
- По словам Wu, команда опробовала AnyJev на внутренней задаче маршрутизации Nokia и получила многообещающие результаты.
Как использовать AnyJev
# pip install "anyjev[hf]"
from anyjev import Decider, Question
from anyjev.backends.hf import HFBackend
d = Decider(HFBackend("Qwen/Qwen3-8B"))
route = Question.choice("Which team should handle this?",
["billing", "technical", "sales", "other"], name="route")
r = d.decide({"conversation": [...]}, [route])
r["route"].distribution # probabilities per optionДля сервинга запустите vLLM с кэшированием префиксов и укажите на него VLLMBackend.
Ключевые выводы
- AnyJev превращает открытые большие языковые модели в типизированные модели принятия решений в стиле Jev без обучения.
- L0 использует циклические сдвиги и пакетную априорную коррекцию для устранения позиционного смещения и смещения меток.
- На Qwen3-8B BANKING77 доля изменений при обратном порядке вариантов снижается с 0.230 до 0.073.
- Доля автоматически принимаемых решений при ошибке 5% с L1 возрастает с 7.7% до 52.0%.
- Библиотека распространяется по лицензии Apache-2.0 на PyPI и поддерживает бэкенды Hugging Face и vLLM.
Посмотрите репозиторий на GitHub. Вся благодарность исследователю этого проекта. Также подписывайтесь на нас в Twitter и не забудьте присоединиться к нашему сабреддиту о машинном обучении с более чем 150 тыс. участников и подписаться на нашу рассылку. Постойте! Вы есть в Telegram? теперь к нам можно присоединиться и в Telegram.
Хотите сотрудничать с нами для продвижения своего репозитория на GitHub, страницы на Hugging Face, релиза продукта, вебинара и т. д.? Свяжитесь с нами
Переведено автоматически с английского. Оригинал статьи — по ссылке ниже.