Vượt xa Chatbot: Hãy để AI thực sự viết code
Tất cả chúng ta đều đã từng trải qua cảm giác này: hỏi AI để nhờ giúp đỡ, sau đó copy-paste từng đoạn code thủ công, chỉnh lại thụt đầu dòng và đi sửa những lỗi mà LLM tạo ra. OpenHands (trước đây là OpenDevin) phá vỡ vòng lặp này. Nó không chỉ là một cửa sổ chat khác; nó là một agent tự chủ có khả năng sử dụng terminal, quản lý file và thực thi lệnh. Hãy coi nó như một lập trình viên junior làm việc trong một môi trường được kiểm soát để hoàn thành các tác vụ mà bạn quá bận rộn để xử lý.
Tôi đã sử dụng thiết lập này cho các tác vụ refactor phức tạp và độ ổn định thực sự ấn tượng. Bằng cách chuyển việc thực thi vào một Docker container, máy chủ của bạn luôn sạch sẽ trong khi agent có một “sân chơi” riêng để cài đặt các dependency và chạy test. Nếu bạn đã chán việc phải nhảy qua nhảy lại giữa trình duyệt và IDE, tự host OpenHands là cách tốt nhất để lấy lại sự tập trung.
Tại sao Docker là yếu tố bắt buộc
Việc cấp quyền cho một AI agent chạy các lệnh shell rất mạnh mẽ nhưng cũng đầy rủi ro. Bạn chắc chắn không muốn một sự “ảo giác” (hallucination) biến một lệnh dọn dẹp đơn giản thành thảm họa rm -rf / trên hệ điều hành chính của mình. Docker cung cấp lớp cô lập cần thiết để giữ an toàn cho các file của bạn.
Sử dụng Docker giải quyết ba vấn đề cụ thể:
- Bảo mật: Agent sống trong một sandbox bị hạn chế, không có quyền truy cập trực tiếp vào hệ thống máy chủ trừ khi bạn cho phép.
- Tính nhất quán: Môi trường luôn giống nhau trong mọi lần chạy. Không còn lỗi kiểu “chạy được trên máy tôi”.
- Không gây rác hệ thống: Bạn sẽ không cần quản lý các phiên bản Python 3.11 hay Node.js cụ thể trên máy cục bộ.
Thiết lập nền tảng
Hãy đảm bảo Docker đang hoạt động trước khi bắt đầu. Bạn cũng sẽ cần một API key. Mặc dù GPT-4o của OpenAI là một lựa chọn tốt, nhưng Claude 3.5 Sonnet hiện là tiêu chuẩn vàng cho OpenHands nhờ khả năng suy luận vượt trội trong các vòng lặp lập trình. Nếu bạn ưu tiên sự riêng tư, bạn cũng có thể kết nối với một instance Ollama cục bộ.
1. Chuẩn bị không gian làm việc
OpenHands cần một nơi cụ thể để làm việc. Hãy tạo một thư mục riêng để agent không bị lạc trong thư mục gốc của bạn:
mkdir -p ~/openhands-projects
cd ~/openhands-projects
2. Tải OpenHands Image
Image này khá nặng—khoảng 3GB—vì nó bao gồm cả một môi trường thực thi Linux đầy đủ. Hãy tải phiên bản ổn định mới nhất bằng lệnh sau:
docker pull ghcr.io/all-hands-ai/openhands:0.9
3. Khởi chạy Container
Lệnh sau đây sẽ khởi động engine. Nó map Docker socket, cho phép OpenHands tự khởi tạo các container “anh em” để thực thi tác vụ.
docker run -it \
--pull=always \
-e SANDBOX_USER_ID=$UID \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-v $(pwd):/opt/workspace_base \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
ghcr.io/all-hands-ai/openhands:0.9
Cấu hình để đạt hiệu suất tối ưu
Phần việc nặng nhất diễn ra trên giao diện web, nhưng các biến môi trường ban đầu sẽ quyết định trải nghiệm ổn định đến mức nào. Hãy cùng phân tích các phần quan trọng của lệnh khởi chạy đó.
Map không gian làm việc thông minh
Flag -v $(pwd):/opt/workspace_base là cầu nối của bạn. Nó mount thư mục hiện tại vào tầm nhìn của agent. Khi AI viết một file trong /opt/workspace_base, nó sẽ xuất hiện ngay lập tức trên máy tính của bạn. Đây chính là sự cộng tác trong thời gian thực.
Giải thích về Docker Socket
Tại sao lại mount /var/run/docker.sock? Nó cho phép OpenHands đóng vai trò là một điều phối viên (orchestrator). Khi agent cần chạy code của bạn, nó không thực hiện việc đó bên trong container ứng dụng chính mà tạo ra một container mới, cô lập hoàn toàn cho tác vụ cụ thể đó. Nếu code bị crash, chỉ container tạm thời đó bị ảnh hưởng.
Tinh chỉnh LLM
Truy cập http://localhost:3000 để hoàn tất thiết lập. Để có kết quả tốt nhất, hãy sử dụng các cài đặt sau:
- Language Model Provider: Anthropic
- Model: claude-3-5-sonnet-20240620
- API Key: [Key của bạn]
- Base URL: Để trống đối với các API chính thức
Xác minh và Xử lý sự cố
Sau khi nhấn lưu, giao diện chat sẽ xuất hiện. Hãy thử nghiệm với một tác vụ cụ thể. Yêu cầu nó: “Khởi tạo một dự án Vite với React và TypeScript, sau đó tạo một component đăng nhập cơ bản.”
Theo dõi Log
Nếu giao diện có cảm giác chậm chạp, terminal là người bạn tốt nhất của bạn. Tôi thường mở một tab riêng để theo dõi “nhịp đập” của container. Điều này giúp phát hiện sớm các giới hạn rate limit của API hoặc các lỗi về quyền truy cập.
docker logs -f openhands-app
Sửa lỗi Permission Denied
Người dùng Linux thường gặp vấn đề về quyền sở hữu file vì agent hoạt động như một user cụ thể bên trong Docker. Mặc dù -e SANDBOX_USER_ID=$UID khắc phục được hầu hết các trường hợp, đôi khi bạn vẫn cần lấy lại quyền sở hữu thư mục dự án của mình:
sudo chown -R $USER:$USER ~/openhands-projects
Quản lý tài nguyên
OpenHands khá ngốn tài nguyên. Nếu quạt tản nhiệt của bạn bắt đầu quay quá nhanh, hãy giới hạn tài nguyên. Bạn có thể giới hạn container ở mức 4GB RAM và 2 nhân CPU bằng cách thêm --memory="4g" --cpus="2.0" vào lệnh chạy. Tôi thường tắt các giới hạn này trong các phiên refactor lớn để đảm bảo agent hoàn thành công việc nhanh chóng.
Giờ đây bạn đã vượt xa việc chỉ sử dụng AI autocomplete cơ bản. Bạn đã có một người đồng đội thực thụ, xử lý các mã nguồn mẫu (boilerplate) nhàm chán và viết unit test trong khi bạn tập trung vào kiến trúc cấp cao. Đây là một sự nâng cấp đáng kể cho quy trình làm việc của bất kỳ lập trình viên nào.
