🏥

BioMistral-7B Fine-Tuned

Assistente Médico com IA — Tech Challenge FIAP (Fase 3)

🤖 BioMistral-7B ⚡ QLoRA Fine-Tuned 🇧🇷 PT-BR Ready 📚 RAG Ativo ✅ Apache 2.0

📋 Sobre o Projeto

Modelo de linguagem médica baseado no BioMistral-7B (variante do Mistral-7B pré-treinada em PubMed), fine-tuned com QLoRA em 16.325 perguntas e respostas médicas do dataset MedQuAD (NIH, EUA).

Faz parte de um sistema completo que inclui: RAG sobre bulas de medicamentos brasileiros (10k documentos), camada de tradução PT-BR ↔ EN, pipeline 3-agentes LangGraph (Triagem, Síntese, Validação), validação humana obrigatória (HITL) e logging de auditoria completo.

👩‍💻 Desenvolvido por: Michelle Almeida Nogueira Rodrigues
🎓 Contexto: Tech Challenge FIAP — Fase 3 (IA para Devs)
📅 Data: Agosto/Setembro 2026

📊 Métricas do Fine-Tuning

Comparação entre o modelo base e o modelo fine-tuned no conjunto de validação (816 amostras que o modelo nunca viu):

2.18 Perplexidade (Fine-Tuned)
4.31 Perplexidade (Base)
49.4% Redução de Hesitação
0.586 Validation Loss

Traduzindo o que esses números significam:

📚 Datasets Utilizados

1. Fine-tuning

2. RAG (Base de Conhecimento)

💻 Como Usar o Modelo

Para usar este modelo, você precisa de:

Instalação

pip install torch transformers peft bitsandbytes accelerate

Carregar o modelo

from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer

# Carrega base
base = AutoModelForCausalLM.from_pretrained(
    "BioMistral/BioMistral-7B",
    load_in_4bit=True,
    device_map="auto",
)

# Carrega LoRA adapter (este modelo)
model = PeftModel.from_pretrained(
    base,
    "michelleAnogueira/biomistral-medquad-lora"
)

tokenizer = AutoTokenizer.from_pretrained(
    "michelleAnogueira/biomistral-medquad-lora"
)

Fazer uma pergunta

prompt = """Below is an instruction that describes a task.
Write a response that appropriately completes the request.

### Instruction:
What are the symptoms of diabetes?

### Response:
"""

inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(
    **inputs,
    max_new_tokens=512,
    temperature=0.5,
    top_p=0.9,
    do_sample=True,
    repetition_penalty=1.3,
)
resposta = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(resposta.split("### Response:")[-1].strip())

🎯 Casos de Uso

🧪 Testes de Generalização

O modelo foi testado com 15 perguntas que NUNCA viu durante o treino:

Conclusão: O modelo generalizou bem. Não houve overfitting prejudicial.

⚠️ Aviso Importante

ATENÇÃO: Este modelo é um protótipo acadêmico desenvolvido como trabalho de conclusão de curso. NÃO É um substituto para profissionais de saúde. Qualquer uso real em ambiente clínico requer:
  • Validação humana obrigatória por médico habilitado
  • Aprovação regulatória (ANVISA, CRM, etc.)
  • Testes clínicos rigorosos
  • Monitoramento contínuo de performance e viés