Madras1/Yara-50M-PTBR-QA
Yara-50M-PTBR-QA
Yara-50M-PTBR-QA é um pequeno modelo de linguagem causal em português brasileiro, treinado do zero e posteriormente ajustado para responder perguntas factuais a partir de um contexto fornecido.
Apesar de usar uma arquitetura compatível com LlamaForCausalLM, Yara não deriva de pesos Llama nem de qualquer outro checkpoint pré-treinado. O tokenizer Byte-Level BPE e os aproximadamente 50 milhões de parâmetros foram inicializados e treinados do zero.
O comportamento mais forte observado é a produção de respostas curtas e diretas quando a resposta está explicitamente presente no contexto. Este é um modelo experimental e educacional, não um sistema de perguntas e respostas de produção.
Características
- Arquitetura: decoder causal Llama-like (
LlamaForCausalLM) - Parâmetros: 50.049.536
- Camadas: 12
- Dimensão oculta: 512
- MLP intermediário: 1.536
- Cabeças de atenção: 8
- Cabeças KV: 4 (GQA)
- Vocabulário: 24.000 tokens
- Janela máxima: 1.024 tokens
- Ativações: SwiGLU/SiLU
- Normalização: RMSNorm
- Posicionamento: RoPE
- Embeddings de entrada e saída compartilhados
- Idioma principal: português brasileiro
Yara é um decoder causal. Ela não é um encoder BERT, apesar de o experimento ter usado anteriormente o nome provisório “Bertinha”.
Treinamento
Pré-treinamento
O pré-treinamento utilizou a parte real de `Madras1/corpus-ptbr-v1`, com uma mistura-alvo de aproximadamente 75% de tokens de FineWeb2 PT e 25% de C4 PT.
- Tokens processados: 399.966.208
- Comprimento de sequência: 512
- Passos: 6.103
- Loss de validação medida no passo 6.000: 3,5559
- Perplexidade de validação medida: 35,02
Ajuste supervisionado
O SFT utilizou `Madras1/rag-qa-fulltext-ptbr`, com separação de documentos entre treino, validação e teste. A loss foi aplicada apenas à resposta e ao token EOS; contexto e pergunta foram mascarados.
- Tokens computados: 99.942.400
- Comprimento de sequência: 1.024
- Passos: 1.525
- Loss de validação medida no passo 1.400: 1,1214
- Perplexidade de validação medida: 3,069
As perplexidades de pré-treinamento e SFT não são diretamente comparáveis, pois no SFT a loss considera somente os tokens supervisionados da resposta.
O treinamento foi realizado em duas GPUs NVIDIA T4, com DDP e precisão FP16. Os pesos publicados estão armazenados em safetensors.
Formato de entrada
O modelo espera este protocolo:
<|contexto|>TEXTO DE REFERÊNCIA<|pergunta|>PERGUNTA<|resposta|>O tokenizer adiciona o token BOS. A geração deve terminar em EOS.
Uso com Transformers
Recomenda-se uma versão de transformers compatível com o formato salvo pelo Transformers 5.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
repo_id = "Madras1/Yara-50M-PTBR-QA" # ajuste o proprietário se necessário
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float16 if device == "cuda" else torch.float32
tokenizer = AutoTokenizer.from_pretrained(repo_id)
model = AutoModelForCausalLM.from_pretrained(repo_id, dtype=dtype).to(device)
model.eval()
model.config.use_cache = True
contexto = (
"Namar possui três ilhas. Solena tem como capital Varedo. "
"Taris tem como capital Mavena. Orun tem como capital Celúria."
)
pergunta = "Qual cidade é a capital da ilha de Taris?"
prompt = (
f"<|contexto|>{contexto}"
f"<|pergunta|>{pergunta}"
"<|resposta|>"
)
inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=True).to(device)
with torch.inference_mode():
output = model.generate(
**inputs,
max_new_tokens=64,
do_sample=False,
repetition_penalty=1.08,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
new_tokens = output[0, inputs["input_ids"].shape[1]:]
resposta = tokenizer.decode(new_tokens, skip_special_tokens=True).strip()
print(resposta)Uma resposta típica para o exemplo é A cidade de Mavena. ou Mavena.
Capacidades observadas
Em testes qualitativos simples, Yara mostrou boa tendência para:
- extrair uma entidade diretamente declarada no contexto;
- responder de forma curta em português;
- lidar com nomes fictícios, reduzindo a possibilidade de mera memorização;
- selecionar a entidade correta entre fatos independentes sobre sujeitos diferentes.
Esses resultados são observações qualitativas, não uma avaliação formal de acurácia. A loss de validação mede previsão de tokens e não garante correção factual.
Limitações
- O modelo possui apenas cerca de 50 milhões de parâmetros e 400 milhões de tokens de pré-treinamento.
- Pode alucinar, repetir partes da pergunta ou produzir frases gramaticalmente imperfeitas.
- Apresentou fragilidade quando o mesmo sujeito recebeu informações temporais concorrentes, como “capital antiga” versus “capital atual”.
- Não foi treinado especificamente para recusar perguntas sem resposta no contexto.
- Não possui chat template nem foi desenvolvido como assistente conversacional geral.
- O repositório contém o leitor/gerador; não inclui recuperador, embeddings ou banco vetorial de um pipeline RAG completo.
- Os dados sintéticos ou coletados da web podem conter erros e vieses.
- Não houve avaliação de segurança suficiente para uso sensível ou de alto impacto.
Antes de qualquer uso real, avalie o modelo em exemplos separados com Exact Match, F1, perguntas sem resposta, negação, contraste temporal e contextos com distratores.
Arquivos adicionais
experiment_config.json: configuração completa do experimento.metrics.jsonl: logs de treinamento e validação do SFT.
Status
Modelo experimental, disponibilizado para pesquisa, aprendizado e exploração de modelos pequenos em português brasileiro.
