Kev-0.5B — protótipo (substituído)
O Kev-0.5B é um modelo de decisão. Recebe um documento (o estado) e um conjunto de perguntas tipadas, e devolve uma distribuição de probabilidade para cada pergunta numa única passagem direta. Não gera texto.
É um adaptador LoRA mais uma pequena cabeça de ponteiro sobre o Qwen/Qwen2.5-0.5B. Reproduz a arquitetura que Archer Hume inferiu para o Jev da TypeSafe em Jev’s Architecture Unmasked, e serve o contrato público da API /v1/systemone da TypeSafe.
Este checkpoint é o protótipo original, treinado num portátil em setembro de 2026 para mostrar que o mecanismo funciona. É substituído pelo Kev-0.8B, o Kev-4B e o Kev-9B, que usam bases Qwen3.5, suites congeladas com somas de verificação e uma receita encontrada através de ~110 ensaios controlados; nos mesmos itens fora da distribuição (transfer-v4 dev) este modelo obtém 0.561 contra 0.643 / 0.794 / 0.812.620 / 0.790 / 0.796. Fica no Hub como referência e para reprodutibilidade; usa a família atual para tudo o resto.
- Hub: jaredpalmer/kev-0.5b (tag
v0.1) - Código, receita de treino, avaliação e demonstração: github.com/jaredpalmer/kev
- Pesos: release
v0.1.0do GitHub,kev-0.5b.tar.gz(38 MB; adaptador LoRAadapter_model.safetensors, cabeçahead.pt, ficheiros do tokenizer,eval.json, registo de treino). SHA-25615639f79…6e12f8, resumo completo no ficheiro auxiliar.sha256. Extrai pararuns/kev/. Os pesos não estão commitados no git.
Detalhes do modelo
| Desenvolvido por | Jared Palmer, com Devin (Cognition) |
| Tipo de modelo | Transformer causal, apenas pré-preenchimento, máscara de ramo causal em bloco, leitura por ponteiro |
| Modelo base | Qwen/Qwen2.5-0.5B (494M parâmetros, congelado) |
| Adaptador | LoRA de rank 16, alpha 32, dropout 0.05, em q_proj k_proj v_proj o_proj gate_proj up_proj down_proj (todas as 24 camadas) |
| Cabeça | Dois mapas lineares 896 → 256 (consulta a partir de <decide>, chave a partir de cada </opt>), produto escalar dimensionado, softmax sobre as opções |
| Parâmetros treináveis | 9.3M (LoRA 8.8M + cabeça 0.46M), 1.9% do backbone |
| Precisão | fp32 (treino e serviço em Apple MPS) |
| Contexto usado no treino | ≤ 384 tokens de estado, ≤ 1,024 tokens por ramo de pergunta |
| Contexto permitido no serviço | 8,192 por ramo (o backbone suporta 32k) |
| Tipos de pergunta | noul (sim/não), choice (2–255 opções), score (2–255 níveis ordenados) |
| Idioma | Inglês |
| Licença | Apache-2.0 para o adaptador e a cabeça. O modelo base está sob a licença Qwen (Apache-2.0 para o Qwen2.5-0.5B). Os conjuntos de dados têm as suas próprias licenças. |
| Versão | Kev-0.5B v0.1, treinado em 2026-09-17 |
Utilização prevista
Prevista. Investigação sobre modelos de decisão: calibração de leituras diretas de probabilidade, atenção com estado partilhado / perguntas isoladas, sensibilidade à ordem das opções e compatibilidade ao nível da API com o contrato System One da TypeSafe. Demonstrações locais e ensino.
Não prevista. Qualquer decisão de produção que afete pessoas: moderação, fraude, crédito, contratação, encaminhamento médico ou jurídico. O conhecimento do modelo está limitado a um backbone de 0.5B, a sua calibração só está verificada nas distribuições de treino, e as suas saídas em tarefas desconhecidas não foram medidas.
Como se usa o modelo
A entrada é uma única sequência de tokens empacotada:
<state> …state… <q> instr <opt> o1 </opt> <opt> o2 </opt> … <decide> <q> … <decide> …
- A máscara de atenção deixa um token de uma pergunta ver o estado e o seu próprio ramo apenas. As perguntas não se veem umas às outras.
- Cada ramo reinicia os ids de posição após o estado.
- Para cada pergunta, a cabeça avalia cada estado oculto
</opt>contra o estado oculto<decide>e aplica softmax. - O código da aplicação transforma as distribuições na resposta da API:
choice/confidencepara Choice,p(yes)para Noul, nível esperado para Score.
Os tokens reservados são tokens especiais existentes do Qwen (<|fim_prefix|>, <|fim_middle|>, <|box_start|>, <|box_end|>, <|fim_suffix|>). O texto do utilizador é saneado para não os poder produzir.
Serve com python -m kev.serve --run runs/kev e chama POST /v1/systemone, ou usa o typesafe-sdk com base_url="http://127.0.0.1:8009".
Dados de treino
Seis conjuntos de dados públicos, convertidos em pedidos com a forma da TypeSafe e renderizados com o mesmo caminho de código usado no serviço (api.to_record()). Foram amostrados 1,500 registos por fonte a partir das partições train padrão, dando 9,000 registos e 13,500 perguntas (4,500 Choice, 6,000 Noul, 3,000 Score).
| fonte | partição | convertido em | notas |
|---|---|---|---|
| Banking77 | train | Choice, K = 77 | nomes de intenções como chaves de opção; descrições com templates, 50% null |
| BoolQ | train | Noul | passagem como estado; 40% com critérios true/false |
| AG News | train | Choice K = 4 + 2 Noul | perguntas de sim/não derivadas, empacotadas com a pergunta de tópico |
| MNLI | train | Choice K = 3 | premissa como estado, hipótese nas instruções |
| SST-5 | train | Score, 5 níveis | |
| Yelp Review Full | train | Score 5 níveis + Noul | texto truncado para 220 palavras; recommend = estrelas ≥ 4 |
Variação de renderização aplicada no momento da conversão: ~30% de descrições de opção null, ~10% de descrições estruturadas {"what": …}, ~15% de instruções estruturadas {"question", "focus"}, ~32% de estados envolvidos como objetos ou arrays ({"document"}, {"ticket": {"channel","body"}}, [{"role","content"}]).
Aumento aplicado uma vez por registo antes da codificação: ordem das opções baralhada; com probabilidade 0.10 a opção verdadeira substituída por other: None of the above; com probabilidade 0.15 acrescentada uma opção distratora irrelevante.
Sem dados gerados por LLM. Sem anotação humana para além dos conjuntos de dados originais.
Procedimento de treino
| Objetivo | Entropia cruzada sobre as opções, média sobre as perguntas de um registo |
| Otimizador | AdamW, lr 2e-4, decaimento de peso 0.01, agenda OneCycle (10% de aquecimento) |
| Lote | 1 registo por passo, acumulação de gradiente 8, corte de gradiente 1.0 |
| Épocas | 2 (2,250 passos do otimizador) |
| Hardware | Apple M5, 32 GB de memória unificada, backend MPS do PyTorch 2.8 |
| Tempo real | ~1h45m (~0.29 s por registo) |
| Semente | 0 |
| Perda final de treino | 0.27 |
Este checkpoint é anterior a dois termos de perda que agora são predefinições no kev/train.py: o termo ordinal para Score (--ord_w) e a KL de consistência de permutação para Choice (--perm_kl). Para reproduzir este checkpoint exatamente:
uv run python -m kev.train --n_per_source 1500 --epochs 2 --accum 8 --perm_kl 0 --ord_w 0 --out runs/kev
Nota que o aumento é agora reaplicado a cada época em vez de ser fixado no momento da codificação, por isso uma nova execução não será idêntica bit a bit.
Avaliação
Partições test / validation reservadas das mesmas seis fontes, 150 registos por fonte, 1,350 perguntas, semente 1. Resultados completos em runs/kev/eval.json.
Precisão e calibração
| fonte | 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 |
Linhas de base: Qwen/Qwen2.5-0.5B (em bruto) e Qwen/Qwen2.5-0.5B-Instruct (template de chat), o mesmo texto renderizado, logits do token seguinte sobre as letras de opção A–H; não corrido para K = 77. O ECE usa 10 intervalos de largura igual sobre a probabilidade mais alta.
Escalonamento da temperatura
Ajustada nos registos de índice par, testada nos de índice ímpar: T = 1.47. NLL reservada 0.505 → 0.481, ECE 0.057 → 0.031. O modelo está ligeiramente demasiado confiante antes do escalonamento.
Testes do mecanismo
| teste | resultado |
|---|---|
| Isolamento (segredo numa pergunta irmã / ausente / no estado) | p = 0.03 / 0.03 / 0.99 |
| Empacotado vs separado, diferença máxima absoluta de probabilidade | 3.7e-6 (2.0× mais rápido empacotado, ~2.7 perguntas por pedido) |
| Permutação, 4 ordens, Choice K ≥ 3 | argmax muda 7.4%; dispersão média de p(correta) 0.065, p90 0.25 |
| IIA, acrescentar uma opção irrelevante | média |Δ log-odds| top-2 = 0.13, p90 0.34 |
| Falsificação de fronteira, texto de opção com delimitadores falsos | contagem de opções inalterada; p da opção falsificada ≤ 0.09 |
Limitações
- Apenas em distribuição. Todos os números acima são em partições reservadas dos conjuntos de dados de treino. A generalização fora da fonte não foi medida para este checkpoint.
- Backbone pequeno. 0.5B parâmetros. No exemplo de critérios estruturados da documentação da TypeSafe, o modelo escolhe
return_policyonde o Jev escolhereturn_status. A compreensão de leitura (BoolQ 0.75, MNLI 0.75) está muito abaixo do estado da arte. - Cobertura estreita de tarefas. Seis conjuntos de dados e cerca de dez templates de instruções. Código, tabelas, conversa com vários turnos, aritmética e condições de vários passos não são treinados.
- A sensibilidade à ordem mantém-se. 7% de mudanças de argmax e uma dispersão p90 de probabilidade de 0.25 sob reordenação das opções. Um limiar próximo de uma fronteira de decisão pode mudar a ação.
- A confiança do Score é calculada pelo código de serviço, não pelo checkpoint. Era
1 − E|level − mode| / (L − 1)quando esta ficha foi escrita; agora émax(0, 1 − E|level − mode| / D), sendo D o desvio absoluto médio de uma distribuição uniforme sobre os níveis, como no adaptador de referência da TypeSafe (system-one-adapter0.2.1). - A calibração não é uma garantia. Um ECE de 0.03 depois do escalonamento da temperatura nestas fontes não diz nada sobre a calibração num novo fluxo de trabalho. As regras de pontuação próprias dão o incentivo certo; não eliminam a necessidade de dados de resultados.
- Limitações herdadas do Qwen2.5-0.5B e dos conjuntos de dados, incluindo o seu ruído de etiquetas, enviesamentos demográficos (por exemplo, Yelp, intenções bancárias) e cobertura apenas em inglês.
Enviesamento, riscos e recomendações
Os conjuntos de treino transportam os enviesamentos das suas fontes: categorias de notícias centradas nos EUA, terminologia bancária inglesa, críticas de restaurantes e etiquetas NLI de origem colaborativa. O modelo vai espelhá-los.
As saídas diretas de probabilidade parecem autoritativas. Um confidence: 0.92 deste modelo é uma estatística sobre a sua própria distribuição por três opções, não uma probabilidade verificada de estar certo. Não definas limiares com base nele para decisões consequentes sem primeiro medires a calibração nos teus próprios resultados etiquetados.
A propriedade de isolamento das perguntas é uma característica de segurança real (o texto de uma pergunta não consegue manipular a resposta de outra) e foi verificada. A proteção contra falsificação de delimitadores foi verificada para os cinco tokens reservados. Outras vias de injeção de prompt através do texto do estado não foram estudadas.
Impacto ambiental
Uma execução de treino: ~1.75 h num único SoC de portátil Apple M5 a cerca de 30–40 W, ou seja, cerca de 0.06 kWh. As execuções de avaliação e de teste rápido acrescentam uma quantidade semelhante. Isto é pequeno.
Citação
@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 um issue em github.com/jaredpalmer/kev.