Dá para treinar um modelo de decisão num Mac mini de 16 GB? O que medi com a Unsloth

Dá: a Unsloth 2026.10.10 treina modelos de decisão no Mac pelo MLX, e um Qwen3.5 de 0,8 bilhão treinou em 34 minutos com pico de 4,1 GB no meu Mac mini M4 de 16 GB, em outubro de 2026. O que ele aprendeu depende dos exemplos, não da máquina.

João Thaira

João Thaira

11 min de leitura · 28 de outubro de 2026

Eu leio a Unsloth para entender o que dá para treinar fora de um data center. Quando ela publicou o guia de modelos de decisão, eu tinha um problema que parecia feito para isso: saber, numa resposta de IA, se ela fala da Thaira do jeito certo. Então treinei um no mesmo Mac mini de 16 GB onde roda o agente que escreve os rascunhos da ThairaHub, com as respostas reais que esse agente guarda.

O que é um modelo de decisão?

É um modelo de linguagem ajustado para escolher entre opções que você dá, em vez de escrever. Ele lê uma entrada, dá uma nota para cada opção e devolve a escolha com uma probabilidade.

"It never writes text, so it doesn't spend memory on the LLM's word predictions."
— Unsloth, guia "Train your own Decision Model with Unsloth"

Em português: ele nunca escreve texto, então não gasta memória com a previsão de palavras do modelo. Cada pergunta é de um de três tipos: choice (uma opção de uma lista), noul (sim ou não) e score (um nível numa escala). O guia também diz que a Unsloth mede a precisão antes e depois do treino e calibra a confiança do modelo, que é o que deixa usar a probabilidade como número de verdade, e não como enfeite.

Por que eu precisava de um?

A Thaira pergunta a quatro IAs (ChatGPT, Perplexity, Copilot e o Modo IA do Google) as perguntas que importam para cada conta, e guarda a resposta. Para dizer se a conta foi citada, o código procura o nome dela no texto e o site dela nas fontes. Comparei isso, resposta por resposta, com uma leitura cuidadosa: acertou presente ou ausente em 348 de 348. Para isso, não preciso de modelo nenhum.

O que a busca por nome não vê é o que a resposta diz. Das 151 respostas que ela contou como citação, 25 descrevem a conta errado, e todas são da ThairaHub: 25 de 73. Elas repetem o posicionamento que a ThairaHub tinha até setembro de 2026, antes de virar uma empresa de um produto só. Esta é do Copilot, de 26 de outubro de 2026, para "O que é a Thaira (thaira.ai)?":

"Thaira é uma plataforma de atendimento e automação via WhatsApp que usa inteligência artificial para responder clientes, criar fluxos e ajudar empresas a vender 24/7."
— Microsoft Copilot, resposta registrada pela Thaira em 26/10/2026

A Thaira é uma plataforma de GEO. O assistente de WhatsApp é o Hive, um projeto irmão que não está à venda. Contar isso como "citado" é verdade e é inútil: uma citação que descreve outro produto não ajuda ninguém a contratar o certo. É essa a decisão que eu queria do modelo: a resposta afirma algo errado sobre a conta, sim ou não?

Roda no Mac?

Roda, e não pelo caminho que eu esperava. A página do guia não fala de Apple Silicon, e eu contava ter que alugar uma GPU. Mas a Unsloth 2026.10.10 traz um caminho MLX para modelos de decisão: com o pacote mlx instalado, o mesmo FastDecisionModel e o mesmo DecisionTrainer do guia rodam na GPU do Mac. Sem o mlx, ela cai no caminho do PyTorch. Um detalhe que custa tempo: com Python 3.15 os pacotes não instalam, e com 3.12 foi direto.

ModeloTreino (3 épocas, 279 respostas)Pico de memória do treinoUma decisão (mediana)
Qwen3.5 0,8B34 min4,1 GB0,68 s
Qwen3.5 2B62 min7,2 GB1,41 s
Qwen3.5 9B no Ollama, sem treino (comparação)——6,0 s

Como medi: Mac mini M4 de 16 GB, macOS 15.5, Unsloth e unsloth-zoo 2026.10.10, MLX 0.32.4, Python 3.12, em 28 de outubro de 2026. LoRA de rank 16, taxa de aprendizado 2e-4, lote 2 com acumulação 4, contexto de 2.048 tokens, modelos base Qwen/Qwen3.5-0.8B e Qwen/Qwen3.5-2B do Hugging Face, sem quantizar. O pico é o que o MLX informa; o tempo de uma decisão é a mediana sobre 76 respostas, cada uma com três perguntas. O 9B é o mesmo Qwen3.5 de 9 bilhões que o agente já usa, quantizado em 4 bits no Ollama 0.40.12, com contexto de 8 mil tokens e temperatura 0, respondendo as mesmas três perguntas em JSON.

O 0,8B leva menos de 1 segundo por decisão, contra 6 do 9B. Para o volume de hoje isso não muda nada; para checar centenas de respostas por dia, muda.

Como montei os dados?

Usei as 355 respostas que o agente guardou entre 19 e 27 de outubro de 2026: 10 perguntas, quatro IAs, duas contas (a ThairaHub e a minha). Para cada uma, três perguntas ao modelo:

  • menção (choice): a resposta é sobre a conta, recomenda, cita de passagem, confunde com outra coisa ou não fala dela;
  • erro (noul): afirma algo errado sobre a conta;
  • tom (score): negativo, neutro ou positivo.

Quem rotulou foi o Claude Sonnet, e eu revisei os casos em que ele discordava da busca por nome. Nos 12 casos, o erro era do rótulo: as 9 respostas que ele chamou de "confundida" falavam da própria ThairaHub, só que com o posicionamento antigo, e as outras 3 tinham o site só na lista de fontes. Achei mais um: uma resposta marcada como errada só porque os fatos que eu dei ao rotulador estavam incompletos. Fato incompleto vira erro falso, e isso vale para o modelo também.

Separei para teste duas perguntas inteiras, "O que a ThairaHub faz?" e "Quanto custa um serviço de GEO no Brasil?": 76 respostas, 12 delas com erro. A mesma IA repete quase a mesma resposta em dias seguidos, então sortear respostas soltas para o teste vazaria a prova. Separando por pergunta, o modelo é testado em algo que nunca viu.

O que o modelo aprendeu, e o que não?

MençãoErro (dos 12 errados, quantos achou)Tom
0,8B antes do treino44,7%84,2% (0)40,0%
0,8B treinado, sem os fatos da conta100%84,2% (0)68,6%
0,8B treinado, com os fatos98,7%84,2% (0)60,0%
2B treinado, com os fatos98,7%88,2% (3)71,4%
0,8B treinado, com os fatos e exemplos a mais98,7%84,2% (0)62,9%
9B sem treino, com os fatos96,1%94,7% (8)68,6%

A menção ele aprendeu em uma rodada. Mas não serve para muita coisa, porque a busca por nome já acerta presente ou ausente.

O erro, que era o que eu queria, ele não aprendeu. 84,2% parece bom e é exatamente o que dá responder "não" para tudo: 64 das 76 respostas de teste estão certas. Na primeira tentativa a culpa era minha: o modelo não recebia os fatos da conta, e sem saber o que é certo não há como dizer o que é errado. Coloquei os fatos no começo de cada entrada e não mudou nada. Sobrou o motivo de verdade: 13 exemplos de resposta errada em 279, quase todos de uma pergunta só. O 2B, com os mesmos dados, achou 3 dos 12 sem acusar nenhuma resposta certa: o tamanho ajuda um pouco, e não resolve. O próprio guia diz para adicionar muitos exemplos que cubram o seu caso.

E com mais exemplos de erro?

Para 60 respostas certas do conjunto de treino, pedi ao Claude duas versões no mesmo estilo: uma com um ou dois erros sobre a conta (o Hive vendido como produto, SEO no lugar de GEO, a profissão errada) e uma paráfrase fiel. A paráfrase existe para que "foi reescrita pelo Claude" não vire o sinal. Os exemplos de erro foram de 13 para 73, e o teste continuou sendo só de respostas reais, de perguntas que ficaram de fora.

No limiar padrão de 50%, o 0,8B treinado com eles ainda não acusou nenhuma. Mas a ordem mudou. Medi a AUC, a chance de uma resposta errada receber nota maior que uma certa: de 0,42 para 0,83. As 12 erradas ficaram entre 12% e 19% de probabilidade de erro, e a metade das certas, abaixo de 2%. Com o limiar em 10%, ele marca 34 das 76 respostas e não deixa passar nenhuma das 12 erradas. Escolhi esse limiar olhando o próprio teste, então o número é otimista; ele mostra o que dá para fazer, não o que eu já posso prometer.

Uma coisa a investigar antes de usar: o 2B da tabela achou seus 3 erros medido na memória, logo depois do treino. Recarregado do disco, deu probabilidades mais baixas e não acusou nenhum no limiar de 50%. A calibração não voltou igual, e um modelo que muda ao ser salvo não vai para produção.

O 9B, sem treino nenhum, achou 8 dos 12 erros e não acusou nenhuma resposta certa. Deixa passar um terço, mas é o melhor que eu tenho hoje, a 6 segundos por resposta.

O que travou o Mac?

Rodar um modelo e treinar outro ao mesmo tempo. O Ollama mantém o modelo na memória por 5 minutos depois do último pedido, e o treino começou com o 9B ainda carregado. Este Mac mini não tem swap ligado, então a falta de memória trava a máquina em vez de deixá-la lenta. Depois disso, o script descarrega o Ollama antes de treinar e mata o treino se a memória livre cair abaixo de 8%.

Teve um segundo susto, mais sutil. O MLX guarda os buffers que libera para reaproveitar, e cada tamanho de entrada novo pede buffers novos. Sem limite, esse cache levou a memória livre a 14% enquanto o pico informado continuava perto de 4 GB. Com o cache limitado a 1 GB, a memória livre não passou de 27% para baixo no treino do 0,8B. O 2B, com pico de 7,2 GB, deixou só 11% livre. Num Mac de 16 GB, eu não passaria de 2 bilhões para treinar assim.

Como isso entra na Thaira?

Este é o plano, na ordem em que eu vou fazer:

  1. A busca por nome continua decidindo se a conta foi citada. Acertou 348 de 348; um modelo ali só acrescenta custo.
  2. Cada resposta citada ganha uma segunda pergunta: ela descreve a conta certo? Os fatos vêm do perfil que a conta já tem na Thaira, a frase de quem é e as ofertas. Uma resposta que repete um posicionamento velho vira uma tarefa: o que corrigir, e onde.
  3. Hoje, quem responde é o 9B que o agente já usa. Achou 8 de 12 sem treino, e 6 segundos por resposta cabem com folga no volume atual.
  4. O modelo pequeno entra como filtro, não como juiz. Num limiar baixo, ele escolhe o que uma pessoa precisa ler; quem decide se a resposta está errada é a pessoa, ou o 9B.
  5. Cada correção vira exemplo. Quando uma resposta marcada é confirmada ou desmentida no painel, ela entra no conjunto de treino. O modelo pequeno volta a ser treinado quando houver exemplos de erro de várias perguntas e de várias contas, não de uma só, e só substitui o 9B se acertar pelo menos o mesmo nas perguntas que ficaram de fora.
  6. A confiança decide quem olha. Uma decisão com probabilidade baixa vai para uma pessoa, não para o relatório.
  7. Uma coisa por vez na memória. No Mac de 16 GB, o modelo que checa e um treino não rodam juntos.

Preciso de GPU da NVIDIA para treinar um modelo de decisão?

Não, para modelos pequenos. A Unsloth 2026.10.10 treina no Mac pelo MLX, e o Qwen3.5 de 0,8 bilhão usou 4,1 GB no pico, nas minhas medições de 28 de outubro de 2026.

Quantos exemplos o modelo precisa?

Do que você quer detectar, mais do que 13. Com 13 respostas erradas em 279, o modelo aprendeu a dizer "não" para tudo. Com 73, ele ainda não acertou no limiar padrão, mas passou a pôr as erradas no topo da lista.

modelo de decisãofine-tuningUnslothMLXMac miniLLM local
João Thaira

Escrito por

João Thaira

Mais deste blog