Gemma 26B ajustada em um MacBook de 24 GB: assistente offline acerta 703 de 766 conversas
Um desenvolvedor passou meio ano construindo um assistente de voz para macOS que executa ações no computador: abre pastas, busca arquivos e lê e-mails. O modelo de linguagem roda localmente, sem nuvem. Ele ajustou o Gemma 4 26B A4B com QLoRA diretamente em um MacBook com 24 GB de memória unificada. O ponto central foi transferir as regras de um prompt de sistema de 5.000 tokens para os pesos de um adaptador LoRA. A versão v4b, com prompt curto, resolveu 703 das 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: cerca de 3 horas por passagem; exemplos de no máximo ~1400 tokens, senão o Metal estoura a memória - A passagem de reparo, com 416 exemplos problemáticos, levou 70 minutos e deu o melhor resultado - A busca em documentos usa o Spotlight, em 60–700 ms, sem base vetorial própria
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 assinaturas. O autor do projeto montou um assistente de voz para macOS que não conversa por conversar, mas age: abre pastas, busca arquivos, inicia filmes, lê e-mails. Para isso, ele ajustou o Gemma 4 26B A4B (MoE com ~4 bilhões de parâmetros ativos) com QLoRA via mlx-lm. As regras que antes ocupavam cerca de 5.000 tokens do prompt de sistema foram parar nos pesos de um pequeno adaptador LoRA. Em uma 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, não escreve texto
O aplicativo é feito em Electron, com processos separados rodando em torno da janela. A audição fica com um processo em Python, com detector de fala e Whisper em build MLX. O cérebro é o llama-server (llama.cpp), com o Gemma quantizado em 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 auxiliar em Swift. Um processo vigia reinicia o que cair, e a voz volta em cerca de 7 segundos.
A cada fala, o modelo devolve um único passo em um JSON 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 é entregue ao ChatGPT, ao Claude e ao 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 passagem de reparo
Antes de treinar o modelo, o autor montou uma bancada congelada: frases com passos de referência, nos 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 voz. Duas lições saíram caro. A checagem por falas isoladas descartava mais de 400 encadeamentos e pintava um quadro otimista demais, então é preciso comparar conversas inteiras. Exemplos criados a partir dos erros da bancada inflam a nota nela mesma, de modo que 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 de um 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, plantas, 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. "Coloque um filme" passou a tocar música, "ache um filme" perdeu o tipo de busca, e "minha pasta" se confundia com a pasta de notas. A passagem de reparo ajudou: 416 exemplos desses casos mais uma amostra aleatória de dados antigos e novos, cerca de 1100 no total. O treino complementar 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 do projeto inteiro. Já o treino do zero 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 aparece o erro Insufficient Memory. Treinar com o prompt completo no Mac é fisicamente impossível, mais um argumento a favor de levar 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 cada passagem leva cerca de três horas, por isso o modelo treina à noite.
Outros tropeços:
- O Mac dormiu. 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 levam o swap a 6–7 GB, e as falhas coincidiam com a validação a cada 200–400 passos. Solução: salvar checkpoints, retomar automaticamente com --resume-adapter-file e desativar a validação nas etapas finais.
- Editar um script bash em execução derrubou a cadeia com um syntax error, porque o bash lê o arquivo conforme executa.
- O Gemma 4 exigiu dois pequenos ajustes no mlx-lm, e a conversão do adaptador para GGUF precisa de um ambiente separado com torch.
Há bastante engenharia também em volta do modelo. O filme é abaixado não pelo nome do assistente, mas pelo início da fala: se a voz está 6 dB acima do "piso flutuante" e não é eco, o som baixa e, após 2,5 segundos sem o nome, volta. Um defeito da síntese, em que "сэр" vira "сёр" em aproximadamente um a cada três takes, é detectado por análise acústica.
A vogal é medida com análise LPC de 12ª ordem, comparando-se o segundo formante (cerca de 2000–2300 Hz para "э" e 750–900 Hz para "ё"). A verificação leva cerca de 3 ms, o detector encontra 39 falhas de 46, e a frase é ressintetizada com outro take. As perguntas sobre documentos ficam a cargo do Spotlight: busca em 60–700 ms, dois ou três melhores arquivos, janelas de ~600 caracteres e resposta apenas com base nelas.
As plantas DWG são interpretadas 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, 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 em cada requisição compensam ser levadas 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 learning rate reduzido. 24 GB bastam para um modelo MoE de 26B se você cortar o tamanho dos exemplos, salvar checkpoints e não deixar a máquina dormir. O próximo passo do autor é memória pessoal e autoaprendizado com as frases que o assistente não entendeu.
- 1 de nov. de 2026Modelos locais perdem para Opus e Codex: 0,21 ponto no MacBook contra 1,00 do Codex
- 1 de nov. de 2026Kimi marca 96,2% em teste de análise em base 1C e vira reserva caso o Claude seja bloqueado
- 1 de nov. de 2026OpenAI reescreve as regras de comportamento do GPT: cinco valores e uma cadeia de prioridades
- 1 de nov. de 2026Google admite que o AI Mode reduz a receita da Busca; ações caem 15%
Perguntas frequentes sobre a notícia
O que se sabe sobre O cérebro escolhe a ferramenta, não escreve texto?
O aplicativo é feito em Electron, com processos separados rodando em torno da janela. A audição fica com um processo em Python, com detector de fala e Whisper em build MLX. O cérebro é o llama-server (llama.cpp), com o Gemma quantizado em 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 auxiliar em Swift. Um processo vigia reinicia o que cair, e a voz volta em cerca de 7 segundos. A cada fala, o modelo devolve um único passo em um JSON fixo, co
O que se sabe sobre Bancada de 766 conversas e a passagem de reparo?
Antes de treinar o modelo, o autor montou uma bancada congelada: frases com passos de referência, nos 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 voz. Duas lições saíram caro. A checagem por falas isoladas descartava mais de 400 encadeamentos e pintava um quadro otimista demais, então é preciso comparar conversas inteiras. Exemplos criados a partir dos erros da bancada inflam a nota nela mesma, de modo que uma avaliação honesta exige um conjunto nov
O que quebrou no notebook?
O limite do Metal dita o tamanho do exemplo: no máximo ~1400 tokens, senão aparece o erro Insufficient Memory. Treinar com o prompt completo no Mac é fisicamente impossível, mais um argumento a favor de levar 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 cada passagem leva cerca de três horas, por isso o modelo treina à noite. Outros tropeços: O Mac dormiu. 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 ún
Test Frontier LLMs & Autonomous Agents in One Workspace
Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.
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.