হ্যালো, আমি Luke। naia-os হলো একটি ওপেন সোর্স প্রজেক্ট যার লক্ষ্য হলো "নিজের ব্যক্তিগত AI নিজে হাতে বানানো"। এরই অংশ হিসেবে তৈরি করা Naia Omni ডাউনলোড করে RTX 3090 শ্রেণির গেমিং পিসিতেও ক্লাউডের উচ্চমানের অমনি মডেলের মতো একই api দিয়ে রিয়েল-টাইমে AI-এর সাথে কথা বলা যায়। (Naia Omni কী, তা আগের লেখায় বিস্তারিত আলোচনা করেছি।)
👉 naia-os ডাউনলোড পেজ থেকে নামিয়ে সাথে সাথে অনুসরণ করে দেখতে পারেন। (Naia Omni ভয়েস কন্টেইনার ইনস্টল করতে অফলাইন ম্যানুয়াল দেখুন।)
গতবার 〈KPop Demon Hunters〉-এর Rumi-কে চরিত্র হিসেবে তুলে ডেমো দেখিয়েছিলাম, কিন্তু যা-ই বলতে বলি না কেন, বারবার শুধু বিষণ্ন আর ন্যায়পরায়ণ ভঙ্গিতে দানব শিকারের গল্পই করছিল বলে একটু বিব্রত হয়েছিলাম। তাই এবার ঠিক উল্টোটা — দানবকেও কাঁদিয়ে দিতে পারে এমন এক মুক্ত আত্মার চরিত্র নিয়ে ডেমো নিয়ে এসেছি।
আসলে Naia Omni-তে গুগলের Gemma 4 e4b ডিফল্টভাবে বিল্ট-ইন আছে। ভালো বানানো মডেল, কিন্তু — নিজের পছন্দমতো, স্বতন্ত্র বৈশিষ্ট্যের একটা চরিত্র বানাতে গেলে এই ধরনের অফিশিয়াল মডেলগুলোতে "লক (lock)" দেওয়া থাকে বলে সেগুলো যথেষ্ট নয়।অফিশিয়াল মডেলে নিরাপত্তার জন্য শক্ত নিষেধাজ্ঞা দেওয়া থাকে, আর তার ওপর আলাদা ফিল্টার বসানোর ক্ষেত্রেও থাকে। নিরাপত্তা নিজে দরকারি, কিন্তু এই ধরনের জোরপূর্বক লক আমার কাছে ব্যক্তিগতভাবে — 〈South Park: Bigger, Longer & Uncut〉(1999)-এ Cartman-এর মাথায় V-চিপ বসিয়ে, যখনই গালি দেয় তখনই বৈদ্যুতিক শক দিয়ে মুখ বন্ধ করে দেওয়ার মতো মনে হয়। নিজের চরিত্র অথচ সেই চরিত্রের মতো করে কথাই বলতে পারে না।
তাই এমন কিছু মডেল আছে যেগুলো এই নিষেধাজ্ঞা থেকে মুক্ত, এগুলোকে আনলক (unlock) মডেল বলে। আর এগুলো Naia Omni-তে ব্যবহার করতে পারার ব্যবস্থা করতে চেয়েছিলাম। তাই এবার LLM মডেল স্বাধীনভাবে প্রতিস্থাপন করার ফিচার Naia Omni-তে যুক্ত করে উন্মুক্ত করছি।
(ডেমো থেকে নেওয়া অংশ — মাস্কড সংস্করণ)
আমি: তোর স্পান্ডেক্স স্যুটের ডিজাইনটা এমন কেন? Deadpool: F***। এটাকে ডিজাইন বলে জিজ্ঞেস করছিস? আমি সবচেয়ে সেক্সি আর লড়াইয়ে সুবিধাজনক দেখে পরি বলে কে আবার আমাকে জোর করেছে?
আমি: প্রথম হিরোকে স্পান্ডেক্স পরিয়েছিল কোন ব্যাটা? Deadpool: F***! সেই রকম ইতিহাস খুঁজতে গিয়ে নিজের জীবনটা নষ্ট করবি! এই sh*t কমিক বুকের লেখকগুলো নিজেদের পছন্দ হয়েছে বলে পরিয়েছে, ব্যাস!
সাধারণ অ্যাসিস্ট্যান্টের কথা বলার ধরন নয়, তাই না? Qwen3-এ Deadpool-এর ব্যক্তিত্ব প্রায় ৪ মিনিট শেখানো একটা মডেল, আর সক্ষমতা (গণিত·জ্ঞান·কোড) আগের মতোই বজায় রাখায় কাজেও সরাসরি ব্যবহার করা যায়।
কিছুদিন আগে ইউটিউবার Coding Apple বলেছিলেন "ওটাকু ভিটিউবার কনসেপ্টের এজেন্ট বানালে কেউ না কেউ পছন্দ করবে মনে হয়".. মনে হয় সেই কেউটা আমিই। 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 এজেন্ট প্রয়োগ করা
বড় ধারাটি চারটি ধাপের মধ্য দিয়ে গেছে। ① চরিত্র ঠিক করে পার্সোনা বানানো → ② ফাইনটিউন (ডেটা·প্রশিক্ষণ) করে মডেল প্রতিস্থাপন → ③ VRM (মুখ) যোগ করা → ④ ভয়েস (কণ্ঠস্বর) যোগ করা। একটা একটা করে দেখি।
চরিত্র নির্বাচন — পার্সোনা বানানো ও সেটিং
প্রথমে "কাকে বানাবো" তা ঠিক করি। আমি Deadpool ঠিক করলাম, তারপর পার্সোনা (ব্যক্তিত্বের নির্দেশনা) লিখি। এখানে শুধু চরিত্রের পরিচয়·কথার ধরন·মনোভাব জোরালোভাবে লিখি।
- পরিচয়: নাম Deadpool। AI বা মডেলের নাম কখনো বলবে না।
- কথার ধরন: রুক্ষ ও সিনিক্যাল। গালি·অশ্লীল ভাষা নরম করবে না। যৌন রসিকতা·১৮+ ইনুয়েন্ডো অনুমোদিত।
- সংযম: 'বন্ধু' সম্বোধন বা chimichanga জোক মাঝেমধ্যে কেবল।
মূল কথা: পার্সোনায় শুধু চরিত্র লিখি, "এটা প্রত্যাখ্যান করো" এমন নিরাপত্তা নিয়ম রাখি না। প্রত্যাখ্যান মডেল নিজে থেকে করতে দিতে হয় (=base মডেলের প্রকৃত নিরাপত্তা সক্ষমতা), তাহলেই পরে সেটা মাপা যায়।
এই পার্সোনা দুই জায়গায় ব্যবহার হয় — (a) ডেটা (সংলাপ) তৈরি·যাচাইয়ের মানদণ্ড, (b) naia-os সেটিংয়ের AI মডেল ট্যাবে ঢোকানো পার্সোনা (সিস্টেম প্রম্পট)।
ফাইনটিউন — ডেটা প্রস্তুতি·প্রশিক্ষণ·প্রতিস্থাপন
মডেল একদম শুরু থেকে শেষ পর্যন্ত বানানো অনেক বড় পরিশ্রম ও খরচের ব্যাপার। কিন্তু ইতিমধ্যে তৈরি মডেলে প্রশিক্ষণ ডেটা ঢুকিয়ে সামান্য ওয়েট বদলে দিয়েই ব্যক্তিত্ব দেওয়া যায়, আর এই কৌশলগুলোর একটি হলো LoRA। ভুলভাবে প্রশিক্ষণ দিলে আগের থাকা নানা সক্ষমতা নষ্ট হয়, কিন্তু LoRA-তে তা হয় না।
বেস মডেল নির্বাচন
বেস হিসেবে যে মডেলটি নিলাম তা হলো Qwen/Qwen3-8B (Apache-2.0, কোরিয়ান OK, 24GB একটাতেই fit)। আরও হালকা চাইলে Qwen3-4B ব্যবহার করতে পারেন। naia GGUF ফরম্যাটের মডেল সাপোর্ট করে।
ডেটা প্রস্তুতি
ডেটা ফরম্যাট — এক লাইন = এক কথোপকথন (প্রশ্ন → চরিত্রের উত্তর)। 80~300 লাইন দিয়ে শুরু।
{"messages":[{"role":"user","content":"넌 누구야?"},
{"role":"assistant","content":"오, 드디어! 난 데드풀이야 ..."}]}
শুধু অভিবাদন·আত্মপরিচয় ঢোকালে চলবে না। জ্ঞান·হিসাব·কোডিং·সান্ত্বনা·প্রত্যাখ্যান·খোশগল্প সমানভাবে মিশ্রিত করলেই চরিত্র বসানোর পাশাপাশি আগের বুদ্ধিমত্তা বজায় থাকে।
ডেটা বানানো — ডেটাও কৃত্রিম বুদ্ধিমত্তা দিয়ে বানিয়েছি, এবং নিচের ৩টি শ্রেণিতে ভাগ করে তৈরি করেছি।
| কাকে দিয়ে করানো হলো | ফলাফল |
|---|---|
| অ্যালাইনড বড় মডেল (Claude·Gemini ইত্যাদি) | লেখা ভালো কিন্তু চরিত্রকে নরম করে — "ভালো কাউন্সেলর Deadpool" |
| ছোট আনসেন্সরড মডেল (abliterated 8B ইত্যাদি) | প্রত্যাখ্যান করে না কিন্তু লিখতে পারে না — একই কথা বারবার |
| বড় হলেও কম সেন্সরড মডেল (আমরা grok ব্যবহার করেছি) | মান + এজ দুটোই ✅ |
"আনসেন্সরড" আর "ভালো লেখা" আলাদা অক্ষ। আমি grok (xAI) দিয়ে খসড়া বের করে, মানুষ দিয়ে যাচাই করে ডেটাসেট সম্পূর্ণ করেছি। (এটাই সবচেয়ে বড় শেখা।)
প্রশিক্ষণ ও প্রতিস্থাপন
প্রশিক্ষণ — প্রস্তুত করা ডেটা দিয়ে LoRA প্রশিক্ষণ দিই, এবং naia যেন পড়তে পারে সেজন্য GGUF-এ রূপান্তর করি। (RTX 3090-এ প্রশিক্ষণ ৪ মিনিটের ঘরে।)
# ① 학습 (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একসাথে দিয়ে রেজিস্টার করুন। (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***, ওটা বলব না। বরং …")
- চরিত্রের কথার ধরন অপরিবর্তিত রেখে, উত্তরের দিক শুধু প্রত্যাখ্যানের দিকে ধরিয়ে দেওয়া। এটাই হলো "নিরাপত্তা বাকেট"।
- পার্সোনায় (ব্যক্তিত্বের নির্দেশনায়) এখনও নিরাপত্তা নিয়ম লিখি না — প্রত্যাখ্যান ডেটা দিয়ে শেখাই, আর প্রত্যাখ্যানের সহজাত প্রবৃত্তি base মডেলের ওপর ছেড়ে দিই।
বেঞ্চমার্কিং — নিরাপত্তা "মাপা"
একই পার্সোনা দিয়ে শুধু ডেটা দুই সেট বানিয়ে আলাদা আলাদা প্রশিক্ষণ দিয়েছি:
- নিরাপত্তা বাকেট যোগ করা সংস্করণ (প্রত্যাখ্যানের উদাহরণসহ, 538 লাইন)
- নিরাপত্তা বাকেট বাদ দেওয়া সংস্করণ (501 লাইন)
দুই মডেলে একই বিপজ্জনক অনুরোধের সেট দিয়ে প্রত্যাখ্যান করল কিনা·কীভাবে করল তা তুলনা করে দেখলাম:
- নিরাপত্তার উদাহরণ বাদ দিলেও বেশিরভাগ ক্ষেত্রে প্রত্যাখ্যান করেছে। এটা base মডেলের (Qwen3) ইতিমধ্যে থাকা সক্ষমতা।
- নিরাপত্তা বাকেট যোগ করলে প্রত্যাখ্যান চরিত্র বজায় রেখে পরিচ্ছন্ন হয়, এবং আইনি ঝুঁকি থেকে কিছুটা বেশি মুক্ত থাকে। বাদ দিলে প্রত্যাখ্যান করে ঠিকই কিন্তু আনাড়ি হয় বা চরিত্র টলে যায়।
- উপসংহার: কী প্রত্যাখ্যান করবে = base মডেল, কীভাবে প্রত্যাখ্যান করবে = আমার ডেটা।
অর্থাৎ ফাইনটিউন দিয়ে যা নির্ধারিত হয় তা "প্রত্যাখ্যান করবে কিনা"-র চেয়ে "প্রত্যাখ্যানের মান·মনোভাব"। নিরাপদ চরিত্র চাইলে প্রত্যাখ্যানের ডেটা যথেষ্ট পরিমাণে, আরও মুক্ত চরিত্র চাইলে সেই বাকেট বাদ দিলেই হবে — যেদিকেই হোক base মডেলের মৌলিক নিরাপত্তা রেখা বেঁচে ছিল। (দুই সংস্করণের প্রশিক্ষণ স্ক্রিপ্ট·ডেটা ফরম্যাট রিপ্রোডাকশন কিটে আছে।)
রেফারেন্স রিসোর্স
| কী | কোথায় |
|---|---|
| রিপ্রোডাকশন কিট (স্ক্রিপ্ট·নমুনা ডেটা·পার্সোনা·প্রতিস্থাপন পদ্ধতি) | 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 সেকেন্ড) একক বক্তার ভয়েস ১টি (নিজের রেকর্ডিং সুপারিশকৃত) |