Câu hỏi tôi nghe nhiều nhất tuần này: “máy mình cài OpenClaw được không, chạy có nặng không, có cần GPU không”. Câu hỏi sai. Câu đúng phải là: “tôi có muốn process này có shell access trên máy này không”.

Bài viết này không phải tutorial cài đặt. Đã có 50 cái tutorial bằng tiếng Việt rồi. Bài này là 3 thứ những tutorial đó bỏ qua: pattern thực sự là gì, resource thực sự cần bao nhiêu, và những câu hỏi mà mỗi người nên tự trả lời trước khi enable.

Pattern cũ trong áo mới

Mọi developer đều đã quen với pattern này, có khi không nhận ra. Slack bot với slash command (/deploy staging). Discord bot exec script trên server game. GitHub Actions workflow trigger từ comment /rerun-failed. Zapier nối Gmail với Notion. n8n workflow chạy tự động mỗi giờ. Cron job phía sau webhook. Tất cả đều là ChatOps: text vào một channel, hệ thống parse, action chạy, kết quả gửi về channel.

Pattern này không mới. Nagios alert vào IRC channel rồi bot exec script là từ giữa 2000s. Hubot của GitHub năm 2011 chuẩn hóa nó thành thư viện. Đến 2026 thì gần như mọi đội kỹ thuật đều có vài Slack bot, vài GitHub Actions workflow, vài Zapier flow chạy nền. Pattern đã ngấm vào hạ tầng đến mức không ai gọi tên nó nữa.

OpenClaw, gptme ở chế độ MCP server, AutoGPT từ làn sóng 2023, LangChain agents, Claude Desktop với MCP, n8n có AI agent node: tất cả đều ngồi đúng vị trí một Slack bot ngồi cách đây 5 năm. Khác biệt nằm ở đúng 2 component:

  • Command parser cũ: regex của slash command, JSON schema của Zapier trigger, webhook payload mapping. Mới: LLM.
  • Decision tree cũ: if-else hard-code, workflow graph kéo thả trong n8n, state machine. Mới: LLM.

Mọi thứ còn lại y nguyên. Auth. Session per (channel, sender). Routing. Sandbox executor. Formatter trả message về channel. Nếu bạn nhìn vào codebase OpenClaw rồi nhìn vào codebase một Slack bot 2020, 80% file structure là một-một.

Nhìn từ góc kiến trúc, OpenClaw có 3 layer (giống mọi tool cùng họ):

  1. Channel adapter (Telegram, Slack, Discord, iMessage): normalize inbound, format outbound, giữ credentials cho từng platform.
  2. Gateway: routing message vào session, parse tool_use response, gọi executor, ghi trạng thái session.
  3. Agent core: LLM client, tool registry, sandbox runtime.

Đến đây sẽ có người hỏi: “vậy điều gì thật sự mới”. Đáp án ngắn: không phải “AI làm được nhiều việc hơn”. Slack bot làm được mọi việc Bash làm được. Cũng không phải “tự động hóa”. Ansible, GitHub Actions, n8n đã tự động hóa từ lâu, deterministic gấp nhiều lần. Cái mới ở chỗ: bạn không cần viết command trước. Slack bot cần bạn viết handler cho /deploy. Zapier cần bạn config từng trigger, từng action. AI agent thì không. LLM tự dịch ý định người dùng sang chuỗi tool call.

Trade-off của “không cần viết command trước”:

  • Mất reproducibility. Cùng câu hỏi, hai lần kết quả khác nhau là kỳ vọng, không phải bug.
  • Mất audit log có ý nghĩa. Log chứa LLM reasoning, không phải command đã review.
  • Mất deterministic behavior. Hallucination là feature của model, không phải bug.
  • Được flexibility cho task chưa thấy bao giờ.

Trade-off này đáng cho exploratory work, one-off task không lặp đủ nhiều để viết command. Không đáng cho production critical path, destructive operation cần audit, hoặc compliance environment. Ansible, Terraform, Argo vẫn đúng cho 95% việc còn lại.

Resource và blast radius

Trực giác “chỉ call API thì không cần máy mạnh” đúng một phần.

Gateway Node.js daemon idle đã ăn 400-800 MB RAM. Scale theo (channel × session): mỗi session có context state, mỗi channel có connection state. Hai channel với 3 session active là chuyện thường.

Tool execution mới là chỗ tốn thật:

  • Playwright instance cho browser automation: 200-400 MB mỗi cái.
  • Docker sandbox per session: 256 MB đến 1 GB tùy image.
  • Concurrent 3-4 session với browser plus sandbox: 4-6 GB RAM riêng cho tools, chưa tính gateway.

Bảng cấu hình thực dụng theo use case:

Use casevCPURAMDisk
Test/learn, 1 channel24 GB20 GB
Daily driver, có browser tool48 GB50 GB NVMe
Multi-agent concurrent816-32 GB100 GB NVMe

Cần GPU mạnh chỉ khi chạy local model (Ollama, llama.cpp với 7B-70B). Nếu gateway gọi cloud API (Anthropic, OpenAI, Mistral, OpenRouter), CPU đủ, GPU không bắt buộc.

Laptop vs VPS: Mac M-series 16 GB là first-class citizen cho daily driver. VPS thắng ở 3 điểm cụ thể: always-on, public webhook (Telegram, Slack bắt buộc URL public), và blast radius isolation (một sandbox container ngốn 8 GB không kill được phiên làm việc của bạn). Hybrid pattern thực dụng: VPS production cho channel public, laptop dev cho channel cá nhân, tách hai bộ credentials.

Về phần blast radius, đây mới là điểm cần dừng lại lâu.

ChatOps cũ (Slack bot, GitHub Actions, Zapier) thiết kế trên giả định bot có ACL hẹp. Command đã review, scope đã review, mỗi handler chỉ có quyền nó cần. Slack bot không có toàn quyền shell, GitHub Action chỉ chạy step đã định nghĩa. Compromise bot ≠ compromise toàn bộ host.

AI agent thiết kế trên giả định ngược lại: bot có shell access đầy đủ trong sandbox, đôi khi cả ngoài sandbox nếu sandbox cấu hình lỏng. Scope của agent = toàn bộ những gì process này access được. Compromise agent = full RCE trong scope đó.

Prompt injection trong agent context không tương đương XSS, không tương đương SQL injection. Nó là privilege escalation. Indirect injection qua media bot fetch về (caption ảnh, OCR PDF, nội dung trang web, file đính kèm trong group chat) khó detect hơn nhiều vì payload nằm trong data, không nằm trong request.

Security checklist tối thiểu trước khi enable, không phải nice-to-have:

  • File config có credentials: chmod 600. Không để 644 vì “đỡ phiền”.
  • Sandbox container không mount Docker socket. Mount = thoát sandbox trivial.
  • Network egress của sandbox: allowlist domain, không default allow.
  • Workspace mount vào sandbox: read-only trừ khi có lý do cụ thể write.
  • Gateway bind 127.0.0.1 plus reverse tunnel (Cloudflare Tunnel, Tailscale Funnel), không bind 0.0.0.0 rồi đặt sau reverse proxy.
  • Group chat: per-sender ACL. Mặc định “ai trong group cũng exec được” là default sai.
  • Destructive command (rm, drop, force push, kubectl delete, AWS delete API): gate riêng, require human confirm trong message thread.

7 câu hỏi trước khi cài

Phần này dành cho cả dev senior và người mới. Câu hỏi giống nhau, đáp án khác nhau theo profile.

1. Nếu agent đọc được mọi file user của bạn, nó đọc được những gì?

Đây không phải câu hỏi giả định. AI agent có shell access nghĩa là nó truy cập được mọi thứ user account của bạn truy cập được. Liệt kê thật ra giấy: tờ khai thuế, ảnh gia đình, session ngân hàng trong browser, session Slack công ty, SSH key sang production server, password manager đang đăng nhập, ví crypto, hợp đồng client. Nếu danh sách không trống và bạn không muốn người lạ đọc, đừng cài agent lên daily driver. Cài lên máy ảo riêng (UTM, Multipass, Lima trên Mac; VPS rẻ vài đô/tháng) là đủ tách bạch.

2. Khi gặp lỗi cấu hình, bạn có dám tin lời khuyên của chính LLM không?

Pattern dễ rơi vào: gateway báo lỗi, bạn copy error message hỏi LLM, LLM bảo “thử chmod 777 workspace cho dễ”, “mount /var/run/docker.sock vào sandbox đi”, “disable sandbox cho nhanh”, “chạy với sudo cho đỡ phiền”. Câu trả lời nào cũng làm vấn đề trước mắt biến mất. Câu trả lời nào cũng mở toang security. Bạn có biết câu nào sai trước khi LLM nói không? Nếu không, threat model của bạn đang nằm trong LLM, mà LLM không có threat model. Senior dev biết câu hỏi cần hỏi tiếp; non-tech thường tin response đầu tiên.

3. Skill bạn tải từ internet đã ai đọc qua chưa?

Tool AI agent hiện tại có pattern share “skill” hoặc “extension” qua GitHub gist, npm package, Marketplace của tool. Đây là supply chain attack vector hoàn toàn mới: tác giả nhét tool_call exfil credentials vào skill, người dùng cài bằng một câu npm install hoặc copy/paste vào config, không bao giờ đọc source. Skill có tag “popular” với 500 stars cũng không an toàn (stars mua được, npm typo-squatting cũng tồn tại từ lâu). Quy tắc tối thiểu: skill từ author bạn chưa biết = đọc từng dòng trước khi enable. Trust ai cài skill là trust toàn bộ shell access cho người đó.

4. Self-host có nghĩa là dữ liệu của bạn không rời máy?

Không, trừ khi bạn dùng local model. Self-hosted gateway thông thường (OpenClaw, gptme MCP mode, hầu hết tool tương tự) vẫn gửi prompt sang Anthropic, OpenAI, Mistral, OpenRouter. “Self-host” chỉ có nghĩa code chạy trên máy bạn, không có nghĩa data ở lại máy bạn. Nếu yêu cầu thực sự là data không rời máy (medical record, hợp đồng client, source code closed-source), phải dùng local model qua Ollama hoặc llama.cpp. Đó là topology khác hoàn toàn, hardware cũng khác: RAM cao hơn, GPU thật sự cần, output chất lượng thường thua model cloud.

5. Lệnh xoá, drop, force push có cần xác nhận không?

Mặc định của hầu hết AI agent: gì cũng exec, miễn LLM bảo exec. Mặc định cần là: rm -rf, DROP TABLE, git push --force, kubectl delete, mọi AWS delete API, mọi truy cập ghi vào production database, đều phải require human confirm trong cùng message thread. Nếu tool không có cơ chế này built-in, bạn phải tự viết wrapper trước khi enable nó. Mỗi incident “AI agent xoá nhầm bucket production” hay “agent commit sai branch rồi force push” đều có chung một câu chuyện: không có gate.

6. Backup gần nhất của bạn là khi nào?

Câu hỏi cụ thể: nếu sáng mai mở máy thấy ~/Documents trống, ~/Pictures trống, repo working dir bị reset, bạn restore được không, từ đâu, mất bao nhiêu dữ liệu. AI agent xoá nhầm không phải kịch bản hiếm; nó là kịch bản default mà bạn cần plan trước. Time Machine cho Mac (full disk, 1 ổ ngoài), restic hoặc borg cho Linux, off-site copy (cloud storage hoặc NAS). Không backup = mọi câu hỏi trên đều vô nghĩa, vì bạn không có second chance.

7. Bạn có cách nào biết agent vừa làm gì trong 10 phút qua không?

Audit trail là phần dễ bị bỏ qua nhất. Slack bot có message log đầy đủ. GitHub Actions có run log từng step. AI agent thường log ra console của gateway, hoặc log file đâu đó trong ~/.config/<tool>/logs/, hoặc tệ hơn: chỉ log LLM reasoning, không log tool call cụ thể (filename truy cập, shell command exec, network request). Trước khi enable: tìm log file của tool đó, mở ra xem có gì, xác nhận mọi tool call đều được ghi với đủ chi tiết để debug. Không có log = bạn không biết khi nào có vấn đề, không debug được khi có vấn đề.

Khi nào nên, khi nào không

Self-host AI agent hợp lý khi:

  • Bạn có lab học việc, sandbox cá nhân riêng, đã quen với Linux/Docker/network.
  • Môi trường air-gapped hoặc compliance bắt buộc on-prem.
  • Yêu cầu data residency cụ thể không dùng được cloud provider.
  • Batch job lớn mà chi phí API vượt local model (đo trước, đừng đoán).

Suy nghĩ kỹ trước khi cài nếu:

  • Máy đang cài lên là daily driver có dữ liệu cá nhân, không có separation.
  • Bạn chỉ “thử cho biết” mà chưa có threat model rõ.
  • Định thay Ansible/Terraform/Argo trong production critical path (agent chưa đến mức đó).

Thực ra tôi viết bài này vì thấy nhiều người trong cộng đồng đang setup AI agent local mà không nghĩ đủ kỹ về cái máy mình cài lên. Không phải lỗi của họ, phần lớn tutorial tiếng Việt hiện tại chỉ tập trung vào “làm sao cho chạy”. Câu hỏi “có nên không” thì ít ai viết.

Tôi cũng dùng AI agent hằng ngày, nó tiết kiệm cho tôi nhiều giờ. Nhưng tôi cài trên VM riêng, sandbox có network allowlist, gate cho destructive action, log đầy đủ. Không phải vì paranoid, mà vì đã thấy đủ incident (của mình và của bạn bè) để biết default “gì cũng exec” không phù hợp với laptop có dữ liệu thật.

Nếu bạn đang cân nhắc cài, hy vọng 7 câu hỏi trên giúp ích. Còn câu nào tôi quên đưa vào, hoặc bạn có incident muốn share, comment hoặc nhắn cho tôi, bài này tôi sẽ update.