Ajuste fino

Ajuste fino significa pegar um modelo existente e continuar treinando-o com seus próprios exemplos, para que seu comportamento padrão mude na direção que você deseja. Este capítulo apresenta uma visão prática do que isso muda, para o que é bom, e quando usá-lo em vez de um prompt ou recuperação.
O que o treinamento realmente faz
Para ver o que o ajuste fino muda, é útil saber de onde um modelo vem. Um modelo é construído em dois estágios amplos.
O primeiro é pré-treinamento: o modelo lê uma quantidade enorme de texto e aprende a prever o próximo token, repetidamente, até que gramática, fatos e padrões de raciocínio se consolidem como um efeito colateral. O que sai é um modelo base, fluente mas sem foco. Ele continuará seu texto de bom grado, mas não foi ensinado a ser um assistente útil que responde perguntas.
O segundo estágio é pós-treinamento: o modelo base é treinado ainda mais em exemplos curados de boas respostas, junto com feedback humano sobre quais respostas são melhores. Isso transforma um preditor de texto bruto no assistente que segue instruções com o qual você realmente interage. O modelo que você chama de uma API já passou pelos dois.
Ambos os estágios funcionam pelo mesmo mecanismo: mostre exemplos ao modelo e ajuste seus números internos, seus parâmetros ou pesos, para que suas previsões se aproximem desses exemplos. Treinamento é prática de previsão que deixa o modelo permanentemente alterado.
O que é ajuste fino
Ajuste fino é uma versão pequena e direcionada daquele segundo estágio, executada por você. Você pega um modelo que já está treinado e continua treinando-o em um conjunto de seus próprios exemplos, cada um uma entrada emparelhada com a saída que você deseja que ele produza. Após exemplos suficientes, os pesos do modelo mudam para que esse tipo de resposta se torne seu padrão, sem você pedir por isso no prompt toda vez.
A distinção real do prompting e RAG é onde a mudança vive. Prompting e RAG deixam o modelo congelado e o direcionam através do contexto que você fornece no momento da chamada. Ajuste fino muda o próprio modelo, então o novo comportamento está incorporado e aparece mesmo com um prompt curto. Você não está dando melhores instruções em tempo de execução; está enviando um modelo que já se inclina na direção que você quer.
Na prática, você fornece ao provedor um arquivo de conversas de exemplo, ele executa um trabalho de treinamento, e fornece um novo id do modelo. Você chama esse id exatamente como qualquer outro modelo, exceto que suas respostas agora refletem o que você treinou. Ajuste fino move comportamento para dentro do modelo, prompting e RAG direcionam um congelado.
Para o que é bom, e para o que não é
Ajuste fino ganha seu lugar quando você precisa de um comportamento consistente que um prompt tem dificuldade de fixar: um formato de saída preciso toda vez, um tom ou estilo de marca específico, ou uma tarefa estreita como classificação feita confiável em milhares de chamadas. Também pode tornar as chamadas mais baratas e rápidas, porque o comportamento que você teria que soletrar em um prompt longo está incorporado no modelo, então seus prompts ficam mais curtos.
Onde ele falha é no conhecimento. Ajuste fino é ruim em ensinar um modelo novos fatos, e pior em fatos que mudam. Exemplos de treinamento se misturam em padrões gerais em vez de serem armazenados como entradas exatas e consultáveis, então um modelo ajustado fino ainda inventa detalhes e ainda fica obsoleto no momento em que suas informações são atualizadas. Re-treinar toda vez que um preço ou política muda é lento e caro. Quando o problema é "o modelo não sabe X", a resposta é quase sempre RAG, não ajuste fino.
A regra de ouro: ajuste fino para mudar a forma, não para adicionar fatos. Ensine ao modelo como responder, e deixe a recuperação lidar com o que responder.
Prompt, RAG, ou ajuste fino?
Na maioria das vezes você não começa aqui. As três técnicas formam uma escada, mais barata e rápida de mudar primeiro:
- Prompting. Sempre tente isto primeiro. É instantâneo para iterar, custa nada extra, e um prompt claro com um casal de exemplos resolve mais do que as pessoas esperam. Se você não fez o prompt funcionar, você não está pronto para ajuste fino.
- RAG. Alcance isso quando a lacuna é conhecimento: o modelo precisa de fatos que não tem, ou que mudam com o tempo. RAG os fornece no tempo da pergunta sem tocar no modelo.
- Ajuste fino. Alcance isso quando a lacuna é comportamento em vez de conhecimento e prompting não consegue deixá-lo consistente o suficiente, ou quando seus prompts cresceram tanto que incorporar as instruções no modelo é mais barato e rápido em escala.
Eles não são exclusivos, e os sistemas mais fortes os combinam: ajuste fino um modelo para seu formato e tom, então use RAG para alimentá-lo com fatos atuais em tempo de execução. Comportamento do treinamento, conhecimento da recuperação.
Então um teste rápido antes de você ajustar fino. Você consegue chegar lá com um prompt melhor? Então faça isso. É a lacuna conhecimento faltando? Então é RAG.
Suba a escada; ajuste fino é o último degrau, não o primeiro. Apenas quando o prompt já está correto, os fatos já estão disponíveis, e o modelo ainda não se comportará consistentemente o suficiente é que o ajuste fino se torna a ferramenta que se encaixa.
Na prática
Dados de ajuste fino não são nada exótico. Cada exemplo é uma conversa curta na forma exata que você envia em tempo de execução, terminando com a resposta que você deseja que o modelo tivesse dado:
# Alguns mostrados aqui; um conjunto de dados real é centenas a milhares de exemplos,
# cobrindo a gama completa de entradas que você espera em tempo de execução.
training_examples = [
{"messages": [
{"role": "system", "content": "Classifique a urgência do ticket como baixa, média ou alta."},
{"role": "user", "content": "Fui cobrado duas vezes esta semana e preciso que seja corrigido hoje."},
{"role": "assistant", "content": "alta"},
]},
{"messages": [
{"role": "system", "content": "Classifique a urgência do ticket como baixa, média ou alta."},
{"role": "user", "content": "Existe uma configuração de modo escuro em algum lugar?"},
{"role": "assistant", "content": "baixa"},
]},
# ...
]Você salva estes em um arquivo, inicia um trabalho de treinamento com o provedor, e espera que termine. O que volta é um novo id de modelo, que você então chama exatamente como qualquer outro modelo:
# O modelo ajustado fino é outro id; tudo mais é inalterado.
response = client.chat.completions.create(
model="your-org/urgency-classifier-v1",
messages=[
{"role": "system", "content": "Classifique a urgência do ticket como baixa, média ou alta."},
{"role": "user", "content": "O botão de exportação não faz nada quando eu clico nele."},
],
)
# response.choices[0].message.content -> "baixa" (apenas o rótulo, o comportamento que você treinou)A vitória é que o comportamento agora vive no modelo. As instruções podem ser mais curtas, o formato se mantém em milhares de chamadas, e você não teve que crescer o prompt para chegar lá. O custo é tudo em volta: você precisa de um conjunto de dados de qualidade, uma execução de treinamento, e um trabalho fresco cada vez que você quer mudar o que aprendeu, que é exatamente por que isso senta no fundo da escada. Faça upload de exemplos, obtenha um id de modelo, chame-o como qualquer outro.
Esse é o último das formas de moldar o que um modelo sabe e como responde, todos os quais o deixam prevendo texto em uma mesa que você arranjou. Os próximos capítulos dão a ele a habilidade de agir: em Uso de ferramentas o modelo chama suas próprias funções, e depois as executa em um loop como um agente.

