Apostila completa de Fine-tuning e Customização de Modelos
Afinar um modelo é a última alavanca, não a primeira. Esta apostila cobre o quadro de decisão (prompt → few-shot → RAG → fine-tune), os tipos de customização, por que os dados decidem tudo, PEFT com LoRA e QLoRA, preference tuning com DPO, as ferramentas e o loop de treino, como avaliar de verdade um modelo afinado, distillation para SLMs especializados, e o que muda em produção — servir adapters, versionar, re-treinar, segurança e licença.
Quando customizar um modelo
Objetivo: o quadro de decisão prompt → few-shot → RAG → fine-tune, o que o fine-tuning muda e o que não muda, e por que ele vem por último.
1.1 A escada de customização
- Prompt engineering — instruções claras, papel, restrições, formato. Grátis, instantâneo, reversível.
- Few-shot — 2–8 exemplos no prompt. Ensina formato e estilo sem treinar.
- RAG — dar ao modelo os documentos certos em tempo de execução. É assim que se "adiciona conhecimento" (ver IA Generativa & RAG).
- Fine-tuning — ajustar os pesos com exemplos da sua tarefa. Muda comportamento de forma persistente.
- Continued pre-training / treinar do zero — raro; caríssimo; para domínios muito distintos ou fundações próprias.
Suba a escada só quando o degrau anterior não resolve. A maioria dos "problemas de modelo" some com prompt melhor, few-shot ou RAG.
1.2 O que o fine-tuning muda
- Formato e estrutura: sempre responder no seu JSON/schema, no seu template, sem preâmbulo.
- Estilo e tom: a "voz" da sua marca, um nível de formalidade, concisão.
- Uma tarefa estreita: classificar/extrair/rotear/reescrever naquele domínio, melhor e mais barato que um modelo genérico grande.
- Aderência a instruções complexas que o modelo "esquece" no meio de prompts longos.
- Reduzir o prompt: o que era 2 mil tokens de instruções e exemplos vira comportamento embutido — mais barato por chamada, mais rápido.
- Linguagem/domínio: melhorar num idioma ou jargão sub-representado (com dados de continued pre-training).
1.3 O que o fine-tuning NÃO muda de forma confiável
- Não "ensina fatos" de forma confiável: jogar a sua base de conhecimento num fine-tune faz o modelo às vezes lembrar e às vezes alucinar por cima. Fatos = RAG.
- Não conserta raciocínio fraco de um modelo pequeno demais para a tarefa.
- Não é atualização: fatos que mudam (preços, políticas) não podem viver num peso congelado.
Fine-tune para "como", RAG para "o quê". Se o problema é o modelo não sabe uma informação → RAG. Se o problema é o modelo sabe fazer, mas não do jeito certo / no formato certo / no estilo certo / com consistência → aí fine-tuning pode valer. E mesmo então: só depois de esgotar prompt e few-shot, e só com dados bons (Módulo 3).
Perguntas de abertura: "Prompt, RAG ou fine-tuning — como você decide?" (suba a escada; RAG para conhecimento, fine-tune para comportamento/formato/estilo/tarefa estreita), "Fine-tuning ensina fatos novos?" (não de forma confiável — isso é RAG; fine-tune muda o "como"), "Quando fine-tuning vale a pena?" (formato/estilo/consistência/tarefa estreita e barata, depois de esgotar prompt e few-shot, com dados bons).
✏️ Exercício 1 — Escolha a alavanca
Para cada caso, diga prompt, few-shot, RAG, fine-tune, ou combinação — e por quê: (a) o assistente responde perguntas sobre a política de RH da empresa; (b) o modelo às vezes não devolve JSON válido; (c) você quer respostas no tom da sua marca (informal, direto, sem "Claro! Aqui está..."); (d) classificar tickets em 20 categorias específicas do seu produto, 100 mil/mês; (e) o modelo não sabe gírias e termos do setor agropecuário brasileiro.
Gabarito (uma boa resposta): (a) RAG — a política é conhecimento que muda; nunca fine-tune. (b) prompt + saída estruturada (grammar/structured output) primeiro; se ainda falhar em casos difíceis, um fine-tune leve de formato ajuda. (c) few-shot primeiro; se precisa ser consistente em escala e reduzir o prompt, fine-tune de estilo (SFT com exemplos no tom). (d) fine-tune de um SLM (LoRA) — tarefa estreita, alto volume; um modelo pequeno afinado bate um grande genérico em custo/latência (Módulo 8); RAG opcional se as categorias dependem de contexto. (e) continued pre-training num corpus do domínio + SFT; ou, mais barato, RAG com um glossário e few-shot — testar se resolve antes de treinar.
Tipos de customização
Objetivo: distinguir continued pre-training, SFT, preference tuning (RLHF/DPO), distillation, embedding fine-tuning e classifier heads — e qual usar para qual objetivo.
| Técnica | O que faz | Quando |
|---|---|---|
| Continued pre-training | continua o pré-treino (prever o próximo token) num corpus do seu domínio | domínio/idioma muito distinto do treino original; precisa de muito texto |
| SFT / instruction tuning | treina em pares instrução → resposta desejada | o caso mais comum: formato, estilo, tarefa, aderência a instruções |
| Preference tuning (RLHF, DPO, ORPO, KTO) | treina com pares resposta boa vs resposta ruim | quando o modelo precisa aprender o que não fazer; alinhar a preferências sutis que exemplos positivos não capturam (Módulo 5) |
| Distillation | um modelo "professor" (grande) gera dados/rótulos que treinam um "aluno" (pequeno) | ter a qualidade do grande numa tarefa, com o custo/latência do pequeno (Módulo 8) |
| Embedding fine-tuning | ajusta um modelo de embeddings para o seu domínio | melhorar retrieval do seu RAG (as consultas e os documentos do seu jargão) |
| Classifier head | congela o modelo e treina só uma "cabeça" de classificação por cima | classificação pura, muito eficiente, quando não precisa gerar texto |
Um projeto pode combinar: continued pre-training (domínio) → SFT (tarefa/formato) → DPO (polir preferências). A maioria dos casos práticos é só SFT com LoRA.
Perguntas: "Diferença entre SFT e preference tuning?" (SFT: pares instrução→resposta boa, ensina o "faça assim"; preference: pares bom vs ruim, ensina o "não faça isso" e preferências sutis), "O que é distillation?" (professor grande gera dados para ensinar um aluno pequeno numa tarefa), "Quando um classifier head em vez de gerar texto?" (classificação pura — muito mais eficiente), "Como você melhora o retrieval do seu RAG por treino?" (embedding fine-tuning).
✏️ Exercício 2 — Que técnica
Para cada objetivo, escolha a técnica: (a) um SLM que só responde "spam / não-spam"; (b) o modelo tende a ser prolixo e "puxa saco" — você quer respostas diretas e honestas; (c) o RAG recupera trechos irrelevantes porque as consultas usam gírias internas; (d) você quer um modelo de 3B que resume contratos tão bem quanto um modelo de fronteira; (e) o modelo escreve português de Portugal e você quer PT-BR.
Gabarito: (a) classifier head (ou SFT pequeno) — classificação binária, eficiência. (b) preference tuning (DPO) — o problema é comportamental e sutil ("menos bajulação, mais franqueza"); pares chosen/rejected capturam isso melhor que exemplos positivos. (c) embedding fine-tuning com pares (consulta interna, documento relevante). (d) distillation: usar o modelo de fronteira para gerar milhares de (contrato → resumo) de alta qualidade e treinar o 3B com SFT. (e) SFT num corpus PT-BR (ou continued pre-training se a diferença for grande), com exemplos no registro certo.
Dados: o ativo que decide tudo
Objetivo: quantidade e qualidade, os formatos, as fontes (logs de produção, dados sintéticos, anotação), limpeza, contaminação e licença.
3.1 Quantidade × qualidade
- Para SFT com LoRA numa tarefa estreita: dezenas a poucos milhares de exemplos bons costumam bastar. Formato/estilo puro pode render com 50–200.
- Qualidade > quantidade, sempre. 200 exemplos impecáveis batem 5 mil ruidosos. Um exemplo errado "ensina" o erro.
- Diversidade cobrindo os casos reais (incluindo os difíceis e as bordas) importa mais que volume.
- Continued pre-training e treinar do zero são outra escala (bilhões de tokens) — fora do escopo prático da maioria.
3.2 Formatos
// SFT — formato de chat (JSONL, uma linha por exemplo) {"messages": [ {"role": "system", "content": "Você é um extrator. Responda só com JSON."}, {"role": "user", "content": "Fatura: ...texto..."}, {"role": "assistant", "content": "{\"numero\": \"123\", \"total\": 19990}"} ]} // Preference (DPO) — chosen vs rejected para o mesmo prompt {"prompt": "...", "chosen": "resposta melhor", "rejected": "resposta pior"}
3.3 Fontes de dados
- Logs de produção + correção humana: o ouro. Onde os usuários editaram/rejeitaram a saída, você tem o par (entrada → resposta certa). Instrumente isso (ver Design de Produtos com IA e LLMOps & Avaliação). Com consentimento e privacidade.
- Dados sintéticos: um modelo forte gera exemplos (distillation, aumento de dados). Rápido e barato; risco de propagar o viés e os erros do professor — filtre e revise.
- Anotação humana: especialistas escrevem/rotulam. Caro, alta qualidade; use para os casos que os outros não cobrem.
- Datasets públicos: para tarefas genéricas; cheque licença e adequação ao seu caso.
3.4 Higiene dos dados
- Limpeza: remover exemplos incorretos, incompletos, contraditórios; normalizar o formato.
- Deduplicação: exemplos repetidos enviesam o treino.
- Contaminação com o eval: se um exemplo do conjunto de treino também está no de avaliação, seus números mentem. Separe antes e cheque sobreposição.
- Viés: o modelo aprende os vieses dos dados; audite representação e casos sensíveis.
- Balanceamento: se 95% dos exemplos são de uma categoria, o modelo vira "sempre essa categoria".
- Consistência: se dois exemplos parecidos têm respostas em estilos diferentes, o modelo fica confuso — padronize.
3.5 Licença e consentimento
- Você tem direito de treinar com esses dados? (dados de usuários — consentimento/base legal; dados de terceiros — licença; conteúdo protegido).
- Algumas licenças de modelo/serviço proíbem usar as saídas para treinar outro modelo — leia (ver IA Local & SLMs, Módulo 2).
- Remova PII que não é necessária para a tarefa.
Poucos exemplos ruins > muitos exemplos ruins. Formato inconsistente (o modelo aprende a inconsistência). Contaminação treino/eval (números falsos). Dataset desbalanceado (colapso numa classe). Dados sintéticos não filtrados (herda os erros do professor). PII no treino (o modelo pode regurgitar). Ignorar a licença dos dados e do modelo base. "Jogar a base de conhecimento" num SFT esperando que vire memória.
Perguntas: "Quantos exemplos para um LoRA de SFT?" (dezenas a poucos milhares; qualidade > quantidade; diversidade cobrindo os casos reais), "Qual a melhor fonte de dados?" (logs de produção com correção humana — o par entrada→resposta certa; com consentimento), "Riscos de dados sintéticos?" (propaga viés e erros do professor — filtrar e revisar), "O que é contaminação treino/eval e por que importa?".
✏️ Exercício 3 — Monte o dataset
Você quer afinar um modelo para escrever respostas de suporte no tom da empresa (empático, direto, sem jargão). Descreva: quantos exemplos, de onde tirar, o formato, e 4 verificações de qualidade antes de treinar.
Gabarito (uma boa resposta): Quantidade: ~200–500 pares (ticket do cliente → resposta ideal), cobrindo os tipos de pergunta mais comuns + casos difíceis (cliente irritado, pedido fora de escopo, reembolso). Estilo puro rende com menos; começar com 150 e iterar. Fontes: respostas reais de agentes seniores bem avaliadas (com consentimento e PII redigida); curadoria manual das melhores; alguns exemplos escritos do zero para os casos raros; opcionalmente dados sintéticos revisados para aumentar variedade. Formato: JSONL de chat, com um system prompt fixo que descreve o papel, o ticket como user, a resposta ideal como assistant. Verificações: (1) todas as respostas realmente seguem o tom-alvo (revisão por 2 pessoas, rubrica); (2) formato e comprimento consistentes; (3) dedup e nenhum exemplo contraditório; (4) separar 15% para eval antes e checar que não há sobreposição; (5) PII zero; (6) balanceamento entre tipos de ticket (não 80% "como faço login").
PEFT: LoRA e QLoRA
Objetivo: o conceito de fine-tuning eficiente em parâmetros, os hiperparâmetros de LoRA, o que QLoRA adiciona, a VRAM necessária, e adapters.
4.1 O conceito
Full fine-tuning atualiza todos os pesos — precisa de muita VRAM (o modelo + gradientes + estados do otimizador) e produz uma cópia inteira do modelo por tarefa. PEFT (parameter-efficient fine-tuning) treina só uma fração minúscula:
- LoRA (Low-Rank Adaptation): para cada matriz de peso que você escolhe adaptar, congela a original e treina um par de matrizes de baixo rank (
AeB, comΔW = B·A). São ~0.1–2% dos parâmetros. Na inferência,W + ΔW. - QLoRA: carrega o modelo base quantizado em 4-bit (NF4) e treina os adapters LoRA por cima, em precisão maior. Permite afinar um 13B numa GPU de 24 GB, ou um 70B em ~48 GB.
- DoRA, rsLoRA, LoRA+: variações que melhoram a qualidade/estabilidade.
PEFT venceu para a maioria dos casos: mais barato, mais rápido, os adapters são pequenos (MBs), dá para ter muitos e trocá-los.
4.2 Os hiperparâmetros que importam
| Parâmetro | O que é | Ponto de partida |
|---|---|---|
| rank (r) | a "capacidade" do adapter; maior = aprende mais, ocupa mais, arrisca overfit | 8–32 (formato/estilo: 8–16; tarefa mais complexa: 32–64) |
| alpha | escala do adapter; costuma-se usar alpha = 2×r (ou = r) | 16–32 |
| target modules | quais matrizes adaptar (só as de atenção q,v, ou também k,o e as MLP) | começar com q_proj, v_proj; "all-linear" rende mais, custa mais |
| learning rate | o mais sensível; LoRA aceita LR maior que full FT | 1e-4 a 2e-4 (SFT); menor para datasets pequenos |
| epochs | quantas passadas pelos dados | 1–3; datasets pequenos overfitam rápido — 1–2 |
| batch size / grad accumulation | efetivo = batch × accumulation; limitado pela VRAM | o maior que couber; usar accumulation para simular batch maior |
| max seq length | tamanho máximo dos exemplos; corta ou custa memória | o suficiente para os seus exemplos; packing para eficiência |
4.3 VRAM
- LoRA (base em 16-bit): ~2–3× o tamanho do modelo em 16-bit. Um 7B → ~20–24 GB.
- QLoRA (base 4-bit): bem menos — 7B em ~8–10 GB, 13B em ~16 GB, 70B em ~48 GB. É o que democratiza o fine-tune.
- Serviços gerenciados (dos provedores de modelo, ou plataformas) escondem tudo isso — você manda o JSONL e recebe o modelo/adapter.
4.4 Adapters
- O resultado de um LoRA é um adapter de poucos MB. Você pode: guardar vários (um por tarefa/cliente), trocar em runtime, e — se quiser — fazer merge no modelo base (gera um modelo completo, útil para servir sem overhead de adapter).
- Servir múltiplos adapters sobre um base compartilhado (vLLM suporta) é a base de multi-tenant barato (Módulo 9).
- Compor adapters (somar dois) funciona às vezes, com cuidado.
Perguntas: "O que é LoRA e por que se usa em vez de full fine-tuning?" (treina matrizes de baixo rank, congela o resto — ~1% dos parâmetros; mais barato, adapters pequenos e trocáveis), "O que QLoRA adiciona?" (base quantizada 4-bit → afinar modelos grandes em pouca VRAM), "Que hiperparâmetros importam?" (rank, alpha, target modules, learning rate, epochs — datasets pequenos overfitam, use 1–2 epochs), "Quanta VRAM para afinar um 7B?" (~20 GB LoRA, ~8–10 GB QLoRA).
✏️ Exercício 4 — Configure o treino
Você tem 300 exemplos de SFT (estilo + formato de resposta), um modelo base de 8B, e uma GPU de 24 GB. Proponha a configuração de LoRA/QLoRA e justifique cada escolha; diga como você saberia que está overfitando.
Gabarito (uma boa resposta): Método: QLoRA (4-bit) — cabe folgado em 24 GB e sobra para batch maior e contexto. rank: 16 (estilo/formato não pede muita capacidade; rank alto com 300 exemplos overfita). alpha: 32. target modules: q_proj, k_proj, v_proj, o_proj (atenção); adicionar MLP só se o resultado ficar aquém. learning rate: ~1e-4 (dataset pequeno → conservador), scheduler cosine com warmup. epochs: 2 (com 300 exemplos, 3+ já arrisca decorar). batch efetivo: 16–32 via grad accumulation. max seq len: o percentil 95 dos seus exemplos; packing ligado. Reservar ~45 exemplos para eval. Overfitting: a loss de treino cai e a de validação para de cair ou sobe; o modelo começa a repetir frases exatas dos exemplos de treino; regride em prompts fora da distribuição do treino (perde capacidade geral); no eval próprio, melhora nos casos "parecidos com o treino" mas piora nos diferentes. Mitigar: menos epochs, rank menor, mais/melhores dados, early stopping pela loss de validação.
Preference tuning (DPO)
Objetivo: por que SFT não basta, o que é RLHF, por que DPO virou o padrão prático, e como montar o dataset de preferência.
5.1 Por que SFT não basta
SFT ensina "responda assim" com exemplos positivos. Mas há coisas que exemplos positivos não capturam bem: o que não fazer (não inventar, não ser prolixo, não bajular, não sair do escopo), e preferências sutis entre duas respostas plausíveis ("esta é boa, mas aquela é melhor"). Preference tuning treina com pares comparativos.
5.2 RLHF → DPO
- RLHF (Reinforcement Learning from Human Feedback): treina um reward model a partir de comparações humanas, e depois otimiza o LLM contra esse reward com RL (PPO). Poderoso, mas complexo e instável (vários modelos, tuning delicado, reward hacking).
- DPO (Direct Preference Optimization): pula o reward model e o RL — otimiza o modelo diretamente nos pares (chosen, rejected) com uma única loss. Muito mais simples, estável e barato; virou o padrão prático.
- ORPO (combina SFT + preferência num passo só), KTO (usa só "bom/ruim", sem par), SimPO — variações; DPO/ORPO cobrem a maioria.
5.3 O dataset de preferência
{"prompt": "<pergunta ou instrução>",
"chosen": "<a resposta que preferimos>",
"rejected": "<uma resposta pior para o MESMO prompt>"}
- De onde vêm os pares: comparação humana entre duas saídas do modelo; a resposta original (rejected) vs a versão editada por um humano (chosen); a saída do modelo antigo vs a do novo; "melhor de N" vs "pior de N".
- Qualidade: o chosen tem que ser claramente melhor pelo motivo que você quer ensinar; o rejected não pode ser lixo óbvio (senão não ensina nuance) nem quase idêntico.
- Cobertura: os eixos que você quer mover (concisão, honestidade, formato, recusa apropriada) representados em pares.
- Centenas a poucos milhares de pares costumam bastar depois de um SFT.
5.4 Riscos
- Reward hacking / degradação: o modelo aprende o "atalho" da preferência (ex.: fica sempre curto porque respostas curtas foram preferidas) e perde capacidade real.
- "Alignment tax": o preference tuning pode reduzir performance em tarefas não cobertas — meça a regressão (Módulo 7).
- Sobre-recusa: ensinar a recusar demais deixa o modelo inútil.
- Faça DPO depois de um SFT sólido, com
beta(o quanto se afasta do modelo de referência) moderado.
Perguntas: "Por que SFT não basta?" (exemplos positivos não ensinam o "não faça" nem preferências sutis entre respostas plausíveis), "RLHF vs DPO?" (RLHF: reward model + PPO, poderoso mas complexo/instável; DPO: otimiza direto nos pares chosen/rejected, simples e estável — o padrão), "Como montar um dataset de preferência?" (pares chosen/rejected para o mesmo prompt; chosen claramente melhor pelo motivo-alvo; rejected plausível), "Riscos do preference tuning?" (reward hacking, alignment tax, sobre-recusa).
✏️ Exercício 5 — DPO para franqueza
Seu assistente é bajulador e evasivo ("Ótima pergunta! Depende de muitos fatores..."). Você quer respostas diretas e honestas, inclusive dizer "não sei" ou "isso é uma má ideia". Descreva o dataset de preferência, o cuidado para não quebrar o modelo, e como você mediria o resultado.
Gabarito (uma boa resposta): Dataset: ~500 pares. Para prompts variados (perguntas técnicas, pedidos de opinião, ideias ruins, coisas fora do conhecimento do modelo), o rejected é a resposta bajuladora/evasiva típica do modelo atual; o chosen é uma versão direta — vai ao ponto, dá a resposta ou diz "não tenho essa informação", e quando cabe diz "não recomendo isso, porque...". Cobrir também casos onde ser direto não significa ser rude — para não ensinar grosseria. Incluir pares onde o chosen admite incerteza. Cuidado: fazer DPO depois de um SFT (ou sobre um modelo já bom), beta moderado para não se afastar demais do base; incluir no dataset alguns pares "controle" onde a resposta boa é elaborada (para não ensinar "sempre curto"); poucas epochs. Medir: um eval set com prompts que provocam bajulação/evasão + prompts normais; LLM-as-judge com rubrica (direto? honesto sobre incerteza? ainda educado? ainda completo quando precisa?) comparando base vs DPO; checar regressão em tarefas gerais (o modelo ficou pior em código/raciocínio/seguir instruções?); A/B com usuários reais medindo satisfação e taxa de "resposta útil".
Ferramentas e o loop de treino
Objetivo: as bibliotecas, o fluxo (dados → config → treino → avaliação → iterar), o hardware, o logging, e os sinais de overfitting.
6.1 As ferramentas
| Ferramenta | Perfil |
|---|---|
| Hugging Face TRL | as libs de referência: SFTTrainer, DPOTrainer, ORPOTrainer, integra com PEFT e Accelerate |
| Axolotl | config em YAML sobre TRL — o "jeito fácil" de rodar SFT/DPO/QLoRA sem escrever muito código |
| Unsloth | kernels otimizados: 2× mais rápido, menos VRAM; ótimo em GPU única |
| LLaMA-Factory | UI + CLI, muitos métodos e modelos suportados |
| torchtune | oficial do PyTorch, receitas limpas |
| MLX-LM | LoRA em Apple Silicon (Mac) — ver IA Local & SLMs |
| Serviços gerenciados | os fine-tune dos provedores de modelo, ou plataformas — você manda o JSONL, recebe o modelo/endpoint; zero infra |
6.2 O loop
- Preparar os dados (Módulo 3): JSONL limpo, dedup, split treino/eval sem contaminação.
- Baseline: medir o modelo base (e prompt+RAG) no seu eval — o número a bater.
- Configurar (Módulo 4/5): método, hiperparâmetros de partida.
- Treinar: acompanhar a loss de treino e de validação; salvar checkpoints.
- Avaliar (Módulo 7): no eval próprio, contra o baseline, checando regressão.
- Iterar: ajustar dados (o que mais rende), depois hiperparâmetros. Mudar uma coisa por vez.
6.3 Hardware
- Uma GPU de 24 GB faz LoRA de 7–13B (QLoRA vai a 30–70B). Alugar por hora numa cloud é o caminho para não comprar.
- Apple Silicon com bastante RAM roda LoRA de modelos pequenos-médios via MLX.
- Serviço gerenciado se você não quer nem pensar em GPU.
6.4 Logging e checkpoints
- Weights & Biases (ou TensorBoard/MLflow): loss, LR, gradientes, exemplos de geração ao longo do treino.
- Salvar checkpoints e escolher o melhor pela loss de validação (não a de treino) e pelo eval próprio — o último passo nem sempre é o melhor.
6.5 Sinais de overfitting
- Loss de validação para de cair (ou sobe) enquanto a de treino continua caindo.
- O modelo repete frases literais dos exemplos de treino; "decora" em vez de generalizar.
- Melhora nos casos parecidos com o treino, piora nos diferentes; perde capacidade geral.
- Correção: menos epochs, rank menor, mais/melhores dados, early stopping, regularização (dropout no LoRA).
Perguntas: "Que ferramentas você usaria para um LoRA?" (TRL, ou Axolotl/Unsloth para facilidade e velocidade; serviço gerenciado se sem infra), "Descreva o loop de fine-tuning" (dados → baseline → config → treinar → avaliar contra baseline e checar regressão → iterar mudando uma coisa por vez), "Como você escolhe o melhor checkpoint?" (pela loss de validação e pelo eval próprio, não o último passo), "Sinais de overfitting?".
✏️ Exercício 6 — Plano de treino de ponta a ponta
Você recebeu a tarefa: "faça o modelo classificar tickets em 20 categorias do nosso produto, melhor que o prompt atual". Descreva o plano completo, do dado ao "vai/não vai para produção".
Gabarito (uma boa resposta): (1) Dados: exportar tickets históricos com a categoria correta (rótulo humano); ~50–200 por categoria, balanceado; separar 20% para eval antes, sem contaminação; limpar rótulos ambíguos. (2) Baseline: rodar o eval com o prompt atual (few-shot) e um modelo bom — anotar accuracy por categoria e a matriz de confusão. (3) Escolha: um SLM (3–8B) com QLoRA (tarefa estreita, alto volume → quer barato/rápido — ver IA Local & SLMs); saída forçada ao enum das 20 categorias. (4) Config: rank 16, LR 1e-4, 2 epochs, target atenção; Axolotl/Unsloth; W&B. (5) Treinar, escolher checkpoint pela loss de validação. (6) Avaliar: accuracy geral e por categoria no eval próprio vs baseline; olhar a matriz de confusão (quais categorias ele troca); checar que não colapsou nas categorias raras. (7) Decisão: vai para produção se bate o baseline com margem e o custo/latência do SLM afinado compensa; senão, tentar mais/melhores dados ou rank maior. (8) Produção: shadow mode comparando com o humano, monitorar drift, plano de re-treino quando surgirem categorias novas (Módulo 9).
Avaliar um modelo fine-tunado
Objetivo: o eval set próprio, comparar contra o base e contra prompt+RAG no mesmo eval, detectar regressão de capacidade geral, e decidir se vale a pena.
7.1 Nunca só benchmark
- Benchmarks públicos não medem a sua tarefa e têm contaminação. Monte um eval set próprio: 100–500 exemplos representativos, com o resultado esperado ou um verificador, separado do treino.
- Métricas: checagem automática onde dá (classificação bate? JSON válido e correto? o código roda?), LLM-as-judge com rubrica para o que é aberto (ver LLMOps & Avaliação de Sistemas de IA).
7.2 Comparar no mesmo eval
Rode, no mesmo eval set: (a) o modelo base com o seu prompt; (b) base + few-shot; (c) base + RAG se aplicável; (d) o modelo fine-tunado. Só assim você sabe se o fine-tune ganhou de alternativas mais baratas — muitas vezes um bom prompt+RAG empata com o fine-tune e não custa treino nem manutenção.
7.3 Regressão de capacidade (catastrophic forgetting)
- Afinar numa tarefa pode degradar outras: o modelo "esquece" instruções gerais, raciocínio, outros idiomas, segurança.
- Tenha um eval de regressão: um punhado de tarefas gerais (seguir instruções, um pouco de raciocínio, formato, uma tarefa em outro idioma, prompts de segurança) que você roda antes e depois.
- Mitigar: menos epochs, rank menor, misturar alguns exemplos "gerais" no dataset de treino, LR menor.
7.4 Formato, estilo, segurança
- Se o objetivo era formato/estilo, meça isso diretamente (o JSON valida sempre? o tom bate com a rubrica?).
- Segurança: o fine-tune pode ter afrouxado guardrails do base (sobretudo com dados não curados) — re-rode um conjunto de prompts de segurança (ver Segurança de Aplicações de IA).
7.5 "Vale a pena?"
O fine-tune só se justifica se o ganho no eval próprio supera o custo total: dados (coleta, anotação, curadoria), GPU/treino, avaliação, e — o maior — a manutenção: cada vez que o modelo base evolui ou os dados mudam, você re-treina e re-avalia. Se prompt+RAG chega perto, fique com prompt+RAG.
Perguntas: "Como você avalia um modelo fine-tunado?" (eval set próprio, checagem automática + LLM-as-judge; comparar no mesmo eval contra base, few-shot e RAG; checar regressão de capacidade geral e segurança), "O que é catastrophic forgetting e como detectar?" (afinar degrada outras tarefas — um eval de regressão antes/depois), "Como você decide se o fine-tune valeu a pena?" (ganho no eval > custo de dados + treino + avaliação + manutenção; se prompt+RAG empata, não fine-tune).
✏️ Exercício 7 — Ele "melhorou"?
Seu LoRA de resumo de contratos subiu a "qualidade do resumo" (LLM-as-judge) de 3.9 para 4.4 no eval próprio. O que mais você checaria antes de dizer que valeu e mandar para produção?
Gabarito (uma boa resposta): (1) Comparar com alternativas no mesmo eval: base + prompt melhorado + few-shot; base + RAG das cláusulas relevantes — quanto disso é o fine-tune e quanto seria só um prompt melhor? (2) Regressão: rodar o eval de capacidade geral (seguir instruções, raciocínio, outro idioma, segurança) antes/depois — o modelo ficou pior em algo? (3) Por fatia: o ganho é em todos os tipos de contrato ou só nos parecidos com o treino? Piorou em algum? (4) Formato/factualidade: o resumo continua fiel (não inventa cláusula)? o formato é consistente? (5) Overfitting: ele repete trechos literais dos exemplos de treino? (6) Custo/latência: qual o custo de servir esse LoRA vs o baseline, e vs manter isso atualizado quando o modelo base mudar? (7) Robustez do juiz: 3.9→4.4 é significativo ou ruído? rodar o eval algumas vezes, checar o intervalo. (8) Produção: um A/B (ou shadow) com avaliação humana amostral antes de confiar 100%.
Distillation e SLMs especializados
Objetivo: usar um modelo grande para "ensinar" um pequeno a fazer uma tarefa muito bem, o pipeline de distillation, e quando o SLM afinado bate o modelo de fronteira.
8.1 A ideia
Distillation: um modelo "professor" forte (de fronteira, ou um grande aberto) gera dados de alta qualidade para a sua tarefa; você treina (SFT/LoRA) um modelo "aluno" pequeno nesses dados. O aluno aprende a fazer aquela tarefa quase tão bem, mas com o custo, a latência e a privacidade de um SLM (ver IA Local & SLMs).
8.2 Quando o SLM afinado ganha do modelo de fronteira
- Tarefa estreita e repetitiva: roteamento, classificação, extração, um estilo de reescrita, um formato — o SLM afinado pode bater o modelo de fronteira genérico nela, por focar.
- Volume alto: 100 mil a milhões de chamadas/dia — o SLM local ou barato muda a economia.
- Latência: um SLM responde em dezenas de ms.
- Privacidade: roda on-prem, dados não saem.
- Não ganha em: tarefas abertas, raciocínio difícil, contexto muito longo — aí o modelo grande é insubstituível.
8.3 O pipeline de distillation
- Definir a tarefa e o formato de saída com precisão.
- Gerar com o professor: milhares de exemplos (entrada → saída), com prompts variados cobrindo os casos reais; usar entradas reais quando possível (não só sintéticas).
- Filtrar: descartar as saídas do professor que estão erradas (validação automática, um segundo modelo como juiz, amostragem humana). Lixo do professor = lixo no aluno.
- Treinar o aluno (SFT/LoRA) nos dados filtrados.
- Avaliar (Módulo 7) contra o professor e contra o SLM base sem afinar, no seu eval.
- Iterar: os casos onde o aluno erra viram novos exemplos.
Licença: alguns provedores proíbem usar as saídas do modelo deles para treinar um modelo concorrente — leia os termos antes de destilar (ver IA Local & SLMs, Módulo 2).
8.4 Frota de especialistas
- Em vez de um modelo generalista, vários SLMs afinados — um por tarefa/domínio — + um dispatcher (heurística ou classificador leve) que escolhe.
- Servir como adapters LoRA sobre um base compartilhado mantém o custo de memória baixo (Módulo 9).
- Fallback para um modelo grande nos casos que nenhum especialista cobre bem (cascata — ver IA Local & SLMs, Módulo 8).
Perguntas: "O que é distillation e para que serve?" (professor grande gera dados; aluno pequeno aprende a tarefa com o custo/latência/privacidade de um SLM), "Quando um SLM afinado bate um modelo de fronteira?" (tarefa estreita e repetitiva, volume alto, latência, privacidade — não em tarefas abertas/raciocínio difícil), "Qual o passo mais importante do pipeline de distillation?" (filtrar as saídas do professor — lixo do professor vira lixo no aluno), "Que cuidado de licença?" (alguns termos proíbem treinar com as saídas).
✏️ Exercício 8 — Destile um roteador
Você quer um modelo minúsculo que decida, para cada mensagem de um chatbot, se ela deve ir para o fluxo "FAQ", "abrir chamado", "falar com humano" ou "fora de escopo". Hoje isso é feito por um modelo grande caro. Descreva o pipeline de distillation e como validaria.
Gabarito (uma boa resposta): (1) Tarefa: classificação em 4 rótulos; saída forçada ao enum. (2) Gerar: pegar mensagens reais do histórico do chatbot (milhares, variadas) e rotular cada uma com o modelo grande (o professor) com um prompt cuidadoso e few-shot; para os casos ambíguos, um segundo prompt/modelo ou um humano. (3) Filtrar: descartar rótulos de baixa confiança do professor; rotular manualmente uma amostra para medir a qualidade dos rótulos do professor (se o professor erra 8%, o teto do aluno é ~92%); balancear os 4 rótulos. (4) Treinar: um SLM de 0.5–3B (ou um classifier head) com LoRA nos dados filtrados. (5) Avaliar: um eval set com ~400 mensagens reais rotuladas por humanos (não pelo professor, para não herdar o viés dele); accuracy geral e por rótulo, matriz de confusão; comparar aluno vs professor vs SLM base sem afinar; medir latência e custo por 1k. (6) Decisão: se o aluno chega perto do professor com uma fração do custo/latência, vai para produção com fallback ao modelo grande nos casos de baixa confiança; monitorar drift (mensagens novas que não se encaixam) e re-treinar periodicamente.
Produção
Objetivo: servir adapters, versionar modelo+dados+config, quando re-treinar, o custo real, a segurança e a licença.
9.1 Servir
- Adapter separado: guardar o LoRA (MBs) e carregá-lo sobre o base na inferência. O vLLM serve múltiplos adapters sobre um base compartilhado → um adapter por cliente/tarefa com um só modelo na memória (multi-tenant barato).
- Merged: fundir o adapter no base gera um modelo completo — sem overhead de adapter na inferência, mas ocupa o tamanho inteiro e não dá para trocar em runtime. Bom quando é um modelo só e o throughput importa.
- Ver a apostila IA Local, On-Device & SLMs para o serving (vLLM, quantização, batching).
9.2 Versionar
- Reprodutibilidade: versione juntos o modelo base (nome + hash + quantização), o dataset (versão/hash), a config de treino (hiperparâmetros, seed), e o código. Sem isso, você não consegue re-treinar o "mesmo" modelo.
- Um model registry (MLflow, o registry do seu provedor, um bucket com metadados) — ver MLOps.
- Guardar o eval do modelo junto (os números que justificaram promovê-lo).
9.3 Quando re-treinar
- Drift: as entradas mudaram (novos tipos de ticket, novo jargão) e a qualidade caiu — monitorar em produção.
- Novos dados: acumulou correção humana suficiente para melhorar.
- Novo modelo base: saiu um base melhor; re-treinar o adapter sobre ele (e re-avaliar tudo). Este é o custo escondido do fine-tuning — você fica "preso" à sua pipeline de treino a cada evolução do ecossistema.
9.4 O custo real
Além da GPU do treino (relativamente barato para LoRA): coleta e curadoria de dados (o maior), anotação, construção e manutenção do eval, o tempo de engenharia a cada iteração, e o re-treino a cada troca de base. Compare honestamente com "prompt+RAG que a gente ajusta em minutos".
9.5 Segurança
- Guardrails: o fine-tune (sobretudo com dados não curados) pode remover proteções do base — re-teste segurança depois de todo treino (ver Segurança de Aplicações de IA — OWASP LLM Top 10).
- Vazamento de dados de treino: modelos podem regurgitar exemplos do treino literalmente — não afine com PII ou segredos que não podem sair na saída.
- Envenenamento de dados: se os dados de treino vêm de fonte não confiável (logs manipuláveis, contribuições externas), alguém pode plantar comportamento malicioso — valide a proveniência.
9.6 Licença
- A licença do modelo base permite fine-tune comercial? redistribuir o modelo afinado? (varia — ver IA Local & SLMs, Módulo 2).
- As saídas do modelo professor (na distillation) podem ser usadas para treinar? Alguns termos proíbem.
- Os dados de treino: você tem direito de uso para treinar (licença, consentimento)?
Perguntas: "Como você serve muitos modelos fine-tunados sem explodir a memória?" (adapters LoRA sobre um base compartilhado — vLLM multi-adapter), "O que versionar para reproduzir um fine-tune?" (base + dataset + config + código + seed, no registry, com o eval junto), "Qual o custo escondido do fine-tuning?" (curadoria de dados + eval + engenharia + re-treino a cada novo modelo base), "O fine-tune pode afetar a segurança?" (sim — pode remover guardrails; re-testar; risco de regurgitar dados de treino e de envenenamento).
✏️ Exercício 9 — Plano de operação
Sua empresa tem 5 clientes, cada um com um LoRA de estilo próprio sobre o mesmo modelo base de 8B. Descreva: como servir, como versionar, quando re-treinar, e 3 riscos de segurança/compliance com mitigação.
Gabarito (uma boa resposta): Servir: um vLLM com o base 8B (quantizado) e os 5 adapters LoRA carregados; roteamento por cliente escolhe o adapter; um adapter por cliente mantém a memória baixa (o base é compartilhado); fallback ao base puro se um adapter falha. Versionar: para cada adapter, um registro com {base (nome+hash+quantização), dataset do cliente (versão+hash), config de treino (hiperparâmetros+seed), commit do código, resultados do eval do cliente}. Promover um adapter novo só com o eval passando e um A/B. Re-treinar: por cliente, quando (a) drift detectado no monitoramento (qualidade caiu), (b) o cliente forneceu mais exemplos/correções, ou (c) trocamos o modelo base — aí re-treinar os 5 adapters sobre o novo base e re-avaliar todos antes de cortar. Riscos: (1) o LoRA de um cliente removeu guardrails → re-testar segurança (prompts de OWASP LLM) a cada treino, e manter um filtro de saída independente do modelo; (2) o adapter regurgita dados de treino de um cliente → não treinar com PII/segredos, testar com prompts de extração, e isolar por tenant; (3) dados de treino de um cliente vêm de logs manipuláveis → validar proveniência, revisar amostra, e ter o eval como rede. Compliance: cada cliente é um contexto isolado; contratos definindo o uso dos dados para treino.
Mercado de trabalho: roadmap, entrevistas e portfólio
Objetivo: converter o conteúdo dos módulos em contratação — onde a habilidade é usada, um plano de estudo, um banco de perguntas e projetos que geram entrevista.
10.1 Onde essa habilidade pesa
- ML engineer / applied AI: customizar modelos para tarefas de produto, distillation, avaliação.
- LLM engineer: a pipeline de fine-tune, o serving de adapters, a integração com o resto do sistema de IA.
- ML platform: a infra de treino, o registry, o serving multi-tenant, os custos.
- Research / applied research: métodos de tuning, alinhamento, avaliação.
- Setores: qualquer produto de IA sério que precise de comportamento consistente, custo controlado ou privacidade.
10.2 Roadmap de estudo (5–7 semanas)
| Semanas | Foco | Prática |
|---|---|---|
| 1 | A escada de customização e os tipos (Módulos 1–2) | Para 5 problemas reais, decidir prompt/RAG/fine-tune e justificar |
| 2 | Dados (Módulo 3) | Montar um dataset de SFT de ~200 exemplos para uma tarefa, com split limpo e verificações |
| 3 | LoRA/QLoRA (Módulo 4) | Rodar um QLoRA (Unsloth/Axolotl) num 7–8B; variar rank/LR/epochs e observar |
| 4 | Avaliação (Módulo 7) | Eval set próprio; comparar fine-tune vs base vs few-shot vs RAG; eval de regressão |
| 5 | DPO (Módulo 5) | Um dataset de preferência pequeno e um DPO sobre o SFT anterior; medir o efeito e a regressão |
| 6 | Distillation e serving (Módulos 8–9) | Destilar um SLM para uma tarefa; servir adapters multi-tenant no vLLM; relatório de custo/latência |
| 7 | Portfólio | Publicar os projetos com os números e o raciocínio de decisão |
10.3 Banco de perguntas (com a resposta que aprova)
Júnior/pleno — "Fine-tuning ou RAG?"
Fine-tune para "como" (formato, estilo, tom, uma tarefa estreita, consistência, reduzir o prompt); RAG para "o quê" (conhecimento, fatos que mudam). Fine-tuning não ensina fatos de forma confiável. E fine-tune vem por último — depois de esgotar prompt e few-shot, e só com dados bons.
Pleno — "O que é LoRA e por que se usa?"
Congela os pesos do modelo e treina, para cada matriz adaptada, um par de matrizes de baixo rank (ΔW = B·A) — ~1% dos parâmetros. Mais barato e rápido que full fine-tuning, o adapter tem poucos MB, dá para ter muitos e trocá-los, e servir vários sobre um base compartilhado. QLoRA carrega o base em 4-bit para afinar modelos grandes em pouca VRAM.
Pleno — "Quantos exemplos e o que importa neles?"
Para SFT/LoRA numa tarefa estreita, dezenas a poucos milhares; formato/estilo puro rende com 50–200. Qualidade > quantidade — exemplos impecáveis, formato consistente, diversidade cobrindo os casos reais e as bordas, balanceado, sem contaminação com o eval. Um exemplo errado ensina o erro.
Pleno — "SFT vs DPO?"
SFT treina em pares instrução→resposta boa (ensina o "faça assim"). DPO treina em pares chosen/rejected para o mesmo prompt (ensina o "não faça isso" e preferências sutis entre respostas plausíveis). DPO é o padrão prático de preference tuning — otimiza direto nos pares, sem o reward model e o RL do RLHF. Faz-se DPO depois de um SFT sólido.
Sénior — "Como você avalia um fine-tune de verdade?"
Eval set próprio (não benchmark), separado do treino, com checagem automática + LLM-as-judge. Comparar, no mesmo eval, o fine-tune contra o base, few-shot e RAG — para saber se ganhou de alternativas mais baratas. Rodar um eval de regressão (tarefas gerais, outro idioma, segurança) antes/depois para detectar catastrophic forgetting. E decidir "vale a pena" pelo ganho vs o custo total, incluindo re-treinar a cada novo modelo base.
Sénior — "Quando um SLM afinado bate um modelo de fronteira?"
Numa tarefa estreita e repetitiva (roteamento, classificação, extração, um estilo), com volume alto, requisito de latência ou de privacidade — o SLM afinado (via distillation de um modelo grande) foca e entrega qualidade próxima com uma fração do custo. Não ganha em tarefas abertas, raciocínio difícil ou contexto muito longo.
Sénior — "Riscos de segurança do fine-tuning?"
Pode remover guardrails do base (re-testar segurança após todo treino). O modelo pode regurgitar exemplos do treino literalmente (não afinar com PII/segredos). Envenenamento se os dados vêm de fonte não confiável. E questões de licença: o base permite fine-tune/redistribuição comercial? as saídas do professor podem ser usadas para treinar?
Armadilha — "Vamos fine-tunar para o modelo saber sobre a nossa empresa"
Fine-tuning não é um jeito confiável de injetar conhecimento — o modelo às vezes lembra, às vezes alucina por cima, e não atualiza quando os fatos mudam. Conhecimento é RAG. Fine-tune muda comportamento, formato e estilo. Confundir os dois é o erro nº 1.
10.4 Projetos de portfólio que geram entrevista
- LoRA com ganho medível (âncora): uma tarefa real, um QLoRA que bate o base e o prompt+few-shot+RAG no mesmo eval próprio, com o eval de regressão e o raciocínio de "valeu a pena".
- SLM destilado: um modelo pequeno destilado de um grande para uma tarefa (roteamento/extração/classificação), com relatório de accuracy, custo por 1k e latência vs o professor.
- DPO a partir de pares de preferência: mover um eixo de comportamento (concisão, honestidade), com a medição do efeito e da regressão.
- Estudo "fine-tune vs RAG vs prompt": a mesma tarefa pelas três vias, com números lado a lado e a recomendação.
- Serving multi-tenant: vários adapters sobre um base no vLLM, com o versionamento (base+dados+config) e as métricas de custo/latência.
10.5 Fontes para continuar
- Libs: a documentação do Hugging Face TRL e PEFT, do Axolotl, do Unsloth (e o blog deles, muito prático), do torchtune, do LLaMA-Factory, do MLX-LM.
- Papers: LoRA, QLoRA, DoRA; InstructGPT (RLHF), DPO, ORPO, KTO; estudos sobre catastrophic forgetting e "alignment tax".
- Guias: os cookbooks de fine-tuning da Hugging Face e dos provedores de modelo; materiais sobre "synthetic data" e "LLM-as-judge".
- Nesta trilha: IA Local, On-Device & Small Language Models, Engenharia de LLMs, IA Generativa & RAG, LLMOps & Avaliação de Sistemas de IA, MLOps: do Modelo à Produção, Design de Produtos com IA, Segurança de Aplicações de IA (OWASP LLM Top 10), Governança de IA, Ética & EU AI Act, Machine Learning e IA, Redes Neurais.
Cinco ideias sustentam a customização de modelos: (1) fine-tune para "como", RAG para "o quê" — e fine-tune vem por último, depois de prompt e few-shot; (2) os dados decidem tudo — dezenas a milhares de exemplos bons, sem contaminação, dos casos reais; logs de produção com correção humana são o ouro; (3) LoRA/QLoRA (PEFT) é o padrão — barato, adapters trocáveis, cabe numa GPU; (4) SFT ensina o "faça assim", DPO ensina o "não faça isso"; distillation dá a um SLM a qualidade de um grande numa tarefa; (5) avalie no seu eval contra base/few-shot/RAG, cheque regressão e segurança, e só mantenha o fine-tune se o ganho supera o custo de re-treinar a cada novo modelo base.