Gemma 26B ajustado em MacBook de 24 GB: assistente offline acerta 703 de 766
Há seis meses, um desenvolvedor constrói um assistente de voz para macOS que executa ações no computador: abre pastas, procura arquivos, lê e-mails. O modelo de linguagem roda localmente, sem nuvem. Ele fez o fine-tuning do Gemma 4 26B A4B com QLoRA diretamente em um MacBook com 24 GB de memória unificada. O ponto central foi transferir as regras do prompt de sistema, de 5 000 tokens, para os pesos de um adaptador LoRA. A versão v4b, com prompt curto, resolveu 703 de 766 conversas de teste, com mediana de 1,64 s. O Gemma base com prompt longo respondia em 1,94 s e acertava 89% dos passos. • Treino: ~3 horas por passada, com exemplos de no máximo ~1400 tokens; acima disso, o Metal falha por falta de memória • A passada de reparo em 416 exemplos problemáticos levou 70 minutos e deu o melhor resultado • A busca em documentos usa o Spotlight, em 60–700 ms, sem banco vetorial próprio
Processado por IA de Habr AI; editado por Hamidun News
Seis meses de trabalho, um MacBook com 24 GB de memória unificada e uma condição rígida: nada de nuvem nem de assinaturas. O autor do projeto montou um assistente de voz para macOS que não conversa por conversar, mas age: abre pastas, procura arquivos, abre filmes, lê e-mails. Para isso, ele fez o fine-tuning do Gemma 4 26B A4B (MoE com ~4 bilhões de parâmetros ativos) usando QLoRA via mlx-lm. As regras que antes ocupavam cerca de 5 000 tokens do prompt de sistema passaram para os pesos de um pequeno adaptador LoRA. Na bancada congelada de 766 conversas, a versão v4b, com prompt curto, resolveu 703, e a mediana de resposta foi de 1,64 segundo.
O cérebro escolhe a ferramenta, em vez de escrever texto
O aplicativo é escrito em Electron, com processos separados em torno da janela. A audição fica com um processo Python que reúne detector de fala e Whisper em build MLX. O cérebro é o llama-server (llama.cpp), com o Gemma em quantização de 4 bits e o LoRA em formato GGUF. A voz é sintetizada pelo Qwen-TTS a partir de uma gravação de referência. Os recursos de sistema do macOS (som, microfone, eco) ficam a cargo de um assistente em Swift. Um processo supervisor reinicia qualquer componente que caia, e a voz volta em cerca de 7 segundos.
A cada fala, o modelo devolve um único passo em um JSON de formato fixo, com os campos think, tool, args, say e next. A janela executa a ferramenta e, se necessário, devolve o resultado ao modelo. Qualquer alteração ou exclusão de arquivos exige confirmação por voz. O mesmo formato é devolvido por ChatGPT, Claude e Gemini, caso o usuário os conecte: as ferramentas são repassadas a eles por chamadas de função nativas. Nesse caso, o llama-server local é desligado e libera cerca de 13 GB.
Bancada de 766 conversas e a passada de reparo
Antes de treinar o modelo, o autor montou uma bancada de testes congelada: frases com passos de referência, nas quais ele nunca treina. Ela inclui comandos para pastas, busca de filmes, e-mail, perguntas sobre documentos, encadeamentos de falas, recusas e erros de reconhecimento de fala. Duas lições saíram caro. A verificação por falas isoladas descartava mais de 400 encadeamentos e pintava um quadro róseo demais, por isso é preciso comparar conversas inteiras. Exemplos montados a partir dos erros da bancada inflam a nota nela mesma, então uma avaliação honesta exige um conjunto novo.
Evolução das versões (a bancada cresceu de 533 para 766 conversas, então a comparação direta só vale dentro do mesmo tamanho):
- Sem adaptador, prompt completo: 475 de 533 (89%), mediana de 1,94 s
- v3, prompt completo: 487 de 533 (91%), mediana de 1,63 s
- v4 com novas seções (documentos, desenhos técnicos, inglês, encadeamentos): 684 de 766
- v4b, prompt curto: 703 de 766, mediana de 1,64 s
Na v4, o modelo melhorou nas seções novas, mas piorou nas antigas. «Включи фильм» passou a abrir música, «найди фильм» perdeu o tipo de busca, e «свою папку» era confundida com a pasta de notas. O que ajudou foi a passada de reparo: 416 exemplos desses casos, mais uma amostra aleatória de dados antigos e novos, cerca de 1100 no total. O treino adicional durou mais ~1000 passos, com learning rate de 1,5e-5 em vez de 3e-5 e sem validação. Levou cerca de 70 minutos e deu o melhor resultado de todo o projeto. Já treinar do zero, ao contrário, fazia o modelo esquecer o que sabia.
O que quebrou no notebook
O limite do Metal dita o tamanho do exemplo: no máximo ~1400 tokens, senão ocorre o erro Insufficient Memory. Treinar com o prompt completo no Mac é fisicamente impossível, e esse é mais um argumento a favor de transferir as regras para os pesos. O script descarta de antemão os exemplos que não cabem. A velocidade é de 0,25–0,4 passo por segundo, e uma passada leva cerca de três horas, por isso o modelo treina à noite.
Outros tropeços:
- O Mac entrava em repouso. Depois de um treino, a verificação na bancada levou seis horas. Agora toda a cadeia (treino, conversão para GGUF, bancada) roda sob um único caffeinate -i -s.
- Falhas de memória. O navegador e a indexação do Spotlight elevam o swap a 6–7 GB, e as falhas coincidiam com a validação a cada 200–400 passos. A solução foi salvar checkpoints, retomar automaticamente com --resume-adapter-file e desativar a validação nas etapas finais.
- Editar um script bash com ele em execução derrubou a cadeia com um syntax error, porque o bash lê o arquivo à medida que executa.
- O Gemma 4 exigiu duas pequenas correções no mlx-lm, e a conversão do adaptador para GGUF precisa de um ambiente separado com torch.
Há bastante engenharia também em torno do modelo. O filme é abafado não pelo nome do assistente, mas pelo início da fala: se a voz estiver 6 dB acima do «piso flutuante» e não for eco, o som é reduzido, e volta após 2,5 segundos sem o nome. Um defeito da síntese, em que «сэр» vira «сёр» em cerca de uma a cada três tomadas, é detectado pela acústica.
A vogal é medida por análise LPC de 12ª ordem, e a segunda formante é comparada (em torno de 2000–2300 Hz para «э» e 750–900 Hz para «ё»). A verificação leva cerca de 3 ms, o detector encontra 39 falhas em 46, e a frase é sintetizada de novo com outra tomada. As perguntas sobre documentos ficam com o Spotlight: busca em 60–700 ms, os dois ou três melhores arquivos, janelas de ~600 caracteres e resposta apenas a partir delas.
Os desenhos DWG são processados pelo LibreDWG em WebAssembly, em uma thread separada, e o resultado é convertido em SVG e armazenado em cache.
Receita para o seu projeto
Se você está construindo um agente local, comece pela bancada de testes, não pelo treino. Congele um conjunto de conversas e compare as versões apenas nele; para a avaliação final, mantenha uma amostra nova, que nem o modelo nem você tenham visto.
Regras que arrastam milhares de tokens de prompt a cada requisição compensam ser transferidas para o LoRA: precisão e latência melhoram ao mesmo tempo. Adicione novas habilidades sobre o adaptador anterior, com uma mistura de dados antigos e novos e um learning rate reduzido. 24 GB bastam para um modelo MoE de 26B se você limitar o tamanho dos exemplos, salvar checkpoints e não deixar a máquina entrar em repouso. O próximo passo do autor é memória pessoal e autoaprendizado com as frases que o assistente não entendeu.
- 28 de out. de 202612 ferramentas de pentest contra o Juice Shop: o melhor agente de IA achou 5 falhas de 116
- 28 de out. de 2026OpenAI lança GPT-6.1 Terra: metade do preço e quase no nível dos modelos de ponta
- 28 de out. de 2026OpenAI lança GPT-6.1 Terra: token a $1 e três vezes mais rápido que o Astra
- 28 de out. de 2026Anthropic entra com S-1: US$ 11,6 bilhões de receita no trimestre e compromissos de US$ 780 bilhões
Perguntas frequentes sobre a notícia
O que se sabe sobre O cérebro escolhe a ferramenta, em vez de escrever texto?
O aplicativo é escrito em Electron, com processos separados em torno da janela. A audição fica com um processo Python que reúne detector de fala e Whisper em build MLX. O cérebro é o llama-server (llama.cpp), com o Gemma em quantização de 4 bits e o LoRA em formato GGUF. A voz é sintetizada pelo Qwen-TTS a partir de uma gravação de referência. Os recursos de sistema do macOS (som, microfone, eco) ficam a cargo de um assistente em Swift. Um processo supervisor reinicia qualquer componente que caia, e a voz volta em cerca de 7 segundos. A cada fala, o modelo devolve um único
O que se sabe sobre Bancada de 766 conversas e a passada de reparo?
Antes de treinar o modelo, o autor montou uma bancada de testes congelada: frases com passos de referência, nas quais ele nunca treina. Ela inclui comandos para pastas, busca de filmes, e-mail, perguntas sobre documentos, encadeamentos de falas, recusas e erros de reconhecimento de fala. Duas lições saíram caro. A verificação por falas isoladas descartava mais de 400 encadeamentos e pintava um quadro róseo demais, por isso é preciso comparar conversas inteiras. Exemplos montados a partir dos erros da bancada inflam a nota nela mesma, então uma avaliação honesta exige um con
O que quebrou no notebook?
O limite do Metal dita o tamanho do exemplo: no máximo ~1400 tokens, senão ocorre o erro Insufficient Memory. Treinar com o prompt completo no Mac é fisicamente impossível, e esse é mais um argumento a favor de transferir as regras para os pesos. O script descarta de antemão os exemplos que não cabem. A velocidade é de 0,25–0,4 passo por segundo, e uma passada leva cerca de três horas, por isso o modelo treina à noite. Outros tropeços: O Mac entrava em repouso. Depois de um treino, a verificação na bancada levou seis horas. Agora toda a cadeia (treino, conversão para GGUF,
Build & Ship Production AI Agents Without Boilerplate Code
Start your free 72-hour trial at Hamidun Academy (academy.hamidun.com) — interactive lessons on Claude Code & Cursor, live Tech Radar, and production agent templates.
O essencial da IA — uma vez por semana
Sete histórias que realmente importaram, escolhidas a dedo. Sem ruído nem releases.
Pronto! Verifique seu e-mail para a confirmação.