Hacker News Nổi bật (buzzing.cc bản dịch tiếng Trung)
Điểm AI 34/100

Sản phẩm

TERMy: Trợ lý dòng lệnh siêu tốc không cần dùng đến LLM

(giờ Việt Nam)

Tóm tắt AI

Dự án TERMy vừa ra mắt trên GitHub, cung cấp giải pháp hỗ trợ dòng lệnh tốc độ cao mà không phụ thuộc vào các mô hình ngôn ngữ lớn (LLM).

Chính văn · Bản dịch AI

NPC-Forge/docs/development.md at main · gioblu/NPC-Forge

Phát triển NPC-Forge và TERMy

Tôi yêu thích nghiên cứu và phát triển, có lẽ bạn đã từng nghe đến tôi qua PJON (Padded Jittering Operative Network). Đây là một giao thức mạng mà tôi bắt đầu phát triển từ năm 2010, gần đây đã được đại học ETH Zurich hiện thực hóa trên phần cứng nhờ vào nghiên cứu của Pius Sieber.

Tôi đã có cơ hội tập trung vào các dự án cá nhân trong 2 tháng kể từ đầu tháng 7, trong khoảng thời gian kỳ lạ khi giá AI tăng vọt và kỷ nguyên trợ giá token kết thúc. Tôi tò mò muốn biết liệu mình có thể tự phát triển từ đầu một trợ lý dòng lệnh (terminal assistant) có khả năng xử lý các yêu cầu ngôn ngữ tự nhiên đơn giản hay không. Tôi có trí nhớ kém và đã quen với việc yêu cầu Copilot "kích hoạt môi trường ảo" hoặc các thao tác tương tự, tiêu tốn một khoản tiền không nhỏ mỗi tháng. Tôi bắt đầu suy nghĩ, liệu mình có thể làm gì đó để quy trình làm việc hiệu quả hơn không? Liệu tôi có thực sự cần hàng nghìn tỷ tham số để hoàn thành những tác vụ đó?

Transformers tại nhà

Tôi đã bắt đầu một nghiên cứu mở về tính khả thi của việc triển khai một mô hình tạo sinh tại nhà và huấn luyện nó từ đầu trên chiếc máy tính mà tôi từng dùng để chơi Kerbal Space Program vào đầu những năm 2010, nay đã được "nâng cấp" với 16GB RAM, NVIDIA GTX 1050 Ti (4GB VRAM) và CPU i7-4790K (4.0GHz 8 nhân). Trong các thử nghiệm của mình, tôi có xu hướng tìm kiếm sự tối giản, vì vậy tôi tự đặt ra một môi trường hạn chế để buộc bản thân phải hướng tới một giải pháp thanh lịch và hiệu quả.

Đầu tiên, tôi phát triển một framework để huấn luyện và đánh giá các mô hình transformer, được tôi viết từ đầu bằng Python. Tôi bắt đầu với thứ gì đó rất giống NanoGPT với 100-200 triệu tham số, sau đó thêm flash attention và tất cả các tối ưu hóa cần thiết, thậm chí tôi còn thử nghiệm các kiến trúc mới như Mamba. Kết quả nhìn chung không thỏa đáng, thậm chí kỳ quặc đến mức đáng sợ, như ví dụ sau:

(từ "excrements" đã được sử dụng thay cho một từ chửi thề gồm 4 chữ cái mà tôi không muốn công bố ở đây)

Tất cả các thử nghiệm của tôi đều tạo ra các mô hình có xu hướng rơi vào vòng lặp, lặp đi lặp lại cùng một câu, và ngay cả khi được huấn luyện trên dữ liệu hỏi đáp (QA), chúng hiếm khi có thể trả lời nhất quán các câu hỏi, đặc biệt là các câu hỏi kỹ thuật. Tôi đã huấn luyện các mô hình trên một bộ sưu tập sách miễn phí từ Project Gutenberg, rất nhiều phần mềm mã nguồn mở và các tập dữ liệu khác nhau có sẵn trên Huggingface.

Tôi nhanh chóng hiểu rằng cách tiếp cận này không khả thi; một quá trình huấn luyện hoàn chỉnh sẽ cần ít nhất một tháng chạy liên tục. Tôi kinh ngạc trước việc các mô hình của mình trông có vẻ sống động và kỳ diệu, nhưng tôi cũng cảm thấy xấu hổ vì chúng cực kỳ lãng phí tài nguyên và thực tế là vô dụng.

Các mô hình cục bộ (Local models)

Tôi chuyển hướng sang ollama và các mô hình mở (open-weight), đồng thời phát triển howto, một công cụ dòng lệnh khác sử dụng pre-prompt để ép mô hình chỉ trả lời bằng các lệnh terminal. Kết quả nhìn chung không thỏa đáng do thời gian chờ phản hồi quá lâu. Các mô hình như ornith:9b, mistral:7b hoặc cogito:14b đôi khi có thể hoàn thành công việc, nhưng chúng không đủ nhanh và đáng tin cậy cho nhu cầu sử dụng chung, đặc biệt là khi bạn chỉ có 4GB VRAM.

Chuyển sang hướng tất định (Deterministic)

Sau đó, tôi nhớ lại cơn sốt blockchain, khi mọi người đều muốn nhồi nhét blockchain vào bất cứ đâu và quảng bá nó như một bước tiến lớn tiếp theo. Tôi không muốn lãng phí thời gian và tiền bạc như tất cả những người đó trong chu kỳ cường điệu trước đây, vì vậy tôi bắt đầu xây dựng một trợ lý dòng lệnh từ đầu với một bộ ràng buộc mới:

Định dạng tập dữ liệu

Những thứ đầu tiên tôi cần là một bộ quy ước để dựa vào, vì vậy tôi đã soạn thảo NDF 0.0 (NPC-Forge Dataset Format), định dạng quy định cấu trúc tập dữ liệu của NPC-Forge. Đối tượng sau đây chứa danh mục, các câu đầu vào, phản hồi văn bản, dấu vết tư duy, kiểm soát quyền hạn và các lệnh gọi công cụ sẽ được thực thi ở định dạng tương thích với VS Code.

Tôi thực sự yêu thích điều này, nó là một nguyên tử tri thức khép kín có thể dễ dàng chỉnh sửa và chia sẻ. Việc mở rộng khả năng của các tác nhân hội thoại rất đơn giản nếu bạn tuân thủ quy ước này; giả sử tôi muốn trợ lý dòng lệnh của mình học về các lệnh docker, tôi chỉ cần viết một danh sách các đối tượng trong dataset_docker.json, thả tệp đó vào thư mục tập dữ liệu, và NPC sẽ học chúng ngay lập tức giống như Neo học Jujitsu trong phim The Matrix.

Vấn đề tiếp theo cần giải quyết là làm thế nào để xử lý các câu hỏi như "tạo tệp test.txt"? Tôi cần phân tích "biến" trong đó và hiểu ý nghĩa thực sự của yêu cầu, vì vậy tôi đã nghĩ ra cách này:

Mỗi thẻ như <||vocab_create||> đại diện cho một khái niệm, trong trường hợp này là hành động tạo, được biểu thị bằng nhiều từ đồng nghĩa:

Một hoặc nhiều thẻ có thể được mong đợi tại cùng một vị trí và mỗi thẻ có thể là bắt buộc hoặc tùy chọn. Các "biến" hoặc thực thể được đặt tên sẽ được trích xuất dựa trên loại của chúng và một biểu thức chính quy (regular expression) liên quan:

Tôi phải cảm ơn người bạn tuyệt vời Kevin đã giúp tôi suy nghĩ về điều này.

Suy ngẫm về tính an toàn

Nhìn vào khóa quyền hạn, tôi kết luận rằng bằng cách bắt buộc sử dụng "permission": "ask" cho tất cả các lệnh có khả năng gây hại, công cụ này trở nên an toàn về bản chất; tất nhiên vẫn còn tiềm ẩn lỗi do con người, chẳng hạn như lỗi trong quá trình triển khai hoặc trong tập dữ liệu, nhưng các rủi ro đã được giảm thiểu đáng kể.

Quá trình triển khai

Tôi đã viết các lớp FlintParser và FlintNPC để sử dụng định dạng dữ liệu mô tả ở trên, triển khai một pipeline NLU (Hiểu ngôn ngữ tự nhiên) và tất cả các tính năng cần thiết để trợ lý dòng lệnh hoạt động chỉ trong khoảng 1000 dòng mã. Tôi đã viết các lớp này với các triển khai giống hệt nhau, tương thích chéo cho cả Python (đối với môi trường hệ điều hành cục bộ) và JavaScript (chạy phía client bên trong bất kỳ tab trình duyệt hoặc instance Node.js nào).

Phần khó nhất là xác định phải làm gì và theo thứ tự nào. Tôi đã làm việc rất nhiều trên một trình biên dịch cho ngôn ngữ lập trình của riêng mình là BIPLAN, và trong quá trình đó, tôi có vinh dự được học rằng điều đầu tiên cần làm khi dịch mã là loại bỏ nhiễu, sau đó tìm cách giải quyết bằng những con đường ít tốn kém nhất trước.

Và đây là pipeline mà tôi đã triển khai:

Bước 5 dựa trên:

Lần đầu tiên sau gần 2 tháng "ném mì ống lên tường và hy vọng chúng dính lại", tôi lại cảm nhận được niềm vui khi làm việc trên một thứ gì đó dễ hiểu và có thể dự đoán được. Cuối cùng tôi đã có một trợ lý dòng lệnh đáng tin cậy hoạt động trên máy tính của mình!

Tôi quyết định gọi nó là TERMy:

Điều này so với các framework NLU đã được thiết lập thì sao? Rasa và NLP.js rất nặng nề và dựa vào các bộ phân loại học máy cùng các pipeline huấn luyện, ChatScript thì đồ sộ với đường cong học tập nổi tiếng là khó khăn. NPC-Forge loại bỏ tất cả những điều đó, không yêu cầu huấn luyện, chỉ định một định dạng dữ liệu mạnh mẽ và linh hoạt, đồng thời sở hữu một bộ phân tích cú pháp đủ nhỏ để chạy trên vi điều khiển.

Hãy kết nối nó với Copilot

Tôi đã phát triển TERMy và kết nối nó với Copilot để xử lý một tập hợp con các câu lệnh mà trước đây tôi thường gửi cho Claude! Nó không phải là một LLM nhưng nó hoàn thành công việc và phản hồi tức thì! Tôi nghi ngờ đây là lần đầu tiên hầu hết chúng ta thấy một tác nhân tất định sử dụng một bộ khung (harness), mặc dù tôi tin rằng đây sẽ là chủ đề phổ biến trong tương lai gần:

Thật trớ trêu khi nghĩ rằng việc tăng giá gần đây của Copilot chính là điều cuối cùng đã thúc đẩy tôi dành thời gian cho phần mềm này. Có lẽ đó chỉ là vòng đời của các SaaS doanh nghiệp? Dù sao đi nữa, tôi tin rằng các bộ khung như Copilot và Pi nên dựa vào các NPC tất định như TERMy và chỉ chuyển hướng đến một LLM nặng nề như là phương án cuối cùng. Tiếp tục lãng phí tài nguyên tính toán và điện năng cho các tác vụ tầm thường là đắt đỏ và thiếu trách nhiệm.

NPC-Forge

NPC-Forge là một framework, một máy chủ và một CLI cung cấp các chức năng sau:

Với NPC-Forge, giờ đây bất kỳ ai cũng có thể nhanh chóng xây dựng một NPC và chia sẻ nó với cộng đồng. Các NPC đó chạy trên CPU của bất kỳ máy Linux nào, như RPI Zero, và phản hồi trong vài mili giây. Hãy tưởng tượng, giờ đây ngay cả đồng hồ đo điện hay bộ định tuyến của bạn cũng có thể phục vụ một tác nhân hội thoại miễn phí. Cách tiếp cận này cũng dân chủ hơn; NPC của bạn sẽ sẵn lòng nói ra những điều khó chịu nếu bạn lập trình cho nó làm như vậy, tốt hơn nhiều so với các bộ lọc căn chỉnh và rào cản của doanh nghiệp đang định hình dư luận, văn hóa và ngôn ngữ.

Tôi mong nhận được sự khoan dung: đây là dự án Python đầu tiên của tôi, được thực hiện trong hai tháng phát triển đầy đam mê. Tôi hoàn toàn nhận thức được rằng mã nguồn vẫn chưa sẵn sàng cho môi trường sản xuất. Tôi cá là nhiều "lão làng" Linux sẽ nguyền rủa tôi đến tận cùng vì chuỗi lệnh mà TERMy đôi khi phát ra; cần phải làm rất nhiều việc trên tập dữ liệu và mã nguồn để đạt được sự an toàn và sẵn sàng cho sản xuất.

Hãy coi đây là bản phát hành sớm để giới thiệu những gì chúng ta có thể sử dụng trong một tương lai không xa. Nếu nỗ lực chung của cộng đồng tập trung vào NPC-Forge và TERMy, tôi nghĩ chúng có thể mang lại cho chúng ta nhiều tự do hơn và giúp tiết kiệm tiền bạc, điện năng và thời gian. Nếu bạn thích bài viết này và đồng ý với tôi, hãy cân nhắc đóng góp cho dự án. Chúc bạn mày mò vui vẻ!

Bài viết được AI dịch và tổng hợp tự động từ Hacker News Nổi bật (buzzing.cc bản dịch tiếng Trung). Liên kết bài gốc ở phía trên. Dữ liệu đồng bộ qua API công khai được ghi nguồn tại AI HOT (canonical) ↗. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.

TERMy: Trợ lý dòng lệnh siêu tốc không cần dùng đến LLM | AIHOT.vn