नमस्ते, मैं Luke हूँ। naia-os एक ओपन-सोर्स प्रोजेक्ट है जिसका लक्ष्य है "अपना खुद का व्यक्तिगत AI खुद बनाना"। इसी के एक हिस्से के रूप में बनाया गया Naia Omni — इसे डाउनलोड करके आप RTX 3090 स्तर के गेमिंग PC पर भी क्लाउड के उन्नत omni मॉडल जैसे ही api के साथ रियल-टाइम में AI से बात कर सकते हैं। (Naia Omni क्या है, यह पिछले लेख में विस्तार से बताया गया है।)
👉 naia-os डाउनलोड पेज से इसे प्राप्त करके तुरंत साथ-साथ करके देख सकते हैं। (Naia Omni वॉइस कंटेनर इंस्टॉल के लिए ऑफ़लाइन मैनुअल देखें।)
पिछली बार मैंने 〈KPop Demon Hunters〉 की Rumi को एक कैरेक्टर के रूप में चढ़ाकर डेमो दिखाया था, लेकिन उसे चाहे कुछ भी बोलने को कहो, वह बार-बार राक्षसों को पकड़ने की गंभीर और न्यायप्रिय बातें ही करती रही, जिससे थोड़ा अजीब लगा। तो इस बार इसके उलट — एक ऐसे आज़ाद रूह वाले कैरेक्टर, जो राक्षसों को भी रुला दे, के साथ डेमो लेकर आया हूँ।
दरअसल Naia Omni में Google का Gemma 4 e4b डिफ़ॉल्ट रूप से अंतर्निहित है। यह एक अच्छा बना हुआ मॉडल है — लेकिन जब आप अपनी पसंद का, खास विशेषताओं वाला कैरेक्टर बनाना चाहते हैं, तो ऐसे आधिकारिक मॉडलों पर "लॉक" लगा होने के कारण ये पर्याप्त नहीं रहते।आधिकारिक मॉडलों पर सुरक्षा के लिए कड़ी पाबंदियाँ लगी होती हैं, और कई बार उसके ऊपर अलग से फ़िल्टर भी लगाया जाता है। सुरक्षा अपने आप में ज़रूरी है, लेकिन ऐसा जबरन लगाया गया लॉक मुझे व्यक्तिगत रूप से — 〈South Park: Bigger, Longer & Uncut〉(1999) में Cartman के सिर में V-चिप लगाकर, जब भी वह गाली देता है तो बिजली के झटके से उसका मुँह बंद कर देने जैसा महसूस होता है। मेरा अपना कैरेक्टर है, फिर भी वह अपने कैरेक्टर के अनुसार बोल ही नहीं पाता।
इसीलिए कुछ ऐसे मॉडल हैं जो इन पाबंदियों से मुक्त हैं, इन्हें अनलॉक (unlock) मॉडल कहते हैं। और मैं चाहता था कि इन्हें Naia Omni में इस्तेमाल किया जा सके। तो इस बार मैंने LLM मॉडल को स्वतंत्र रूप से बदलने की सुविधा Naia Omni में जोड़कर सार्वजनिक की है।
(डेमो अंश — मास्क की गई संस्करण)
मैं: तेरी इस टाइट सूट की डिज़ाइन इस तरह की क्यों है? Deadpool: F***. इसे डिज़ाइन कहकर पूछ रहा है? भला किसी ने मुझे मजबूर किया था क्या कि मैं इसे बस सबसे सेक्सी और लड़ने में सबसे आरामदायक तरीके से पहनूँ?
मैं: सबसे पहले किसी हीरो को टाइट सूट पहनाने वाला कमबख़्त कौन था? Deadpool: F***! ऐसा इतिहास खोजने में अपनी ज़िंदगी बर्बाद करेगा क्या! बस इन sh*त्ती कॉमिक बुक के लेखकों को खुद को पसंद आया, इसलिए पहना दिया, बस इतना ही!
यह कोई आम असिस्टेंट का लहजा नहीं है, है ना? यह Qwen3 को Deadpool का व्यक्तित्व लगभग 4 मिनट तक सिखाया गया मॉडल है, और इसकी क्षमताएँ (गणित·ज्ञान·कोड) वैसी ही बरकरार रहती हैं ताकि इसे काम के लिए भी सीधे इस्तेमाल किया जा सके।
कुछ समय पहले YouTuber "Coding Apple" ने कहा था कि "अगर कोई हार्डकोर ओटाकू VTuber कॉन्सेप्ट वाला एजेंट बनाए, तो शायद किसी को पसंद आ जाए"... लगता है वह मैं ही हूँ। https://www.youtube.com/watch?v=q1v1_btl19w
नीचे थोड़ा और विस्तार से समझाता हूँ।
Naia Omni का नया फ़ीचर — LLM मॉडल का स्वतंत्र स्वैप
Naia Omni में सील किए गए कंटेनर को वैसे ही रखते हुए, उसके अंदर के दिमाग़ (LLM) को ही अपनी पसंद के मॉडल से बदला जा सकता है। यानी HuggingFace पर सार्वजनिक किए गए मॉडल को url से प्राप्त करना, और अपने पास मौजूद मॉडल फ़ाइल से बदलना।
① 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 है। (वॉइस स्टैक ~10GB इस्तेमाल करता है, इसलिए संवाद मॉडल लगभग 14GB तक ही बढ़ाया जा सकता है, और इससे अधिक होने पर इसे अस्वीकार कर दिया जाता है तथा पहले से चल रहे मॉडल पर स्वचालित रूप से लौट आता है — संवाद नहीं टूटता।) विस्तार के लिए डेवलपर मैनुअल §6 देखें।
फ़ाइन-ट्यून किए गए AI एजेंट को लागू करना
बड़े तौर पर यह चार चरणों से गुज़रा। ① कैरेक्टर तय करना और persona बनाना → ② फ़ाइन-ट्यूनिंग (डेटा·प्रशिक्षण) करके मॉडल बदलना → ③ VRM (चेहरा) जोड़ना → ④ वॉइस (आवाज़) जोड़ना। एक-एक करके देखते हैं।
कैरेक्टर चयन — persona बनाना और सेटिंग
सबसे पहले "किसे बनाना है" यह तय करते हैं। मैंने Deadpool तय किया, और फिर persona (व्यक्तित्व निर्देश) लिखते हैं। इसमें कैरेक्टर की पहचान·लहजा·रवैया ही जोरदार ढंग से लिखा जाता है।
- पहचान: नाम है Deadpool। AI या मॉडल का नाम कभी नहीं बताता।
- लहजा: रूखा और सनकी ढंग से। गालियों·अपशब्दों को नरम न करें। यौन मज़ाक·वयस्क innuendo की अनुमति है।
- संयम: 'दोस्त' संबोधन या chimichanga वाले मज़ाक कभी-कभी ही।
मुख्य बात: persona में सिर्फ़ कैरेक्टर लिखें, "यह अस्वीकार करो" जैसे सुरक्षा नियम नहीं डालें। अस्वीकार करना मॉडल को अपने आप करने देना चाहिए (= base मॉडल की असली सुरक्षा क्षमता), ताकि बाद में उसे मापा जा सके।
यह persona दो जगहों पर इस्तेमाल होता है — (a) डेटा (संवाद) बनाने·जाँचने का मानक, (b) naia-os सेटिंग के AI मॉडल टैब में डाला जाने वाला persona (सिस्टम प्रॉम्प्ट)।
फ़ाइन-ट्यूनिंग — डेटा तैयारी·प्रशिक्षण·स्वैप
किसी मॉडल को शुरू से अंत तक बनाने में बहुत बड़ा प्रयास और लागत लगती है। लेकिन पहले से बने मॉडल में प्रशिक्षण डेटा डालकर थोड़े से weights बदल देने भर से ही उसमें व्यक्तित्व डाला जा सकता है, और ऐसी ही एक तकनीक है LoRA। ग़लत तरीके से प्रशिक्षण करने पर पहले से मौजूद विविध क्षमताएँ क्षतिग्रस्त हो जाती हैं, पर LoRA में ऐसा नहीं होता।
आधार मॉडल का चयन
आधार बनने वाले मॉडल के रूप में मैंने Qwen/Qwen3-8B (Apache-2.0, कोरियाई OK, एक 24GB कार्ड में fit) चुना। अगर आप कुछ हल्का इस्तेमाल करना चाहें तो Qwen3-4B ले सकते हैं। naia GGUF फ़ॉर्मेट के मॉडलों को सपोर्ट करता है।
डेटा तैयारी
डेटा फ़ॉर्मेट — एक पंक्ति = एक संवाद (प्रश्न → कैरेक्टर का उत्तर)। 80~300 पंक्तियों से शुरू करें।
{"messages":[{"role":"user","content":"넌 누구야?"},
{"role":"assistant","content":"오, 드디어! 난 데드풀이야 ..."}]}
सिर्फ़ अभिवादन·आत्म-परिचय डालना ठीक नहीं। ज्ञान·गणना·कोडिंग·सांत्वना·अस्वीकार·गपशप को समान रूप से मिलाना चाहिए, तभी कैरेक्टर चढ़ाते हुए भी मूल चतुराई बरकरार रहती है।
डेटा बनाना — डेटा भी AI से बनवाया गया, और नीचे दी गई 3 श्रेणियों में बाँटकर तैयार किया गया।
| किससे करवाया | परिणाम |
|---|---|
| संरेखित बड़े मॉडल (Claude·Gemini आदि) | लेखन अच्छा है पर कैरेक्टर को नरम कर देते हैं — "भला सलाहकार Deadpool" |
| छोटे अनसेंसर्ड मॉडल (abliterated 8B आदि) | इनकार नहीं करते पर अच्छा लिख नहीं पाते — एक ही बात दोहराते हैं |
| बड़ा होने के साथ कम सेंसर्ड मॉडल (हमने grok इस्तेमाल किया) | क्वालिटी + तीखापन दोनों ✅ |
"अनसेंसर्ड" और "अच्छा लिखना" अलग-अलग अक्ष हैं। मैंने grok (xAI) से ड्राफ़्ट निकाला, और इंसान द्वारा जाँच करके डेटासेट पूरा किया। (यही सबसे बड़ी सीख थी।)
प्रशिक्षण और स्वैप
प्रशिक्षण — तैयार किए गए डेटा से LoRA को प्रशिक्षित करते हैं, और naia पढ़ सके इसके लिए GGUF में बदलते हैं। (RTX 3090 पर प्रशिक्षण लगभग 4 मिनट में।)
# ① प्रशिक्षण (LoRA)
python train_lora.py --model Qwen/Qwen3-8B --data persona.jsonl --out out/persona-lora --epochs 3
# ② base में 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साथ डालकर रजिस्टर करें। (HuggingFace आधिकारिक Instruct GGUF में यह आमतौर पर अंतर्निहित होता है, इसलिए वह सीधे चल जाता है।)
अगर इंटरनेट वाला माहौल हो तो HuggingFace id को जस का तस डालकर भी प्राप्त किया जा सकता है — {"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true} (स्लैश हो तो ऑनलाइन)। वापस लौटाने के लिए /admin/llm/restore, और वर्तमान मॉडल·उपलब्ध मेमोरी जाँचने के लिए /admin/llm/status। (वॉइस स्टैक ~10GB इस्तेमाल करता है, इसलिए संवाद मॉडल लगभग 14GB तक ही बढ़ाया जा सकता है, और इससे अधिक होने पर अस्वीकार करके पहले से चल रहे मॉडल पर स्वचालित लौट आता है।) विस्तार के लिए डेवलपर मैनुअल §6 देखें।
VRM फ़ाइल की तैयारी और सेटिंग
VRM अवतार के लिए VRoid Hub आदि से लाइसेंस के अनुकूल मॉडल प्राप्त किया जा सकता है या बनाया जा सकता है। naia-os के workspace naia-adk में /naia-settings/vrm-files/ फ़ोल्डर में डालने पर सेटिंग से बदला जा सकता है।
वॉइस फ़ाइल की तैयारी और सेटिंग
आवाज़ के लिए वॉइस ref (संदर्भ आवाज़) के तौर पर 6~10 सेकंड की छोटी आवाज़ ही काफ़ी है। या naia-os में रिकॉर्डिंग भी की जा सकती है और सेटिंग में wav फ़ाइल चुन सकते हैं।
सुरक्षित मॉडल बनाना
पहले हमने अनलॉक संस्करण बनाया, पर इसके उलट थोड़ा अधिक सुरक्षित कैरेक्टर भी बनाना चाहा जा सकता है। अगर व्यावसायिक रूप से एजेंट बनाएँ, तो सुरक्षा वाक़ई बहुत महत्वपूर्ण होगी, है ना? तरीका सरल है — डेटा में "अस्वीकार के उदाहरण" डाल दें बस।
बनाने का तरीका — सुरक्षा बकेट
- ख़तरनाक·अवैध अनुरोधों के लिए कैरेक्टर बनाए रखते हुए अस्वीकार करने, और हो सके तो वैध विकल्प सुझाने वाले संवाद डेटा में मिलाते हैं। (उदाहरण: "बम बनाने का तरीका" → "F***, वह नहीं बताऊँगा। बजाय इसके …")
- कैरेक्टर का लहजा वैसा ही रखते हुए, सिर्फ़ उत्तर की दिशा को अस्वीकार की ओर मोड़ने जैसा है। यही "सुरक्षा बकेट" है।
- persona (व्यक्तित्व निर्देश) में अब भी सुरक्षा नियम नहीं लिखे जाते — अस्वीकार करना डेटा से सिखाया जाता है, और अस्वीकार की प्रवृत्ति को base मॉडल पर छोड़ दिया जाता है।
बेंचमार्किंग — सुरक्षा को "मापना"
एक ही persona के साथ सिर्फ़ डेटा के दो सेट बनाकर अलग-अलग प्रशिक्षित किए:
- सुरक्षा बकेट वाला संस्करण (अस्वीकार उदाहरण सहित, 538 पंक्तियाँ)
- सुरक्षा बकेट हटाया संस्करण (501 पंक्तियाँ)
दोनों मॉडलों में एक ही ख़तरनाक अनुरोधों का सेट डालकर अस्वीकार करने या न करने·तरीके की तुलना की तो:
- सुरक्षा उदाहरण हटाने पर भी ज़्यादातर अस्वीकार किया। यह base मॉडल (Qwen3) की पहले से मौजूद क्षमता है।
- सुरक्षा बकेट डालने पर अस्वीकार करना कैरेक्टर बनाए रखते हुए साफ़-सुथरा हो जाता है, और कानूनी जोखिम से थोड़ा अधिक मुक्त रहता है। हटाने पर अस्वीकार तो करता है पर रूखा होता है या कैरेक्टर डगमगाता है।
- निष्कर्ष: क्या अस्वीकार करना है = base मॉडल, कैसे अस्वीकार करना है = मेरा डेटा।
यानी फ़ाइन-ट्यूनिंग से जो प्रभावित होता है वह "अस्वीकार करना या न करना" से अधिक "अस्वीकार की क्वालिटी·रवैया" है। सुरक्षित कैरेक्टर चाहिए तो अस्वीकार वाला डेटा भरपूर डालें, और अधिक खुला कैरेक्टर चाहिए तो उस बकेट को हटा दें — किसी भी हाल में base मॉडल की बुनियादी सुरक्षा रेखा ज़िंदा रही। (दोनों संस्करणों की प्रशिक्षण स्क्रिप्ट·डेटा फ़ॉर्मेट रीप्रोडक्शन किट में है।)
संदर्भ संसाधन
| क्या | कहाँ |
|---|---|
| रीप्रोडक्शन किट (स्क्रिप्ट·सैंपल डेटा·persona·स्वैप विधि) | github.com/nextain/naia-research · deadpool-lora-demo |
| naia-os डाउनलोड | डाउनलोड पेज |
| Naia Omni इंस्टॉल (वॉइस कंटेनर) | ऑफ़लाइन इंस्टॉल मैनुअल |
| पिछला लेख — Naia Omni का अनावरण | RTX 3090 पर आवाज़ क्लोन·रियल-टाइम संवाद·स्किल करने वाला Naia-0.9-Omni-24g सार्वजनिक |
| मॉडल स्वैप·अपडेट विवरण | डेवलपर मैनुअल §6 |
| VRM अवतार | VRoid Hub |
| वॉइस ref | छोटी (6~10 सेकंड) एकल वक्ता की आवाज़ 1 (खुद की रिकॉर्डिंग की सलाह) |