Documentation

Kev-0.5B — prototype (remplacé)

Kev-0.5B est un modèle de décision. Il prend un document (l’état) et un ensemble de questions typées, et renvoie une distribution de probabilité pour chaque question en une seule passe avant. Il ne génère pas de texte.

C’est un adaptateur LoRA plus une petite tête pointeur au-dessus de Qwen/Qwen2.5-0.5B. Il reproduit l’architecture qu’Archer Hume a inférée pour le Jev de TypeSafe dans Jev’s Architecture Unmasked, et il sert le contrat d’API public /v1/systemone de TypeSafe.

Ce checkpoint est le prototype d’origine, entraîné sur un ordinateur portable en septembre 2026 pour montrer que le mécanisme fonctionne. Il est remplacé par Kev-0.8B, Kev-4B et Kev-9B, qui utilisent des bases Qwen3.5, des suites gelées et vérifiées par somme de contrôle, et une recette trouvée à travers ~110 essais contrôlés ; sur les mêmes éléments hors domaine (transfer-v4 dev), ce modèle obtient 0.561 contre 0.643 / 0.794 / 0.812.620 / 0.790 / 0.796. Il reste sur le Hub pour référence et reproductibilité ; utilise la famille actuelle pour tout le reste.

  • Hub : jaredpalmer/kev-0.5b (étiquette v0.1)
  • Code, recette d’entraînement, évaluation et démo : github.com/jaredpalmer/kev
  • Poids : GitHub release v0.1.0, kev-0.5b.tar.gz (38 MB ; adaptateur LoRA adapter_model.safetensors, tête head.pt, fichiers de tokenizer, eval.json, journal d’entraînement). SHA-256 15639f79…6e12f8, empreinte complète dans le sidecar .sha256. À extraire dans runs/kev/. Les poids ne sont pas commités dans git.

Détails du modèle

Développé par Jared Palmer, avec Devin (Cognition)
Type de modèle Transformer causal, prefill uniquement, masque de branche block-causal, lecture pointeur
Modèle de base Qwen/Qwen2.5-0.5B (494M paramètres, gelé)
Adaptateur LoRA rang 16, alpha 32, dropout 0.05, sur q_proj k_proj v_proj o_proj gate_proj up_proj down_proj (les 24 couches)
Tête Deux applications linéaires 896 → 256 (requête depuis <decide>, clé depuis chaque </opt>), produit scalaire mis à l’échelle, softmax sur les options
Paramètres entraînables 9.3M (LoRA 8.8M + tête 0.46M), 1.9 % du backbone
Précision fp32 (entraînement et service sur Apple MPS)
Contexte utilisé à l’entraînement ≤ 384 jetons d’état, ≤ 1 024 jetons par branche de question
Contexte autorisé au service 8 192 par branche (le backbone supporte 32k)
Types de questions noul (oui/non), choice (2–255 options), score (2–255 niveaux ordonnés)
Langue anglais
Licence Apache-2.0 pour l’adaptateur et la tête. Le modèle de base est sous licence Qwen (Apache-2.0 pour Qwen2.5-0.5B). Les jeux de données portent leurs propres licences.
Version Kev-0.5B v0.1, entraîné le 2026-09-17

Usage prévu

Prévu. Recherche sur les modèles de décision : calibration des lectures directes de probabilité, attention à état partagé / questions isolées, sensibilité à l’ordre des options, et compatibilité au niveau de l’API avec le contrat System One de TypeSafe. Démos locales et enseignement.

Non prévu. Toute décision de production qui affecte des personnes : modération, fraude, crédit, recrutement, orientation médicale ou juridique. Les connaissances du modèle sont limitées à un backbone 0.5B, sa calibration n’est vérifiée que sur les distributions d’entraînement, et ses sorties sur des tâches inconnues n’ont pas été mesurées.

Comment le modèle est utilisé

L’entrée est une seule séquence de jetons groupée :

<state> …state…  <q> instr <opt> o1 </opt> <opt> o2 </opt> … <decide>  <q> … <decide>  …
  • Le masque d’attention permet à un jeton de question de voir l’état et sa propre branche uniquement. Les questions ne peuvent pas se voir entre elles.
  • Chaque branche redémarre les position ids après l’état.
  • Pour chaque question, la tête évalue chaque état caché </opt> contre l’état caché <decide> et applique un softmax.
  • Le code applicatif transforme les distributions en réponse d’API : choice/confidence pour Choice, p(yes) pour Noul, le niveau attendu pour Score.

Les jetons réservés sont des jetons spéciaux Qwen existants (<|fim_prefix|>, <|fim_middle|>, <|box_start|>, <|box_end|>, <|fim_suffix|>). Le texte de l’utilisateur est nettoyé pour qu’il ne puisse pas les produire.

Sers-le avec python -m kev.serve --run runs/kev et appelle POST /v1/systemone, ou utilise typesafe-sdk avec base_url="http://127.0.0.1:8009".

Données d’entraînement

Six jeux de données publics, convertis en requêtes de forme TypeSafe et rendus avec le même chemin de code qu’au service (api.to_record()). 1 500 enregistrements ont été échantillonnés par source dans les partitions train standard, donnant 9 000 enregistrements et 13 500 questions (4 500 Choice, 6 000 Noul, 3 000 Score).

source split converti en notes
Banking77 train Choice, K = 77 noms d’intention comme clés d’option ; descriptions gabarits, 50 % null
BoolQ train Noul passage comme état ; 40 % avec critères true/false
AG News train Choice K = 4 + 2 Noul questions oui/non dérivées groupées avec la question de thème
MNLI train Choice K = 3 prémisse comme état, hypothèse dans les instructions
SST-5 train Score, 5 niveaux
Yelp Review Full train Score 5 niveaux + Noul texte tronqué à 220 mots ; recommend = étoiles ≥ 4

Variation de rendu appliquée au moment de la conversion : ~30 % de descriptions d’option null, ~10 % de descriptions structurées {"what": …}, ~15 % d’instructions structurées {"question", "focus"}, ~32 % d’états enveloppés en objets ou tableaux ({"document"}, {"ticket": {"channel","body"}}, [{"role","content"}]).

Augmentation appliquée une fois par enregistrement avant l’encodage : ordre des options mélangé ; avec une probabilité 0.10, l’option vraie remplacée par other: None of the above ; avec une probabilité 0.15, une option distractrice non pertinente ajoutée.

Aucune donnée générée par LLM. Aucune annotation humaine au-delà des jeux de données d’origine.

Procédure d’entraînement

Objectif Entropie croisée sur les options, moyennée sur les questions d’un enregistrement
Optimiseur AdamW, lr 2e-4, weight decay 0.01, schedule OneCycle (10 % d’échauffement)
Batch 1 enregistrement par pas, accumulation de gradient 8, gradient clipping 1.0
Époques 2 (2 250 pas d’optimiseur)
Matériel Apple M5, 32 GB de mémoire unifiée, backend MPS de PyTorch 2.8
Temps réel ~1h45m (~0.29 s par enregistrement)
Graine 0
Perte d’entraînement finale 0.27

Ce checkpoint précède deux termes de perte désormais par défaut dans kev/train.py : le terme ordinal pour Score (--ord_w) et la KL de cohérence de permutation pour Choice (--perm_kl). Pour reproduire ce checkpoint à l’identique :

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

Note que l’augmentation est désormais réappliquée à chaque époque plutôt que figée au moment de l’encodage, donc une nouvelle exécution ne sera pas identique au bit près.

Évaluation

Partitions test / validation tenues à l’écart des mêmes six sources, 150 enregistrements par source, 1 350 questions, graine 1. Résultats complets dans runs/kev/eval.json.

Exactitude et calibration

source K base zero-shot Instruct zero-shot 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 oui/non 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 niveaux)
yelp 5 0.313 / 0.043 0.353 / 0.078 0.553 / 0.118 / 0.95 (MAE 0.54 niveaux)
yelp oui/non 2 0.833 / 0.129 0.833 / 0.066 0.887 / 0.084 / 0.33
all 0.799 / 0.065

Références : Qwen/Qwen2.5-0.5B (brut) et Qwen/Qwen2.5-0.5B-Instruct (gabarit de chat), même texte rendu, logits du jeton suivant sur les lettres d’option A–H ; non exécuté pour K = 77. L’ECE utilise 10 intervalles d’égale largeur sur la probabilité supérieure.

Mise à l’échelle de la température

Ajusté sur les enregistrements d’indice pair, testé sur ceux d’indice impair : T = 1.47. NLL tenue à l’écart 0.505 → 0.481, ECE 0.057 → 0.031. Le modèle est légèrement trop confiant avant la mise à l’échelle.

Tests de mécanisme

test résultat
Isolation (secret dans une question jumelle / absent / dans l’état) p = 0.03 / 0.03 / 0.99
Groupé vs séparé, écart de probabilité absolu max 3.7e-6 (2.0× plus rapide groupé, ~2.7 questions par requête)
Permutation, 4 ordres, Choice K ≥ 3 bascules d’argmax 7.4 % ; étalement moyen de p(correct) 0.065, p90 0.25
IIA, ajout d’une option non pertinente |Δ log-odds| moyen top-2 = 0.13, p90 0.34
Falsification de frontière, texte d’option avec faux délimiteurs nombre d’options inchangé ; p de l’option falsifiée ≤ 0.09

Limites

  • En distribution uniquement. Tous les chiffres ci-dessus portent sur des partitions tenues à l’écart des jeux de données d’entraînement. La généralisation hors source n’a pas été mesurée pour ce checkpoint.
  • Petit backbone. 0.5B paramètres. Sur l’exemple de critères structurés de la doc TypeSafe, le modèle choisit return_policy là où Jev choisit return_status. La compréhension de lecture (BoolQ 0.75, MNLI 0.75) est loin de l’état de l’art.
  • Couverture de tâches étroite. Six jeux de données et une dizaine de gabarits d’instructions. Le code, les tableaux, le chat multi-tours, l’arithmétique et les conditions multi-étapes ne sont pas entraînés.
  • La sensibilité à l’ordre demeure. 7 % de bascules d’argmax et un étalement de probabilité p90 de 0.25 sous réordonnancement des options. Un seuil proche d’une frontière de décision peut changer l’action.
  • La confiance Score est calculée par le code de service, pas par le checkpoint. Elle valait 1 − E|level − mode| / (L − 1) quand cette fiche a été écrite ; elle vaut désormais max(0, 1 − E|level − mode| / D), D étant l’écart absolu moyen d’une distribution uniforme sur les niveaux, comme dans l’adaptateur de référence de TypeSafe (system-one-adapter 0.2.1).
  • La calibration n’est pas une garantie. Un ECE de 0.03 après mise à l’échelle de la température sur ces sources ne dit rien de la calibration sur un nouveau flux de travail. Les règles de score propres donnent la bonne incitation ; elles ne suppriment pas le besoin de données de résultat.
  • Limites héritées de Qwen2.5-0.5B et des jeux de données, y compris leur bruit d’étiquette, leurs biais démographiques (par ex. Yelp, intentions bancaires) et leur couverture en anglais uniquement.

Biais, risques et recommandations

Les ensembles d’entraînement portent les biais de leurs sources : catégories d’actualités centrées sur les États-Unis, terminologie bancaire anglaise, avis de restaurants et étiquettes NLI issues du crowdsourcing. Le modèle les reflétera.

Les sorties de probabilité directes paraissent faisant autorité. Un confidence: 0.92 de ce modèle est une statistique sur sa propre distribution sur trois options, pas une probabilité vérifiée d’avoir raison. Ne pose pas de seuil dessus pour des décisions lourdes de conséquences sans avoir d’abord mesuré la calibration sur tes propres résultats étiquetés.

La propriété d’isolation des questions est une vraie garantie de sécurité (le texte d’une question ne peut pas manipuler la réponse d’une autre) et a été vérifiée. La protection contre la falsification de délimiteurs a été vérifiée pour les cinq jetons réservés. Les autres voies d’injection de prompt via le texte de l’état n’ont pas été étudiées.

Impact environnemental

Une exécution d’entraînement : ~1.75 h sur un seul SoC de portable Apple M5 à environ 30–40 W, soit environ 0.06 kWh. Les exécutions d’évaluation et de test ajoutent un montant similaire. C’est peu.

Citation

@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}
}

Contact

Ouvre un ticket sur github.com/jaredpalmer/kev.