Benchmark comparativo entre modelos locais de linguagem (LLMs) e um BERT fine-tunado na tarefa de classificação de notícias falsas em português brasileiro. Avalia três estratégias de prompting (zero-shot, few-shot e chain-of-thought) contra um baseline de BERT fine-tunado, em dois datasets (Fake.Br Corpus e FakeRecogna).
O projeto usa uv e pyproject.toml (Python ≥3.13):
uv syncPara GPU com CUDA:
pip install torch --index-url https://download.pytorch.org/whl/cu121 # CUDA 12.1
pip install torch --index-url https://download.pytorch.org/whl/cu118 # CUDA 11.8| Categoria | Modelo | Parâmetros | VRAM aprox. |
|---|---|---|---|
| Pequeno | Qwen/Qwen2-1.5B-Instruct | 1.5B | ~4 GB |
| Pequeno | CEIA-UFG/Gemma-3-Gaia-PT-BR-4b-it | 4B | ~6 GB |
| Médio | Qwen/Qwen2-7B-Instruct | 7B | ~8 GB |
| Médio | meta-llama/Meta-Llama-3-8B-Instruct | 8B | ~10 GB |
| Médio | lucianosb/boto-7B-v1.1 | 7B | ~10 GB |
| Médio | recogna-nlp/bode-7b-alpaca-pt-br | 7B | ~10 GB |
Baseline: neuralmind/bert-base-portuguese-cased (BERTimbau) fine-tunado em cada dataset.
Valores de VRAM considerando quantização 4-bit.
- Fake.Br Corpus — 7.200 notícias (Monteiro et al., 2018). Fonte: https://github.com/roneysco/Fake.br-Corpus
- FakeRecogna — 11.902 notícias (Garcia et al., 2022). Fonte: https://github.com/Gabriel-Lino-Garcia/FakeRecogna
Baixados automaticamente via Hugging Face.
O fluxo de trabalho é baseado em Jupyter notebooks. Execute-os a partir da raiz do projeto; eles configuram sys.path para importar os módulos em src/.
Ordem de execução:
01_data_exploration.ipynb— carrega e inspeciona os datasets.02_single_model_test.ipynb— sanity-check em um único modelo/estratégia.03_full_benchmark.ipynb— sweep completo (modelos × estratégias × datasets). Dura várias horas; grava um JSON por combinação emreports/.03_train_bert.ipynb— fine-tuning do BERTimbau.04_benchmark_analysis.ipynb— consolida os JSONs emreports/benchmark_report.{csv,xlsx,md}e gera figuras.
Configurações centrais em src/config.py (MODELS, DATASETS, PROMPTING_STRATEGIES, EXPERIMENT_CONFIG). Templates de prompt em src/models/prompts.py.
Desempenho: Acurácia, Precisão, Recall, F1-Score (com pos_label=1 para "fake").
Práticas: tempo médio de inferência (s/notícia) e uso de VRAM (GB).
.
├── main.py
├── pyproject.toml
├── uv.lock
├── README.md
├── src/
│ ├── config.py
│ ├── data/
│ │ └── data_loader.py
│ ├── models/
│ │ ├── model_handler.py
│ │ ├── prompts.py
│ │ └── metrics.py
│ └── visualization/
├── data/
│ └── processed/ # datasets pré-processados (CSV)
├── notebooks/
│ ├── 01_data_exploration.ipynb
│ ├── 02_single_model_test.ipynb
│ ├── 03_full_benchmark.ipynb
│ ├── 03_train_bert.ipynb
│ └── 04_benchmark_analysis.ipynb
├── reports/ # resultados gerados pelos notebooks
└── models/
└── partial_results/ # checkpoints locais do BERT fine-tunado
| Configuração | VRAM | Modelos |
|---|---|---|
| Mínima | 8 GB | Qwen2-1.5B, Gemma-4B |
| Recomendada | 16 GB | Todos até 8B |
| Ideal | 24 GB | Todos |
O benchmark usa Ollama por padrão nos notebooks (via ModelHandlerOllama). Os modelos listados em OLLAMA_MODEL_MAPPING (em src/config.py) precisam estar disponíveis localmente. Uso direto:
from models.model_handler import ModelHandlerOllama
handler = ModelHandlerOllama("meta-llama/Meta-Llama-3-8B-Instruct")
response = handler.generate(prompt)