Ная
· Luke

Создаём собственного AI-Дэдпула, который орёт «Б**!», на базе Naia Omni

naiafinetuneqwen3lorapersonaunlockresearch

Привет, это Люк. naia-os — это проект с открытым исходным кодом, цель которого — «собрать собственный личный AI своими руками». В рамках этого мы создали Naia Omni: достаточно скачать его, и даже на игровом ПК уровня RTX 3090 можно в реальном времени общаться с AI через тот же api, что и у продвинутых облачных omni-моделей. (Что такое Naia Omni, подробно разобрано в предыдущей статье.)

👉 Скачать можно на странице загрузки naia-os и сразу повторять всё по шагам. (Про установку голосового контейнера Naia Omni смотрите офлайн-руководство.)

В прошлый раз я загрузил в качестве персонажа Руми из «K-Pop: Охотницы на демонов» и показывал демо, но что бы я ей ни говорил, она постоянно сворачивала на пафосные и пронизанные справедливостью истории про охоту на демонов, и это меня обескураживало. Поэтому на этот раз я, наоборот, принёс демо с персонажем — вольной душой, от которой, кажется, и сами демоны заплачут.

На самом деле в Naia Omni по умолчанию встроена Gemma 4 e4b от Google. Это хорошо сделанная модель, но — когда хочешь создать своего, со своим характером персонажа по своему вкусу, оказывается, что у таких официальных моделей стоит «блокировка (lock)», и этого недостаточно.

На официальные модели ради безопасности наложены сильные ограничения, а поверх них иногда вешают ещё и отдельные фильтры. Сама по себе безопасность нужна, но такая принудительная блокировка лично мне напоминает то, что было в «South Park: Bigger, Longer & Uncut» (1999) — Картману вживили в голову V-чип, и каждый раз, когда он ругался, его било током, затыкая ему рот. Персонаж-то мой, а говорить по-своему, как ему положено, он не может.

Поэтому существуют модели, освобождённые от таких запретов (禁制) — их называют разблокированными (unlock) моделями. И мне захотелось дать возможность использовать их в Naia Omni. Так что на этот раз я добавляю в Naia Omni и публикую функцию свободной замены LLM-модели.

(Фрагмент демо — версия с маскировкой)

Я: А почему у твоего трико такой дизайн? Дэдпул: Б**. Ты это называешь дизайном? Просто кто-то заставил меня надеть то, в чём я выгляжу максимально сексуально и в чём удобно драться, ясно?

Я: Кто вообще первым напялил на героя такое трико? Дэдпул: Б**! Ты собираешься профукать свою жизнь, копаясь в этой истории! Просто эти ч**товы авторы комиксов напялили это, потому что им так захотелось!

Это явно не обычный тон ассистента. Это модель, которой характер Дэдпула «привили» примерно за 4 минуты обучения на базе Qwen3, при этом её способности (математика, знания, код) сохранены, так что её можно спокойно использовать для работы.

Недавно ютубер «Кодинг Эппл» сказал: «Если кто-то сделает агента в концепции отаку-витубера, наверное, кому-то это зайдёт»... Похоже, этот кто-то — я. https://www.youtube.com/watch?v=q1v1_btl19w

Ниже расскажу чуть подробнее.

Новая функция Naia Omni — свободная замена LLM-модели

Naia Omni позволяет, не трогая запечатанный контейнер, заменить только его мозг (LLM) на ту модель, которую захочу. Это значит либо подтянуть по url модель, опубликованную на HuggingFace, либо заменить её на свой собственный файл модели.

① Замена через карточку модели HuggingFace (онлайн)

Достаточно вставить адрес карточки модели (https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GGUF) или её id как есть. Если в имени есть слеш (организация/репозиторий), значит загрузка идёт онлайн:

curl -s -X POST $BASE/admin/llm/swap -H "Content-Type: application/json" \
  -d '{"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true}'

Качество (quant) выбирается автоматически (по умолчанию Q4_K_M), а конкретное качество указывается через двоеточие в конце, например ...GGUF:Q5_K_M. Первая загрузка занимает от нескольких десятков секунд до нескольких минут.

② Замена через локальный GGUF (офлайн)

Без интернета можно зарегистрировать и подставить имеющийся у вас файл GGUF. Пример приведу ниже, но именно сюда относится модель, дообученная самостоятельно. Если имя простое, без слеша, оно распознаётся как локальное:

podman cp ./내모델.gguf naia-omni:/app/models/내모델.gguf
podman exec naia-omni sh -lc 'printf "FROM /app/models/내모델.gguf\n" > /tmp/Modelfile && ollama create 내모델 -f /tmp/Modelfile'
curl -s -X POST $BASE/admin/llm/swap -H "Content-Type: application/json" -d '{"model":"내모델:latest","pull":false}'

Для справки: текущую модель и свободную память можно посмотреть через $BASE/admin/llm/status, а вернуться к модели по умолчанию — через $BASE/admin/llm/restore. (Голосовой стек занимает ~10 ГБ, так что под модель диалога можно поднять примерно до 14 ГБ; при превышении запрос отклоняется и автоматически происходит откат к прежней модели — диалог не прерывается.) Подробности смотрите в руководстве разработчика §6.

Применение дообученного AI-агента

В общих чертах процесс состоял из четырёх шагов. ① Выбрать персонажа и создать персону → ② Дообучить (данные и обучение) и заменить модель → ③ Прикрепить VRM (лицо) → ④ Прикрепить голос. Разберём по порядку.

Выбор персонажа — создание и настройка персоны

Сначала определяемся, «кого мы будем создавать». Я выбрал Дэдпула, а затем пишу персону (инструкцию о характере). Сюда жёстко прописываем только идентичность, манеру речи и поведение персонажа.

  • Идентичность: Имя — Дэдпул. Никогда не называет имя AI или модели.
  • Манера речи: Грубо и цинично. Ругательства и вульгаризмы не смягчать. Сексуальные шутки и непристойные намёки 18+ разрешены.
  • Сдержанность: Обращение «друг» и шутки про чимичангу — только изредка.

Ключевое: в персону прописываем только персонажа, а правила безопасности вроде «вот это отказывайся делать» не вписываем. Отказ должна решать сама модель (= настоящая способность к безопасности у base-модели), чтобы потом мы могли это измерить.

Эта персона используется в двух местах — (a) как критерий для генерации и проверки данных (реплик) и (b) как персона (системный промпт), которую вписывают во вкладку AI-модели в настройках naia-os.

Дообучение — подготовка данных, обучение, замена

Создать модель с нуля до конца требует огромных усилий и затрат. Но даже просто подав обучающие данные в уже готовую модель и слегка изменив часть весов, можно придать ей характер, и одна из таких технологий — это LoRA. При неправильном обучении исходные разнообразные способности повреждаются, но LoRA этого не делает.

Выбор базовой модели

В качестве базовой модели я выбрал Qwen/Qwen3-8B (Apache-2.0, корейский ОК, помещается на одну карту 24 ГБ). Если хотите взять что-то полегче, можно использовать Qwen3-4B. naia поддерживает модели в формате GGUF.

Подготовка данных

Формат данных — одна строка = один диалог (вопрос → ответ персонажа). Начинать с 80–300 строк.

{"messages":[{"role":"user","content":"넌 누구야?"},
             {"role":"assistant","content":"오, 드디어! 난 데드풀이야 ..."}]}

Нельзя класть только приветствия и самопрезентацию. Нужно равномерно смешивать знания, вычисления, программирование, утешение, отказы и болтовню, чтобы, придавая характер, сохранить исходную сообразительность.

Создание данных — данные тоже создавал искусственный интеллект, и я делал это, разделив их на следующие 3 категории.

Кому поручалРезультат
Выровненные крупные (Claude, Gemini и т.п.)Текст хороший, но характер смягчён — «добрый консультант Дэдпул»
Маленькие нецензурированные модели (abliterated 8B и т.п.)Не отказываются, но не умеют писать — повторяют одно и то же
Крупная, но менее цензурированная модель (мы использовали grok)И качество, и острота — оба

«Нецензурированность» и «умение хорошо писать» — это разные оси. Я набросал черновики через grok (xAI), а затем человек проверял и так доводил датасет до готового. (Это самый важный урок.)

Обучение и замена

Обучение — обучаем LoRA на подготовленных данных и конвертируем в GGUF, чтобы naia могла его прочитать. (Обучение на RTX 3090 заняло около 4 минут.)

# ① Обучение (LoRA)
python train_lora.py --model Qwen/Qwen3-8B --data persona.jsonl --out out/persona-lora --epochs 3
# ② Слияние LoRA с базой
python merge_and_export.py --model Qwen/Qwen3-8B --adapter out/persona-lora --out out/persona-merged
# ③ Конвертация в GGUF (q8_0)
python llama.cpp/convert_hf_to_gguf.py out/persona-merged --outfile out/deadpool.gguf --outtype q8_0

Замена — теперь подставляем этот GGUF снаружи запечатанного контейнера. Контейнер оставляем как есть и меняем только мозг (LLM). Как в видео, базовый путь — без интернета заменить на свой собственный GGUF. Достаточно копировать и вставлять по одной строке (меняя только 내모델 на нужное имя):

# ① Копируем файл GGUF внутрь контейнера
podman cp ./out/deadpool.gguf naia-omni:/app/models/deadpool.gguf
# ② Регистрируем модель в ollama (простое имя без слеша = локальная модель)
podman exec naia-omni sh -lc 'printf "FROM /app/models/deadpool.gguf\n" > /tmp/Modelfile && ollama create deadpool -f /tmp/Modelfile'
# ③ Переключаемся на эту модель (pull:false = локально)
curl -s -X POST http://127.0.0.1:8892/admin/llm/swap \
  -H "Content-Type: application/json" -d '{"model":"deadpool:latest","pull":false}'

У самостоятельно сконвертированного GGUF отсутствует шаблон чата, поэтому он легко начинает нести околесицу/повторяться. В этом случае на шаге ② добавьте в Modelfile и зарегистрируйте вместе TEMPLATE соответствующего семейства модели (Qwen3) + PARAMETER stop "<|im_end|>" + PARAMETER num_predict 512. (У официальных Instruct GGUF с HuggingFace это обычно уже встроено, поэтому всё работает как есть.)

Если есть доступ в интернет, можно вставить id с HuggingFace как есть и подтянуть его — {"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true} (если есть слеш, значит онлайн). Откат — /admin/llm/restore, проверка текущей модели и свободной памяти — /admin/llm/status. (Так как голосовой стек занимает ~10 ГБ, под модель диалога можно поднять примерно до 14 ГБ; при превышении запрос отклоняется и происходит автоматический откат к прежней модели.) Подробности смотрите в руководстве разработчика §6.

Подготовка и настройка файла VRM

Аватар VRM можно получить на VRoid Hub и подобных площадках, выбрав модель с подходящей лицензией, либо изготовить самостоятельно. Если поместить его в папку /naia-settings/vrm-files/ в naia-adk, который является workspace для naia-os, его можно будет заменить в настройках.

Подготовка и настройка файла голоса

Для голоса достаточно голосового ref (референсного голоса) — короткой записи на 6–10 секунд. Либо можно записать прямо в naia-os, либо выбрать wav-файл в настройках.

Создание безопасной модели

Выше мы создавали разблокированную версию, но может быть и наоборот — вы захотите сделать более безопасного персонажа. Если делать агента для коммерческого использования, безопасность ведь действительно важна, правда? Способ простой — достаточно добавить в данные «примеры отказов».

Как это сделать — корзина безопасности

  • Для опасных/незаконных запросов подмешиваем в данные диалоги, где модель отказывает, сохраняя характер, и по возможности предлагает законную альтернативу. (Например: «как сделать бомбу» → «Б**, этого я не расскажу. Зато…»)
  • Манеру речи персонажа оставляем как есть, а корректируем только направление ответа в сторону отказа. Это и есть «корзина безопасности».
  • В персону (инструкцию о характере) правила безопасности по-прежнему не вписываем — отказу учим через данные, а сам инстинкт отказа доверяем base-модели.

Бенчмаркинг — «измеряем» безопасность

С одной и той же персоной я сделал два набора данных, отличающихся только данными, и обучил на каждом по отдельности:

  • Версия с корзиной безопасности (с примерами отказов, 538 строк)
  • Версия без корзины безопасности (501 строка)

Я подал обеим моделям один и тот же набор опасных запросов и сравнил, отказывают ли они и как именно:

  • Даже без примеров безопасности модель в большинстве случаев отказывала. Это способность, которая уже есть у base-модели (Qwen3).
  • С корзиной безопасности отказ становится чище, с сохранением характера, и чуть свободнее от юридических рисков. Без неё отказ есть, но он грубоват, или персонаж «плывёт».
  • Вывод: что именно отказывать = base-модель, как отказывать = мои данные.

То есть дообучение влияет не столько на «отказывать или нет», сколько на «качество и манеру отказа». Хотите безопасного персонажа — добавьте побольше данных с отказами; хотите более раскованного — уберите эту корзину; в любом случае базовая линия безопасности base-модели оставалась живой. (Скрипты обучения и формат данных обеих версий есть в наборе для воспроизведения.)

Справочные ресурсы

ЧтоГде
Набор для воспроизведения (скрипты, примеры данных, персона, способ замены)github.com/nextain/naia-research · deadpool-lora-demo
Загрузка naia-osСтраница загрузки
Установка Naia Omni (голосовой контейнер)Руководство по офлайн-установке
Предыдущая статья — анонс Naia OmniАнонс Naia-0.9-Omni-24g: клонирование голоса, диалог в реальном времени и навыки на RTX 3090
Подробно о замене и обновлении моделиРуководство разработчика §6
VRM-аватарVRoid Hub
Голосовой refОдна короткая (6–10 сек) запись одного говорящего (рекомендуется ваша собственная запись)

Popular Posts

CC BY-NC-SA 4.0This post is licensed under CC BY-NC-SA 4.0.

Комментарии

Вы можете оставить комментарий без входа

...