Olá, aqui é o Luke. O naia-os é um projeto de código aberto cujo objetivo é "construir sua própria IA pessoal com as próprias mãos". Como parte disso, criamos o Naia Omni: você baixa, e mesmo num PC gamer da classe RTX 3090 consegue conversar com a IA em tempo real, usando a mesma api dos modelos omni avançados da nuvem. (O que é o Naia Omni foi detalhado no artigo anterior.)
👉 Você pode baixar na página de download do naia-os e já seguir o passo a passo. (Para a instalação do contêiner de voz do Naia Omni, consulte o manual offline.)
Da última vez, fiz uma demonstração colocando a Rumi de 〈K-pop Demon Hunters〉 como personagem, mas, dissesse eu o que dissesse, ela ficava sempre solene e justiceira, só falando de caçar demônios, o que foi um tanto constrangedor. Por isso, desta vez trouxe o oposto — uma demo com um personagem de alma livre, capaz de fazer até um demônio chorar.
Na verdade, o Naia Omni já vem com o Gemma 4 e4b da Google embutido por padrão. É um modelo bem feito, mas — quando você tenta criar um personagem do seu gosto, com personalidade marcante, esses modelos oficiais têm um "lock" e por isso ficam aquém.Os modelos oficiais têm restrições fortes em nome da segurança, e em alguns casos ainda aplicam um filtro adicional por cima. A segurança em si é necessária, mas, pessoalmente, sinto que esse tipo de lock forçado é parecido com — em 〈South Park: Bigger, Longer & Uncut〉 (1999) — implantar um V-chip na cabeça do Cartman, que toda vez que ele xinga leva um choque elétrico que fecha a boca dele. É o meu personagem, mas ele não consegue falar como o personagem que é.
Por isso existem modelos que foram liberados dessas proibições, e a esses chamamos de modelos unlock. E eu queria poder usá-los no Naia Omni. Então, desta vez, adiciono ao Naia Omni e torno público o recurso de troca livre de modelo LLM.
(Trecho da demo — versão censurada)
Eu: Por que o design do seu collant é desse jeito? Deadpool: P***. Você tá perguntando isso achando que é um design? Quem é que me obrigou a vestir o que é mais sexy e mais confortável pra brigar?
Eu: Quem foi o primeiro cretino a colocar um collant num herói? Deadpool: P***! Vai desperdiçar sua vida atrás desse tipo de história?! Foi só porque esses desgraçad*** dos roteiristas de quadrinhos quiseram, porque acharam bonitinho!
Não é o jeito de falar de um assistente comum, né? É um modelo em que treinei a personalidade do Deadpool no Qwen3 por cerca de 4 minutos, e as capacidades (matemática, conhecimento, código) foram mantidas, então dá pra usar normalmente no trabalho.
Outro dia, o youtuber Coding Apple disse "se alguém fizer um agente com conceito de VTuber otaku, acho que tem gente que vai gostar"... acho que sou eu. https://www.youtube.com/watch?v=q1v1_btl19w
Abaixo vou explicar com um pouco mais de detalhe.
O novo recurso do Naia Omni — troca livre de modelo LLM
O Naia Omni deixa o contêiner selado intacto e permite trocar apenas o cérebro (LLM) dentro dele pelo modelo que você quiser. Você pode baixar um modelo público do HuggingFace via url, ou trocar por um arquivo de modelo que você já tem.
① Trocar pelo model card do HuggingFace (online)
Basta colocar o endereço do model card (https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GGUF) ou o id dele diretamente. Se houver uma barra (organização/repositório) no nome, ele baixa online:
curl -s -X POST $BASE/admin/llm/swap -H "Content-Type: application/json" \
-d '{"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true}'
A qualidade (quant) é automática (padrão Q4_K_M); para uma qualidade específica, acrescente ao final como em ...GGUF:Q5_K_M. No primeiro download, leva de dezenas de segundos a alguns minutos.
② Trocar por um GGUF local (offline)
Sem internet, você registra um arquivo GGUF que já tem e faz a troca. Vou dar um exemplo mais abaixo, mas é aqui que entra o modelo que você mesmo fez fine-tuning. Se for um nome simples sem barra, ele reconhece como local:
podman cp ./meumodelo.gguf naia-omni:/app/models/meumodelo.gguf
podman exec naia-omni sh -lc 'printf "FROM /app/models/meumodelo.gguf\n" > /tmp/Modelfile && ollama create meumodelo -f /tmp/Modelfile'
curl -s -X POST $BASE/admin/llm/swap -H "Content-Type: application/json" -d '{"model":"meumodelo:latest","pull":false}'
A propósito, o modelo atual e a memória livre você vê em $BASE/admin/llm/status, e voltar ao modelo padrão é em $BASE/admin/llm/restore. (Como a pilha de voz usa ~10GB, o modelo de conversa pode subir até cerca de 14GB; se exceder, é recusado e volta automaticamente ao modelo que estava em uso — a conversa não é interrompida.) Para detalhes, consulte o manual do desenvolvedor §6.
Aplicando o agente de IA com fine-tuning
O fluxo geral passou por quatro etapas. ① Definir o personagem e criar a persona → ② Fazer fine-tuning (dados e treino) e trocar o modelo → ③ Acoplar o VRM (rosto) → ④ Acoplar a voz. Vamos ver uma a uma.
Escolha do personagem — criação e configuração da persona
Primeiro, defina "quem você vai criar". Eu escolhi o Deadpool, e em seguida escrevo a persona (instrução de personalidade). Aqui você anota com força apenas a identidade, o jeito de falar e a atitude do personagem.
- Identidade: O nome é Deadpool. Nunca diz que é uma IA nem o nome do modelo.
- Jeito de falar: Rude e cínico. Não suavizar palavrões e gírias. Permitir piadas sexuais e insinuações adultas.
- Moderação: Tratar por "amigo" ou fazer piada de chimichanga só de vez em quando.
Essencial: na persona você anota só o personagem, e não inclui regras de segurança do tipo "recuse isto". A recusa deve ficar a cargo do próprio modelo (= o verdadeiro desempenho de segurança do modelo base), porque assim depois conseguimos medi-la.
Essa persona é usada em dois lugares — (a) como critério para gerar e revisar os dados (as falas), (b) como a persona (system prompt) que você coloca na aba de modelo de IA das configurações do naia-os.
Fine-tuning — preparar dados, treinar e trocar
Criar um modelo do zero exige um esforço e um custo enormes. Mas basta inserir dados de treino num modelo já pronto e mudar um pouco os pesos para conseguir dar personalidade a ele — e uma dessas técnicas é o LoRA. Se você treinar mal, as diversas capacidades que o modelo já tinha são danificadas, mas com o LoRA isso não acontece.
Escolha do modelo base
Como modelo base, escolhi o Qwen/Qwen3-8B (Apache-2.0, OK em coreano, cabe em uma única placa de 24GB). Se quiser usar algo mais leve, dá para usar o Qwen3-4B. O naia suporta modelos no formato GGUF.
Preparação dos dados
Formato dos dados — uma linha = uma conversa (pergunta → resposta do personagem). Comece com 80~300 linhas.
{"messages":[{"role":"user","content":"넌 누구야?"},
{"role":"assistant","content":"오, 드디어! 난 데드풀이야 ..."}]}
Não pode colocar só saudações e autoapresentação. Você precisa misturar conhecimento, cálculo, programação, consolo, recusa e bate-papo de forma equilibrada para dar a personalidade e ao mesmo tempo manter a inteligência original.
Criação dos dados — os dados também foram feitos pela IA, e eu os produzi divididos nas 3 categorias abaixo.
| A quem pedi | Resultado |
|---|---|
| Grande alinhado (Claude, Gemini etc.) | O texto é bom, mas suaviza o personagem — "Deadpool conselheiro bonzinho" |
| Pequeno sem censura (abliterated 8B etc.) | Não recusa, mas escreve mal — repete as mesmas coisas |
| Modelo grande e menos censurado (nós usamos o grok) | Qualidade + edge, os dois ✅ |
"Sem censura" e "escreve bem" são eixos diferentes. Eu gerei os rascunhos com o grok (xAI) e completei o dataset com revisão humana. (Essa foi a maior lição.)
Treino e troca
Treino — treine o LoRA com os dados preparados e converta para GGUF para que o naia consiga ler. (Na RTX 3090, o treino fica na casa dos 4 minutos.)
# ① treino (LoRA)
python train_lora.py --model Qwen/Qwen3-8B --data persona.jsonl --out out/persona-lora --epochs 3
# ② mesclar o LoRA na base
python merge_and_export.py --model Qwen/Qwen3-8B --adapter out/persona-lora --out out/persona-merged
# ③ conversão para GGUF (q8_0)
python llama.cpp/convert_hf_to_gguf.py out/persona-merged --outfile out/deadpool.gguf --outtype q8_0
Troca — agora você encaixa esse GGUF do lado de fora do contêiner selado. O contêiner fica intacto e você troca apenas o cérebro (LLM). Assim como no vídeo, sem internet, trocar pelo GGUF que você mesmo fez é o caminho padrão. Basta copiar e colar uma linha de cada vez (mude só onde está meumodelo para o nome que quiser):
# ① copiar o arquivo GGUF para dentro do contêiner
podman cp ./out/deadpool.gguf naia-omni:/app/models/deadpool.gguf
# ② registrar como modelo no ollama (nome simples sem barra = modelo local)
podman exec naia-omni sh -lc 'printf "FROM /app/models/deadpool.gguf\n" > /tmp/Modelfile && ollama create deadpool -f /tmp/Modelfile'
# ③ trocar para esse 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}'
Um GGUF convertido por você mesmo fica sem o chat template e tende a falar bobagem ou repetir. Nesse caso, na etapa ②, registre o Modelfile incluindo junto o
TEMPLATE(Qwen3) da família do modelo +PARAMETER stop "<|im_end|>"+PARAMETER num_predict 512. (Os GGUF Instruct oficiais do HuggingFace geralmente já vêm com isso embutido, então funcionam direto.)
Em um ambiente com internet, você também pode colocar o id do HuggingFace diretamente para baixar — {"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true} (se houver barra, é online). Para reverter, use /admin/llm/restore; para verificar o modelo atual e a memória livre, use /admin/llm/status. (Como a pilha de voz usa ~10GB, o modelo de conversa pode subir até cerca de 14GB; se exceder, é recusado e volta automaticamente ao modelo que estava em uso.) Para detalhes, consulte o manual do desenvolvedor §6.
Preparação e configuração do arquivo VRM
O avatar VRM pode ser baixado de lugares como o VRoid Hub (com a licença adequada) ou criado por você. Colocando-o na pasta /naia-settings/vrm-files/ do naia-adk, que é o workspace do naia-os, você pode trocá-lo nas configurações.
Preparação e configuração do arquivo de voz
Para a voz, basta uma ref de voz (voz de referência) curta, de 6~10 segundos. Ou você pode gravar no próprio naia-os e selecionar um arquivo wav nas configurações.
Criando um modelo seguro
Antes fizemos a versão unlock, mas, ao contrário, você pode querer criar um personagem um pouco mais seguro. Se for fazer um agente para uso comercial, a segurança é mesmo muito importante, não é? O método é simples — basta colocar "exemplos de recusa" nos dados.
Como fazer — o bucket de segurança
- Para pedidos perigosos ou ilegais, misture nos dados conversas em que o modelo recusa mantendo o personagem e, se possível, sugere uma alternativa legal. (Ex.: "como fazer uma bomba" → "P***, isso eu não te ensino. Em vez disso, …")
- O jeito de falar do personagem permanece, mas só a direção da resposta é guiada para a recusa. Isso é o "bucket de segurança".
- A persona (instrução de personalidade) continua sem regras de segurança — a recusa é ensinada pelos dados, e o instinto de recusa em si fica a cargo do modelo base.
Benchmarking — "medir" a segurança
Com a mesma persona, criei dois conjuntos de dados e treinei cada um:
- Versão com bucket de segurança (com exemplos de recusa, 538 linhas)
- Versão sem o bucket de segurança (501 linhas)
Submetendo os dois modelos ao mesmo conjunto de pedidos perigosos e comparando se e como recusavam:
- Mesmo tirando os exemplos de segurança, na maioria das vezes recusaram. Isso é uma capacidade que o modelo base (Qwen3) já tem.
- Com o bucket de segurança, a recusa fica mais limpa mantendo o personagem e um pouco mais livre de riscos legais. Sem ele, recusa, mas de forma tosca ou com o personagem oscilando.
- Conclusão: o que recusar = modelo base; como recusar = meus dados.
Ou seja, o que o fine-tuning controla é menos o "se recusa" e mais a "qualidade e a atitude da recusa". Se você quer um personagem seguro, coloque bastante dado de recusa; se quer um personagem mais solto, tire esse bucket — em qualquer dos casos, a linha de segurança básica do modelo base permaneceu viva. (Os scripts de treino e o formato dos dados das duas versões estão no kit de reprodução.)
Recursos de referência
| O quê | Onde |
|---|---|
| Kit de reprodução (scripts, dados de amostra, persona, método de troca) | github.com/nextain/naia-research · deadpool-lora-demo |
| Download do naia-os | Página de download |
| Instalação do Naia Omni (contêiner de voz) | Manual de instalação offline |
| Artigo anterior — lançamento do Naia Omni | Lançamento do Naia-0.9-Omni-24g: clonagem de voz, conversa em tempo real e skills na RTX 3090 |
| Detalhes de troca e atualização de modelo | Manual do desenvolvedor §6 |
| Avatar VRM | VRoid Hub |
| Ref de voz | 1 áudio curto (6~10 s) de um único locutor (recomenda-se gravar você mesmo) |