CoolFace
Modelpublic

matheus-ciro-tcc/qwen3.5-0.8b-triagem-medica-ptbr

sourceHugging Faceapache-2.0updated 27d agoView on Hugging Face
0likes24downloads
Model Card

Qwen3.5-0.8B — Triagem médica em português brasileiro

Adaptador LoRA que faz roteamento de especialidade médica: dada a queixa de um paciente em texto livre e em português brasileiro, o modelo aponta a qual especialista procurar, entre 10 especialidades.

Treinado com QLoRA sobre Qwen/Qwen3.5-0.8B como parte de um Trabalho de Conclusão de Curso que investiga se um modelo de linguagem pequeno, rodando em placa de vídeo doméstica, dá conta dessa tarefa.

⚠️ Não é um dispositivo médico. Este modelo sugere um encaminhamento de especialidade a partir de texto; ele não diagnostica, não avalia gravidade de forma confiável e não substitui triagem por profissional de saúde. Não use para decisão clínica.

Detalhes

Modelo base`Qwen/Qwen3.5-0.8B`
MétodoQLoRA — base congelada em NF4 4-bit + adaptadores LoRA
LoRAr=16, α=32, dropout=0
Módulos alvoqproj, kproj, vproj, oproj, gateproj, upproj, down_proj
Parâmetros treináveis6.389.760
Dataset`AKCIT/MedPT`, 10 especialidades mais frequentes
IdiomaPortuguês brasileiro
HardwareRTX 4060 Laptop (8 GB)

Especialidades cobertas

Dentista · Dermatologista · Ginecologista · Oftalmologista · Ortopedista - traumatologista · Otorrino · Psicólogo · Psicólogo, Psicanalista · Psiquiatra · Urologista

Dados

Recorte do MedPT com as 10 especialidades mais frequentes, split estratificado 80/10/10:

SplitExemplos
Treino145.321
Validação18.165
Teste18.166

As classes são desbalanceadas — Psicólogo tem 57.113 exemplos contra 7.734 de Otorrino no corpus filtrado.

Hiperparâmetros

Épocas3 (13.626 passos)
Batch efetivo32 (4 × 8 de acumulação)
Learning rate2e-4, scheduler cosseno
Warmup409 passos
Otimizadoradamw_8bit
max_seq_length1024

Resultados

MétricaValor
Loss de treino (final)0,4446
eval_loss — fim da época 10,6020
eval_loss — fim da época 20,5138

A curva de validação caiu de forma consistente entre as épocas 1 e 2, sem sinal de sobreajuste.

Métricas de teste (F1 macro, acurácia, matriz de confusão) ainda não foram computadas para esta execução e serão adicionadas a este card quando estiverem prontas. Não presuma desempenho a partir dos números de loss.

Ver training_summary.json para o registro completo, incluindo notas sobre medições que o Trainer reportou incorretamente por causa de retomadas.

Como usar

O prompt segue o formato ChatML com um system prompt que enumera as especialidades. O metadata.json neste repositório traz o prompt exato e a lista de rótulos.

python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel

BASE = "Qwen/Qwen3.5-0.8B"
ADAPTER = "matheus-ciro-tcc/qwen3.5-0.8b-triagem-medica-ptbr"

tokenizer = AutoTokenizer.from_pretrained(ADAPTER)
model = AutoModelForCausalLM.from_pretrained(BASE, torch_dtype=torch.bfloat16, device_map="auto")
model = PeftModel.from_pretrained(model, ADAPTER)
model.eval()

ESPECIALIDADES = [
    "Dentista", "Dermatologista", "Ginecologista", "Oftalmologista",
    "Ortopedista - traumatologista", "Otorrino", "Psicólogo",
    "Psicólogo, Psicanalista", "Psiquiatra", "Urologista",
]
system = (
    "Você é um sistema de triagem médica. Dada a queixa do paciente, "
    "classifique a especialidade médica mais apropriada entre: "
    + ", ".join(sorted(ESPECIALIDADES)) + "."
)

queixa = "Estou com manchas vermelhas que coçam nos braços há duas semanas."
messages = [{"role": "system", "content": system}, {"role": "user", "content": queixa}]

prompt = tokenizer.apply_chat_template(
    messages, tokenize=False, add_generation_prompt=True, enable_thinking=False
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=16, do_sample=False)
print(tokenizer.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True).strip())

Importante: o Qwen3.5 precisa rodar em non-thinking mode (enable_thinking=False). No thinking mode o 0.8B entra em laço infinito.

Limitações

  • —Classificação fechada. Só sabe escolher entre as 10 especialidades acima. Queixa fora desse escopo produz um rótulo errado, não uma abstenção.
  • —`Psicólogo` e `Psicólogo, Psicanalista` se sobrepõem quase totalmente no dataset. Em execuções anteriores do mesmo pipeline, a segunda classe foi absorvida pela primeira.
  • —Sem consciência de urgência. O modelo roteia especialidade; não identifica emergência nem prioriza atendimento.
  • —Viés do corpus. O MedPT vem de perguntas feitas por pacientes em plataforma online, com a distribuição de queixas e o vocabulário desse contexto.
  • —Português brasileiro apenas.

Autores

Matheus Marques Eiras e Ciro Guilherme Nass Orientador: João Paulo Orlando Instituto Federal do Paraná — Câmpus Pinhais

Licença

Apache 2.0, herdada do modelo base Qwen/Qwen3.5-0.8B. O dataset MedPT tem seus próprios termos — consulte o card do dataset.

Referências

  • —MedPT: FÄRBER, F. B. et al. MedPT: a massive medical question answering dataset for Brazilian-Portuguese speakers. arXiv:2511.11878, 2026.
  • —QLoRA: DETTMERS, T. et al. QLoRA: efficient finetuning of quantized LLMs. arXiv:2305.14314, 2023.
  • —LoRA: HU, E. J. et al. LoRA: low-rank adaptation of large language models. arXiv:2106.09685, 2021.