matheus-ciro-tcc/qwen35-2b-triagem-medica-piloto
Qwen3.5-2B — Triagem Médica em Português Brasileiro (piloto)
Adaptadores LoRA (QLoRA, 4-bit) para o `Qwen/Qwen3.5-2B`, ajustados para classificar a especialidade médica mais adequada a partir da queixa de um paciente escrita em texto livre, em português brasileiro.
Faz parte do TCC "Triagem médica automatizada em português brasileiro: ajuste fino QLoRA de modelos de linguagem para roteamento de especialidade" (Matheus Marques Eiras, Ciro Guilherme Nass — Instituto Federal do Paraná, Câmpus Pinhais, orientação de João Paulo Orlando).
⚠️ Resultado de piloto, não do dataset completo. Este checkpoint foi treinado numa amostra reduzida (500 exemplos por classe) para validar o pipeline antes de comprometer o treino no dataset completo (145 mil exemplos). Os números aqui não são comparáveis diretamente aos resultados finais do Qwen3.5-0.8B do mesmo projeto, que já rodou no dataset completo.
Tarefa
Classificação fechada de especialidade médica entre 10 classes, a partir da queixa do paciente:
Dentista, Dermatologista, Ginecologista, Oftalmologista,
Ortopedista - traumatologista, Otorrino, Psicólogo, Psicólogo — Psicanalista,
Psiquiatra, UrologistaDados
- Fonte: `AKCIT/MedPT` — corpus público de 384.095 pares de pergunta e resposta médica em português brasileiro.
- Piloto: 500 exemplos por classe (4.000 treino / 500 validação / 500 teste), split estratificado 80/10/10, seed 42.
Método
QLoRA: base Qwen/Qwen3.5-2B congelada e quantizada em NF4 4-bit; adaptadores LoRA treinados nas projeções de atenção e no MLP.
Resultados (piloto)
Avaliação de acurácia/F1 macro sobre o conjunto de teste ainda não foi rodada para este checkpoint — ver o repositório do projeto para atualizações.
Nota: o modelo entra em loop infinito se rodado em thinking mode — sempre usar enable_thinking=False no template de chat (mesma observação já documentada para o Qwen3.5-0.8B do mesmo projeto).Como usar
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="MatheusMarquesEiras/qwen35-2b-triagem-medica-piloto",
max_seq_length=1024,
load_in_4bit=True,
)
FastLanguageModel.for_inference(model)
messages = [
{"role": "system", "content": (
"Você é um sistema de triagem médica. Dada a queixa do paciente, "
"classifique a especialidade médica mais apropriada entre: Dentista, "
"Dermatologista, Ginecologista, Oftalmologista, Ortopedista - "
"traumatologista, Otorrino, Psicólogo, Psicólogo, Psicanalista, "
"Psiquiatra, Urologista. Responda APENAS com o nome da especialidade, "
"sem explicações adicionais."
)},
{"role": "user", "content": "Estou com muita dor de dente e sensibilidade ao frio."},
]
text = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True, enable_thinking=False,
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=20, do_sample=False)
print(tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))Limitações conhecidas
- Treinado num piloto pequeno (500/classe) — não reflete o desempenho do dataset completo.
- Como no experimento com Qwen3.5-0.8B do mesmo projeto, a classe "Psicólogo, Psicanalista" tende a ser absorvida pela classe majoritária "Psicólogo" por sobreposição semântica quase total entre as duas.
- Modelo de triagem, não de diagnóstico — não deve ser usado para decisões clínicas sem supervisão de um profissional de saúde.
Framework versions
- PEFT 0.19.1
- Unsloth 2026.3.11
- TRL 0.24.0
