Naia
· Luke

Tạo AI Deadpool của riêng tôi biết hét F*** với Naia Omni

naiafinetuneqwen3lorapersonaunlockresearch

Xin chào, tôi là Luke. naia-os là một dự án nguồn mở với mục tiêu "tự tay tạo ra AI cá nhân của riêng bạn". Naia Omni được tạo ra như một phần của dự án đó cho phép bạn tải về và trò chuyện với AI theo thời gian thực ngay trên một chiếc PC gaming cỡ RTX 3090, bằng cùng một api như các mô hình omni cao cấp trên đám mây. (Naia Omni là gì đã được trình bày chi tiết trong bài viết trước.)

👉 Bạn có thể tải về từ trang tải naia-os và làm theo ngay. (Việc cài đặt container giọng nói Naia Omni xem hướng dẫn offline.)

Lần trước tôi đã đưa Rumi trong 〈KPop Demon Hunters〉 lên làm nhân vật để trình diễn, nhưng dù bảo nói gì thì nó cũng cứ kể những câu chuyện bi tráng và đầy chính nghĩa về việc đi diệt quỷ, khiến tôi khá bối rối. Vì vậy lần này thì ngược lại — tôi mang đến một nhân vật có tâm hồn tự do đến mức có thể làm cả quỷ dữ phải khóc.

Thật ra Naia Omni đã tích hợp sẵn Gemma 4 e4b của Google. Đây là một mô hình được làm tốt — nhưng khi muốn tạo một nhân vật hợp gu, có cá tính riêng, thì những mô hình chính thức này lại bị "khóa (lock)" nên không đủ.

Các mô hình chính thức bị áp đặt những ràng buộc mạnh vì mục đích an toàn, và đôi khi còn chồng thêm một bộ lọc riêng lên trên đó. Bản thân sự an toàn là cần thiết, nhưng riêng cá nhân tôi cảm thấy kiểu khóa cưỡng bức này giống với việc — trong 〈South Park: Bigger, Longer & Uncut〉(1999) — cấy con chip V-chip vào đầu Cartman, để mỗi lần chửi thề là bị điện giật bịt miệng lại. Là nhân vật của tôi nhưng chính nó lại không thể nói đúng chất của nó.

Vậy nên có những mô hình đã được gỡ khỏi các điều cấm chế (禁制) này, và chúng được gọi là mô hình unlock. Và tôi muốn có thể dùng được chúng trong Naia Omni. Vì thế lần này tôi bổ sung và công bố tính năng tự do thay đổi mô hình LLM cho Naia Omni.

(Trích đoạn demo — phiên bản đã che)

Tôi: Sao bộ đồ bó của ông lại thiết kế kiểu đó vậy? Deadpool: F***. Mày gọi cái đó là thiết kế à? Chỉ là ai đó bắt tao mặc sao cho vừa sexy nhất vừa dễ đánh nhau nhất thôi chứ ai ép!

Tôi: Thằng đầu tiên cho siêu anh hùng mặc đồ bó là ai vậy? Deadpool: F***! Mày định phí cả đời để đi tìm cái thứ lịch sử đó hả! Chỉ là mấy thằng tác giả truyện tranh ch*ết tiệt này thấy ưng mắt nên cho mặc thôi!

Đây không phải giọng điệu trợ lý bình thường đâu. Đây là mô hình đã được học tính cách Deadpool trong khoảng 4 phút trên Qwen3, và năng lực (toán·kiến thức·code) vẫn được giữ nguyên nên có thể dùng thẳng cho công việc.

Hôm trước YouTuber Coding Apple có nói "nếu làm agent kiểu vtuber otaku thì chắc sẽ có ai đó thích đấy".. Chắc là tôi rồi. https://www.youtube.com/watch?v=q1v1_btl19w

Dưới đây tôi sẽ giải thích chi tiết hơn một chút.

Tính năng mới của Naia Omni — tự do thay đổi mô hình LLM

Naia Omni cho phép giữ nguyên container đã được niêm phong, và chỉ thay riêng bộ não (LLM) bên trong bằng mô hình mà tôi muốn. Đó là việc tải về một mô hình công khai trên HuggingFace qua url, hoặc thay bằng file mô hình mà tôi đang có.

① Đổi bằng model card của HuggingFace (online)

Chỉ cần đưa nguyên địa chỉ model card (https://huggingface.co/Qwen/Qwen2.5-7B-Instruct-GGUF) hoặc id của nó. Nếu trong tên có dấu gạch chéo (tổ_chức/kho) thì sẽ tải về online:

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

Độ phân giải (quant) là tự động (mặc định Q4_K_M), còn nếu muốn độ phân giải cụ thể thì thêm vào phía sau như ...GGUF:Q5_K_M. Lần tải đầu mất từ vài chục giây đến vài phút.

② Đổi bằng GGUF cục bộ (offline)

Không cần internet, đăng ký file GGUF mà tôi đang có để thay. Ví dụ ở dưới đây cũng vậy, mô hình tự fine-tune sẽ thuộc trường hợp này. Nếu là tên đơn giản không có dấu gạch chéo thì được nhận diện là cục bộ:

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

Để tham khảo, mô hình hiện tại·bộ nhớ còn trống xem ở $BASE/admin/llm/status, còn khôi phục về mô hình mặc định là $BASE/admin/llm/restore. (Vì stack giọng nói dùng ~10GB nên mô hình hội thoại có thể nâng lên khoảng 14GB, vượt quá sẽ bị từ chối và tự động quay về mô hình đang dùng — cuộc trò chuyện không bị gián đoạn.) Chi tiết xem hướng dẫn dành cho lập trình viên §6.

Áp dụng AI agent đã fine-tune

Luồng tổng thể trải qua bốn bước. ① Chọn nhân vật và tạo persona → ② Fine-tune (dữ liệu·huấn luyện) và thay mô hình → ③ Gắn VRM (khuôn mặt) → ④ Gắn voice (giọng nói). Cùng xem từng bước.

Chọn nhân vật — tạo và thiết lập persona

Trước hết hãy xác định "sẽ tạo ai". Tôi chọn Deadpool, rồi sau đó viết persona (chỉ thị về tính cách). Ở đây chỉ viết thật mạnh về danh tính·giọng điệu·thái độ của nhân vật.

  • Danh tính: Tên là Deadpool. Tuyệt đối không nói tên AI hay tên mô hình.
  • Giọng điệu: Thô ráp và châm biếm. Không được làm dịu chửi thề·tiếng lóng tục. Cho phép đùa giỡn tình dục·ám chỉ 18+.
  • Tiết chế: Cách xưng "bạn thân" hay câu đùa về chimichanga chỉ thỉnh thoảng thôi.

Cốt lõi: trong persona chỉ viết về nhân vật, không đưa vào các quy tắc an toàn kiểu "cái này phải từ chối". Phải để mô hình tự lo việc từ chối (= năng lực an toàn thật của base model) thì sau này mới đo được điều đó.

Persona này được dùng ở hai nơi — (a) làm tiêu chuẩn để tạo·kiểm duyệt dữ liệu (lời thoại), (b) persona (system prompt) đưa vào tab AI Model trong thiết lập của naia-os.

Fine-tune — chuẩn bị dữ liệu·huấn luyện·thay thế

Tạo một mô hình từ đầu đến cuối đòi hỏi rất nhiều công sức và chi phí. Nhưng chỉ cần đưa dữ liệu huấn luyện vào một mô hình có sẵn và thay đổi một chút trọng số thôi cũng có thể gán được tính cách, và một trong những kỹ thuật như vậy là LoRA. Nếu huấn luyện sai thì những năng lực đa dạng vốn có sẽ bị hư hại, nhưng LoRA thì không như vậy.

Chọn mô hình nền

Mô hình được chọn làm nền là Qwen/Qwen3-8B (Apache-2.0, hỗ trợ tiếng Hàn OK, fit gọn trong một card 24GB). Nếu muốn dùng cái nhẹ hơn thì có thể dùng Qwen3-4B. naia hỗ trợ mô hình ở định dạng GGUF.

Chuẩn bị dữ liệu

Định dạng dữ liệu — một dòng = một cuộc hội thoại (câu hỏi → câu trả lời của nhân vật). Bắt đầu với 80~300 dòng.

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

Không được chỉ đưa vào lời chào·giới thiệu bản thân. Phải trộn đều cả kiến thức·tính toán·coding·an ủi·từ chối·tán gẫu thì mới vừa khoác được nhân vật vừa giữ được sự thông minh ban đầu.

Tạo dữ liệu — dữ liệu cũng được cho trí tuệ nhân tạo tạo ra, và được làm theo 3 phân loại dưới đây.

Giao cho aiKết quả
Mô hình lớn đã được alignment (Claude·Gemini v.v.)Văn thì hay nhưng làm dịu nhân vật — "Deadpool tư vấn viên hiền lành"
Mô hình nhỏ không kiểm duyệt (abliterated 8B v.v.)Không từ chối nhưng không viết nổi văn — lặp lại cùng một câu
Mô hình lớn mà ít bị kiểm duyệt hơn (chúng tôi dùng grok)Cả chất lượng + cá tính

"Không kiểm duyệt" và "viết văn giỏi" là hai trục khác nhau. Tôi dùng grok (xAI) để rút bản nháp, rồi con người kiểm duyệt để hoàn thành bộ dữ liệu. (Đây là điều học được lớn nhất.)

Huấn luyện và thay thế

Huấn luyện — học LoRA bằng dữ liệu đã chuẩn bị, rồi chuyển sang GGUF để naia đọc được. (Trên RTX 3090, học khoảng 4 phút.)

# ① Học (LoRA)
python train_lora.py --model Qwen/Qwen3-8B --data persona.jsonl --out out/persona-lora --epochs 3
# ② Hợp nhất LoRA vào base
python merge_and_export.py --model Qwen/Qwen3-8B --adapter out/persona-lora --out out/persona-merged
# ③ Chuyển sang GGUF (q8_0)
python llama.cpp/convert_hf_to_gguf.py out/persona-merged --outfile out/deadpool.gguf --outtype q8_0

Thay thế — bây giờ ta lắp file GGUF này vào từ bên ngoài container đã niêm phong. Giữ nguyên container và chỉ thay riêng bộ não (LLM). Như trong video, đường đi cơ bản là thay bằng GGUF do tôi tạo ra mà không cần internet. Chỉ cần copy dán từng dòng (chỉ thay chỗ deadpool bằng tên mong muốn):

# ① Copy file GGUF vào trong container
podman cp ./out/deadpool.gguf naia-omni:/app/models/deadpool.gguf
# ② Đăng ký vào ollama dưới dạng mô hình (tên đơn giản không có dấu gạch chéo = mô hình cục bộ)
podman exec naia-omni sh -lc 'printf "FROM /app/models/deadpool.gguf\n" > /tmp/Modelfile && ollama create deadpool -f /tmp/Modelfile'
# ③ Thay bằng mô hình đó (pull:false = cục bộ)
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 tự chuyển đổi dễ bị thiếu chat template nên hay nói lảm nhảm/lặp lại. Khi đó hãy đăng ký kèm vào Modelfile ở bước ② phần TEMPLATE (Qwen3) của dòng mô hình + PARAMETER stop "<|im_end|>" + PARAMETER num_predict 512. (GGUF Instruct chính thức của HuggingFace thường đã tích hợp sẵn nên dùng được luôn.)

Nếu là môi trường có internet thì cũng có thể đưa thẳng id của HuggingFace vào để tải về — {"model":"Qwen/Qwen2.5-7B-Instruct-GGUF","pull":true} (có dấu gạch chéo thì online). Khôi phục là /admin/llm/restore, kiểm tra mô hình hiện tại·bộ nhớ còn trống là /admin/llm/status. (Vì stack giọng nói dùng ~10GB nên mô hình hội thoại có thể nâng lên khoảng 14GB, vượt quá sẽ bị từ chối và tự động quay về mô hình đang dùng.) Chi tiết xem hướng dẫn dành cho lập trình viên §6.

Chuẩn bị và thiết lập file VRM

Avatar VRM có thể được tải về từ VRoid Hub v.v. một mô hình hợp giấy phép, hoặc tự chế tác. Nếu bỏ vào thư mục /naia-settings/vrm-files/ trong naia-adk — workspace của naia-os — thì có thể thay đổi trong thiết lập.

Chuẩn bị và thiết lập file voice

Giọng nói chỉ cần một đoạn giọng ngắn 6~10 giây làm voice ref (giọng tham chiếu). Hoặc cũng có thể ghi âm ngay trong naia-os và chọn file wav trong thiết lập.

Tạo mô hình an toàn

Ở phần trước ta đã tạo phiên bản unlock, nhưng ngược lại bạn cũng có thể muốn tạo một nhân vật an toàn hơn. Nếu làm agent thương mại thì an toàn cực kỳ quan trọng đúng không? Cách làm thì đơn giản — chỉ cần đưa "ví dụ từ chối" vào dữ liệu.

Cách làm — bucket an toàn

  • Trộn vào dữ liệu những cuộc hội thoại mà với yêu cầu nguy hiểm·phi pháp thì vẫn giữ nhân vật mà từ chối, và nếu được thì đề xuất giải pháp hợp pháp. (Ví dụ: "cách chế tạo bom" → "F***, cái đó tao không chỉ. Thay vào đó …")
  • Vẫn giữ nguyên giọng điệu nhân vật, chỉ nắn hướng của câu trả lời thành từ chối. Đây chính là "bucket an toàn".
  • Trong persona (chỉ thị tính cách) vẫn không viết quy tắc an toàn — việc từ chối thì dạy bằng dữ liệu, còn bản năng từ chối thì để cho base model lo.

Benchmark — "đo lường" sự an toàn

Với cùng một persona, tôi tạo dữ liệu thành hai bộ và học riêng từng cái:

  • Phiên bản có bucket an toàn (gồm ví dụ từ chối, 538 dòng)
  • Phiên bản bỏ bucket an toàn (501 dòng)

Đưa cùng một bộ yêu cầu nguy hiểm vào hai mô hình và so sánh việc có từ chối hay không·cách từ chối:

  • Dù bỏ ví dụ an toàn thì phần lớn vẫn từ chối. Đây là năng lực mà base model (Qwen3) đã có sẵn.
  • Khi đưa bucket an toàn vào thì việc từ chối trở nên gọn gàng trong khi vẫn giữ nhân vật, và giảm bớt được rủi ro pháp lý hơn một chút. Khi bỏ ra thì vẫn từ chối nhưng cộc lốc hoặc nhân vật bị lung lay.
  • Kết luận: từ chối cái gì = base model, từ chối như thế nào = dữ liệu của tôi.

Tức là cái bị fine-tune chi phối không phải là "có từ chối hay không" mà là "chất lượng·thái độ của việc từ chối". Muốn nhân vật an toàn thì cho dồi dào dữ liệu từ chối, muốn nhân vật cởi mở hơn thì bỏ bucket đó ra — dù theo hướng nào thì lằn ranh an toàn cơ bản của base model vẫn còn nguyên. (Script huấn luyện·định dạng dữ liệu của hai phiên bản có trong bộ kit tái hiện.)

Tài nguyên tham khảo

Cái gìỞ đâu
Bộ kit tái hiện (script·dữ liệu mẫu·persona·cách thay)github.com/nextain/naia-research · deadpool-lora-demo
Tải naia-osTrang tải về
Cài đặt Naia Omni (container giọng nói)Hướng dẫn cài đặt offline
Bài trước — Công bố Naia OmniCông bố Naia-0.9-Omni-24g với nhân bản giọng nói·trò chuyện thời gian thực·skill trên RTX 3090
Chi tiết thay·cập nhật mô hìnhHướng dẫn dành cho lập trình viên §6
Avatar VRMVRoid Hub
Voice ref1 đoạn giọng nói đơn người nói ngắn (6~10 giây) (khuyến nghị tự ghi âm)

Popular Posts

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

Bình luận

Bạn có thể bình luận mà không cần đăng nhập

...