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.
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
11 min de leitura · 28 de outubro de 2026
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.
| Modelo | Treino (3 épocas, 279 respostas) | Pico de memória do treino | Uma decisão (mediana) |
|---|---|---|---|
| Qwen3.5 0,8B | 34 min | 4,1 GB | 0,68 s |
| Qwen3.5 2B | 62 min | 7,2 GB | 1,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ção | Erro (dos 12 errados, quantos achou) | Tom | |
|---|---|---|---|
| 0,8B antes do treino | 44,7% | 84,2% (0) | 40,0% |
| 0,8B treinado, sem os fatos da conta | 100% | 84,2% (0) | 68,6% |
| 0,8B treinado, com os fatos | 98,7% | 84,2% (0) | 60,0% |
| 2B treinado, com os fatos | 98,7% | 88,2% (3) | 71,4% |
| 0,8B treinado, com os fatos e exemplos a mais | 98,7% | 84,2% (0) | 62,9% |
| 9B sem treino, com os fatos | 96,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:
- A busca por nome continua decidindo se a conta foi citada. Acertou 348 de 348; um modelo ali só acrescenta custo.
- 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.
- 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.
- 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.
- 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.
- A confiança decide quem olha. Uma decisão com probabilidade baixa vai para uma pessoa, não para o relatório.
- 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.
