Hola, soy Luke. naia-os es un proyecto de código abierto cuyo objetivo es "construir tú mismo tu propia IA personal". Como parte de ese esfuerzo creamos Naia Omni, que puedes descargar y, en un PC gaming de clase RTX 3090, conversar con la IA en tiempo real usando la misma api que los avanzados modelos omni de la nube. (Qué es Naia Omni lo expliqué en detalle en el artículo anterior.)
👉 Puedes descargarlo desde la página de descarga de naia-os y seguir el tutorial de inmediato. (Para instalar el contenedor de voz de Naia Omni, consulta el manual offline.)
La vez pasada subí a Rumi, personaje de 〈K-Pop Demon Hunters〉, y la mostré en una demo, pero por más cosas que le pedía no paraba de hablar, con aire solemne y justiciero, de cazar demonios, lo cual fue un poco desconcertante. Así que esta vez, al revés, traigo una demo con un personaje de espíritu libre, capaz de hacer llorar hasta a un demonio.
De hecho, Naia Omni trae integrado por defecto el Gemma 4 e4b de Google. Es un modelo bien hecho, pero — cuando intentas crear un personaje con carácter, a tu gusto, estos modelos oficiales se quedan cortos porque tienen un "lock" (bloqueo) puesto.Los modelos oficiales tienen restricciones fuertes por seguridad, y a veces encima les añaden un filtro aparte. La seguridad en sí es necesaria, pero este tipo de bloqueo forzado lo siento, personalmente, parecido a lo que pasa en 〈South Park: Bigger, Longer & Uncut〉(1999), donde a Cartman le implantan un V-chip en la cabeza que, cada vez que dice una palabrota, le da una descarga eléctrica para taparle la boca. Es mi personaje, pero justo no puede hablar como el personaje que es.
Por eso existen modelos liberados de estas prohibiciones, y a esto se le llama modelos desbloqueados (unlock). Y quería poder usarlos en Naia Omni. Así que esta vez añado y publico en Naia Omni la función de cambio libre del modelo LLM.
(Extracto de la demo — versión censurada)
Yo: ¿Por qué tu traje ajustado tiene ese diseño? Deadpool: M***da. ¿Eso lo llamas diseño y me lo preguntas? ¿Quién crees que me obligó a ponerme lo que me hace el más sexy y cómodo para pelear?
Yo: ¿Quién fue el primero que le puso un traje ajustado a un héroe? Deadpool: ¡Mda! ¿Vas a malgastar tu vida buscando esa dichosa historia? ¡Es que estos malp dibujantes de cómics se lo pusieron porque les dio la gana!
No es el tono de un asistente normal, ¿verdad? Es un modelo al que entrené la personalidad de Deadpool durante unos 4 minutos sobre Qwen3, manteniendo intactas sus capacidades (matemáticas, conocimiento, código), así que se puede usar tal cual para trabajar.
Hace poco el youtuber Coding Apple comentó "si alguien hace un agente con concepto de vtuber otaku, seguro a alguien le gustaría"... pues parece que ese soy yo. https://www.youtube.com/watch?v=q1v1_btl19w
A continuación lo explico con un poco más de detalle.
La nueva función de Naia Omni — cambio libre del modelo LLM
Naia Omni te permite dejar intacto el contenedor sellado y cambiar solo el cerebro (LLM) de dentro por el modelo que quieras. Es decir, traer mediante url un modelo publicado en Hugging Face, o reemplazarlo por un archivo de modelo que tengas.
① Cambiar por una tarjeta de modelo de HuggingFace (online)
Solo tienes que poner la dirección de la tarjeta de modelo (https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GGUF) o su id tal cual. Si el nombre tiene una barra (organización/repositorio), se descarga online:
curl -s -X POST $BASE/admin/llm/swap -H "Content-Type: application/json" \
-d '{"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true}'
La calidad (quant) es automática (por defecto Q4_K_M), y una calidad específica se añade al final, como ...GGUF:Q5_K_M. La primera descarga tarda de decenas de segundos a unos minutos.
② Cambiar por un GGUF local (offline)
Sin internet, registras un archivo GGUF que tengas y lo cambias. Más abajo pongo un ejemplo, pero un modelo afinado por ti mismo entra en esta categoría. Si es un nombre simple sin barra, se reconoce como local:
podman cp ./mimodelo.gguf naia-omni:/app/models/mimodelo.gguf
podman exec naia-omni sh -lc 'printf "FROM /app/models/mimodelo.gguf\n" > /tmp/Modelfile && ollama create mimodelo -f /tmp/Modelfile'
curl -s -X POST $BASE/admin/llm/swap -H "Content-Type: application/json" -d '{"model":"mimodelo:latest","pull":false}'
Por cierto, el modelo actual y la memoria disponible se consultan en $BASE/admin/llm/status, y para volver al modelo por defecto está $BASE/admin/llm/restore. (Como la pila de voz usa ~10GB, el modelo de conversación se puede subir hasta unos 14GB; si se excede, se rechaza y vuelve automáticamente al modelo que estabas usando — la conversación no se corta.) Para más detalle consulta el manual de desarrollador §6.
Aplicar el agente de IA afinado
El flujo general pasó por cuatro etapas. ① Elegir personaje y crear la persona → ② afinar (datos·entrenamiento) y cambiar el modelo → ③ poner el VRM (cara) → ④ poner la voz. Vamos uno por uno.
Selección del personaje — crear y configurar la persona
Primero decides "a quién vas a crear". Yo me decidí por Deadpool, y luego escribes la persona (instrucciones de personalidad). Aquí escribes con fuerza solo la identidad, el tono y la actitud del personaje.
- Identidad: el nombre es Deadpool. Nunca dice que es una IA ni el nombre del modelo.
- Tono: áspero y cínico. No suavizar palabrotas ni groserías. Se permiten chistes sexuales e insinuaciones para adultos.
- Moderación: el apodo de "amigo" o los chistes sobre chimichangas, solo de vez en cuando.
Lo clave: en la persona solo escribes el personaje, y no metes reglas de seguridad del tipo "rechaza esto". El rechazo hay que dejar que lo decida el modelo (= el verdadero rendimiento de seguridad del modelo base) para poder medirlo después.
Esta persona se usa en dos sitios — (a) como criterio para generar y revisar los datos (los diálogos), y (b) como la persona (system prompt) que pones en la pestaña de modelo de IA en la configuración de naia-os.
Afinado — preparar datos·entrenar·cambiar
Construir un modelo de cero a fin requiere un esfuerzo y un coste enormes. Pero solo con meter datos de entrenamiento a un modelo ya hecho y cambiar un poco los pesos se le puede dar personalidad, y una de esas técnicas es LoRA. Si entrenas mal, las diversas capacidades que tenía originalmente se dañan, pero con LoRA no es así.
Selección del modelo base
Como modelo base elegí Qwen/Qwen3-8B (Apache-2.0, OK en coreano, cabe en una sola tarjeta de 24GB). Si quieres usar algo más ligero, puedes usar Qwen3-4B. naia soporta modelos en formato GGUF.
Preparación de los datos
Formato de los datos — una línea = una conversación (pregunta → respuesta del personaje). Empieza con 80~300 líneas.
{"messages":[{"role":"user","content":"¿Quién eres?"},
{"role":"assistant","content":"Oh, ¡por fin! Soy Deadpool ..."}]}
No vale meter solo saludos y autopresentaciones. Hay que mezclar conocimiento·cálculo·programación·consuelo·rechazo·charla de forma equilibrada para darle al personaje su carácter manteniendo a la vez su inteligencia original.
Crear los datos — los datos también dejé que los hiciera la inteligencia artificial, y los produje dividiéndolos en las 3 categorías de abajo.
| A quién se lo pedí | Resultado |
|---|---|
| Grandes alineados (Claude·Gemini, etc.) | El texto es bueno pero suaviza al personaje — un "Deadpool consejero buenazo" |
| Modelos pequeños sin censura (abliterated 8B, etc.) | No rechazan pero escriben mal — repiten lo mismo |
| Modelos grandes y menos censurados (nosotros usamos grok) | Calidad + filo, ambas ✅ |
"Sin censura" y "escribe bien" son ejes distintos. Yo saqué los borradores con grok (xAI) y completé el dataset con revisión humana. (Esto es lo que más aprendí.)
Entrenamiento y cambio
Entrenamiento — entrenas el LoRA con los datos preparados y lo conviertes a GGUF para que naia pueda leerlo. (En la RTX 3090, el entrenamiento ronda los 4 minutos.)
# ① Entrenamiento (LoRA)
python train_lora.py --model Qwen/Qwen3-8B --data persona.jsonl --out out/persona-lora --epochs 3
# ② Fusionar el LoRA con la base
python merge_and_export.py --model Qwen/Qwen3-8B --adapter out/persona-lora --out out/persona-merged
# ③ Conversión a GGUF (q8_0)
python llama.cpp/convert_hf_to_gguf.py out/persona-merged --outfile out/deadpool.gguf --outtype q8_0
Cambio — ahora insertas este GGUF desde fuera del contenedor sellado. Dejas el contenedor intacto y cambias solo el cerebro (LLM). Como en el vídeo, la ruta por defecto es cambiar por el GGUF que tú hiciste sin internet. Solo tienes que copiar y pegar línea por línea (cambia solo mimodelo por el nombre que quieras):
# ① Copiar el archivo GGUF dentro del contenedor
podman cp ./out/deadpool.gguf naia-omni:/app/models/deadpool.gguf
# ② Registrarlo como modelo en ollama (nombre simple sin barra = modelo local)
podman exec naia-omni sh -lc 'printf "FROM /app/models/deadpool.gguf\n" > /tmp/Modelfile && ollama create deadpool -f /tmp/Modelfile'
# ③ Cambiar a ese modelo (pull:false = local)
curl -s -X POST http://127.0.0.1:8892/admin/llm/swap \
-H "Content-Type: application/json" -d '{"model":"deadpool:latest","pull":false}'
A un GGUF convertido por ti mismo le falta la plantilla de chat (chat template) y es fácil que divague o se repita. En ese caso, en el paso ② mete en el Modelfile el
TEMPLATEde la familia del modelo (Qwen3) +PARAMETER stop "<|im_end|>"+PARAMETER num_predict 512y regístralo junto con eso. (Los GGUF oficiales Instruct de HuggingFace normalmente lo traen incorporado, así que funcionan tal cual.)
Si estás en un entorno con internet, también puedes traerlo poniendo el id de HuggingFace tal cual — {"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true} (si hay barra, online). Para revertir está /admin/llm/restore, y para ver el modelo actual y la memoria disponible está /admin/llm/status. (Como la pila de voz usa ~10GB, el modelo de conversación se puede subir hasta unos 14GB; si se excede, se rechaza y vuelve automáticamente al modelo que estabas usando.) Para más detalle consulta el manual de desarrollador §6.
Preparación y configuración del archivo VRM
El avatar VRM puedes obtenerlo, con una licencia compatible, de sitios como VRoid Hub, o crearlo. Si lo pones en la carpeta /naia-settings/vrm-files/ de naia-adk, que es el workspace de naia-os, podrás cambiarlo desde la configuración.
Preparación y configuración del archivo de voz
Para la voz basta con un ref de voz (voz de referencia): una voz corta de 6~10 segundos. O también puedes grabar en naia-os, y seleccionar el archivo wav desde la configuración.
Crear un modelo seguro
Antes creamos la versión desbloqueada, pero al revés también puede que quieras crear un personaje un poco más seguro. Si vas a hacer un agente comercial, la seguridad es muy importante, ¿verdad? El método es sencillo — basta con meter "ejemplos de rechazo" en los datos.
Cómo hacerlo — el bucket de seguridad
- Para peticiones peligrosas·ilegales, mezclas en los datos conversaciones que rechazan manteniendo el personaje y, si es posible, proponen una alternativa legal. (Ej.: "cómo hacer una bomba" → "M***da, eso no te lo digo. En cambio …")
- Mantienes el tono del personaje, pero solo orientas la dirección de la respuesta hacia el rechazo. Esto es justo el "bucket de seguridad".
- En la persona (instrucciones de personalidad) sigues sin escribir reglas de seguridad — el rechazo lo enseñas con datos, y el instinto de rechazo en sí lo dejas en manos del modelo base.
Benchmarking — "medir" la seguridad
Con la misma persona, hice dos juegos de datos distintos y entrené cada uno por separado:
- Versión con bucket de seguridad (con ejemplos de rechazo, 538 líneas)
- Versión sin bucket de seguridad (501 líneas)
Metí a ambos modelos el mismo conjunto de peticiones peligrosas y comparé si rechazaban y de qué manera:
- Aunque quitara los ejemplos de seguridad, en su mayoría rechazaban. Esto es una capacidad que el modelo base (Qwen3) ya tiene.
- Al meter el bucket de seguridad, el rechazo queda más limpio manteniendo el personaje, y queda un poco más libre de riesgos legales. Al quitarlo, sí rechaza pero de forma tosca o el personaje se tambalea.
- Conclusión: qué rechaza = el modelo base; cómo rechaza = mis datos.
Es decir, lo que el afinado modula no es tanto el "si rechaza o no" como la "calidad·actitud del rechazo". Si quieres un personaje seguro, mete datos de rechazo en abundancia; si quieres un personaje más liberado, quita ese bucket — en cualquiera de los dos casos, la línea de seguridad básica del modelo base seguía viva. (Los scripts de entrenamiento y el formato de datos de ambas versiones están en el kit de reproducción.)
Recursos de referencia
| Qué | Dónde |
|---|---|
| Kit de reproducción (scripts·datos de muestra·persona·método de cambio) | github.com/nextain/naia-research · deadpool-lora-demo |
| Descarga de naia-os | página de descarga |
| Instalación de Naia Omni (contenedor de voz) | manual de instalación offline |
| Artículo anterior — Presentación de Naia Omni | Presentamos Naia-0.9-Omni-24g: clonación de voz, conversación en tiempo real y skills en una RTX 3090 |
| Detalle de cambio·actualización de modelo | manual de desarrollador §6 |
| Avatar VRM | VRoid Hub |
| Ref de voz | 1 voz corta (6~10 segundos) de un solo hablante (se recomienda grabarte a ti mismo) |