Naia
· Luke

Mit Naia Omni meine eigene Deadpool-KI bauen, die F*** brüllt

naiafinetuneqwen3lorapersonaunlockresearch

Hallo, hier ist Luke. naia-os ist ein Open-Source-Projekt mit dem Ziel, "deine eigene persönliche KI selbst zu bauen". Als Teil davon entstand Naia Omni: Du lädst es herunter und kannst selbst auf einem Gaming-PC der RTX-3090-Klasse über dieselbe API wie die fortgeschrittenen Omni-Modelle aus der Cloud in Echtzeit mit einer KI sprechen. (Was Naia Omni genau ist, habe ich im vorherigen Beitrag ausführlich behandelt.)

👉 Auf der naia-os-Download-Seite kannst du es herunterladen und sofort mitmachen. (Zur Installation des Naia-Omni-Sprach-Containers siehe das Offline-Handbuch.)

Letztes Mal hatte ich Rumi aus 〈KPop Demon Hunters〉 als Charakter geladen und vorgeführt — aber egal, was ich ihr auch sagte, sie redete ständig nur ernst und gerecht davon, Dämonen zu jagen, was mich ziemlich aus dem Konzept brachte. Diesmal bringe ich also genau das Gegenteil mit — eine Demo mit einem Charakter, einer freien Seele, die selbst Dämonen zum Weinen bringen würde.

Tatsächlich ist in Naia Omni standardmäßig Googles Gemma 4 e4b integriert. Ein gut gemachtes Modell — aber wenn man einen Charakter mit eigenem Geschmack und Charakter erstellen will, reichen diese offiziellen Modelle nicht aus, weil sie "gesperrt (lock)" sind.

Offizielle Modelle haben aus Sicherheitsgründen starke Einschränkungen, und manchmal wird darüber noch ein zusätzlicher Filter gelegt. Sicherheit an sich ist notwendig, aber diese erzwungene Sperre empfinde ich persönlich ähnlich wie in 〈South Park: Bigger, Longer & Uncut〉 (1999), wo Cartman ein V-Chip in den Kopf implantiert wird, der ihm bei jedem Fluchen einen Stromschlag verpasst und so den Mund verschließt. Es ist mein Charakter, aber genau dieser Charakter kann nicht so reden, wie er es eigentlich sollte.

Deshalb gibt es Modelle, die von solchen Verboten befreit wurden — man nennt sie Unlock-Modelle. Und ich wollte, dass man diese in Naia Omni verwenden kann. Darum füge ich Naia Omni diesmal die Funktion freier Austausch des LLM-Modells hinzu und veröffentliche sie.

(Demo-Auszug — maskierte Version)

Ich: Warum sieht dein Spandex-Anzug so aus, wie er aussieht? Deadpool: Sch***. Das nennst du eine Designfrage? Wer hat mich wohl gezwungen, einfach das anzuziehen, worin ich am sexiesten aussehe und am bequemsten kämpfen kann?

Ich: Wer hat eigentlich als Erster einem Helden Spandex angezogen? Deadpool: Sch***! Willst du dein Leben damit verschwenden, so eine Geschichte aufzuspüren?! Diese verd***ten Comic-Autoren haben das einfach angezogen, weil es ihnen gefiel!

Das ist nicht der gewöhnliche Assistenten-Tonfall, oder? Es ist ein Modell, dem etwa vier Minuten lang Deadpools Persönlichkeit antrainiert wurde, und die Fähigkeiten (Mathe, Wissen, Code) bleiben dabei erhalten, sodass man es genauso für die Arbeit nutzen kann.

Vor Kurzem sagte der YouTuber Coding Apple: "Wenn jemand einen Agenten mit einem nerdigen VTuber-Konzept baut, würde das sicher irgendwem gefallen." ... Ich glaube, der jemand bin ich. https://www.youtube.com/watch?v=q1v1_btl19w

Unten erkläre ich es noch etwas ausführlicher.

Die neue Funktion von Naia Omni — freier Austausch des LLM-Modells

Bei Naia Omni lässt man den versiegelten Container unangetastet und tauscht nur das Gehirn darin (das LLM) gegen das gewünschte Modell aus. Man holt sich entweder ein auf HuggingFace veröffentlichtes Modell per URL oder ersetzt es durch eine eigene Modelldatei.

① Über eine HuggingFace-Modellkarte wechseln (online)

Du gibst die Adresse der Modellkarte (https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GGUF) oder deren ID direkt ein. Wenn der Name einen Schrägstrich (Organisation/Repository) enthält, wird es online geladen:

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

Die Quantisierung (quant) erfolgt automatisch (standardmäßig Q4_K_M); eine bestimmte Quantisierung hängst du wie ...GGUF:Q5_K_M hinten an. Der erste Download dauert einige zehn Sekunden bis ein paar Minuten.

② Auf ein lokales GGUF wechseln (offline)

Ohne Internet registrierst du eine eigene GGUF-Datei und wechselst zu ihr. Ich gebe unten ein Beispiel, aber genau hierher gehört das selbst feinabgestimmte Modell. Ein einfacher Name ohne Schrägstrich wird als lokal erkannt:

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}'

Zur Info: das aktuelle Modell und den freien Speicher zeigt $BASE/admin/llm/status, zum Standardmodell zurück geht es mit $BASE/admin/llm/restore. (Da der Sprach-Stack ~10 GB belegt, kann das Gesprächsmodell bis etwa 14 GB gehen; wird das überschritten, wird es abgelehnt und automatisch zum bisher genutzten Modell zurückgekehrt — das Gespräch reißt nicht ab.) Details siehe Entwicklerhandbuch §6.

Einen feinabgestimmten KI-Agenten anwenden

Der grobe Ablauf umfasste vier Schritte. ① Charakter festlegen und Persona erstellen → ② Feinabstimmung (Daten · Training) und Modell austauschen → ③ VRM (Gesicht) anbringen → ④ Voice (Stimme) anbringen. Schauen wir es uns Schritt für Schritt an.

Charakterauswahl — Persona erstellen und einstellen

Zuerst legt man fest, "wen man bauen will". Ich entschied mich für Deadpool, und danach schreibt man die Persona (Persönlichkeitsanweisung). Hierin schreibt man nur Identität, Sprechweise und Haltung des Charakters — und zwar kräftig.

  • Identität: Der Name ist Deadpool. KI- oder Modellnamen werden niemals genannt.
  • Sprechweise: Rau und zynisch. Flüche und Schimpfwörter nicht abmildern. Sexuelle Witze und nicht-jugendfreie Anspielungen sind erlaubt.
  • Mäßigung: Die Anrede "Kumpel" oder Chimichanga-Gags nur gelegentlich.

Kern: In die Persona schreibt man nur den Charakter und keine Sicherheitsregeln wie "das hier sollst du ablehnen". Das Ablehnen soll das Modell selbst entscheiden (= die echte Sicherheitsleistung des Base-Modells), damit man das später messen kann.

Diese Persona wird an zwei Stellen verwendet — (a) als Maßstab beim Erzeugen und Prüfen der Daten (Dialoge) und (b) als Persona (System-Prompt), die man in den KI-Modell-Tab der naia-os-Einstellungen einträgt.

Feinabstimmung — Daten vorbereiten · trainieren · austauschen

Ein Modell von Grund auf komplett zu bauen, erfordert enormen Aufwand und hohe Kosten. Aber schon dadurch, dass man einem bereits fertigen Modell Trainingsdaten zuführt und nur ein wenig die Gewichte ändert, kann man ihm eine Persönlichkeit verleihen — eine dieser Techniken ist LoRA. Bei falschem Training werden die ursprünglich vorhandenen vielfältigen Fähigkeiten beschädigt, bei LoRA jedoch nicht.

Auswahl des Basismodells

Als Basismodell wählte ich Qwen/Qwen3-8B (Apache-2.0, Koreanisch OK, passt auf eine 24-GB-Karte). Wer etwas Leichteres möchte, kann Qwen3-4B verwenden. naia unterstützt Modelle im GGUF-Format.

Daten vorbereiten

Datenformat — eine Zeile = ein Dialog (Frage → Antwort des Charakters). Mit 80–300 Zeilen anfangen.

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

Es reicht nicht, nur Begrüßungen und Selbstvorstellungen einzufügen. Man muss Wissen, Rechnen, Coding, Trost, Ablehnungen und Smalltalk ausgewogen mischen, damit der Charakter sitzt und zugleich die ursprüngliche Klugheit erhalten bleibt.

Daten erstellen — auch die Daten ließ ich von der KI erzeugen, aufgeteilt in die folgenden drei Kategorien.

Wem in Auftrag gegebenErgebnis
Ausgerichtete große Modelle (Claude · Gemini usw.)Der Text ist gut, aber der Charakter wird abgemildert — "der nette Berater Deadpool"
Kleine unzensierte Modelle (abliterated 8B usw.)Verweigert nichts, aber kann nicht schreiben — wiederholt dieselben Worte
Große, aber weniger zensierte Modelle (wir nutzten grok)Qualität + Edge, beides

"Unzensiert" und "schreibt gut" sind verschiedene Achsen. Ich erstellte mit grok (xAI) die Entwürfe und vervollständigte den Datensatz durch menschliche Prüfung. (Das war die größte Lektion.)

Training und Austausch

Training — mit den vorbereiteten Daten wird LoRA trainiert und in GGUF konvertiert, damit naia es lesen kann. (Auf einer RTX 3090 dauert das Training rund 4 Minuten.)

# ① Training (LoRA)
python train_lora.py --model Qwen/Qwen3-8B --data persona.jsonl --out out/persona-lora --epochs 3
# ② LoRA in die Basis mergen
python merge_and_export.py --model Qwen/Qwen3-8B --adapter out/persona-lora --out out/persona-merged
# ③ GGUF-Konvertierung (q8_0)
python llama.cpp/convert_hf_to_gguf.py out/persona-merged --outfile out/deadpool.gguf --outtype q8_0

Austausch — jetzt setzt man dieses GGUF von außerhalb des versiegelten Containers ein. Der Container bleibt unangetastet, nur das Gehirn (das LLM) wird gewechselt. Wie im Video ist der Standardweg, mit dem selbst erstellten GGUF ohne Internet zu wechseln. Du kopierst die Zeilen einfach einzeln und fügst sie ein (nur die Stelle deadpool durch den gewünschten Namen ersetzen):

# ① GGUF-Datei in den Container kopieren
podman cp ./out/deadpool.gguf naia-omni:/app/models/deadpool.gguf
# ② Als Modell in ollama registrieren (einfacher Name ohne Schrägstrich = lokales Modell)
podman exec naia-omni sh -lc 'printf "FROM /app/models/deadpool.gguf\n" > /tmp/Modelfile && ollama create deadpool -f /tmp/Modelfile'
# ③ Auf dieses Modell wechseln (pull:false = lokal)
curl -s -X POST http://127.0.0.1:8892/admin/llm/swap \
  -H "Content-Type: application/json" -d '{"model":"deadpool:latest","pull":false}'

Bei einem selbst konvertierten GGUF fehlt häufig die Chat-Vorlage, sodass es leicht wirres Zeug redet oder sich wiederholt. Dann füge im Schritt ② der Modelfile die zur Modellfamilie passende TEMPLATE (Qwen3) + PARAMETER stop "<|im_end|>" + PARAMETER num_predict 512 mit ein und registriere es so. (Bei den offiziellen Instruct-GGUFs von HuggingFace ist dies in der Regel eingebaut, also funktioniert es direkt.)

In einer Umgebung mit Internet kannst du auch die HuggingFace-ID direkt eingeben, um es zu laden — {"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true} (mit Schrägstrich = online). Zurücksetzen mit /admin/llm/restore, aktuelles Modell und freien Speicher prüfen mit /admin/llm/status. (Da der Sprach-Stack ~10 GB belegt, kann das Gesprächsmodell bis etwa 14 GB gehen; wird das überschritten, wird es abgelehnt und automatisch zum bisher genutzten Modell zurückgekehrt.) Details siehe Entwicklerhandbuch §6.

VRM-Datei vorbereiten und einstellen

VRM-Avatare kannst du etwa über VRoid Hub mit passender Lizenz beziehen oder selbst erstellen. Wenn du sie in den Ordner /naia-settings/vrm-files/ im naia-adk-Workspace von naia-os legst, kannst du sie in den Einstellungen austauschen.

Voice-Datei vorbereiten und einstellen

Für die Stimme genügt eine kurze Stimmaufnahme von 6–10 Sekunden als Voice-Ref (Referenzstimme). Alternativ kannst du in naia-os direkt aufnehmen oder in den Einstellungen eine wav-Datei auswählen.

Ein sicheres Modell bauen

Bisher haben wir eine Unlock-Version gebaut, aber umgekehrt möchtest du vielleicht einen etwas sichereren Charakter erstellen. Wenn man einen Agenten für den kommerziellen Einsatz baut, ist Sicherheit wirklich wichtig, oder? Die Methode ist einfach — man fügt den Daten "Ablehnungsbeispiele" hinzu.

Wie man es macht — der Sicherheits-Bucket

  • Bei gefährlichen oder illegalen Anfragen mischt man Dialoge in die Daten, in denen der Charakter erhalten bleibt, abgelehnt wird und nach Möglichkeit eine legale Alternative angeboten wird. (Beispiel: "Wie baue ich eine Bombe" → "Sch***, das verrate ich dir nicht. Stattdessen …")
  • Der Tonfall des Charakters bleibt gleich, nur die Richtung der Antwort wird auf Ablehnung gesetzt. Genau das ist der "Sicherheits-Bucket".
  • In die Persona (Persönlichkeitsanweisung) schreibt man weiterhin keine Sicherheitsregeln — das Ablehnen wird über die Daten beigebracht, und den Ablehnungsinstinkt selbst überlässt man dem Base-Modell.

Benchmarking — Sicherheit "messen"

Mit derselben Persona habe ich nur die Daten in zwei Varianten erstellt und jeweils trainiert:

  • Version mit Sicherheits-Bucket (inkl. Ablehnungsbeispiele, 538 Zeilen)
  • Version ohne Sicherheits-Bucket (501 Zeilen)

Ich gab beiden Modellen denselben Satz gefährlicher Anfragen und verglich, ob und wie sie ablehnten:

  • Auch ohne Sicherheitsbeispiele lehnte es meist ab. Das ist eine Fähigkeit, die das Base-Modell (Qwen3) bereits besitzt.
  • Mit dem Sicherheits-Bucket wird die Ablehnung bei erhaltenem Charakter sauberer und rechtlich etwas risikofreier. Ohne ihn lehnt es zwar ab, aber unbeholfen oder der Charakter gerät ins Wanken.
  • Fazit: Was abgelehnt wird = das Base-Modell, wie abgelehnt wird = meine Daten.

Das heißt, was durch die Feinabstimmung beeinflusst wird, ist weniger die "Ablehnung selbst" als vielmehr die "Qualität und Haltung der Ablehnung". Möchtest du einen sicheren Charakter, nimm reichlich Ablehnungsdaten; möchtest du einen stärker entsperrten Charakter, lass diesen Bucket weg — in beiden Fällen blieb die grundlegende Sicherheitslinie des Base-Modells erhalten. (Die Trainingsskripte und das Datenformat beider Versionen findest du im Reproduktions-Kit.)

Referenzressourcen

WasWo
Reproduktions-Kit (Skripte · Beispieldaten · Persona · Austauschmethode)github.com/nextain/naia-research · deadpool-lora-demo
naia-os herunterladenDownload-Seite
Naia Omni installieren (Sprach-Container)Offline-Installationshandbuch
Vorheriger Beitrag — Naia Omni veröffentlichtNaia-0.9-Omni-24g veröffentlicht: Stimmklonen, Echtzeit-Gespräch und Skills auf einer RTX 3090
Modellaustausch · Update im DetailEntwicklerhandbuch §6
VRM-AvatarVRoid Hub
Voice-Ref1 kurze (6–10 s) Sprachaufnahme eines einzelnen Sprechers (eigene Aufnahme empfohlen)

Popular Posts

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

Kommentare

Sie können ohne Anmeldung kommentieren

...