Документация

Kev-9B

Сводка по модели

Kev-9B — это модель принятия решений. Она читает один документ (состояние) и набор типизированных вопросов о нём и возвращает калиброванное распределение вероятностей по вариантам, приложенным к каждому вопросу, за один прямой проход и без генерации текста. Она предназначена для разработчиков, которые классифицируют, маршрутизируют, сортируют или проверяют документы и которым нужны вероятности, пригодные для порогов, — например, чтобы отправлять неуверенные случаи на проверку человеком. Она реализует публичный API System One от TypeSafe (POST /v1/systemone), поэтому TypeSafe SDK работает с ней без изменений. Это LoRA-адаптер и указательная голова на Qwen3.5-9B-Base, помещающиеся на одну GPU класса 24 ГБ. Эта карточка описывает версию 2, выпущенную 2026-09-30 и включённую в Kev 1.0.

Детали модели

Разработчик Jared Palmer (github.com/jaredpalmer/kev)
Тип модели Модель принятия решений: бэкбон каузальной языковой модели, работающий только на prefill, с указательной головой по вариантам
Бэкбон Qwen/Qwen3.5-9B-Base (ревизия 68c46c4b): 32 слоя, 24 Gated DeltaNet (линейное внимание) и 8 полного внимания, размер скрытого слоя 4 096; заморожен
Адаптер LoRA, ранг 16, α 32, на проекциях внимания, MLP и DeltaNet (45.4M параметров)
Голова Указательная голова: две проекции оценивают закрывающий токен каждого варианта против финального токена вопроса; softmax даёт вероятности
Точность вычислений Обучение с bf16-автокастом поверх весов fp32; обслуживание в bf16 (адаптер сливается с базой при загрузке); оценка в fp32
Контекст Обслуживаются состояния до 65 536 токенов, плюс как минимум 8 192 токена на вопрос. Обучающие состояния были не длиннее 7 552 токенов.
Проверенная длина контекста 8 192 токена (см. «Длинные документы»)
Калибровка Одна температура, T = 2.19, хранится в head.pt и применяется при загрузке
Языки Английский
Лицензия Apache-2.0 (адаптер и голова); базовая модель — Apache-2.0
Версия v2 (Kev 1.0): main из jaredpalmer/kev-9b, ревизия b5d8c18e (выпущена 2026-09-30)
Предыдущая версия v1, тот же рецепт без стадии документов и навыков (T = 2.30), на теге v1; её карточка — это README на том теге

Вход. Состояние (текст либо объект или массив JSON, отрендеренный как размеченный текст) и любое число именованных вопросов, каждый из которых одного из трёх типов:

Тип Варианты Выход
choice 1–255 именованных вариантов, каждый с необязательным описанием вероятность на вариант, наиболее вероятный вариант и уверенность
score 1–255 упорядоченных уровней вероятность на уровень и ожидаемый индекс уровня
noul да / нет, с необязательными описаниями вероятность «да»

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

Назначение

  • Типизированные решения по документам в несколько тысяч токенов: классификация, маршрутизация, сортировка, выбор при извлечении, проверки политик и права на участие, а также оценка предложенного ответа по изложенным критериям.
  • Рабочие процессы, которые действуют по уверенности: автоматизировать уверенные случаи и ставить в очередь остальные, с порогами, зафиксированными на размеченной выборке собственной нагрузки пользователя.
  • Самостоятельно размещённая замена эндпоинта System One на одной GPU класса 24 ГБ и отправная точка для дообучения на собственных метках пользователя (kev.train --init_from jaredpalmer/kev-9b).

Использование вне охвата

  • Генерация текста, чат, суммаризация или ответы на открытые вопросы. Модель только оценивает предложенные ей варианты.
  • Полностью автоматические решения с юридическими, медицинскими, финансовыми, кадровыми или подобными последствиями для людей, без проверки человеком.
  • Вопросы, ответ на которые зависит от фактов, которых нет ни в состоянии, ни в общих знаниях, и экзамены, требующие больших знаний (см. «Ограничения»).
  • Арифметика дат с точностью до дня без препроцессора KEV_DATE_FACTS=1, состояния длиннее 65 536 токенов и языки, кроме английского.

Как использовать

Запустите её из репозитория Kev. На CUDA она работает в bf16 со слитыми ядрами DeltaNet и CUDA-графами (одна L40S или H100; резидентно около 22 ГБ); на Apple Silicon та же команда обслуживает её через MLX, что выбирается автоматически.

git clone https://github.com/jaredpalmer/kev.git && cd kev && uv sync --extra serve
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-9b --port 8008          # v2, Kev 1.0 (this card)
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-9b@v1 --port 8008       # v1
from typesafe_sdk import Choice, Noul, TypeSafeClient

client = TypeSafeClient(api_key="local", base_url="http://127.0.0.1:8008", model="kev-latest")
response = client.system_one(
    state="I was charged twice for order 1182. Please refund one of the charges.",
    questions={
        "team": Choice(instructions="Which team should handle this?",
                       criteria={"billing": "Charges and refunds", "shipping": "Deliveries", "returns": "Exchanges"}),
        "urgent": Noul(instructions="Does this need a reply today?"),
    },
)
print(response.choices["team"].choice, response.nouls["urgent"].noul)

Калиброванная температура применяется по умолчанию; KEV_TEMPERATURE=1.0 возвращает сырые вероятности. KEV_DTYPE=fp32 выбирает точный путь, используемый для оценки. KEV_DATE_FACTS=1 дописывает число дней между каждой парой дат, найденных в состоянии, — модель обучена это использовать. Состояние свыше 65 536 токенов отклоняется с 422, где указано число его токенов.

Обучающие данные

Этап Записи Содержание и метки
Базовый рецепт (decision-v7) 12 576 10 000 записей из десяти публичных наборов данных для классификации (по 1 000, перечислены в метаданных этой карточки) с их родными метками; 896 сгенерированных минимальных пар политик по девяти семействам шаблонов; 1 680 записей из 60 случайно сгенерированных структур правил в четырёх рендерингах; метки вычислены кодом
Даты и отсутствующие доказательства 1 425 Сгенерировано: 900 кейсов политик с датами (обычные, с предложением-счётчиком дней или с полем date_facts); 255 кейсов с удалённым решающим предложением и равномерной целью, плюс 270 нетронутых контролей
Документы и навыки, одна стадия 16 539 documents-v1 train: 5 219 повествований о потребительских финансовых жалобах США (CFPB, до ~7k токенов) с 7 488 вопросами, метки сохранялись там, где два открытых учителя согласились с собственной подачей потребителя. hard-v1 train: 6 000 программно размеченных записей в семи семействах навыков (длинные политики, компромиссы, вероятность, многошаговые рассуждения, даты и арифметика, оценка предложенного ответа, воздержание при недостающем факте), шаблоны 0–3. devtools-v1 train: 5 320 записей из CodeReviewer, CommitPackFT, FlakeFlagger и Aegis с собственными метками каждого датасета

Две стадии дообучения проигрывают заново 2 000 и 10 000 записей из decision-v7. Ни один выход Jev (хостируемой модели принятия решений от TypeSafe) не использовался. CodeReviewer и FlakeFlagger взяты из Zenodo; повествования CFPB — это произведения правительства США; лицензии и ревизии по каждому источнику зафиксированы в манифестах наборов. Наборы только для оценки ниже (breadth-v1, tasksource-heldout-v1, transfer-v4, longdoc-v1, а также источники When2Call и prompt-инъекций из devtools-v1) в обучение не входят.

Процедура обучения

  1. Базовый рецепт. Две эпохи на decision-v7 от базы: LoRA ранга 16, α 32; скорость обучения 5e-5, расписание one-cycle; эффективный батч 8 (4 × накопление 2); bf16-автокаст, gradient checkpointing. Лосс — кросс-энтропия по вариантам каждого вопроса. Порядок вариантов перемешивается, варианты «none of the above» и дистракторы вставляются случайно, а четверть записей choice дополнительно даёт минимальную пару (вопрос с вариантом «none of the above», один раз с присутствующим верным вариантом и один раз с удалённым).
  2. Даты и отсутствующие доказательства. Одна эпоха от стадии 1 при скорости обучения 2e-5 с 2 000 проигранных заново записей. Это v1.
  3. Документы и навыки. Одна эпоха от v1 на всех трёх обучающих наборах вместе при скорости обучения 2e-5 с 10 000 проигранных заново записей; батч 2 × накопление 4; состояния не длиннее 7 552 токенов; seed 1; 3 318 шагов оптимизатора.
  4. Калибровка. Одна температура, T = 2.19, минимизирующая отрицательное логарифмическое правдоподобие на 648 вопросах из отложенных наборов данных: 448 из калибровочного сплита transfer-r3 (шесть публичных наборов данных, QNLI, SciQ, TweetEval-offensive, PAWS, MMLU и Emotion, плюс два отложенных семейства сгенерированных записей политик) и 200 вопросов MMLU-Pro (transfer-v9 development). Пул был проверен против обучающих наборов чекпойнта до подгонки.

Оценка

Методология. Каждое сравнение идёт против Kev-9B v1 на идентичных элементах, каждая модель при своей обслуживаемой температуре (v1: 2.30). Сравнения и их планки были зарегистрированы до подтверждающих чтений; тестовые партиции читались один раз для этого чекпойнта; тест transfer-v4 закрыт (читается один раз на кандидата). Парные интервалы — это 95 % бутстрэпы с пересэмплированием целых записей (2 000 пересэмплов), поэтому вопросы, делящие одно состояние, движутся вместе. Различия даны в процентных пунктах (п.п.). Jev (хостируемая модель TypeSafe, запрашиваемая через Vercel AI Gateway) показан там, где он читался на тех же элементах. Наборы:

  • breadth-v1: 14 отложенных публичных наборов данных в пяти областях (знания, язык, поиск, инструменты, искусство), обучение на них не велось.
  • transfer-v4: решения вне домена из шести никогда не обучавшихся публичных источников плюс отложенные структуры политик и правил.
  • transfer-r3: панель коротких состояний из тех же восьми отложенных источников, что и калибровочный пул.
  • hard-v1: семейства навыков выше; тестовый сплит удерживает шаблоны тренированных генераторов.
  • devtools-v1: решения по инструментам разработчика из шести источников с проверенной лицензией (четыре обучались, два только для оценки).
  • documents-v1 / documents-v2: повествования о жалобах CFPB; v2 — закрытый отложенный тестовый набор.
  • longdoc-v1: коммерческие контракты CUAD и сгенерированные пакеты соглашений с состояниями от 4k до 64k токенов.

Ключевые панели devtools-v1 исключают две задачи, чьи метки состояние не определяет (flakeflagger, тип изменения коммита); одни и те же строки уходят с обеих сторон.

Результаты против v1 (зарегистрированное подтверждение).

Панель (вопросы) Kev-9B v2 Kev-9B v1 Δ [95 % CI]
development hard-v1 + devtools-v1, audited (1 855) 0.821 0.628 +19.3 [+17.2, +21.6]
development documents-v1 (920) 0.902 0.833 +7.0 [+4.8, +9.2]
Короткие состояния: development transfer-v4 + тест transfer-r3, без emotion (1 586) 0.871 0.871 +0.1 [−1.1, +1.2]
тест hard-v1 + devtools-v1, audited (1 859) 0.822 0.635 +18.7 [+16.7, +20.8]
тест documents-v1 (936) 0.900 0.829 +7.1 [+4.7, +9.2]
Вне домена, закрытый тест transfer-v4 (656): точность 0.852 0.852 +0.0 [−1.7, +1.8]
закрытый тест transfer-v4: обслуживаемый Brier 0.199 0.224 −0.025 [−0.047, −0.007]

Отложенные данные (обучение не велось).

Панель (вопросы) Kev-9B v2 Kev-9B v1 Jev
development breadth-v1, все 14 наборов (3 075) 0.700 0.697 0.757
тест breadth-v1, все 14 наборов (3 089) 0.698 0.692 0.757
тест breadth-v1, индекс со случайной поправкой¹ [95 % CI] 41.0 [38.8, 43.9] 40.0 [38.1, 43.0] 54.0 [51.2, 57.0]
Вне домена, development transfer-v4 (656): точность / Brier 0.820 / 0.262 0.822 / 0.264 0.857 / 0.211
закрытый тест transfer-v4: ECE / уверенные ошибки (p ≥ 0.9 и неверно) / покрытие при ошибке ≤ 5 % 0.034 / 1.4% / 0.742 0.042 / 3.2% / 0.645 –
Короткие состояния, тест transfer-r3 (1 150) 0.847 0.847 –
MMLU-Pro, 10 вариантов (transfer-v9 development) 0.590 0.515 0.840
Неотвечаемые элементы, на которые дан ответ с p ≥ 0.9 (меньше — лучше) 0.00 0.00 0.09

Против v1 разница точности на breadth-v1 составляет +0.3 [−0.7, +1.3] на development и +0.6 [−0.4, +1.6] на тесте. development tasksource-heldout-v1 был прочитан для этого чекпойнта, но его чтение не завершено; здесь он не приводится.

Тренированные семейства (отложенные элементы и шаблоны).

Панель (вопросы) Kev-9B v2 Kev-9B v1 Jev
development hard-v1 (1 083) / тест (1 088) 0.813 / 0.834 0.574 / 0.584 0.777 / –
development devtools-v1 (1 072) / тест (1 071), все источники 0.772 / 0.791 0.631 / 0.637 0.713 / –
development documents-v1 (920) / тест (936) 0.902 / 0.900 0.833 / 0.829 0.868 / –
documents-v2, закрытый отложенный тест (953) 0.900 0.821 –
development decision-v7 (1 264) / закрытый тест (1 200) 0.874 / 0.873 0.872 / – 0.845 / –
Отложенные домены сгенерированных решений, ood-v2 (4 988) 0.889 – –

Различия на тесте против v1: hard-v1 +25.0 [+22.0, +28.1], devtools-v1 (все источники) +15.4 [+11.0, +19.4], documents-v2 +8.0 [+5.9, +10.2].

Длинные документы.

  • Проверенная длина контекста: 8 192 токена, обученная длина. Бин 16k выходит за допуск: его нижняя граница −3.7 п.п., ниже −3 п.п., поэтому более длинные длины не проверены.
  • Правило, зафиксированное до чтения: проверенная длина — это номинальный размер наибольшего бина от 16 384 токенов и выше, такого что он и каждый бин между ним и 8 192 остаются в допуске. В допуске значит, что разница точности на CUAD относительно бина 8k (состояния в 6 553–7 618 токенов, обученная длина), спаренная по одному и тому же контракту, повторам и вопросу, имеет 95 % нижнюю границу не ниже −3 п.п., и на каждую запись был дан ответ. Если бин 16k провален, проверенная длина — 8 192 токена.

Точность CUAD, ECE и парная разница относительно бина 8k по номинальной длине состояния (longdoc-v1 development):

Номинальная длина состояния Вопросы CUAD Точность ECE Δ относительно 8k, п.п. [95 % CI]
4k 443 0.876 0.049 –
8k 453 0.850 0.051 эталон
16k 452 0.839 0.033 −1.4 [−3.7, +0.9]
32k 454 0.819 0.041 −3.6 [−6.4, −0.9]
64k 452 0.801 0.056 −5.2 [−7.9, −2.5]

ECE при поставляемой T = 2.19. Δ спарена по 445–447 вопросам, заданным об одних и тех же контрактах на обеих длинах. Бин 4k содержит другие контракты и не является эталоном для правила. Источник: runs/r28-readout/context.json (зарегистрированное чтение раунда 28, runs/r29-9b-r18a-longdoc).

Калибровка (expected calibration error, ECE, как обслуживается; меньше — лучше):

Панель Kev-9B v2 (T = 2.19) Kev-9B v1 (T = 2.30)
тест breadth-v1, все 14 наборов 0.034 0.044
development transfer-v4 / закрытый тест 0.041 / 0.034 0.042 / 0.042
тест hard-v1 0.054 0.075
тест devtools-v1, все источники 0.098 0.147
тест documents-v1 0.017 0.103

90 % бутстрэп-интервал температуры — [2.05, 2.41]. Температура v1 2.30 была подогнана на девелоперских строках её собственного обучающего распределения; v2 — первая 9B, обслуживаемая при температуре, подогнанной на отложенных наборах данных.

Прочие результаты.

Набор Kev-9B v2 Jev
Арифметика дат, политика deadline (transfer-v9 development) 0.725 0.95
MMLU, 4 варианта (transfer-v9 development) 0.725 0.90
SemIf (144 авторских решения; близко к насыщению, приводится только для сведения) 0.917 0.965

Обслуживание. CUDA, bf16 со слитыми ядрами и CUDA-графами; время модели на запрос (медиана из 20) для нового / повторного состояния, измеренное на v1 (та же архитектура и форма адаптера):

GPU 6 вопросов, короткое состояние 5 вопросов, состояние в 2 200 токенов Запросов/с, 64 клиента
L40S 66.4 / 42.7 мс 235.6 / 57.5 мс 32.7
H100 24.0 / 16.6 мс 88.5 / 26.4 мс 79.5

Резидентная память GPU — 21.9 ГБ. Обслуживаемые вероятности держатся в пределах 0.017 от пути оценки fp32 на 280 вопросах, без изменённых ответов. На пути оценки fp32 (H100, v2) состояния в 16k / 32k / 64k токенов занимают 5.1 / 10.9 / 25.4 с и 4.6 / 9.1 / 18.2 ГиБ сверх весов.

Apple Silicon (MLX): измерения длинных состояний, сделанные для Kev-0.8B и Kev-4B, на этом размере не проводились; на 32 ГБ M5, использованном для них, бэкбон bf16 на 19.3 ГБ и его рабочий набор не поместились в доступную память.

¹ Индекс со случайной поправкой из community Decision Index 0.2: по каждому набору (score − chance) / (1 − chance), усреднённый внутри каждой области, затем 100 × среднее по пяти областям. Индекс Jev — из отдельного чтения тех же тестовых элементов.

Ограничения и компромиссы

  • Отбор. Этот чекпойнт был обучен и прочитан на девелоперских данных в более раннем раунде и пересмотрен по более позднему правилу с известными этими числами. Тестовые партиции и закрытое чтение, каждое прочитанное для него по одному разу, служат защитой; считайте девелоперские запасы оптимистичными.
  • Её большие приросты — в распределении. Обучающие сплиты hard-v1, devtools-v1 и documents-v1 входят в её обучающие данные; эти приросты — отложенные элементы и шаблоны тренированных семейств, а не перенос на новые задачи.
  • На новой работе она не лучше v1. тест breadth-v1 +0.6 п.п. [−0.4, +1.6], development transfer-v4 −0.2 п.п. [−2.4, +1.8], тест transfer-r3 +0.0 п.п. [−1.2, +1.2]. Kev-27B опережает её на 11 пунктов по индексу breadth-v1, Jev — на 13.
  • Знания задаются базой. MMLU-Pro — 0.590 против 0.675 у Kev-27B и 0.840 у Jev.
  • Арифметика дат — её самое слабое семейство: 0.725 на вопросах политики deadline против 0.95 у Jev; препроцессор KEV_DATE_FACTS=1 помогает.
  • Калибровка. devtools-v1 — её наименее калиброванный набор (тест ECE 0.098). Интервал температуры — [2.05, 2.41]. Температура была записана в head.pt из зарегистрированной подгонки по пулу с зафиксированной причиной, потому что скрипт калибровки не может перечислить источники объединённого обучающего файла, чтобы перепроверить сам пул; проверка самого раунда это покрывала. Эта проверка не покрывает данные дат и отсутствующих доказательств v1, чей манифест не перечисляет источников; эти записи — четыре сгенерированных семейства, ни одно из которых не в пуле.
  • Необученные длины. Обучающие состояния были не длиннее 7 552 токенов. Более длинные состояния обслуживаются до 65 536 токенов; насколько сохраняется точность — это проверенная длина контекста выше.
  • Порядок вариантов может изменить ответ; изоляция вопросов этого не предотвращает.

Смещения, риски и этические соображения

  • Калиброванные вероятности могут создавать неоправданное доверие. Температура была подогнана на публичных отложенных наборах данных и не переносится на любой рабочий процесс; измерьте точность и калибровку на размеченной выборке собственных данных и перенастройте там температуру (python -m kev.calibrate), прежде чем задавать пороги.
  • Точность и калибровка сдвигаются при смене домена. Следите за частотой ошибок в проде, а не полагайтесь на числа выше.
  • Не используйте её для значимых автоматических решений о людях без проверки человеком. Смещения базовой модели и обучающих данных (включая метки, произведённые другими моделями) не измерены.
  • Состояния могут содержать личные или конфиденциальные данные. Самостоятельный хостинг держит входные данные на вашей аппаратуре; сервер открыт, если не задан KEV_API_KEY, поэтому применяйте собственный контроль доступа и политику обращения с данными.

Вычисления

  • Базовый рецепт и стадия дат (v1): по одной GPU NVIDIA H100.
  • Стадия документов и навыков: 2.6 часа на одной NVIDIA H200 (пик 74.1 ГБ).
  • Проверки оценки и обслуживания: по одной GPU H100 / H200 / L40S на Modal.

Происхождение и воспроизводимость

  • Код, наборы и отчёты об оценке: github.com/jaredpalmer/kev. Номера релиза: runs/release/kev-9b-r27.json (scripts/release_numbers.py --release kev-9b-r27); зарегистрированное правило и вердикты experiments/rounds/r27.json, runs/r27-readout/, runs/r27-verdict/; чтения семейства от 2026-09-30 runs/fam-9bnew-breadth/, runs/fam-9b-breadth/ и runs/fam-breadth-test-report/; ood-v2 runs/r29-9b-r18a-ood/; обслуживание runs/serve-9b-l40s/, runs/serve-9b-h100/, runs/long-state-9b-h100/.
  • Стадии: базовый прогон q35-9b/01-trial-1 (тег v7-base); даты night2-9b-du/00-trial-0 (v1, тег v1); документы и навыки, раунд 18, ветвь (a) r18-9b/00-trial-0 (experiments/round18/joint.json), отобранная и подтверждённая как 9b-r18a раунда 27.
  • Выпущенные веса: коммит Hub b5d8c18e; sha256 адаптера 2b2a70cf4ef4440b6c22899e1f72c2f8ea5c6f65b19aa344539b4b8971d1f13d, sha256 head.pt 8e1dab2c… (T = 2.1936).
  • Проверка: загруженная анонимно с Hub, она воспроизвела ответы предрелизной оценки на 252 из 252 строк SemIf и 764 из 764 строк development transfer-v4 при T = 2.19 (runs/rel9-public/).

Цитирование

@misc{palmer2026kev9b,
  title        = {Kev-9B: a calibrated decision model on Qwen3.5-9B},
  author       = {Palmer, Jared},
  year         = {2026},
  howpublished = {\url{https://huggingface.co/jaredpalmer/kev-9b}},
  note         = {Version 2, released 2026-09-30; Kev 1.0}
}

Контакты

Вопросы и проблемы: github.com/jaredpalmer/kev/issues.