24 điểm bởi GN⁺ 2025-05-14 | 2 bình luận | Chia sẻ qua WhatsApp
  • Cách tự tạo một trợ lý giọng nói cá nhân chạy on-device mà không phụ thuộc vào API LLM hay đám mây
  • Trợ lý này có thể hiểu ngôn ngữ tự nhiên, thực hiện gọi hàm cá nhân, và chỉ hoạt động cục bộ, nhờ đó có thể đảm bảo quyền riêng tư tuyệt đối
  • Để làm điều đó, bài viết fine-tune mô hình LLaMA 3.1 bằng LoRA, dùng Whisper để chuyển giọng nói thành văn bản, rồi diễn giải thành lệnh để chạy trực tiếp trên thiết bị
  • Dự án gồm tạo dataset → fine-tuning → kết nối giao diện giọng nói → kiểm thử và triển khai, và được cung cấp dưới dạng loạt mini course miễn phí gồm 5 phần
  • Bài viết cảnh báo về ngộ nhận “chạy on-device = đơn giản”, đồng thời nhấn mạnh rằng ngay cả ở môi trường cục bộ cũng cần tư duy MLOps và kiểm soát chất lượng nghiêm ngặt

Vì sao nên xây dựng trợ lý giọng nói cục bộ ngay bây giờ?

  • Trò chuyện với ChatGPT rất hữu ích, nhưng có cần gửi cả những lệnh đơn giản lên đám mây hay không?
  • Nếu mô hình được cài trực tiếp trên thiết bị của bạn, bạn có thể đảm bảo cả tốc độ, quyền riêng tưquyền kiểm soát
  • Đặc biệt hữu ích trong các môi trường nhạy cảm như y tế, pháp lý, công cụ nội bộ

Tổng quan kiến trúc

Các thành phần của dự án

  1. Nhận dạng giọng nói (Whisper) → chuyển thành văn bản
  2. LLM (LLaMA 3.1) → diễn giải lệnh
  3. Bộ thực thi hàm → chạy các chức năng thực tế như lock_screen()

Phần 1: Kiến trúc và tư duy MLOps

Vì sao cục bộ vẫn cần MLOps

  • Vẫn tồn tại các vấn đề như model drift, thay đổi prompt, độ tin cậy của dataset, thiếu logging để debug
  • Suy nghĩ rằng “chỉ cần chạy cục bộ là đủ” là nguy hiểm, và cần một cách tiếp cận có hệ thống

Phát triển online vs thực thi offline

  • Giai đoạn phát triển (fine-tuning, tạo dữ liệu) diễn ra trên đám mây, còn giai đoạn thực thi chạy cục bộ
  • Tách biệt rõ ràng hai quá trình này và quản lý chúng có hệ thống là trọng tâm của MLOps

Tạo dataset (Dataset Generation Flow)

  • Không chỉ là thu thập prompt đơn thuần, mà là thiết kế mẫu gọi hàm có cấu trúc và cấu trúc yêu cầu hội thoại
  • Tạo dataset chất lượng cao bao quát nhiều cách diễn đạt, ý định và các trường hợp thất bại

Điểm chính

  • lock_screen() → bao gồm nhiều cách diễn đạt ngôn ngữ tự nhiên như “khóa màn hình giúp tôi”
  • Dùng engine kiểm chứng tự động để xác nhận đầu ra có đúng hình thức mong muốn hay không

Fine-tuning (Instruction Tuning for Function Calling)

  • Fine-tune mô hình nhỏ (theo cách SFT) để ánh xạ lệnh chính xác
  • Sử dụng các công cụ thực tế như Unsloth, W&B, xuất định dạng GGUF

Mục tiêu

  • Chuyển LLaMA 3.1 8B thành mô hình 4bit có thể chạy cục bộ
  • Hướng tới tối ưu nhẹ để có thể nhắm tới cả Raspberry Pi

Kết nối mô hình và thực thi thực tế

  • Dùng Whisper để chuyển đầu vào giọng nói thành văn bản
  • LLM đã fine-tune sẽ diễn giải lệnh
  • Kết nối với bộ thực thi hàm API cục bộ (lock_screen(), get_battery_status() v.v.)

Kết quả

  • Có thể vận hành trợ lý giọng nói thời gian thực
  • Không cần mạng, không rò rỉ dữ liệu cá nhân, người dùng kiểm soát hoàn toàn

Quản lý rủi ro ở giai đoạn offline

  • Cần kiểm thử trên nhiều thiết bị và hệ điều hành khác nhau
  • Bắt buộc xây dựng hệ thống logging (theo hình thức opt-in, gửi thủ công)
  • Trước khi phát hành chính thức, cần stress test và lấy phản hồi người dùng để phát hiện vấn đề sớm

Kế hoạch sắp tới

  • Trong bài tiếp theo sẽ thực hành tạo dataset cho function calling
  • Xây dựng có cấu trúc dataset chuyên dụng để học ánh xạ từ lệnh ngôn ngữ tự nhiên → gọi API
  • Cấm scraping, chỉ dùng mô phỏng dựa trên prompt và dữ liệu kiểm chứng tự động

Kết luận

  • Hệ thống AI cục bộ có vẻ đơn giản, nhưng độ ổn định và chất lượng đòi hỏi mức quản lý cao hơn
  • Do không thể phụ thuộc vào cloud log hay hotfix, nên cần mức độ tin cậy và trách nhiệm cao hơn
  • Vì vậy cần áp dụng tư duy MLOps và thiết kế có cấu trúc ngay từ đầu

> “Đã đến thời đại xây dựng trợ lý AI thực sự lấy quyền riêng tư làm trung tâm, local-first”
> Ở phần tiếp theo sẽ bắt đầu thực hành tạo dataset cho ánh xạ lệnh-hàm thực tế.

2 bình luận

 
asheswook 2025-05-15

3.1 thì người dùng không nói tiếng Anh khó dùng, còn nếu dùng 3.3 hoặc 4 thì có vẻ cả tiếng Hàn cũng sẽ được, nhưng nếu định chạy on-device thì xét đến việc với ngôn ngữ không phải tiếng Anh phải ít nhất từ 32b trở lên mới có ý nghĩa, nên có lẽ hiện vẫn còn khó...

 
GN⁺ 2025-05-14
Ý kiến trên Hacker News
  • Tôi rất thích ý tưởng này nên muốn tự làm thử, nhưng trải nghiệm dùng các model nhỏ của whisper ở local trước đây không được như kỳ vọng, nên khá tò mò liệu có ai đã đạt kết quả đủ tốt cho kiểu use case này chưa, cũng có thể do microphone của tôi không tốt
    • Nhất định nên kiểm tra lại tình trạng microphone, ở công ty chúng tôi dùng Whisper để ghi chép và dịch toàn bộ cuộc họp theo thời gian thực, và hiệu năng của nó rất xuất sắc
    • Tôi tò mò bạn đang dùng model nào, tôi thường dùng model large trên GPU, vừa nhanh vừa hoạt động rất tốt, nhưng cần lưu ý là nó chỉ nhận diện được một ngôn ngữ mỗi lần, nếu không chỉ định thì sẽ chạy ở chế độ tự động nhận diện, các model nhỏ rõ ràng kém hơn về hiệu năng và nhiều trường hợp chủ yếu chỉ hỗ trợ tiếng Anh, với tôi thì large cho chất lượng tốt nhất nhưng để đạt tốc độ thực sự dùng được thì bắt buộc phải có phần cứng GPU, kể cả khi dùng cùng faster-whisper hay insanely-fast-whisper cũng vậy
  • Sẽ tuyệt biết bao nếu đây là một sản phẩm hay ứng dụng có thể chỉ cần cài vào là dùng được, tôi muốn thiết lập và huấn luyện dễ dàng qua UI, nhưng dù vậy tôi vẫn rất biết ơn vì nhờ hướng dẫn này mà có vẻ tôi sẽ tạo được đúng thứ mình muốn
  • Tài liệu thật sự rất hay, tôi muốn gửi lời cảm ơn, tôi vẫn chưa làm theo hết, nhưng khá tò mò liệu model này có thực sự chạy tốt trên iPhone không, đứa con 9 tuổi ở nhà tôi đã chạy ổn model Qwen 0.6B bằng ollama, nhưng các model khác thì chậm đến mức không mang lại trải nghiệm người dùng đủ tốt
    • À, hóa ra là nói về chiếc điện thoại 9 năm tuổi, tôi đã giật mình tưởng là một đứa trẻ tiểu học đang tự triển khai model, hồi bằng tuổi đó tôi còn đang học bảng cửu chương
    • Theo tài liệu của MLC thì ngay cả model cỡ 8B cũng có thể chạy trên iOS, nhưng khoảng 1-3B có vẻ thực tế hơn, tài liệu tham khảo ở đây: https://llm.mlc.ai/docs/deploy/ios.html#bring-your-own-model
  • Tại sao đây lại phải là một bài do LLM viết? Tôi thấy khó hiểu
    • Kiểu phong cách tóm tắt này, tức là format rất nặng và (!) mọi đoạn đều ở dạng bullet list, khiến tôi cực kỳ bối rối, nhất là với bài dài thì màn hình trông rối mắt và đơn điệu nên cảm giác khá khó đọc
  • Gần đây tôi nhận ra rằng Siri đang hoạt động cục bộ ít nhất với một số lệnh nhất định (có thể tôi đã bỏ lỡ thông báo), ví dụ bạn có thể để Apple Watch ở chế độ máy bay rồi thử yêu cầu đặt timer hoặc reminder
    • Siri ít nhất từ iOS 15 đã có khả năng offline hạn chế, nhưng phần lớn người dùng không nhận ra điều đó, vì đa số lệnh của Siri vẫn cần kết nối mạng
  • Tôi thắc mắc vì sao Apple không phân tích dữ liệu để chuẩn bị các handler hard-code cho khoảng 1000 use case phổ biến nhất
    • Thực ra họ đã làm việc đó rồi, nhưng tiến độ quá chậm, họ có thêm các chức năng liên quan đến độ sáng và nguồn điện, nhưng lại không hướng dẫn rõ những gì có thể dùng offline, nên người dùng chỉ có thể chuyển sang chế độ máy bay rồi tự thử từng thứ, trải nghiệm người dùng quá tệ
  • Dự án rất hay và phần tổng hợp cũng tốt
  • Tôi thắc mắc liệu Apple có cho phép thay Siri bằng trợ lý khác không, trên Android thì các trợ lý ngoài Google từ lâu đã bị hạn chế nghe nền, dùng phím cứng, cử chỉ hoặc phím tắt, tôi không chắc Google Assistant có còn được ưu ái như vậy không, nhưng nếu có thì cũng chẳng có gì đáng ngạc nhiên
    • Một phần nguyên nhân nằm ở coprocessor riêng (AOP) xử lý wake word “hey siri”, model cũng được compile vào firmware, về mặt kỹ thuật thì không phải là bất khả thi, nhưng không thể chỉ đơn giản để app Google chạy nền là xong, vì cử chỉ xảy ra khi AP đang ngủ, bạn có thể dùng nút Action bên cạnh để khởi chạy ứng dụng trợ lý, nhưng trải nghiệm sẽ không thật sự thỏa đáng (ví dụ ứng dụng có thể chưa mở), xem thêm ở đây: https://machinelearning.apple.com/research/hey-siri
    • Dùng Action Button mới được thêm vào thì việc mở một ứng dụng trợ lý thay thế qua shortcut tùy chỉnh khá dễ dàng
    • Perplexity cũng hoạt động theo cách này
  • Trong một năm rưỡi qua tôi đã dùng chatGPT rất đều đặn trên iPhone, và càng ngày càng ghét sự bực bội mà Siri mang lại, tôi tự hỏi bao giờ OpenAI với sự hỗ trợ của Microsoft sẽ tung ra một chiếc GPT phone để cạnh tranh với iPhone, tôi đã chán chiếc iPhone nhàm chán này rồi, tôi cần một chiếc GPT phone có thể để GPT thay tôi xử lý mọi thứ ngay từ màn hình khóa, tôi đang rất nóng lòng chờ nó ra mắt, và có cảm giác là họ chắc đang âm thầm phát triển nó