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

Kev-0.5B — прототип (заменён)

Kev-0.5B — это модель принятия решений. Она принимает один документ (состояние) и набор типизированных вопросов и возвращает распределение вероятностей для каждого вопроса за один прямой проход. Текст она не генерирует.

Это LoRA-адаптер плюс небольшая указательная голова поверх Qwen/Qwen2.5-0.5B. Она воспроизводит архитектуру, которую Archer Hume вывел для Jev от TypeSafe в Jev’s Architecture Unmasked, и реализует публичный контракт API TypeSafe /v1/systemone.

Этот чекпойнт — исходный прототип, обученный на ноутбуке в сентябре 2026 года, чтобы показать, что механизм работает. Его заменяют Kev-0.8B, Kev-4B и Kev-9B, которые используют базы Qwen3.5, замороженные наборы с контрольными суммами и рецепт, найденный примерно через 110 контролируемых прогонов; на тех же элементах вне домена (transfer-v4 dev) эта модель набирает 0.561 против 0.643 / 0.794 / 0.812.620 / 0.790 / 0.796. Он остаётся на Hub для справки и воспроизводимости; для всего остального используйте текущее семейство.

  • Hub: jaredpalmer/kev-0.5b (тег v0.1)
  • Код, рецепт обучения, оценка и демо: github.com/jaredpalmer/kev
  • Веса: GitHub release v0.1.0, kev-0.5b.tar.gz (38 МБ; LoRA-адаптер adapter_model.safetensors, голова head.pt, файлы токенизатора, eval.json, журнал обучения). SHA-256 15639f79…6e12f8, полный дайджест в сайдкаре .sha256. Распаковать в runs/kev/. Веса не коммитятся в git.

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

Разработано Jared Palmer, совместно с Devin (Cognition)
Тип модели Каузальный трансформер, только prefill, блочно-каузальная маска ветвей, указательное считывание
Базовая модель Qwen/Qwen2.5-0.5B (494M параметров, заморожена)
Адаптер LoRA ранга 16, alpha 32, dropout 0.05, на q_proj k_proj v_proj o_proj gate_proj up_proj down_proj (все 24 слоя)
Голова Два линейных отображения 896 → 256 (запрос из <decide>, ключ из каждого </opt>), масштабированное скалярное произведение, softmax по вариантам
Обучаемые параметры 9.3M (LoRA 8.8M + голова 0.46M), 1.9% от бэкбона
Точность вычислений fp32 (обучение и обслуживание на Apple MPS)
Контекст при обучении ≤ 384 токена состояния, ≤ 1 024 токена на ветвь вопроса
Контекст при обслуживании 8 192 на ветвь (бэкбон поддерживает 32k)
Типы вопросов noul (да/нет), choice (2–255 вариантов), score (2–255 упорядоченных уровней)
Язык Английский
Лицензия Apache-2.0 для адаптера и головы. Базовая модель под лицензией Qwen (Apache-2.0 для Qwen2.5-0.5B). Наборы данных несут собственные лицензии.
Версия Kev-0.5B v0.1, обучен 2026-09-17

Назначение

Назначение. Исследования моделей принятия решений: калибровка прямых вероятностных считываний, внимание с общим состоянием и изолированными вопросами, чувствительность к порядку вариантов и совместимость на уровне API с контрактом System One от TypeSafe. Локальные демо и обучение.

Не предназначено. Для любых производственных решений, затрагивающих людей: модерация, фрод, кредитование, найм, медицинская или юридическая маршрутизация. Знания модели ограничены бэкбоном на 0.5B, её калибровка проверена только на обучающих распределениях, а выходы на незнакомых задачах не измерялись.

Как используется модель

На вход подаётся одна упакованная последовательность токенов:

<state> …state…  <q> instr <opt> o1 </opt> <opt> o2 </opt> … <decide>  <q> … <decide>  …
  • Маска внимания позволяет токену вопроса видеть только состояние и собственную ветвь. Вопросы не видят друг друга.
  • Каждая ветвь начинает позиционные id заново после состояния.
  • Для каждого вопроса голова оценивает каждое скрытое состояние </opt> против скрытого состояния <decide> и применяет softmax.
  • Прикладной код превращает распределения в ответ API: choice/confidence для Choice, p(yes) для Noul, ожидаемый уровень для Score.

Зарезервированные токены — это существующие специальные токены Qwen (<|fim_prefix|>, <|fim_middle|>, <|box_start|>, <|box_end|>, <|fim_suffix|>). Пользовательский текст санируется, чтобы он не мог их породить.

Запустите с помощью python -m kev.serve --run runs/kev и вызывайте POST /v1/systemone, либо используйте typesafe-sdk с base_url="http://127.0.0.1:8009".

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

Шесть публичных наборов данных, преобразованных в запросы формы TypeSafe и отрендеренных тем же путём кода, что и при обслуживании (api.to_record()). По 1 500 записей было взято на источник из стандартных train-сплитов, что дало 9 000 записей и 13 500 вопросов (4 500 Choice, 6 000 Noul, 3 000 Score).

источник сплит преобразовано в примечания
Banking77 train Choice, K = 77 названия интентов как ключи вариантов; шаблонные описания, 50% null
BoolQ train Noul пассаж как состояние; 40% с критериями true/false
AG News train Choice K = 4 + 2 Noul производные вопросы да/нет, упакованные вместе с вопросом о теме
MNLI train Choice K = 3 посылка как состояние, гипотеза в инструкциях
SST-5 train Score, 5 уровней
Yelp Review Full train Score 5 уровней + Noul текст усечён до 220 слов; recommend = звёзды ≥ 4

Вариации рендеринга, применённые при преобразовании: ~30% описаний вариантов null, ~10% структурированных описаний {"what": …}, ~15% структурированных инструкций {"question", "focus"}, ~32% состояний, обёрнутых в объекты или массивы ({"document"}, {"ticket": {"channel","body"}}, [{"role","content"}]).

Аугментация, применявшаяся один раз на запись перед кодированием: порядок вариантов перемешан; с вероятностью 0.10 истинный вариант заменён на other: None of the above; с вероятностью 0.15 добавлен нерелевантный вариант-дистрактор.

Никаких сгенерированных LLM данных. Никакой ручной разметки помимо исходных наборов данных.

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

Цель Кросс-энтропия по вариантам, усреднённая по вопросам в записи
Оптимизатор AdamW, lr 2e-4, weight decay 0.01, расписание OneCycle (10% разогрева)
Батч 1 запись на шаг, накопление градиента 8, ограничение градиента 1.0
Эпохи 2 (2 250 шагов оптимизатора)
Аппаратура Apple M5, 32 ГБ объединённой памяти, бэкенд PyTorch 2.8 MPS
Время счёта ~1 ч 45 мин (~0.29 с на запись)
Seed 0
Итоговый лосс обучения 0.27

Этот чекпойнт старше двух членов лосса, которые теперь по умолчанию в kev/train.py: порядкового члена для Score (--ord_w) и KL согласованности перестановок для Choice (--perm_kl). Чтобы воспроизвести этот чекпойнт в точности:

uv run python -m kev.train --n_per_source 1500 --epochs 2 --accum 8 --perm_kl 0 --ord_w 0 --out runs/kev

Учтите, что теперь аугментация применяется заново каждую эпоху, а не фиксируется при кодировании, поэтому повторный прогон не будет бит-в-бит идентичным.

Оценка

Отложенные сплиты test / validation тех же шести источников, по 150 записей на источник, 1 350 вопросов, seed 1. Полные результаты в runs/kev/eval.json.

Точность и калибровка

источник K zero-shot база zero-shot Instruct Kev-0.5B
acc / ECE acc / ECE acc / ECE / NLL
banking77 77 – – 0.860 / 0.057 / 0.56
agnews 4 0.813 / 0.069 0.787 / 0.160 0.940 / 0.028 / 0.22
agnews yes/no 2 0.780 / 0.103 0.853 / 0.062 0.960 / 0.017 / 0.10
boolq 2 0.427 / 0.274 0.607 / 0.084 0.753 / 0.136 / 0.63
mnli 3 0.460 / 0.225 0.433 / 0.390 0.747 / 0.100 / 0.63
sst5 5 0.373 / 0.083 0.447 / 0.344 0.533 / 0.121 / 1.17 (MAE 0.59 уровней)
yelp 5 0.313 / 0.043 0.353 / 0.078 0.553 / 0.118 / 0.95 (MAE 0.54 уровней)
yelp yes/no 2 0.833 / 0.129 0.833 / 0.066 0.887 / 0.084 / 0.33
все 0.799 / 0.065

Бейзлайны: Qwen/Qwen2.5-0.5B (сырая) и Qwen/Qwen2.5-0.5B-Instruct (chat-шаблон), тот же отрендеренный текст, логиты следующего токена по буквам вариантов A–H; не запускались для K = 77. ECE использует 10 равномерных бинов по верхней вероятности.

Температурное масштабирование

Подгонка на записях с чётными индексами, тест на нечётных: T = 1.47. Отложенный NLL 0.505 → 0.481, ECE 0.057 → 0.031. До масштабирования модель слегка самоуверенна.

Тесты механизма

тест результат
Изоляция (секрет в соседнем вопросе / отсутствует / в состоянии) p = 0.03 / 0.03 / 0.99
Упакованно против раздельно, макс. абс. разница вероятностей 3.7e-6 (упакованно в 2.0× быстрее, ~2.7 вопроса на запрос)
Перестановка, 4 порядка, Choice K ≥ 3 argmax меняется 7.4%; средний разброс p(correct) 0.065, p90 0.25
IIA, добавить один нерелевантный вариант среднее |Δ log-odds| top-2 = 0.13, p90 0.34
Подделка границ, текст варианта с фальшивыми разделителями число вариантов не изменилось; p поддельного варианта ≤ 0.09

Ограничения

  • Только в распределении. Все числа выше — на отложенных сплитах обучающих наборов данных. Обобщение за пределы источников для этого чекпойнта не измерялось.
  • Малый бэкбон. 0.5B параметров. На примере структурированных критериев из документации TypeSafe модель выбирает return_policy, тогда как Jev выбирает return_status. Понимание текста (BoolQ 0.75, MNLI 0.75) далеко от передовых результатов.
  • Узкий охват задач. Шесть наборов данных и около десяти шаблонов инструкций. Код, таблицы, многоходовой чат, арифметика и многошаговые условия не обучались.
  • Чувствительность к порядку сохраняется. 7% смен argmax и разброс вероятностей p90 0.25 при переупорядочивании вариантов. Порог вблизи границы решения может изменить действие.
  • Уверенность Score вычисляется кодом обслуживания, а не чекпойнтом. На момент написания этой карточки она была 1 − E|level − mode| / (L − 1); теперь это max(0, 1 − E|level − mode| / D), где D — среднее абсолютное отклонение равномерного распределения по уровням, как в эталонном адаптере TypeSafe (system-one-adapter 0.2.1).
  • Калибровка — не гарантия. ECE 0.03 после температурного масштабирования на этих источниках ничего не говорит о калибровке на новом рабочем процессе. Правильные правила оценки дают верный стимул; они не устраняют потребность в данных об исходах.
  • Унаследованные ограничения от Qwen2.5-0.5B и от наборов данных, включая шум в метках, демографические смещения (например, Yelp, банковские интенты) и покрытие только английским языком.

Смещения, риски и рекомендации

Обучающие наборы несут смещения своих источников: новостные категории с центром в США, английская банковская терминология, отзывы о ресторанах и краудсорсинговые метки NLI. Модель будет их отражать.

Прямые вероятностные выходы выглядят авторитетно. confidence: 0.92 от этой модели — это статистика о её собственном распределении по трём вариантам, а не проверенная вероятность оказаться правой. Не задавайте по ней порог для значимых решений, не измерив сначала калибровку на собственных размеченных исходах.

Свойство изоляции вопросов — это настоящая функция безопасности (текст одного вопроса не может манипулировать ответом другого), и оно было проверено. Защита от подделки разделителей была проверена для пяти зарезервированных токенов. Другие пути prompt-инъекций через текст состояния не изучались.

Воздействие на окружающую среду

Один прогон обучения: ~1.75 ч на одном ноутбучном SoC Apple M5 при примерно 30–40 Вт, то есть около 0.06 кВт·ч. Оценочные и дымовые прогоны добавляют сопоставимо. Это немного.

Цитирование

@software{kev2026,
  title  = {kev: a laptop-scale reconstruction of a Jev-style decision model},
  author = {Palmer, Jared},
  year   = {2026},
  url    = {https://github.com/jaredpalmer/kev}
}

@misc{hume2026jev,
  title  = {Jev's Architecture Unmasked},
  author = {Hume, Archer},
  year   = {2026},
  url    = {https://archerhume.com/posts/jevs-architecture-unmasked}
}

Контакты

Откройте issue на github.com/jaredpalmer/kev.