Kev-9B
Resumo do modelo
O Kev-9B é um modelo de decisão. Ele lê um documento (o estado) e um conjunto de perguntas tipadas sobre ele, e devolve uma distribuição de probabilidade calibrada sobre as opções fornecidas com cada pergunta, em uma única passada direta e sem gerar texto. Ele é indicado para desenvolvedores que classificam, roteiam, fazem triagem ou conferem documentos e que precisam de probabilidades que possam receber limiar, por exemplo para enviar casos incertos à revisão humana. Ele implementa a API pública System One da TypeSafe (POST /v1/systemone), de modo que o SDK da TypeSafe funciona contra ele sem alterações. É um adaptador LoRA e uma cabeça de ponteiro sobre o Qwen3.5-9B-Base e cabe em uma GPU de classe 24 GB. Esta ficha descreve a versão 2, lançada em 2026-09-30 e incluída no Kev 1.0.
Detalhes do modelo
| Desenvolvedor | Jared Palmer (github.com/jaredpalmer/kev) |
| Tipo de modelo | Modelo de decisão: um backbone de modelo de linguagem causal executado somente-prefill, com uma cabeça de ponteiro sobre as opções |
| Backbone | Qwen/Qwen3.5-9B-Base (revisão 68c46c4b): 32 camadas, 24 Gated DeltaNet (atenção linear) e 8 de atenção plena, hidden size 4,096; congelado |
| Adaptador | LoRA, rank 16, α 32, nas projeções de atenção, MLP e DeltaNet (45.4M parâmetros) |
| Cabeça | Cabeça de ponteiro: duas projeções pontuam o token de fechamento de cada opção contra o token final da pergunta; um softmax dá as probabilidades |
| Precisão | Treinado com autocast bf16 sobre pesos fp32; servido em bf16 (o adaptador é mesclado na base no carregamento); avaliado em fp32 |
| Contexto | Estados de até 65,536 tokens são servidos, mais pelo menos 8,192 tokens por pergunta. Os estados de treinamento tinham no máximo 7,552 tokens. |
| Comprimento de contexto validado | 8,192 tokens (veja Documentos longos) |
| Calibração | Uma temperatura, T = 2.19, armazenada em head.pt e aplicada no carregamento |
| Idiomas | Inglês |
| Licença | Apache-2.0 (adaptador e cabeça); o modelo base é Apache-2.0 |
| Versão | v2 (Kev 1.0): main de jaredpalmer/kev-9b, revisão b5d8c18e (lançada em 2026-09-30) |
| Versão anterior | v1, a mesma receita sem o estágio de documentos e habilidades (T = 2.30), na tag v1; a ficha dela é o README naquela tag |
Entrada. Um estado (texto, ou um objeto ou array JSON renderizado como texto rotulado) e qualquer número de perguntas nomeadas, cada uma de um dos três tipos:
| Tipo | Opções | Saída |
|---|---|---|
choice |
1–255 opções nomeadas, cada uma com uma descrição opcional | uma probabilidade por opção, a opção mais provável e uma confiança |
score |
1–255 níveis ordenados | uma probabilidade por nível e o índice do nível esperado |
noul |
sim / não, com descrições opcionais | a probabilidade de sim |
Cada pergunta é respondida como a sua própria linha, que continua a partir do estado compartilhado, então as perguntas não podem influenciar umas às outras; o estado é calculado uma vez e armazenado em cache.
Usos pretendidos
- Decisões tipadas sobre documentos de alguns milhares de tokens: classificação, roteamento, triagem, escolhas de extração, verificações de política e elegibilidade, e julgar uma resposta proposta contra critérios declarados.
- Fluxos de trabalho que agem com base na confiança: automatize os casos confiantes e coloque o resto na fila, com limiares congelados em uma amostra rotulada da carga de trabalho do próprio usuário.
- Um substituto direto e auto-hospedado para um endpoint System One em uma única GPU de classe 24 GB, e um ponto de partida para ajuste fino nos rótulos do próprio usuário (
kev.train --init_from jaredpalmer/kev-9b).
Usos fora de escopo
- Geração de texto, chat, sumarização ou respostas a perguntas abertas. O modelo apenas pontua as opções que recebe.
- Decisões totalmente automatizadas com consequências legais, médicas, financeiras, trabalhistas ou semelhantes para pessoas, sem revisão humana.
- Perguntas cuja resposta depende de fatos que não estão no estado e não são conhecimento geral, e exames com muito conhecimento (veja Limitações).
- Aritmética de datas com precisão de dia sem o pré-processador
KEV_DATE_FACTS=1, estados maiores que 65,536 tokens e idiomas diferentes do inglês.
Como usar
Sirva-o com o repositório do Kev. Em CUDA ele roda em bf16 com kernels DeltaNet fundidos e CUDA graphs (uma L40S ou H100; cerca de 22 GB residentes); no Apple Silicon o mesmo comando o serve através do MLX, escolhido automaticamente.
git clone https://github.com/jaredpalmer/kev.git && cd kev && uv sync --extra serve
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-9b --port 8008 # v2, Kev 1.0 (this card)
uv run --extra serve python -m kev.serve --run jaredpalmer/kev-9b@v1 --port 8008 # v1
from typesafe_sdk import Choice, Noul, TypeSafeClient
client = TypeSafeClient(api_key="local", base_url="http://127.0.0.1:8008", model="kev-latest")
response = client.system_one(
state="I was charged twice for order 1182. Please refund one of the charges.",
questions={
"team": Choice(instructions="Which team should handle this?",
criteria={"billing": "Charges and refunds", "shipping": "Deliveries", "returns": "Exchanges"}),
"urgent": Noul(instructions="Does this need a reply today?"),
},
)
print(response.choices["team"].choice, response.nouls["urgent"].noul)
A temperatura calibrada é aplicada por padrão; KEV_TEMPERATURE=1.0 devolve as probabilidades brutas. KEV_DTYPE=fp32 seleciona o caminho exato usado na avaliação. KEV_DATE_FACTS=1 anexa o número de dias entre cada par de datas encontrado no estado, que o modelo foi treinado para usar. Um estado acima de 65,536 tokens é recusado com um 422 que informa a sua contagem de tokens.
Dados de treinamento
| Estágio | Registros | Conteúdo e rótulos |
|---|---|---|
Receita base (decision-v7) |
12,576 | 10,000 registros de dez conjuntos de dados públicos de classificação (1,000 cada, listados nos metadados desta ficha) com seus rótulos nativos; 896 pares mínimos de política gerados em nove famílias de template; 1,680 registros de 60 estruturas de regra geradas aleatoriamente em quatro renderizações; rótulos calculados por código |
| Datas e evidência ausente | 1,425 | Gerados: 900 casos de política com datas (simples, com uma frase de contagem de dias, ou com um campo date_facts); 255 casos com a frase decisiva removida e um alvo uniforme, mais 270 controles intactos |
| Documentos e habilidades, um estágio | 16,539 | documents-v1 train: 5,219 narrativas de reclamações de consumidores nos EUA (CFPB, até cerca de 7k tokens) com 7,488 perguntas, rótulos mantidos onde dois professores de pesos abertos concordaram com o próprio registro do consumidor. hard-v1 train: 6,000 registros rotulados programaticamente em sete famílias de habilidade (políticas longas, trade-offs, probabilidade, multi-hop, datas e aritmética, julgar uma resposta proposta, abstenção por fato ausente), templates 0–3. devtools-v1 train: 5,320 registros de CodeReviewer, CommitPackFT, FlakeFlagger e Aegis, com os rótulos próprios de cada conjunto |
Os dois estágios de ajuste fino repetem 2,000 e 10,000 registros do decision-v7. Nenhuma saída de Jev (o modelo de decisão hospedado da TypeSafe) foi usada. CodeReviewer e FlakeFlagger vêm do Zenodo; as narrativas do CFPB são obras do governo dos EUA; licenças e revisões por fonte são registradas nos manifestos das suítes. As suítes apenas de avaliação abaixo (breadth-v1, tasksource-heldout-v1, transfer-v4, longdoc-v1, e as fontes When2Call e de injeção de prompt do devtools-v1) nunca entram no treinamento.
Procedimento de treinamento
- Receita base. Duas épocas no
decision-v7a partir da base: LoRA rank 16, α 32; taxa de aprendizado 5e-5, agenda one-cycle; lote efetivo 8 (4 × 2 de acúmulo); autocast bf16, gradient checkpointing. A perda é entropia cruzada sobre as opções de cada pergunta. A ordem das opções é embaralhada, opções “nenhuma das opções acima” e distratores são inseridos aleatoriamente, e um quarto dos registros de choice também gera um par mínimo (a pergunta com uma opção “nenhuma das opções acima”, uma vez com a opção correta presente e uma vez com ela removida). - Datas e evidência ausente. Uma época a partir do estágio 1 com taxa de aprendizado 2e-5 e 2,000 registros repetidos. Esta é a v1.
- Documentos e habilidades. Uma época a partir da v1 nos três conjuntos de treinamento juntos, com taxa de aprendizado 2e-5 e 10,000 registros repetidos; lote 2 × 4 de acúmulo; estados de no máximo 7,552 tokens; semente 1; 3,318 passos do otimizador.
- Calibração. Uma única temperatura, T = 2.19, minimizando a log-verossimilhança negativa em 648 perguntas de conjuntos de dados reservados: 448 da partição de calibração do transfer-r3 (seis conjuntos de dados públicos, QNLI, SciQ, TweetEval-offensive, PAWS, MMLU e Emotion, mais duas famílias reservadas de registros de política gerados) e 200 perguntas de MMLU-Pro (transfer-v9 development). O pool foi conferido contra as suítes de treinamento do checkpoint antes do ajuste.
Avaliação
Metodologia. Toda comparação é contra o Kev-9B v1 em itens idênticos, cada modelo na sua própria temperatura de serviço (v1: 2.30). As comparações e suas réguas foram registradas antes das leituras de confirmação; partições de teste foram lidas uma vez para este checkpoint; o teste do transfer-v4 é bloqueado (lido uma vez por candidato). Os intervalos pareados são bootstraps de 95% que reamostram registros inteiros (2,000 reamostragens), então perguntas que compartilham um estado se movem juntas. As diferenças estão em pontos percentuais (pp). O Jev (o modelo hospedado da TypeSafe, consultado pelo Vercel AI Gateway) é mostrado onde ele foi lido nos mesmos itens. As suítes:
- breadth-v1: 14 conjuntos de dados públicos reservados em cinco áreas (conhecimento, linguagem, recuperação, ferramentas, artes), nunca treinados.
- transfer-v4: decisões fora do domínio de seis fontes públicas nunca treinadas mais políticas e estruturas de regra reservadas.
- transfer-r3: um painel de estado curto das mesmas oito fontes reservadas do pool de calibração.
- hard-v1: as famílias de habilidade acima; a partição de teste reserva templates de geradores treinados.
- devtools-v1: decisões de ferramentas de desenvolvimento de seis fontes com licença verificada (quatro treinadas, duas apenas de avaliação).
- documents-v1 / documents-v2: narrativas de reclamação do CFPB; a v2 é um conjunto de teste reservado privado.
- longdoc-v1: contratos comerciais CUAD e pacotes de acordo gerados, com estados de 4k a 64k tokens.
Os painéis principais do devtools-v1 excluem duas tarefas cujos rótulos o estado não determina (flakeflagger, tipo de mudança do commit); as mesmas linhas saem dos dois lados.
Resultados contra a v1 (confirmação registrada).
| Painel (perguntas) | Kev-9B v2 | Kev-9B v1 | Δ [IC 95%] |
|---|---|---|---|
| hard-v1 + devtools-v1 development, auditado (1,855) | 0.821 | 0.628 | +19.3 [+17.2, +21.6] |
| documents-v1 development (920) | 0.902 | 0.833 | +7.0 [+4.8, +9.2] |
Estados curtos: transfer-v4 development + transfer-r3 test, sem emotion (1,586) |
0.871 | 0.871 | +0.1 [−1.1, +1.2] |
| hard-v1 + devtools-v1 test, auditado (1,859) | 0.822 | 0.635 | +18.7 [+16.7, +20.8] |
| documents-v1 test (936) | 0.900 | 0.829 | +7.1 [+4.7, +9.2] |
| Fora do domínio, transfer-v4 locked test (656): acurácia | 0.852 | 0.852 | +0.0 [−1.7, +1.8] |
| transfer-v4 locked test: Brier servido | 0.199 | 0.224 | −0.025 [−0.047, −0.007] |
Dados reservados (nunca treinados).
| Painel (perguntas) | Kev-9B v2 | Kev-9B v1 | Jev |
|---|---|---|---|
| breadth-v1 development, todos os 14 conjuntos (3,075) | 0.700 | 0.697 | 0.757 |
| breadth-v1 test, todos os 14 conjuntos (3,089) | 0.698 | 0.692 | 0.757 |
| breadth-v1 test, índice corrigido pelo acaso¹ [IC 95%] | 41.0 [38.8, 43.9] | 40.0 [38.1, 43.0] | 54.0 [51.2, 57.0] |
| Fora do domínio, transfer-v4 development (656): acurácia / Brier | 0.820 / 0.262 | 0.822 / 0.264 | 0.857 / 0.211 |
| transfer-v4 locked test: ECE / erros confiantes (p ≥ 0.9 e errado) / cobertura com ≤ 5% de erro | 0.034 / 1.4% / 0.742 | 0.042 / 3.2% / 0.645 | – |
| Estados curtos, transfer-r3 test (1,150) | 0.847 | 0.847 | – |
| MMLU-Pro, 10 opções (transfer-v9 development) | 0.590 | 0.515 | 0.840 |
| Itens impossíveis de responder respondidos com p ≥ 0.9 (menor é melhor) | 0.00 | 0.00 | 0.09 |
Contra a v1, a diferença de acurácia do breadth-v1 é +0.3 [−0.7, +1.3] no desenvolvimento e +0.6 [−0.4, +1.6] no teste. O tasksource-heldout-v1 development foi lido para este checkpoint, mas o seu read-out não está completo; ele não é reportado aqui.
Famílias treinadas (itens e templates reservados).
| Painel (perguntas) | Kev-9B v2 | Kev-9B v1 | Jev |
|---|---|---|---|
| hard-v1 development (1,083) / test (1,088) | 0.813 / 0.834 | 0.574 / 0.584 | 0.777 / – |
| devtools-v1 development (1,072) / test (1,071), todas as fontes | 0.772 / 0.791 | 0.631 / 0.637 | 0.713 / – |
| documents-v1 development (920) / test (936) | 0.902 / 0.900 | 0.833 / 0.829 | 0.868 / – |
| documents-v2, teste reservado privado (953) | 0.900 | 0.821 | – |
| decision-v7 development (1,264) / locked test (1,200) | 0.874 / 0.873 | 0.872 / – | 0.845 / – |
| Domínios reservados de decisões geradas, ood-v2 (4,988) | 0.889 | – | – |
Diferenças de teste contra a v1: hard-v1 +25.0 [+22.0, +28.1], devtools-v1 (todas as fontes) +15.4 [+11.0, +19.4], documents-v2 +8.0 [+5.9, +10.2].
Documentos longos.
- Comprimento de contexto validado: 8,192 tokens, o comprimento treinado. O bucket de 16k está fora da tolerância: seu limite inferior é −3.7 pp, abaixo de −3 pp, então nenhum comprimento maior é validado.
- Regra, fixada antes da leitura: o comprimento validado é o tamanho nominal do maior bucket a partir de 16,384 tokens tal que ele, e todo bucket entre ele e 8,192, esteja dentro da tolerância. “Dentro da tolerância” significa que a diferença de acurácia CUAD em relação ao bucket de 8k (estados de 6,553–7,618 tokens, o comprimento treinado), pareada no mesmo contrato, repetição e pergunta, tem um limite inferior de 95% de pelo menos −3 pp, e todo registro foi respondido. Se o bucket de 16k falha, o comprimento validado é 8,192 tokens.
Acurácia CUAD, ECE e a diferença pareada em relação ao bucket de 8k por comprimento nominal do estado (longdoc-v1 development):
| Comprimento nominal do estado | Perguntas CUAD | Acurácia | ECE | Δ vs 8k, pp [IC 95%] |
|---|---|---|---|---|
| 4k | 443 | 0.876 | 0.049 | – |
| 8k | 453 | 0.850 | 0.051 | referência |
| 16k | 452 | 0.839 | 0.033 | −1.4 [−3.7, +0.9] |
| 32k | 454 | 0.819 | 0.041 | −3.6 [−6.4, −0.9] |
| 64k | 452 | 0.801 | 0.056 | −5.2 [−7.9, −2.5] |
ECE na T de entrega = 2.19. Δ é pareado nas 445–447 perguntas feitas sobre os mesmos contratos nos dois comprimentos. O bucket de 4k contém contratos diferentes e não é uma referência para a regra. Fonte: runs/r28-readout/context.json (o read-out registrado da rodada 28, runs/r29-9b-r18a-longdoc).
Calibração (erro de calibração esperado, ECE, conforme servido; menor é melhor):
| Painel | Kev-9B v2 (T = 2.19) | Kev-9B v1 (T = 2.30) |
|---|---|---|
| breadth-v1 test, todos os 14 conjuntos | 0.034 | 0.044 |
| transfer-v4 development / locked test | 0.041 / 0.034 | 0.042 / 0.042 |
| hard-v1 test | 0.054 | 0.075 |
| devtools-v1 test, todas as fontes | 0.098 | 0.147 |
| documents-v1 test | 0.017 | 0.103 |
O intervalo bootstrap de 90% da temperatura é [2.05, 2.41]. O 2.30 da v1 foi ajustado em linhas de desenvolvimento da própria distribuição de treinamento dela; a v2 é o primeiro 9B servido a uma temperatura ajustada em conjuntos de dados reservados.
Outros resultados.
| Suíte | Kev-9B v2 | Jev |
|---|---|---|
Aritmética de datas, política deadline (transfer-v9 development) |
0.725 | 0.95 |
| MMLU, 4 opções (transfer-v9 development) | 0.725 | 0.90 |
| SemIf (144 decisões autorais; perto da saturação, apenas reportado) | 0.917 | 0.965 |
Serviço. CUDA, bf16 com kernels fundidos e CUDA graphs; tempo de modelo por requisição (mediana de 20) para um estado novo / repetido, medido na v1 (a mesma arquitetura e formato de adaptador):
| GPU | 6 perguntas, estado curto | 5 perguntas, estado de 2,200 tokens | Requisições/s, 64 clientes |
|---|---|---|---|
| L40S | 66.4 / 42.7 ms | 235.6 / 57.5 ms | 32.7 |
| H100 | 24.0 / 16.6 ms | 88.5 / 26.4 ms | 79.5 |
A memória residente da GPU é 21.9 GB. As probabilidades servidas ficam dentro de 0.017 do caminho de avaliação em fp32 em 280 perguntas, sem respostas alteradas. No caminho de avaliação em fp32 (H100, v2), estados de 16k / 32k / 64k tokens levam 5.1 / 10.9 / 25.4 s e 4.6 / 9.1 / 18.2 GiB acima dos pesos.
Apple Silicon (MLX): as medições de estado longo feitas para o Kev-0.8B e o Kev-4B não foram feitas neste tamanho; no M5 de 32 GB usado para elas, o backbone bf16 de 19.3 GB e o seu conjunto de trabalho não couberam na memória disponível.
¹ O índice corrigido pelo acaso do Decision Index 0.2 da comunidade: por conjunto de dados, (score − acaso) / (1 − acaso), com média dentro de cada área, depois 100 × a média das cinco áreas. O índice do Jev vem de uma leitura separada dos mesmos itens de teste.
Limitações e trade-offs
- Seleção. Este checkpoint foi treinado e lido em dados de desenvolvimento numa rodada anterior, e re-selecionado sob uma regra posterior com aqueles números conhecidos. As partições de teste e a leitura bloqueada, cada uma lida uma vez para ele, são a proteção; trate as margens de desenvolvimento como otimistas.
- Seus grandes ganhos estão dentro da distribuição. As partições de treinamento do hard-v1, do devtools-v1 e do documents-v1 estão nos seus dados de treinamento; esses ganhos são itens e templates reservados de famílias treinadas, não transferência para tarefas novas.
- Ele não é melhor que a v1 em trabalho novo. breadth-v1 test +0.6 pp [−0.4, +1.6], transfer-v4 development −0.2 pp [−2.4, +1.8], transfer-r3 test +0.0 pp [−1.2, +1.2]. O Kev-27B o supera em 11 pontos no índice do breadth-v1, e o Jev em 13.
- O conhecimento é definido pela base. O MMLU-Pro é 0.590, contra 0.675 do Kev-27B e 0.840 do Jev.
- A aritmética de datas é a sua família mais fraca: 0.725 nas perguntas da política
deadlinecontra 0.95 do Jev; o pré-processadorKEV_DATE_FACTS=1ajuda. - Calibração. O devtools-v1 é a sua suíte menos calibrada (test ECE 0.098). O intervalo da temperatura é [2.05, 2.41]. A temperatura foi gravada em
head.pta partir do ajuste de pool registrado, com o motivo registrado, porque o script de calibração não consegue listar as fontes do arquivo de treinamento combinado para reconferir o próprio pool; a checagem da própria rodada o tinha coberto. Essa checagem não cobre os dados de datas e evidência ausente da v1, cujo manifesto não lista fontes; esses registros são quatro famílias geradas, nenhuma delas no pool. - Comprimentos não treinados. Os estados de treinamento tinham no máximo 7,552 tokens. Estados mais longos são servidos até 65,536 tokens; até onde a acurácia se mantém é o comprimento de contexto validado acima.
- A ordem das opções pode mudar uma resposta; o isolamento de pergunta não impede isso.
Viés, riscos e considerações éticas
- Probabilidades calibradas podem criar uma confiança infundada. A temperatura foi ajustada em conjuntos de dados públicos reservados e não transfere para toda carga de trabalho; meça a acurácia e a calibração em uma amostra rotulada dos seus próprios dados, e reajuste a temperatura ali (
python -m kev.calibrate), antes de definir limiares. - A acurácia e a calibração mudam sob mudança de domínio. Monitore as taxas de erro em produção em vez de confiar nos números acima.
- Não o use para decisões automatizadas consequentes sobre pessoas sem revisão humana. Os vieses do modelo base e dos dados de treinamento (incluindo rótulos produzidos por outros modelos) não são medidos.
- Os estados podem conter dados pessoais ou confidenciais. A auto-hospedagem mantém as entradas no seu próprio hardware; o servidor é aberto a menos que
KEV_API_KEYesteja definida, então aplique o seu próprio controle de acesso e política de tratamento de dados.
Computação
- Receita base e estágio de datas (v1): GPUs únicas NVIDIA H100.
- Estágio de documentos e habilidades: 2.6 horas em uma NVIDIA H200 (pico 74.1 GB).
- Avaliação e checagens de serviço: GPUs únicas H100 / H200 / L40S no Modal.
Procedência e reprodutibilidade
- Código, suítes e relatórios de avaliação: github.com/jaredpalmer/kev. Números do release:
runs/release/kev-9b-r27.json(scripts/release_numbers.py --release kev-9b-r27); regra e veredictos registradosexperiments/rounds/r27.json,runs/r27-readout/,runs/r27-verdict/; as leituras da família de 2026-09-30runs/fam-9bnew-breadth/,runs/fam-9b-breadth/eruns/fam-breadth-test-report/; ood-v2runs/r29-9b-r18a-ood/; serviçoruns/serve-9b-l40s/,runs/serve-9b-h100/,runs/long-state-9b-h100/. - Estágios: trial da base
q35-9b/01-trial-1(tagv7-base); datasnight2-9b-du/00-trial-0(v1, tagv1); documentos e habilidades rodada 18 braço (a)r18-9b/00-trial-0(experiments/round18/joint.json), selecionado e confirmado como9b-r18ada rodada 27. - Pesos publicados: commit do Hub
b5d8c18e; sha256 do adaptador2b2a70cf4ef4440b6c22899e1f72c2f8ea5c6f65b19aa344539b4b8971d1f13d, sha256 dohead.pt8e1dab2c…(T = 2.1936). - Verificação: carregado anonimamente do Hub, reproduziu as respostas da avaliação pré-release em 252 de 252 linhas do SemIf e 764 de 764 linhas de desenvolvimento do transfer-v4 na T = 2.19 (
runs/rel9-public/).
Citação
@misc{palmer2026kev9b,
title = {Kev-9B: a calibrated decision model on Qwen3.5-9B},
author = {Palmer, Jared},
year = {2026},
howpublished = {\url{https://huggingface.co/jaredpalmer/kev-9b}},
note = {Version 2, released 2026-09-30; Kev 1.0}
}
Contato
Perguntas e problemas: github.com/jaredpalmer/kev/issues.