Kev-0.5B — prototipo (superado)
Kev-0.5B es un modelo de decisión. Recibe un documento (el estado) y un conjunto de preguntas tipadas, y devuelve una distribución de probabilidad para cada pregunta en una sola pasada hacia adelante. No genera texto.
Es un adaptador LoRA más una pequeña cabeza de puntero sobre Qwen/Qwen2.5-0.5B. Reproduce la arquitectura que Archer Hume infirió para el Jev de TypeSafe en Jev’s Architecture Unmasked, y sirve el contrato público /v1/systemone de TypeSafe.
Este checkpoint es el prototipo original, entrenado en un portátil en septiembre de 2026 para mostrar que el mecanismo funciona. Queda superado por Kev-0.8B, Kev-4B y Kev-9B, que usan bases Qwen3.5, suites congeladas con suma de comprobación y una receta hallada tras ~110 ensayos controlados; en los mismos elementos fuera de dominio (transfer-v4 dev) este modelo puntúa 0.561 frente a 0.643 / 0.794 / 0.812.620 / 0.790 / 0.796. Se mantiene en el Hub como referencia y para reproducibilidad; para cualquier otra cosa, usa la familia actual.
- Hub: jaredpalmer/kev-0.5b (etiqueta
v0.1) - Código, receta de entrenamiento, evaluación y demo: github.com/jaredpalmer/kev
- Pesos: release de GitHub
v0.1.0,kev-0.5b.tar.gz(38 MB; adaptador LoRAadapter_model.safetensors, cabezahead.pt, archivos del tokenizador,eval.json, registro de entrenamiento). SHA-25615639f79…6e12f8, resumen completo en el.sha256adyacente. Descomprime enruns/kev/. Los pesos no se confirman en git.
Detalles del modelo
| Desarrollado por | Jared Palmer, con Devin (Cognition) |
| Tipo de modelo | Transformer causal, solo prefill, máscara de rama causal por bloques, lectura por puntero |
| Modelo base | Qwen/Qwen2.5-0.5B (494M parámetros, congelado) |
| Adaptador | LoRA rango 16, alpha 32, dropout 0.05, sobre q_proj k_proj v_proj o_proj gate_proj up_proj down_proj (las 24 capas) |
| Cabeza | Dos mapas lineales 896 → 256 (consulta desde <decide>, clave desde cada </opt>), producto escalar escalado, softmax sobre las opciones |
| Parámetros entrenables | 9.3M (LoRA 8.8M + cabeza 0.46M), 1.9% del backbone |
| Precisión | fp32 (entrenamiento y servicio en Apple MPS) |
| Contexto usado en entrenamiento | ≤ 384 tokens de estado, ≤ undefined tokens por rama de pregunta |
| Contexto permitido en servicio | 8,192 por rama (el backbone admite 32k) |
| Tipos de pregunta | noul (sí/no), choice (2–255 opciones), score (2–255 niveles ordenados) |
| Idioma | Inglés |
| Licencia | Apache-2.0 para el adaptador y la cabeza. El modelo base está bajo la licencia de Qwen (Apache-2.0 para Qwen2.5-0.5B). Los conjuntos de datos llevan sus propias licencias. |
| Versión | Kev-0.5B v0.1, entrenado el 2026-09-17 |
Uso previsto
Previsto. Investigación sobre modelos de decisión: calibración de lecturas directas de probabilidad, atención de estado compartido / pregunta aislada, sensibilidad al orden de las opciones y compatibilidad a nivel de API con el contrato System One de TypeSafe. Demos locales y docencia.
No previsto. Cualquier decisión en producción que afecte a personas: moderación, fraude, crédito, contratación, enrutamiento médico o legal. El conocimiento del modelo se limita a un backbone de 0.5B, su calibración solo está verificada en las distribuciones de entrenamiento y no se han medido sus salidas en tareas desconocidas.
Cómo se usa el modelo
La entrada es una única secuencia de tokens empaquetada:
<state> …state… <q> instr <opt> o1 </opt> <opt> o2 </opt> … <decide> <q> … <decide> …
- La máscara de atención permite que un token de pregunta vea el estado y su propia rama solo. Las preguntas no pueden verse entre sí.
- Cada rama reinicia los IDs de posición después del estado.
- Para cada pregunta, la cabeza puntúa cada estado oculto
</opt>contra el estado oculto<decide>y aplica softmax. - El código de la aplicación convierte las distribuciones en la respuesta de la API:
choice/confidencepara Choice,p(yes)para Noul, nivel esperado para Score.
Los tokens reservados son tokens especiales existentes de Qwen (<|fim_prefix|>, <|fim_middle|>, <|box_start|>, <|box_end|>, <|fim_suffix|>). El texto del usuario se sanea para que no pueda producirlos.
Sirve con python -m kev.serve --run runs/kev y llama a POST /v1/systemone, o usa typesafe-sdk con base_url="http://127.0.0.1:8009".
Datos de entrenamiento
Seis conjuntos de datos públicos, convertidos en solicitudes con la forma de TypeSafe y renderizados con la misma ruta de código que se usa en el servicio (api.to_record()). Se muestrearon 1,500 registros por fuente de las particiones estándar de train, lo que da 9,000 registros y 13,500 preguntas (4,500 Choice, 6,000 Noul, 3,000 Score).
| fuente | partición | convertido a | notas |
|---|---|---|---|
| Banking77 | train | Choice, K = 77 | nombres de intención como claves de opción; descripciones con plantilla, 50% null |
| BoolQ | train | Noul | pasaje como estado; 40% con criterios true/false |
| AG News | train | Choice K = 4 + 2 Noul | preguntas de sí/no derivadas, empaquetadas con la pregunta de tema |
| MNLI | train | Choice K = 3 | premisa como estado, hipótesis en las instrucciones |
| SST-5 | train | Score, 5 niveles | |
| Yelp Review Full | train | Score 5 niveles + Noul | texto truncado a 220 palabras; recommend = estrellas ≥ 4 |
Variación de renderizado aplicada en el momento de la conversión: ~30% de descripciones de opción null, ~10% de descripciones estructuradas {"what": …}, ~15% de instrucciones estructuradas {"question", "focus"}, ~32% de estados envueltos como objetos o arrays ({"document"}, {"ticket": {"channel","body"}}, [{"role","content"}]).
Aumento aplicado una vez por registro antes de codificar: orden de las opciones mezclado; con probabilidad 0.10 la opción verdadera se sustituye por other: None of the above; con probabilidad 0.15 se añade una opción distractora irrelevante.
Sin datos generados por LLM. Sin anotación humana más allá de los conjuntos de datos originales.
Procedimiento de entrenamiento
| Objetivo | Entropía cruzada sobre las opciones, promediada sobre las preguntas de un registro |
| Optimizador | AdamW, lr 2e-4, weight decay 0.01, esquema OneCycle (10% de calentamiento) |
| Lote | 1 registro por paso, acumulación de gradiente 8, recorte de gradiente 1.0 |
| Épocas | 2 (2,250 pasos de optimizador) |
| Hardware | Apple M5, 32 GB de memoria unificada, backend MPS de PyTorch 2.8 |
| Tiempo de reloj | ~1h45m (~0.29 s por registro) |
| Semilla | 0 |
| Pérdida de entrenamiento final | 0.27 |
Este checkpoint es anterior a dos términos de pérdida que ahora son predeterminados en kev/train.py: el término ordinal para Score (--ord_w) y la KL de consistencia de permutación para Choice (--perm_kl). Para reproducir este checkpoint exactamente:
uv run python -m kev.train --n_per_source 1500 --epochs 2 --accum 8 --perm_kl 0 --ord_w 0 --out runs/kev
Ten en cuenta que el aumento ahora se vuelve a aplicar en cada época en lugar de fijarse en el momento de codificar, así que una nueva ejecución no será idéntica bit a bit.
Evaluación
Particiones de test / validación reservadas de las mismas seis fuentes, 150 registros por fuente, 1,350 preguntas, semilla 1. Resultados completos en runs/kev/eval.json.
Precisión y calibración
| fuente | 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 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 levels) |
| yelp | 5 | 0.313 / 0.043 | 0.353 / 0.078 | 0.553 / 0.118 / 0.95 (MAE 0.54 levels) |
| yelp yes/no | 2 | 0.833 / 0.129 | 0.833 / 0.066 | 0.887 / 0.084 / 0.33 |
| all | 0.799 / 0.065 |
Líneas base: Qwen/Qwen2.5-0.5B (sin ajustar) y Qwen/Qwen2.5-0.5B-Instruct (plantilla de chat), mismo texto renderizado, logits del siguiente token sobre las letras de opción A–H; no se ejecutó para K = 77. El ECE usa 10 bins de ancho igual sobre la probabilidad superior.
Escalado por temperatura
Ajustado con registros de índice par, probado con los de índice impar: T = 1.47. NLL reservada 0.505 → 0.481, ECE 0.057 → 0.031. El modelo es ligeramente demasiado confiado antes del escalado.
Pruebas de mecanismo
| prueba | resultado |
|---|---|
| Aislamiento (secreto en la pregunta hermana / ausente / en el estado) | p = 0.03 / 0.03 / 0.99 |
| Empaquetado frente a separado, diferencia máxima de probabilidad absoluta | 3.7e-6 (2.0× más rápido empaquetado, ~2.7 preguntas por solicitud) |
| Permutación, 4 órdenes, Choice K ≥ 3 | el argmax cambia 7.4%; dispersión media de p(correct) 0.065, p90 0.25 |
| IIA, añadir una opción irrelevante | media |Δ log-odds| top-2 = 0.13, p90 0.34 |
| Falsificación de delimitadores, texto de opción con delimitadores falsos | número de opciones sin cambios; p de la opción falsificada ≤ 0.09 |
Limitaciones
- Solo en distribución. Todos los números anteriores son sobre particiones reservadas de los conjuntos de datos de entrenamiento. La generalización fuera de las fuentes no se ha medido para este checkpoint.
- Backbone pequeño. 0.5B parámetros. En el ejemplo de criterios estructurados de los docs de TypeSafe, el modelo elige
return_policydonde Jev eligereturn_status. La comprensión lectora (BoolQ 0.75, MNLI 0.75) está muy por debajo del estado del arte. - Cobertura de tareas estrecha. Seis conjuntos de datos y unas diez plantillas de instrucciones. Código, tablas, chat multiturno, aritmética y condiciones de varios pasos no se entrenan.
- La sensibilidad al orden permanece. 7% de cambios de argmax y una dispersión de probabilidad p90 de 0.25 bajo reordenación de opciones. Un umbral cerca de una frontera de decisión puede cambiar la acción.
- La confianza de Score la calcula el código de servicio, no el checkpoint. Era
1 − E|level − mode| / (L − 1)cuando se escribió esta tarjeta; ahora esmax(0, 1 − E|level − mode| / D), donde D es la desviación absoluta media de una distribución uniforme sobre los niveles, como en el adaptador de referencia de TypeSafe (system-one-adapter0.2.1). - La calibración no es una garantía. Un ECE de 0.03 tras el escalado por temperatura en estas fuentes no dice nada sobre la calibración en un flujo de trabajo nuevo. Las reglas de puntuación propias dan el incentivo correcto; no eliminan la necesidad de datos de resultados.
- Limitaciones heredadas de Qwen2.5-0.5B y de los conjuntos de datos, incluido su ruido de etiquetas, sesgos demográficos (p. ej. Yelp, intenciones bancarias) y cobertura solo en inglés.
Sesgo, riesgos y recomendaciones
Los conjuntos de entrenamiento llevan los sesgos de sus fuentes: categorías de noticias centradas en EE. UU., terminología bancaria en inglés, reseñas de restaurantes y etiquetas de NLI obtenidas por crowdsourcing. El modelo los reflejará.
Las salidas directas de probabilidad parecen autorizadas. Un confidence: 0.92 de este modelo es un estadístico sobre su propia distribución entre tres opciones, no una probabilidad verificada de acertar. No fijes umbrales con él para decisiones trascendentales sin medir antes la calibración con tus propios resultados etiquetados.
La propiedad de aislamiento de preguntas es una característica de seguridad real (el texto de una pregunta no puede manipular la respuesta de otra) y se verificó. La protección contra falsificación de delimitadores se verificó para los cinco tokens reservados. Otras vías de inyección de prompts a través del texto del estado no se han estudiado.
Impacto ambiental
Una ejecución de entrenamiento: ~1.75 h en un único SoC de portátil Apple M5 a unos 30–40 W, es decir, unos 0.06 kWh. La evaluación y las ejecuciones de prueba añaden una cantidad similar. Es poco.
Cita
@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}
}
Contacto
Abre un issue en github.com/jaredpalmer/kev.