--- title: Des-abrasileirador pt-PT emoji: ✍️ colorFrom: green colorTo: red sdk: gradio sdk_version: 6.19.0 app_file: app.py hardware: zero-a10g --- # 🇵🇹 Des-abrasileirador (pt-PT) Reescreve texto em **português europeu** correto com o modelo [AMALIA-9B](https://hf.co/amalia-llm/AMALIA-9B-0626-SFT) e mede a "portugalidade" do resultado com um índice determinístico. ## O que faz 1. **Corrigir** — envia o texto ao AMALIA-9B (com *streaming*) e devolve a versão em pt-PT, com o IPT antes/depois. Opção de "modo explicado" que lista as alterações a partir de JSON, e botão para interromper a geração. 2. **Comparar modelos (IPT)** — corre o mesmo texto por vários modelos e ordena-os pelo **Índice de Portugalidade**. 3. **Analisar (IPT)** — mede a portugalidade de qualquer texto instantaneamente (determinístico, sem GPU) e lista os marcadores brasileiros encontrados. ## Índice de Portugalidade (IPT) Métrica determinística, sem GPU, definida em [`portugality.py`](portugality.py): ``` IPT = 100 * exp(-6 * densidade_ponderada_de_marcadores) ``` Conta marcadores brasileiros (léxico, ortografia pré-AO90, gerúndio, tratamento `você`/`a gente`, próclise inicial), pondera-os e normaliza pelo número de palavras. `0` marcadores → `100`; muito pt-BR → valor baixo. Como não usa nenhum LLM como juiz, é auditável e não é circular. O **delta** de cada modelo é calculado contra a **referência** (por omissão o `EuroLLM-9B`): mesma base e dimensão do AMALIA mas sem afinação pt-PT, pelo que a diferença de IPT isola o efeito dessa afinação. ## Ficheiros | Ficheiro | Papel | | --- | --- | | `app.py` | Interface Gradio (correção + comparação) | | `inference.py` | Registo de modelos e geração (cache de um modelo de cada vez) | | `portugality.py` | Cálculo do IPT (determinístico) | | `system_prompt.txt` | Instruções do revisor pt-PT | ## Hardware Um modelo de 9B **não** corre no Space CPU grátis. Este Space usa **ZeroGPU** (`@spaces.GPU`, `hardware: zero-a10g`), que requer conta HF PRO. Vários 9B não cabem em simultâneo num A10G (24 GB), por isso o `inference.py` mantém apenas **um modelo carregado de cada vez** e a comparação corre-os em série. O `inference.py` deteta o hardware automaticamente: | Ambiente | Modo | | --- | --- | | GPU com ≥ 20 GB VRAM (A10G/ZeroGPU) | bf16 (fp16 em placas pré-Ampere) | | GPU com < 20 GB VRAM (ex.: RTX 2060 6 GB) | 4-bit nf4 + *offload* do excedente para RAM | | Sem CUDA | CPU float32 (apenas modelos pequenos) | Podes forçar com `LOAD_IN_4BIT=1` ou `LOAD_IN_4BIT=0`. ## Correr localmente (Windows/Linux com GPU NVIDIA) ```bash python -m venv .venv .venv\Scripts\activate # Linux: source .venv/bin/activate pip install -r requirements.txt # o torch do PyPI é CPU-only; troca pela build CUDA: pip install torch --index-url https://download.pytorch.org/whl/cu126 python app.py # http://127.0.0.1:7860 ``` Numa GPU de 6 GB os modelos de 9B **não cabem** (mesmo em 4-bit precisam de ~6,3 GB só de pesos — a app recusa com uma mensagem clara em vez de rebentar). Usa o **Qwen2.5-3B** (~2 GB em 4-bit) como modelo de correção local; o Tucano-2B serve apenas de baseline pt-BR no benchmark. ## Modelos *gated* `meta-llama/Llama-3.1-8B-Instruct` e `google/gemma-2-9b-it` exigem aceitar a licença no Hugging Face. Define o segredo `HF_TOKEN` no Space (Settings → Secrets) para os poderes usar; caso contrário, esses modelos são ignorados na comparação com um aviso. ## Teste local rápido ```bash python portugality.py # imprime um ranking de exemplo, sem descarregar modelos ```