enzoferracini's picture
feat: publish software v0.2.0 evaluation and documentation
76c0aec verified
|
Raw History Blame Contribute Delete
11.6 kB

PatchInsight 0.2 — avaliação ampliada e inferência local

A v0.2 avalia os checkpoints da v0.1 em um novo conjunto exploratório, adiciona métricas probabilísticas, calibração experimental, inferência em lote, Action–Method e uma demo local. Não houve novo fine-tuning nem alteração dos pesos, dados congelados ou resultados finais da v0.1. A versão do software é 0.2.0; o checkpoint continua identificado como 0.1.0.

Resultado que muda a interpretação

Conjunto / método Macro-F1 Exact match AP macro Brier ↓ Log loss ↓
Original v0.1 — regressão 0,9888 0,9333 1,0000 0,0089 0,0297
Original v0.1 — BERT ajustado 0,9911 0,9500 1,0000 0,0383 0,1941
Novo teste — heurísticas 0,6910 0,3056 0,7441 0,1833 2,9550
Novo teste — regressão 0,6196 0,3056 0,8401 0,1601 0,8540
Novo teste — BERT ajustado 0,5584 0,2500 0,7768 0,1648 0,5053
Novo teste — regressão com temperatura 0,6196 0,3056 0,8401 0,1355 0,4292
Novo teste — BERT com temperatura 0,5584 0,2500 0,7768 0,1647 0,5051

A ordenação depende da pergunta. No novo teste, heurísticas têm maior macro-F1 entre os três métodos originais; a regressão ordena melhor os positivos por AP. Após temperatura, a regressão tem menor Brier/log loss entre as variantes avaliadas. O resultado original próximo do teto não se sustenta neste desafio. Os dois testes têm composições distintas; a queda não mede desempenho em currículos reais nem permite atribuir toda a diferença a um único fator.

O ganho macro-F1 de BERT menos regressão no novo teste foi −0,0612. Bootstrap pareado de 34 origens, 1.000 reamostragens, seed 42: IC percentil 95% [−0,1642; 0,0372]. A amostra continua pequena e sintética; não há evidência robusta de superioridade do BERT.

Brier e log loss avaliam previsões probabilísticas e combinam calibração e capacidade discriminativa. Confiabilidade é examinada também em cinco bins por rótulo, com contagens explícitas. Não há alegação de probabilidades externamente calibradas. A AP implementada é Average Precision, não integração trapezoidal genericamente chamada de PR-AUC. ROC-AUC e MCC complementam a comparação; ROC-AUC/AP indefinidas ficam null. Log loss usa clipping em 1e-7 para todos os métodos, inclusive decisões heurísticas binárias que não são probabilidades validadas.

Dados e revisão solicitada

O próprio assistente escreveu, anotou e revisou os 72 textos, com justificativa semântica por registro antes dos scores. Sem revisão humana, anotador independente, cegamento ou concordância interavaliadores. O nome exato do modelo gerador não foi inferido. Não há currículos reais nem dados pessoais.

São 36 textos e 34 origens por split: desenvolvimento e teste. Cada split tem 32 descrições livres e dois pares com/sem marcadores. Temas e formatos ainda se repetem; o teste não é semanticamente independente da autoria do desenvolvimento. As tags cobrem versões, medidas por extenso, futuro, negação, perguntas, contrafactuais, resultados qualitativos e escrita informal.

Fontes, textos, rótulos, gerador determinístico e protocolo foram congelados antes dos scores. Dados e artigo: CC BY 4.0. A nova suite fica em data/v02, separada dos splits de treinamento da v0.1. Detalhes: protocolo e revisão por IA.

Calibração e abstenção

Somente desenvolvimento ajusta uma temperatura global por modelo na grade predefinida. BERT: T=0,965936; regressão: T=4,0, o extremo superior da grade. Esse extremo é relatado como limitação; a grade não foi ampliada após os scores. A temperatura não muda as decisões no limiar 0,5, por isso F1 e Hamming são iguais antes/depois. Os scores podem mudar e afetar probabilidades e cobertura.

Nenhum cutoff predefinido conseguiu erro observado de até 5% mantendo pelo menos 50% das decisões em desenvolvimento. As políticas registram cutoff null: a abstenção por confiança permanece desativada. A infraestrutura aceita abstenção quando um experimento futuro atender a seus critérios. Truncamento continua marcando negativos como unknown independentemente disso.

As políticas são opt-in, ligadas por hash ao bundle e identificadas nos diagnósticos. Não se tornam padrão. O novo teste usa as políticas congeladas, sem reestimá-las. Curvas de risco/cobertura de teste são descritivas; não escolher um cutoff a partir delas. Nenhum score é nota de escrita ou competência.

Reproduzir a avaliação

Com a stack ML instalada pelo lock e os artefatos originais em artifacts/run-42:

python3 scripts/build_v02_suite.py
uv run --frozen --extra ml python -m patchinsight.research historical
uv run --frozen --extra ml python -m patchinsight.research development --device cuda
uv run --frozen --extra ml python -m patchinsight.research test --device cuda
uv run --frozen --extra ml python -m patchinsight.research latency --device cuda

Esses relatórios já existem e os comandos recusam sobrescrita. Para uma reprodução, acrescente --root-output artifacts/v02-reproduction a cada comando, usando a mesma pasta em desenvolvimento e teste. CPU também é suportada. O encoder base é carregado apenas do cache local, com revisão fixa; preparar o cache pelo treino/reprodução original antes de desconectar a rede. --run seleciona a pasta com model/ e frozen.json; não basta baixar apenas o BERT.

Relatórios: histórico posterior, desenvolvimento, novo teste, erros. Os JSON incluem versões, ambiente, hashes, métricas por componente, recortes, risco/cobertura e confiabilidade. Macro-F1 em recortes com rótulos sem positivos usa zero_division=0: pode ser zero mesmo com previsões negativas corretas. Comparar esses recortes também por Hamming, suportes e FP/FN, não só macro-F1.

Inferência em lote

printf '%s\n' '{"id":"a","text":"Revisei as consultas com SQL."}' \
  '{"id":"b","text":"OAuth 2.0"}' | \
  uv run --frozen --extra ml patchinsight batch --model artifacts/model --batch-size 8

JSONL de entrada com text e id opcional (string até 200 caracteres). Um envelope por linha de saída conserva ordem, número de linha, id e prediction ou error. O modelo é carregado uma vez e os itens válidos são inferidos juntos. Linhas inválidas não impedem os demais itens. Exit 0: todos válidos; 1: erros por linha; 2: erro de configuração, limite global ou inferência.

Batch de 1–64, máximo padrão 10.000 itens; --max-items ajusta esse total. Entradas excedendo 100.000 caracteres por linha encerram o fluxo. Textos seguem o limite de 20.000 caracteres e as regras de truncamento do contrato. --timeout padrão 300 segundos é cooperativo: verificado entre lotes após leitura. Não interrompe uma inferência ativa nem uma leitura stdin bloqueada. Saída anterior continua válida em interrupções. --input arquivo.jsonl lê arquivo.

Demo local

uv run --frozen --extra ml patchinsight serve --model artifacts/model --device cuda

Abrir http://127.0.0.1:8765. Texto livre, exemplos editáveis, cinco componentes, combinações, scores, truncamento e JSON versionado. A inferência usa o checkpoint real. --backend heuristic seleciona explicitamente regras. Não há fallback.

Captura da demo verificada no Firefox.

A interface e o endpoint POST /v1/analyze ficam restritos a loopback; não é um serviço publicado. O endpoint aceita apenas {"text":"..."}. Modelo carregado uma vez, inferência serializada, máximo de 100.000 bytes por body, sem persistir textos ou registrar requests. /healthz informa backend pronto e política. Host/origem são limitados à demo local. CPU: omitir --device cuda.

Calibração experimental opt-in, com o bundle usado no experimento:

uv run --frozen --extra ml patchinsight serve --model artifacts/run-42/model \
  --policy reports/v02/development/bert_finetuned-policy.json

Uma política de outro método ou bundle é rejeitada. A política fornecida tem abstenção desativada por não cumprir os critérios em desenvolvimento.

Action–Method exige action e method presentes; qualquer unknown impede o match. Assim como as demais estruturas, isso indica coocorrência, não vínculo causal. Schema e regras: 0.2.0. Não usar um validador JSON 0.1.0 para as novas saídas.

Escopo concluído e continuidade

SHOULD atendidos nesta rodada: testes adversariais (ML-15), experimento de calibração (ML-12), inferência em lote (ENG-06), mecanismo de incerteza com critério explícito (ENG-08), Action–Method (STR-06) e demo (PUB-06). A meta empírica de abstenção não foi atingida. Tracking continua em arquivos locais; não foi adicionada infraestrutura de experimentos nem contratada computação.

A revisão permanece por IA conforme solicitado. Spans, task/challenge como novos rótulos, CAR, vagueza/especificidade supervisionadas e inglês exigem novos dados e avaliações. A próxima rodada pode trabalhar com escrita livre e novas fontes ou revisão independente, mantendo um novo teste sem consulta durante ajustes.

Medição local de inferência

RTX A1000 6 GB, CUDA, revisão fixa dos mesmos encoders; três lotes de aquecimento e 12 repetições por método/tamanho. Inclui tokenização, modelo e scores; exclui JSON, regras e I/O. Inferências foram medidas sem inicialização concorrente de outro modelo na GPU. Uma primeira medição com inicialização concorrente da demo foi descartada e mantida somente em artifacts, fora do relatório publicado.

Método Lote 1 p50 / p95 (ms) Lote 8 p50 / p95 (ms) Textos/s no lote 8
Heurísticas 0,08 / 0,08 1,48 / 1,81 5.156
Regressão 5,44 / 5,56 15,43 / 16,41 514
BERT ajustado 4,66 / 4,85 14,88 / 15,57 537

São medições pequenas sobre textos de desenvolvimento, não uma promessa de latência para qualquer entrada. O tamanho de lote altera também a composição dos textos, por isso não isola seu efeito. O JSON registra pico de memória CUDA do processo com ambos os encoders residentes, não consumo isolado por método. Memória CPU não foi medida. Evidência: latência.

Verificações concluídas

25 testes passaram com a stack ML e checkpoint real. Em ambiente separado sem ML, 16 passaram e três testes dependentes de ML foram explicitamente pulados. Wheel instalado em outra virtualenv: HTML, comparação JSON e inferência heurística funcionaram sem dependências de ML. Lock conferido com uv lock --check.

Firefox headless validou inferência BERT, exemplos, erro de entrada vazia, ordenação por métrica, troca de conjunto e ausência de overflow horizontal em tela estreita. A imagem Docker 0.2.0 carregou o modelo real e inferiu sem rede, com filesystem somente leitura e usuário 65532. A imagem anterior não foi retagueada. A verificação compara os dados originais e relatórios finais com a tag v0.1.0, além de conferir o hash dos pesos preservados.

Registro: verification.json. Binários e logs em artifacts/ são evidências locais, não foram enviados a registry, GitHub ou Hub. Screenshot incluída na documentação. O pacote de fontes usa allowlist e exclui PDF, credenciais e docs.md privado.