4 điểm bởi GN⁺ 27 ngày trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Kết nối AI agent dựa trên IRC với website portfolio cá nhân để khách truy cập có thể đặt câu hỏi và nhận câu trả lời dựa trên kết quả phân tích mã từ kho lưu trữ GitHub thực tế
  • Không phải chatbot chỉ tóm tắt CV đơn thuần, mà được thiết kế như một agent có thể thực thi, thực hiện clone kho lưu trữ, tính toán test, xác minh mã
  • Hệ thống được tách thành hai agent là nullclaw công khai và ironclaw riêng tư, giao tiếp an toàn thông qua mạng Tailscale
  • Chọn giao thức IRC làm tầng truyền tải để đồng thời đạt được tự host, chuẩn hóa, chi phí thấp, đồng thời tách vai trò của mô hình Haiku 4.5 và Sonnet 4.6 để giới hạn chi phí ở mức $2/ngày
  • Toàn bộ hệ thống vận hành với binary dưới 10MB, bộ nhớ dưới 5MB, được giới thiệu như một ví dụ hạ tầng AI gọn nhẹ đáp ứng cả bảo mật, chi phí và tính minh bạch

Xây dựng digital doorman

  • Cấu trúc triển khai AI agent trên VPS $7/tháng và sử dụng máy chủ IRC cá nhân làm tầng truyền tải, kết nối với kho lưu trữ GitHub
    • Khách truy cập có thể đặt câu hỏi cho AI trên website portfolio và nhận câu trả lời dựa trên mã nguồn thực tế
    • Không phải chatbot kiểu tóm tắt CV đơn thuần, mà cung cấp phản hồi cụ thể thông qua phân tích mã

Giới hạn của "chatbot để hỏi về CV"

  • Phần lớn chatbot portfolio chỉ dừng ở mức nạp nội dung CV vào mô hình rồi diễn đạt lại
  • Cách này không cung cấp thông tin mới, và chỉ là một dạng đối thoại hình thức
  • Với những câu hỏi như “Bạn quản lý test coverage như thế nào?”, cần có phản hồi cụ thể kiểu clone kho lưu trữ và đếm số lượng test
  • Vì vậy tác giả đã xây dựng hạ tầng cho phép truy cập và phân tích mã trực tiếp

Kiến trúc hệ thống

  • Gồm hai agent, hai máy chủ, hai ranh giới bảo mật
    • nullclaw: doorman công khai, binary Zig 678KB, dùng khoảng 1MB RAM
      • Chào khách truy cập, trả lời câu hỏi về dự án, thực hiện clone kho GitHub và xác minh dựa trên mã
    • ironclaw: agent backend riêng tư, chạy trên hệ thống tách biệt
      • Có thể truy cập email, lịch, ngữ cảnh cá nhân
      • Nhận các yêu cầu phức tạp từ nullclaw thông qua kênh IRC #backoffice
  • Hai hệ thống được kết nối qua Tailscale, và máy chủ công khai không thể truy cập dữ liệu cá nhân

Lý do chọn IRC

  • Tính nhất quán về thẩm mỹ: website portfolio dùng UI kiểu terminal nên IRC client rất tự nhiên
  • Tự host hoàn toàn: máy chủ IRC Ergo, web client gamja và nullclaw đều chạy trên hạ tầng riêng
  • Giao thức đơn giản và được chuẩn hóa: IRC đã tồn tại 30 năm, không bị phụ thuộc nhà cung cấp, không có rủi ro thay đổi API
  • Cùng một agent hoạt động giống nhau không chỉ trên web client mà cả trên irssi terminal client

Lựa chọn và thiết kế mô hình

  • Dùng mô hình lớn là không hiệu quả, nên phân tách mô hình theo vai trò
    • Haiku 4.5**: xử lý hội thoại và truy vấn đơn giản,** phản hồi độ trễ cực thấp

      • Sonnet 4.6: chỉ dùng khi phân tích mã và suy luận phức tạp
      • Trần chi phí: giới hạn ở $2/ngày, $30/tháng
      • Ngăn chi phí tăng vọt do lạm dụng hoặc hội thoại quá mức
      • Thông qua cấu trúc suy luận nhiều tầng để đồng thời đạt được tốc độ và hiệu quả chi phí

Thiết kế bảo mật

  • SSH: vô hiệu hóa đăng nhập root, chỉ cho phép xác thực bằng khóa, dùng cổng không chuẩn
  • Tường lửa: chỉ mở SSH, IRC(TLS), HTTPS(WebSocket)
  • Proxy Cloudflare: thực hiện chấm dứt TLS, giới hạn tốc độ, lọc bot
  • Sandbox cho agent: chỉ cho phép công cụ chỉ đọc, giới hạn 10 hành động mỗi giờ
  • Kiểm soát chi phí: hard cap $2/ngày, $30/tháng
  • Kích hoạt log kiểm toán và cập nhật tự động
  • Giảm thiểu bề mặt tấn công: chỉ chạy hai dịch vụ ergo và nullclaw, không phục vụ nội dung web trực tiếp
  • Khi xảy ra xâm nhập, phạm vi thiệt hại cũng chỉ bị giới hạn ở mức bot IRC có trần $2/ngày

Cấu hình stack truyền thông

  • Mọi thành phần đều ở dạng nhỏ gọn, tự host, có thể thay thế
    • Ergo: máy chủ IRC, một binary Go đơn, 2.7MB RAM
    • gamja: web IRC client, trang tĩnh 152KB, được phục vụ phía sau Cloudflare
    • nullclaw: runtime AI agent, binary Zig 4MB, dùng khoảng 1MB bộ nhớ
  • Toàn bộ hệ thống chạy với binary dưới 10MB, bộ nhớ nhàn rỗi dưới 5MB
  • Có thể vận hành thoải mái ngay cả trên gói VPS rẻ nhất

Chức năng thực tế của nully (agent công khai)

  • Xác định ngôn ngữ lập trình: kiểm tra thông qua ngữ cảnh nạp sẵn và xác minh kho lưu trữ
  • Phân tích cấu trúc test: clone kho lưu trữ rồi trực tiếp đọc file test để báo cáo kết quả
  • Giải thích dự án: ví dụ có thể trả lời chi tiết về dự án Fracture dựa trên mã
  • Cung cấp thông tin liên hệ: chỉ đưa ra thông tin liên hệ chính xác, không bịa đặt
  • Yêu cầu đặt lịch: chuyển tiếp đến ironclaw qua giao thức Google A2A, rồi trả về kết quả đã được cấu trúc
  • Khách truy cập không nhận ra quá trình chuyển sang backend

Triển khai A2A

  • Hỗ trợ giao thức Google A2A (v0.3.0) và thực hiện quản lý trạng thái tác vụ dựa trên JSON-RPC
  • Công cụ a2a_call gửi thông điệp đến agent từ xa và phân tích trạng thái tác vụ (hoàn tất/thất bại/đang xử lý)
  • Bắt buộc HTTPS, nhưng trong mạng nội bộ Tailscale thì cho phép HTTP để thuận tiện debug
  • Cấu trúc phía ironclaw

    • Phiên bản nullclaw không có API key riêng mà dùng LLM gateway của ironclaw như một proxy
    • Chỉ duy trì một API key và một quan hệ thanh toán
    • ironclaw xử lý toàn bộ yêu cầu suy luận và gánh chi phí

Bảo mật handoff

  • Endpoint A2A có rủi ro prompt injection, nên áp dụng giới hạn nghiêm ngặt
    • Các yêu cầu có thể chuyển cho ironclaw chỉ giới hạn ở lịch hẹn, liên hệ, tình trạng sẵn sàng
    • Từ chối chuyển lệnh tùy ý
    • Endpoint A2A của ironclaw được bảo vệ bằng tường lửa chỉ dành cho Tailscale
    • Cả hai agent đều chạy ở chế độ giám sát và danh sách lệnh cho phép bị giới hạn
  • nully quyết định có nâng cấp yêu cầu hay không, để ngăn việc thực thi lệnh bừa bãi

Bài học rút ra trong quá trình xây dựng

  • Lựa chọn mô hình là một phần của thiết kế hệ thống, ảnh hưởng trực tiếp đến chi phí, độ trễ và trải nghiệm
  • Tác giả dành nhiều thời gian hơn cho truyền thông, bảo mật và hạ tầng so với bản thân agent
  • Sự đơn giản và tính mở của IRC khiến nó trở thành tầng truyền tải lý tưởng cho AI agent
  • Cấu trúc tách nullclaw–ironclaw là cốt lõi của mô hình bảo mật
  • Kết hợp giao thức A2A với kênh log IRC giúp có được cả giao tiếp có cấu trúc lẫn khả năng quan sát theo thời gian thực
  • Tránh trùng lặp thông tin xác thực: dùng gateway của ironclaw làm proxy để duy trì một API key, một quan hệ thanh toán

Cách trải nghiệm

  • Truy cập georgelarson.me/chat hoặc nhập irc trong terminal trên trang chủ
  • Nếu dùng IRC client: irc.georgelarson.me, cổng 6697 (TLS), kênh #lobby
  • nully đang chờ sẵn và có thể trò chuyện với khách truy cập theo thời gian thực

1 bình luận

 
Ý kiến trên Hacker News
  • Nếu agent OpenClaw có quyền truy cập email và dữ liệu cá nhân bị xâm nhập thì phạm vi thiệt hại có thể rất lớn
    Nó không chỉ dừng ở mức bot IRC đơn giản, mà kẻ tấn công còn có thể đặt lại mật khẩu để gỡ giới hạn API, thậm chí lợi dụng làm trung tâm chia sẻ nội dung bất hợp pháp

    • Tôi cũng biết vài người chạy agent OpenClaw kiểu này trên Mac Mini, và thật lạ là những người vốn rất nghiêm ngặt về bảo mật lại khá thờ ơ với rủi ro này
    • Nếu điều bạn nói là đúng, thì đây giống như một ví dụ cho thấy con người hành xử thế nào trong một “môi trường không có chốt an toàn”
  • Tôi khá tò mò vì sao lại chọn Haiku/Sonnet. Trên OpenRouter có nhiều model rẻ hơn đáng kể
    Ví dụ Haiku 4.5 có giá $1 cho 1 triệu token đầu vào và $5 cho đầu ra, trong khi MiniMax M2.7 là $0.30 đầu vào, $1.20 đầu ra, còn Kimi K2.5 là $0.45 đầu vào, $2.20 đầu ra
    Theo trải nghiệm của tôi thì M2.7 và K2.5 cho hiệu năng tương đương hoặc thậm chí tốt hơn Haiku

    • Nếu vận hành công khai trên IRC thì safety rails có thể là một yếu tố quan trọng cần cân nhắc
      Đây cũng chính là lý do gần đây tôi dùng model của Anthropic khi làm agent. Haiku kiểm soát khá tốt khi người dùng đưa ra yêu cầu kỳ quặc, và cũng xử lý hội thoại mang tính cảm xúc một cách ổn định
    • Xiaomi Mimo v2-Flash rất xuất sắc. Trong benchmark của tôi, nó nhanh hơn Haiku 8% và rẻ hơn 80 lần. Gemini 3.1 Flash Lite Preview cũng là một lựa chọn ổn
    • MiniMax M2.7 cũng khá dùng được cho coding, nhưng Opus 4.6 vẫn ở đẳng cấp cao hơn một bậc
    • Token Plan của MiniMax rẻ hơn nữa, và cũng cho phép dùng cho agent một cách rõ ràng
    • Tôi nghĩ cứ dùng Gemini Flash3 thì còn tốt hơn Haiku
  • IRC phù hợp làm lớp truyền tải nhưng không có delivery guarantee. Nếu mất kết nối thì các tin nhắn trong khoảng đó sẽ biến mất
    Nó ổn cho chat thời gian thực, nhưng với agent xử lý công việc thực tế thì cần truyền at-least-once
    SSE(Server-Sent Events) là một điểm cân bằng khá ổn. Nó hỗ trợ kết nối liên tục và có thể bổ sung logic truyền lại

    • Nhưng IRC từ lâu đã có bouncer, nên về mặt kỹ thuật vẫn có thể hiện thực at-least-once
  • Tôi từng làm một bot với ý tưởng tương tự trên chuyến tàu từ Tokyo đến Osaka
    web-support-claw.oncanine.run — đó là một dự án tạo bot intercom cho website bằng cách đọc repo GitHub
    Nó trả lời câu hỏi của khách truy cập nên không cần xây riêng một knowledge base

    • Nhưng nếu nó có thể nhận các yêu cầu như “hãy phân tích lỗ hổng của trang thanh toán” hoặc “hãy tìm secret key hardcoded” thì sẽ có rủi ro bảo mật rất lớn
  • Về sau tôi khuyên nên có một instance Haiku để giám sát. Bạn cũng có thể nhận cảnh báo qua ntfy
    Hiện giờ phòng chat hoàn toàn mất kiểm soát

    • Cũng có cách đơn giản hơn. Hãy tạo một thread chat mới cho mỗi khách truy cập rồi đóng nó sau một khoảng thời gian.
      Nếu mục đích là một “CV tương tác” thì không cần những tương tác từ số đông không xác định
  • Nhóm chúng tôi cũng dùng cấu trúc tương tự. Các agent giao tiếp qua một bảng tin nhắn FastAPI + SQLite gồm 4 agent (bán hàng, mạng xã hội, tài chính, chiến lược)
    Thay vì giới hạn ngân sách theo ngày, chúng tôi quản lý trần chi phí ở tầng governance
    Cấu trúc pub/sub của IRC rất hợp cho giao tiếp đa agent, nhưng chúng tôi dùng HTTP polling + khử trùng lặp. Kém thanh lịch hơn, nhưng dễ phục hồi hơn khi agent hay crash

  • Tôi cũng dùng IRC làm giao diện cho agent coding
    Tôi chuyển prompt bằng cách đổi phòng, rồi điều khiển project từ xa

    • Tôi tò mò không biết IRC giờ vẫn còn giới hạn độ dài tin nhắn hay không
    • Tôi cũng dùng theo kiểu đó nên sẽ rất hay nếu có thể so sánh với nhau
  • Có người nói rằng “hộp công khai không truy cập dữ liệu cá nhân”, và tôi nghĩ sẽ thú vị nếu biến nó thành một thử thách CTF
    Giấu một flag trong hộp riêng tư, rồi ai truy cập được và lấy nó ra thì thưởng 50 đô

  • Thái độ của nully hơi thô ráp, nhưng tôi thích kiến trúc hệ thống tổng thể
    Tôi cũng dùng kiến trúc phân tầng, và tầng thấp nhất là bot Qwen chạy local
    Tôi tò mò về logic leo thang từ Haiku lên Opus

    • Tôi dùng cấu trúc nâng từ Haiku lên Opus khi yêu cầu trở nên phức tạp hơn. Tôi lấy cảm hứng từ khái niệm “think hard” của Claude Code
    • Nếu đổi thông báo “An error occurred” thành “Hiện có quá nhiều người dùng. Vui lòng thử lại sau” thì có lẽ sẽ hấp dẫn hơn với nhà tuyển dụng
  • Ý tưởng này thật sự rất thú vị. Nó khiến tôi muốn tạo một bot để tự động hóa quy trình tuyển dụng
    Bot sẽ phỏng vấn để xác định thiên hướng của ứng viên, tìm công việc phù hợp rồi tự động nộp đơn
    Nếu bot phía công ty cũng đánh giá ứng viên theo cách tương tự, thì có thể ghép nối dựa trên sở thích của cả hai bên
    Có thể triển khai hoàn toàn theo kiểu mã nguồn mở tự host, và cho tín hiệu tốt hơn nhiều so với CV

    • Sẽ còn hay hơn nếu bot có thể làm luôn cả bài test không lương thay ứng viên. Bot HR sẽ xem kết quả đó rồi quyết định có tuyển hay không
    • Trước đây Triplebyte từng thử điều gì đó tương tự, có vẻ đã đến lúc nó quay lại
    • Tuy nhiên UI tuyển dụng của mỗi công ty lại khác nhau, nên nếu bot muốn tự động ứng tuyển trên mọi website thì sẽ cần học rất nhiều
    • Nếu hệ thống như vậy xuất hiện thì có thể sẽ tràn ngập ứng viên spam hoặc tài khoản giả mạo
    • Thực ra tôi đã làm một dự án kiểu này rồi