Documentação

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

  1. Receita base. Duas épocas no decision-v7 a 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).
  2. 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.
  3. 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.
  4. 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 deadline contra 0.95 do Jev; o pré-processador KEV_DATE_FACTS=1 ajuda.
  • 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.pt a 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_KEY esteja 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 registrados experiments/rounds/r27.json, runs/r27-readout/, runs/r27-verdict/; as leituras da família de 2026-09-30 runs/fam-9bnew-breadth/, runs/fam-9b-breadth/ e runs/fam-breadth-test-report/; ood-v2 runs/r29-9b-r18a-ood/; serviço runs/serve-9b-l40s/, runs/serve-9b-h100/, runs/long-state-9b-h100/.
  • Estágios: trial da base q35-9b/01-trial-1 (tag v7-base); datas night2-9b-du/00-trial-0 (v1, tag v1); documentos e habilidades rodada 18 braço (a) r18-9b/00-trial-0 (experiments/round18/joint.json), selecionado e confirmado como 9b-r18a da rodada 27.
  • Pesos publicados: commit do Hub b5d8c18e; sha256 do adaptador 2b2a70cf4ef4440b6c22899e1f72c2f8ea5c6f65b19aa344539b4b8971d1f13d, sha256 do head.pt 8e1dab2c… (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.