- SLM
- Fine Tuning
- RAG
- Qwen3
- Hugging Face
- Refauna
Tapirus Open 4B: fine tuning e RAG sobre o Qwen3-4B para um domínio que os LLMs generalistas não cobrem
Por que treinei um modelo pequeno de linguagem especializado em refaunação e restauração de interações ecológicas, como combinei fine tuning com RAG e o que aprendi ao publicar os pesos abertos no Hugging Face.
Modelos generalistas respondem sobre quase tudo — e é justamente por isso que respondem mal sobre refaunação. Quando a pergunta envolve reintrodução de espécies, dispersão de sementes por frugívoros ou restauração de interações ecológicas, o que sai costuma ser um texto fluente, plausível e impreciso. Foi esse incômodo que me levou a treinar um modelo próprio.
O resultado é o Tapirus Open 4B: um modelo pequeno de linguagem, com pesos abertos, especializado em refaunação, conservação da biodiversidade e restauração de interações ecológicas. A base é o Qwen/Qwen3-4B-Instruct-2507, sobre o qual apliquei fine tuning e, por cima, uma camada de RAG. Este texto é sobre as decisões de engenharia por trás disso — e sobre o que eu faria diferente.
O ponto cego dos modelos generalistas
Um LLM treinado majoritariamente na web aberta aprende a distribuição do que é abundante. Literatura técnica de ecologia da restauração é exatamente o oposto disso: pouco volume, vocabulário próprio e muita nuance regional. Termos como defaunação, síndrome de dispersão, linha de base ecológica ou megafauna extinta aparecem raramente — e quando aparecem, vêm descolados do contexto de aplicação.
Na prática isso produz dois tipos de erro. O primeiro é o mais óbvio: o modelo inventa interações entre espécies que não existem. O segundo é mais perigoso, porque passa despercebido: o modelo acerta o conceito geral, mas erra a escala, a região ou a espécie envolvida — e um texto bem escrito com o dado errado é pior do que uma recusa honesta.
Havia dois caminhos. Ajustar prompts sobre um modelo grande, ou construir algo especializado. Prompt engineering melhora a forma da resposta, mas não cria conhecimento que não está lá.
Por que um SLM, e não um LLM gigante
- Em escopo estreito, especialização vence tamanho. O modelo não precisa saber escrever SQL nem discutir política externa. Precisa acertar um domínio.
- Custo e latência. Um modelo de 4B responde rápido e barato o suficiente para ser usado de verdade, não apenas demonstrado.
- Execução local. Roda em GPU modesta e, quantizado, até em notebook. Para pesquisa de campo — onde conectividade é limitada e dados nem sempre podem sair do ambiente — isso deixa de ser detalhe e vira requisito.
- Reprodutibilidade. Pesos abertos permitem que outra pessoa verifique, critique e continue o trabalho.
Por que o Qwen3-4B-Instruct-2507
A escolha do modelo base foi menos sobre ranking em benchmark e mais sobre restrições concretas do projeto:
- 4 bilhões de parâmetros é o ponto de equilíbrio entre capacidade de raciocínio e hardware acessível.
- A variante Instruct já chega alinhada a diálogo, então o fine tuning parte de um comportamento conversacional útil em vez de construí-lo do zero.
- Desempenho consistente em português, que é o idioma do corpus e do público do Refauna.
- Janela de contexto longa, o que dá folga para os trechos recuperados pelo RAG sem espremer a pergunta do usuário.
- Licença permissiva, condição para publicar um derivado com pesos abertos.
A escolha do modelo base é uma decisão de arquitetura, não de placar. Licença, idioma, hardware e o que você pretende publicar depois pesam mais do que dois pontos em um benchmark.
Fine tuning e RAG não competem: resolvem problemas diferentes
Essa talvez seja a confusão mais comum em projetos de IA aplicada. As duas técnicas são tratadas como alternativas — “faço fine tuning ou uso RAG?” — quando na verdade atacam camadas distintas do problema.
- Fine tuning muda como o modelo fala. Tom, estrutura da resposta, vocabulário técnico, e — o mais subestimado — a disposição de recusar o que está fora do escopo.
- RAG muda o que o modelo sabe agora. Fatos verificáveis, com fonte citável, atualizáveis sem retreinar nada.
A regra prática que uso: se a resposta certa muda quando um documento novo entra na base, o problema é de RAG. Se o modelo tem a informação mas a expressa mal, fora do vocabulário do domínio, o problema é de fine tuning. No Refauna, os dois problemas existiam — por isso as duas técnicas.
O pipeline, em quatro etapas
1. Preparação dos dados
O corpus do Refauna foi convertido em pares de instrução e resposta no chat template do próprio modelo base. Aqui a consistência de formato importa mais do que o volume: exemplos heterogêneos ensinam o modelo a ser heterogêneo.
{"messages": [
{"role": "system", "content": "Você é um assistente especializado em refaunação e restauração de interações ecológicas."},
{"role": "user", "content": "Por que a perda de frugívoros de grande porte compromete a regeneração da floresta?"},
{"role": "assistant", "content": "..."}
]}2. Fine tuning supervisionado
O ajuste é feito sobre a variante Instruct, preservando o comportamento conversacional que ela já tem. O risco principal nessa etapa é o esquecimento catastrófico: treinar demais em um domínio estreito degrada habilidades gerais que você ainda quer manter, como seguir instruções e escrever bem. Treino curto e avaliação frequente valem mais do que uma rodada longa.
3. Avaliação
Montei um conjunto de perguntas de validação e comparei as respostas lado a lado com as do modelo base. O critério que importa não é fluência — o modelo base já é fluente — e sim precisão factual dentro do domínio e honestidade nos limites: reconhecer o que não sabe é um resultado positivo, não uma falha.
4. A camada de RAG
Com o modelo já especializado, o RAG entra para ancorar as respostas na base documental. O ganho de combinar as duas técnicas aparece aqui: um modelo que domina o vocabulário do domínio interpreta melhor os trechos recuperados, e erra menos ao sintetizá-los.
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_ID = "Refauna/tapirus-open-4b"
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(MODEL_ID, device_map="auto")
# Os trechos recuperados entram como contexto, não como conhecimento implícito.
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": f"Contexto:\n{retrieved_chunks}\n\nPergunta: {question}"},
]
inputs = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, return_tensors="pt"
).to(model.device)
output = model.generate(inputs, max_new_tokens=512)Por que publicar com pesos abertos
Publicar no Hugging Face não é sobre distribuição, é sobre escrutínio. Um modelo de domínio que não pode ser auditado por quem entende do domínio tem valor limitado. O model card, nesse contexto, é tão importante quanto os pesos: ele precisa declarar o escopo, os dados de origem, as limitações conhecidas e — principalmente — o que o modelo não deve ser usado para decidir.
Um modelo especializado em conservação não substitui avaliação técnica de campo. Ele acelera leitura, síntese e formulação de hipóteses. Deixar isso explícito é parte da entrega.
O que eu levo para o próximo SLM
- Escopo estreito é vantagem, não limitação. Quanto mais claro o recorte, melhor o resultado por unidade de esforço.
- A licença do modelo base é decisão de produto. Ela determina o que você pode publicar no fim — e isso precisa ser verificado antes do primeiro treino, não depois.
- Qualidade e consistência dos dados superam volume. Poucos exemplos bem formatados batem muitos exemplos irregulares.
- Avalie contra o modelo base, sempre. Sem essa comparação você não sabe se o fine tuning ajudou ou apenas mudou o estilo da resposta.
- Fine tuning e RAG são camadas, não alternativas. Uma resolve forma, a outra resolve fato.
O Tapirus Open 4B continua em evolução. Se você trabalha com restauração ecológica, com modelos pequenos ou com os dois, tenho interesse genuíno em ouvir críticas — especialmente as técnicas. Fico à disposição no LinkedIn.