Gemma 26B ajustada en un MacBook de 24 GB: el asistente sin conexión acierta 703 de 766 conversaciones

Un desarrollador lleva medio año construyendo un asistente de voz para macOS que ejecuta acciones en el ordenador: abre carpetas, busca archivos y lee el correo. El modelo de lenguaje funciona en local, sin nube. Ajustó Gemma 4 26B A4B con el método QLoRA directamente en un MacBook con 24 GB de memoria unificada. La clave fue trasladar las reglas de un prompt de sistema de 5.000 tokens a los pesos de un adaptador LoRA. La versión v4b, con un prompt corto, resolvió 703 de 766 conversaciones de prueba con una mediana de 1,64 s. La Gemma base con el prompt largo respondía en 1,94 s y acertaba el 89 % de los pasos. - Entrenamiento: unas 3 horas por pasada; ejemplos de no más de ~1400 tokens, o Metal se queda sin memoria - Una pasada de reparación con 416 ejemplos problemáticos duró 70 minutos y dio el mejor resultado - La búsqueda en documentos pasa por Spotlight en 60–700 ms, sin base de datos vectorial propia

Procesado por IA desde Habr AI; editado por Hamidun News
Gemma 26B ajustada en un MacBook de 24 GB: el asistente sin conexión acierta 703 de 766 conversaciones
Fuente: Habr AI. Collage: Hamidun News.
Escuchar artículo
Ficha técnica y cifras clave
ParámetroDatos
Fuente originalHabr AI ↗
Editor jefe
Entrenamientounas 3 horas por pasada; ejemplos de no más de ~1400 tokens, o Metal se queda sin memoria
Dato clave #2Una pasada de reparación con 416 ejemplos problemáticos duró 70 minutos y dio el mejor resultado
Dato clave #3La búsqueda en documentos pasa por Spotlight en 60–700 ms, sin base de datos vectorial propia

Seis meses de trabajo, un MacBook con 24 GB de memoria unificada y una condición estricta: nada de nube ni suscripciones. El autor del proyecto construyó un asistente de voz para macOS que no charla, sino que actúa: abre carpetas, busca archivos, lanza películas y lee el correo. Para ello ajustó Gemma 4 26B A4B (un MoE con ~4000 millones de parámetros activos) con el método QLoRA a través de mlx-lm. Las reglas que antes ocupaban unos 5.000 tokens de prompt de sistema pasaron a los pesos de un pequeño adaptador LoRA. En un banco de pruebas congelado de 766 conversaciones, la versión v4b con prompt corto resolvió 703, y la mediana de respuesta fue de 1,64 segundos.

El cerebro elige una herramienta en lugar de escribir texto

La aplicación está escrita en Electron, con procesos independientes alrededor de la ventana. Del oído se encarga Python, con un detector de voz y Whisper compilado para MLX. El cerebro es llama-server (llama.cpp) con Gemma cuantizada a 4 bits y una LoRA en formato GGUF. La voz la sintetiza Qwen-TTS a partir de una grabación de referencia. Un asistente en Swift cubre lo propio de macOS (sonido, micrófono, eco). Si un proceso se cae, un vigilante lo reinicia, y la voz vuelve en unos 7 segundos.

Por cada intervención, el modelo devuelve un paso en un JSON fijo con los campos think, tool, args, say y next. La ventana ejecuta la herramienta y, si hace falta, devuelve el resultado al modelo. Cualquier cambio o borrado de archivos exige confirmación por voz. ChatGPT, Claude y Gemini devuelven el mismo formato si el usuario los conecta: las herramientas se les pasan como llamadas nativas a funciones. Entonces el llama-server local se apaga y libera unos 13 GB.

Un banco de 766 conversaciones y la pasada de reparación

Antes de entrenar el modelo, el autor montó un banco de pruebas congelado: frases con pasos de referencia con las que nunca entrena. Incluye órdenes sobre carpetas, búsqueda de películas, correo, preguntas sobre documentos, cadenas de turnos, rechazos y errores de reconocimiento de voz. Dos lecciones salieron caras. Evaluar réplicas sueltas descartaba más de 400 cadenas y daba un panorama demasiado optimista, así que hay que comparar conversaciones completas. Los ejemplos construidos a partir de los errores del banco inflan la puntuación en ese mismo banco, por lo que una comprobación honesta necesita un conjunto nuevo.

Evolución de las versiones (el banco creció de 533 a 766 conversaciones, así que la comparación directa solo es válida dentro del mismo tamaño):

  • Sin 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 con secciones nuevas (documentos, planos, inglés, cadenas): 684 de 766
  • v4b, prompt corto: 703 de 766, mediana de 1,64 s

En v4 el modelo mejoró en las secciones nuevas, pero empeoró en las antiguas. «Pon una película» empezó a lanzar música, «busca una película» perdió el tipo de búsqueda y «mi carpeta» se confundía con la carpeta de notas. Ayudó una pasada de reparación: 416 ejemplos sobre esos casos más una muestra aleatoria de datos antiguos y nuevos, unos 1100 en total. El reentrenamiento duró otros ~1000 pasos con una tasa de aprendizaje de 1,5e-5 en lugar de 3e-5 y sin validación. Tardó unos 70 minutos y dio el mejor resultado de todo el proyecto. En cambio, entrenar desde cero hacía que el modelo olvidara lo anterior.

Qué fallaba en el portátil

El límite de Metal dicta la longitud del ejemplo: no más de ~1400 tokens, o salta Insufficient Memory. Entrenar con el prompt completo en un Mac es físicamente imposible, otro argumento a favor de trasladar las reglas a los pesos. El script descarta de antemano los ejemplos que no caben. La velocidad es de 0,25–0,4 pasos por segundo y una pasada tarda unas tres horas, así que el modelo se entrena de noche.

Otros tropiezos:

  • El Mac se dormía. Tras un entrenamiento, la comprobación en el banco tardó seis horas. Ahora toda la cadena (entrenamiento, conversión a GGUF, banco) se ejecuta bajo un único caffeinate -i -s.
  • Fallos de memoria. El navegador y la indexación de Spotlight disparan el swap hasta 6–7 GB, y los fallos coincidían con la validación cada 200–400 pasos. Solución: guardar puntos de control, reanudar automáticamente con --resume-adapter-file y desactivar la validación en las etapas finales.
  • Editar un script de bash sobre la marcha tumbó la cadena con un syntax error, porque bash lee el archivo a medida que lo ejecuta.
  • Gemma 4 requirió dos pequeños parches en mlx-lm, y para convertir el adaptador a GGUF hace falta un entorno aparte con torch.

Alrededor del modelo también hay bastante ingeniería. La película se atenúa no por el nombre del asistente, sino por el inicio del habla: si la voz supera en 6 dB al «suelo flotante» y no es eco, el sonido baja, y a los 2,5 segundos sin el nombre vuelve. Un defecto de síntesis, por el que «sir» se convierte en otra vocal aproximadamente en una de cada tres tomas, se detecta con acústica.

La vocal se mide con análisis LPC de orden 12 y se compara el segundo formante (en torno a 2000–2300 Hz en la vocal correcta y 750–900 Hz en la defectuosa). La comprobación tarda unos 3 ms, el detector encuentra 39 de 46 fallos y la frase se resintetiza con otra toma. Las preguntas sobre documentos las resuelve Spotlight: búsqueda en 60–700 ms, los dos o tres mejores archivos, ventanas de ~600 caracteres y una respuesta basada solo en ellas.

Los planos DWG los analiza LibreDWG en WebAssembly en un hilo aparte, y el resultado se convierte en SVG y se guarda en caché.

Una receta para tu propio proyecto

Si construyes un agente local, empieza por el banco de pruebas, no por el entrenamiento. Congela un conjunto de conversaciones y compara las versiones solo con él; para la evaluación final, reserva una muestra nueva que no hayan visto ni el modelo ni tú.

Las reglas que arrastran miles de tokens de prompt en cada petición compensa trasladarlas a una LoRA: la precisión y la latencia mejoran a la vez. Añade habilidades nuevas sobre el adaptador anterior con una mezcla de datos antiguos y nuevos y una tasa de aprendizaje reducida. 24 GB bastan para un modelo MoE de 26B si recortas la longitud de los ejemplos, guardas puntos de control y evitas que la máquina se duerma. El siguiente paso del autor es una memoria personal y el autoaprendizaje a partir de las frases que el asistente no entendió.

Historia

Preguntas frecuentes sobre la noticia

¿Qué se sabe sobre El cerebro elige una herramienta en lugar de escribir texto?

La aplicación está escrita en Electron, con procesos independientes alrededor de la ventana. Del oído se encarga Python, con un detector de voz y Whisper compilado para MLX. El cerebro es llama-server (llama.cpp) con Gemma cuantizada a 4 bits y una LoRA en formato GGUF. La voz la sintetiza Qwen-TTS a partir de una grabación de referencia. Un asistente en Swift cubre lo propio de macOS (sonido, micrófono, eco). Si un proceso se cae, un vigilante lo reinicia, y la voz vuelve en unos 7 segundos. Por cada intervención, el modelo devuelve un paso en un JSON fijo con los campos t

¿Qué se sabe sobre Un banco de 766 conversaciones y la pasada de reparación?

Antes de entrenar el modelo, el autor montó un banco de pruebas congelado: frases con pasos de referencia con las que nunca entrena. Incluye órdenes sobre carpetas, búsqueda de películas, correo, preguntas sobre documentos, cadenas de turnos, rechazos y errores de reconocimiento de voz. Dos lecciones salieron caras. Evaluar réplicas sueltas descartaba más de 400 cadenas y daba un panorama demasiado optimista, así que hay que comparar conversaciones completas. Los ejemplos construidos a partir de los errores del banco inflan la puntuación en ese mismo banco, por lo que una c

¿Qué se sabe sobre Qué fallaba en el portátil?

El límite de Metal dicta la longitud del ejemplo: no más de ~1400 tokens, o salta Insufficient Memory. Entrenar con el prompt completo en un Mac es físicamente imposible, otro argumento a favor de trasladar las reglas a los pesos. El script descarta de antemano los ejemplos que no caben. La velocidad es de 0,25–0,4 pasos por segundo y una pasada tarda unas tres horas, así que el modelo se entrena de noche. Otros tropiezos: El Mac se dormía. Tras un entrenamiento, la comprobación en el banco tardó seis horas. Ahora toda la cadena (entrenamiento, conversión a GGUF, banco) se

ZK
Zhemal Khamidun — CPO de Alpina Digital, product manager de AlpinaGPT. Crea productos de IA desde 2019. Hamidun News es un proyecto personal que creció hasta ser un agregador en producción con más de 6.000 lectores.
✦ Unified AI Workspace · Nomad

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.

Try Nomad AI →Launch Nomad Agent
¿Qué te parece?
Cargando comentarios…