Kev-0.5B — protótipo (substituído)
O Kev-0.5B é um modelo de decisão. Ele recebe um documento (o estado) e um conjunto de perguntas tipadas, e devolve uma distribuição de probabilidade para cada pergunta em uma única passada direta. Ele não gera texto.
É um adaptador LoRA mais uma pequena cabeça de ponteiro sobre Qwen/Qwen2.5-0.5B. Ele reproduz a arquitetura que Archer Hume inferiu para o Jev da TypeSafe em Jev’s Architecture Unmasked, e atende o contrato público de API /v1/systemone da TypeSafe.
Este checkpoint é o protótipo original, treinado em um laptop em setembro de 2026 para mostrar que o mecanismo funciona. Ele foi substituído pelo Kev-0.8B, pelo Kev-4B e pelo Kev-9B, que usam bases Qwen3.5, suítes congeladas e verificadas por checksum, e uma receita encontrada ao longo de ~110 trials controlados; nos mesmos itens fora do domínio (transfer-v4 dev) este modelo marca 0.561 contra 0.643 / 0.794 / 0.812.620 / 0.790 / 0.796. Ele permanece no Hub para referência e reprodutibilidade; use a família atual para qualquer outra coisa.
- Hub: jaredpalmer/kev-0.5b (tag
v0.1) - Código, receita de treinamento, 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, arquivos do tokenizador,eval.json, log de treinamento). SHA-25615639f79…6e12f8, digest completo no sidecar.sha256. Extraia pararuns/kev/. Os pesos não são versionados no git.
Detalhes do modelo
| Desenvolvido por | Jared Palmer, com Devin (Cognition) |
| Tipo de modelo | Transformer causal, somente-prefill, máscara de ramo block-causal, leitura por ponteiro |
| Modelo base | Qwen/Qwen2.5-0.5B (494M parâmetros, congelado) |
| Adaptador | LoRA 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 escalonado, 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 (treinamento e serviço no Apple MPS) |
| Contexto usado no treinamento | ≤ 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 carregam suas próprias licenças. |
| Versão | Kev-0.5B v0.1, treinado em 2026-09-17 |
Uso pretendido
Pretendido. Pesquisa sobre modelos de decisão: calibração de leituras diretas de probabilidade, atenção de estado compartilhado / pergunta isolada, sensibilidade à ordem das opções e compatibilidade em nível de API com o contrato System One da TypeSafe. Demos locais e ensino.
Não pretendido. Qualquer decisão de produção que afete pessoas: moderação, fraude, crédito, contratação, roteamento médico ou jurídico. O conhecimento do modelo é limitado a um backbone de 0.5B, sua calibração só foi verificada nas distribuições de treinamento, e suas saídas em tarefas desconhecidas não foram medidas.
Como o modelo é usado
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 permite que um token de pergunta veja o estado e apenas o seu próprio ramo. As perguntas não conseguem ver umas às outras.
- Cada ramo reinicia os ids de posição depois do estado.
- Para cada pergunta, a cabeça pontua cada estado oculto
</opt>contra o estado oculto<decide>e aplica softmax. - O código de 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 usuário é sanitizado para que não possa produzi-los.
Sirva com python -m kev.serve --run runs/kev e chame POST /v1/systemone, ou use typesafe-sdk com base_url="http://127.0.0.1:8009".
Dados de treinamento
Seis conjuntos de dados públicos, convertidos em requisições no formato TypeSafe e renderizados com o mesmo caminho de código usado no momento do serviço (api.to_record()). 1,500 registros foram amostrados por fonte a partir das partições train padrão, dando 9,000 registros e 13,500 perguntas (4,500 Choice, 6,000 Noul, 3,000 Score).
| fonte | split | convertido para | notas |
|---|---|---|---|
| Banking77 | train | Choice, K = 77 | nomes de intenção como chaves de opção; descrições templated, 50% null |
| BoolQ | train | Noul | passagem como estado; 40% com critérios true/false |
| AG News | train | Choice K = 4 + 2 Noul | perguntas 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 em 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 registro antes da codificação: ordem das opções embaralhada; com probabilidade 0.10, a opção verdadeira substituída por other: None of the above; com probabilidade 0.15, uma opção distratora irrelevante adicionada.
Sem dados gerados por LLM. Sem anotação humana além dos conjuntos de dados originais.
Procedimento de treinamento
| Objetivo | Entropia cruzada sobre as opções, com média sobre as perguntas de um registro |
| Otimizador | AdamW, lr 2e-4, weight decay 0.01, agenda OneCycle (10% de warm-up) |
| Lote | 1 registro por passo, acúmulo de gradiente 8, clipping 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 de parede | ~1h45m (~0.29 s por registro) |
| Semente | 0 |
| Perda final de treinamento | 0.27 |
Este checkpoint antecede dois termos de perda que hoje são padrão no kev/train.py: o termo ordinal para Score (--ord_w) e o 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
Observe que o aumento agora é reaplicado a cada época, em vez de fixado no momento da codificação, então uma nova execução não será idêntica bit a bit.
Avaliação
Partições test / validation reservadas das mesmas seis fontes, 150 registros por fonte, 1,350 perguntas, semente 1. Resultados completos em runs/kev/eval.json.
Acurácia 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 níveis) |
| yelp | 5 | 0.313 / 0.043 | 0.353 / 0.078 | 0.553 / 0.118 / 0.95 (MAE 0.54 níveis) |
| 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 (bruto) e Qwen/Qwen2.5-0.5B-Instruct (template de chat), mesmo texto renderizado, logits do próximo token sobre as letras de opção A–H; não executado para K = 77. O ECE usa 10 bins de largura igual sobre a probabilidade do topo.
Escalonamento de temperatura
Ajustado nos registros de índice par, testado nos de índice ímpar: T = 1.47. NLL reservada 0.505 → 0.481, ECE 0.057 → 0.031. O modelo é levemente confiante demais antes do escalonamento.
Testes de mecanismo
| teste | resultado |
|---|---|
| Isolamento (segredo em 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 (empacotado 2.0× mais rápido, ~2.7 perguntas por requisição) |
| Permutação, 4 ordens, Choice K ≥ 3 | argmax inverte 7.4%; dispersão média de p(correto) 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 dentro da distribuição. Todos os números acima estão em partições reservadas dos conjuntos de dados de treinamento. 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 dos documentos 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 de tarefas estreita. Seis conjuntos de dados e cerca de dez templates de instrução. Código, tabelas, chat de múltiplos turnos, aritmética e condições de múltiplos passos não foram treinados.
- A sensibilidade à ordem permanece. 7% de inversões de argmax e uma dispersão de probabilidade p90 de 0.25 sob reordenação de opções. Um limiar próximo de uma fronteira de decisão pode mudar a ação.
- A confiança de 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), com 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. ECE 0.03 após o escalonamento de temperatura nestas fontes não diz nada sobre a calibração em um fluxo de trabalho novo. Regras de pontuação próprias dão o incentivo certo; elas não eliminam a necessidade de dados de desfecho.
- Limitações herdadas do Qwen2.5-0.5B e dos conjuntos de dados, incluindo seu ruído de rótulo, vieses demográficos (por exemplo, Yelp, intenções bancárias) e cobertura apenas em inglês.
Viés, riscos e recomendações
Os conjuntos de treinamento carregam os vieses de suas fontes: categorias de notícias centradas nos EUA, terminologia bancária em inglês, avaliações de restaurantes e rótulos de NLI de crowdsourcing. O modelo os espelhará.
As saídas diretas de probabilidade parecem autoritativas. Um confidence: 0.92 deste modelo é uma estatística sobre a sua própria distribuição entre três opções, não uma probabilidade verificada de estar certo. Não defina um limiar sobre ele para decisões consequentes sem antes medir a calibração nos seus próprios desfechos rotulados.
A propriedade de isolamento de pergunta é um recurso de segurança real (o texto de uma pergunta não pode manipular a resposta de outra) e foi verificada. A proteção contra falsificação de delimitadores foi verificada para os cinco tokens reservados. Outras rotas de injeção de prompt através do texto do estado não foram estudadas.
Impacto ambiental
Uma execução de treinamento: ~1.75 h em uma única SoC de laptop Apple M5 a cerca de 30–40 W, ou seja, cerca de 0.06 kWh. Avaliação e execuções de sanidade somam uma quantia parecida. Isso é 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}
}
Contato
Abra uma issue em github.com/jaredpalmer/kev.