Khang

Khi khó tả cho AI biết chỗ cần sửa

Khi trợ lý AI vẽ sơ đồ ngay trong terminal, chỉ tả bằng chữ thì rất khó nói rõ bạn muốn sửa chỗ nào. Mình tạo ra Relay để bạn xem công việc trên trình duyệt và góp ý ngay trên phần đang xem.

Tóm tắt

Khi trợ lý AI vẽ sơ đồ ngay trong terminal, chỉ riêng việc tả chỗ bạn muốn sửa cũng tốn cả một đoạn văn. Mình tạo ra Relay, một bảng làm việc trên trình duyệt để bạn xem công việc và góp ý ngay trên một giá trị trong biểu đồ hay một ô trong bảng, còn phần góp ý dở dang vẫn được giữ khi tải lại trang hoặc chờ quá lâu. Agent viết một phần đáng kể code, còn mình định hướng, review và kiểm tra.

Những bàn tay vẽ chì đánh dấu chỗ cần sửa khi so sánh hai thiết kế trong một tập hồ sơ màu xanh cô-ban.

Thử hình dung một agent lập trình (coding agent), tức trợ lý AI có thể đọc và sửa code, đang giải thích thay đổi nó định làm bằng cách vẽ sơ đồ kiến trúc ngay trong cửa sổ dòng lệnh (terminal), ghép từ dấu gạch ngang và gạch đứng. Với một ý nhỏ thì cách này vẫn ổn, nhưng khi sơ đồ lớn dần, đọc hiểu sơ đồ đã giống như phải giải thêm một bài toán bên cạnh bài toán chính. Muốn nhận xét một đường nối, bạn phải tả xem đường nối ấy nằm ở đâu giữa cả khối ký tự, còn khi agent đưa ra hai phương án bố cục, bạn phải tự hình dung từng bức hình từ một đoạn văn.

Sau nhiều tháng làm việc với agent lập trình, mình gặp lại vướng mắc này liên tục mỗi lần xem xét công việc trong terminal. Nhiều câu hỏi của agent chỉ cần gõ vài chữ là trả lời xong, và terminal hợp với những câu như vậy. Nhưng cũng có những câu cần một chỗ để mình nhìn thấy công việc và chỉ thẳng vào phần mình muốn nói, và đó là khoảng trống mình muốn lấp.

Khi agent có thứ cần cho bạn xem

Vì vậy mình tạo ra Relay để agent có thể bày công việc lên một bảng chạy cục bộ trên trình duyệt và nhận phản hồi của bạn ngay tại đó. Dễ hình dung nhất là chuyện in bản nháp ra giấy rồi đưa cho ai đó kèm cây bút: họ nhìn cả trang, khoanh vào chỗ chưa ổn, ghi chú ngay bên cạnh, rồi bạn nhận lại tờ giấy với từng nét đánh dấu nằm đúng chỗ người ta viết. Relay mang kiểu "tờ giấy chung" đó vào cuộc trao đổi giữa bạn và agent.

Thay vì vẽ sơ đồ vào terminal, agent chuẩn bị một bảng chứa cả nội dung lẫn những câu hỏi nó cần bạn trả lời. Agent có thể đặt sơ đồ ngay cạnh câu hỏi mà sơ đồ đó giúp bạn trả lời, còn mỗi phương án bố cục đi kèm ảnh riêng để bạn so sánh trực tiếp bằng mắt chứ không phải đọc lời tả hình. Những câu hỏi liên quan cũng có thể nằm chung một bảng, nên trả lời xong câu này bạn không phải ngồi chờ agent hỏi câu tiếp theo.

Khi bạn muốn góp ý đúng một chỗ

Ở terminal, muốn nhận xét một đường nối thì trước hết phải tả được vị trí của nó. Trên bảng của Relay, bình luận gắn thẳng vào nội dung đang xem: bạn có thể chỉ vào một giá trị trên biểu đồ, một ô trong bảng, hoặc bôi chọn một câu trong tài liệu, và Relay gửi bình luận về cho agent kèm thông tin xác định chỗ bạn đã chỉ. Nhờ vậy agent bắt đầu chỉnh sửa từ đúng chỗ ấy, thay vì từ một yêu cầu kiểu "sửa cái phần nào đó gần đầu trang".

Các bình luận trỏ đến một nút trong sơ đồ và một ô trong bảng.

Mình dùng bình luận nhiều nhất, vì lựa chọn của mình thường kèm thêm điều kiện hoặc một yêu cầu chỉnh sửa. Chẳng hạn mình chọn một bố cục nhưng vẫn muốn phần giá được trình bày rõ hơn. Hướng dẫn vận hành của Relay yêu cầu agent đọc câu trả lời cùng với các ghi chú đi kèm, nên lựa chọn và lời dặn thêm đến tay agent thành một phản hồi trọn vẹn.

Ở đây còn một chi tiết tương tác nhỏ mà mình để ý: xem một phương án không có nghĩa là đã chọn nó. Trong Relay, bạn chọn phương án bằng cách bấm vào hàng chứa nhãn của phương án đó, nên phóng to ảnh để soi kỹ hay để lại bình luận trên ảnh đều không làm thay đổi lựa chọn của bạn.

Khi đang góp ý dở thì có việc chen ngang

Một lượt đánh giá kỹ có thể kéo dài hơn thời gian mà lệnh gọi công cụ của agent được phép chờ, và người đánh giá cũng có lúc phải bỏ dở giữa chừng. Với trường hợp đầu, chế độ tách rời (detached) mở bảng rồi trả về mã định danh của bảng, để agent tiếp tục làm việc và quay lại lấy kết quả sau. Với trường hợp sau, câu trả lời tự động lưu trong lúc bạn nhập, tải lại trang sẽ khôi phục những gì đã nhập, và kể cả khi hết thời gian chờ hay lượt đánh giá bị hủy thì bản nháp vẫn còn nguyên.

Bản đánh giá nháp được đánh dấu trang giữ lại phương án đã chọn và ghi chú chưa viết xong sau khi gián đoạn.

Nhờ vậy agent có đường quay lại đúng lượt đánh giá cũ, miễn là nó làm đủ phần việc của mình: kiểm tra bảng hiện có trước khi tạo bảng mới, và coi bản nháp là phản hồi chưa hoàn tất.

Relay được làm ra thế nào

Mình đặt ra yêu cầu và quy trình đánh giá cho Relay, điều phối việc triển khai cùng agent, rà lại các thay đổi trong code và kiểm tra kết quả, trong đó có việc xem kết quả trả về có giữ đúng câu trả lời cùng ghi chú của người dùng hay không. Agent lập trình viết một phần đáng kể code. Phần bên dưới có cách cài Relay và các lệnh agent dùng để mở bảng.

Cài Relay và mở một bảng

Relay dùng giấy phép MIT. Dự án bắt đầu với tên quest-board; gói hiện là @khanglvm/relay, còn lệnh là rly. Theo tài liệu, môi trường chạy cần Node 18 trở lên.

npm i -g @khanglvm/relay
npx -y skills add khanglvm/relay -g -y

Với đặc tả bảng trong board.json, lệnh này mở lượt đánh giá và chờ gửi phản hồi:

rly ask --file board.json --timeout 1800

Với lượt đánh giá cần tiếp tục mở trong khi agent làm việc khác:

rly ask --file board.json --detach
rly wait b-xxxxx --timeout 3500
rly result b-xxxxx

Thay b-xxxxx bằng ID bảng được trả về. Lệnh cuối đọc kết quả mà không chờ, bao gồm cả bản nháp hiện tại. Mỗi phương án trong bảng có thể chứa ảnh riêng:

{
  "id": "layout",
  "type": "single",
  "label": "Hero layout?",
  "options": [
    { "value": "split", "label": "Split", "blocks": [{ "type": "image", "src": "split.png", "height": 160 }] },
    { "value": "stack", "label": "Stacked", "blocks": [{ "type": "image", "src": "stack.png", "height": 160 }] }
  ]
}

Kết quả được xuất dưới dạng JSON qua stdout, còn nhật ký đi qua stderr. Mã thoát phân biệt đã gửi (0), hết thời gian chờ (2), hủy (3), lỗi sử dụng (4) và không tìm thấy bảng (5). Câu hỏi bị bỏ qua xuất hiện trong skipped và không có trong answers.

Relay không cần các gói phụ thuộc trong node_modules khi chạy. Chart.js, Mermaid và Graphviz WASM được đóng gói sẵn và tải khi cần, nên việc hiển thị chúng trên bảng có thể hoạt động ngoại tuyến. Repo trên GitHub chứa đặc tả và hướng dẫn cho agent.

Bảng đáng mở khi việc nhìn thấy công việc giúp bạn trả lời dễ hơn, còn những câu chỉ cần gõ vài chữ thì cứ để trong terminal. Nếu muốn thử, mình sẽ bắt đầu với một quyết định cần so sánh bằng hình ảnh, để lại một bình luận cụ thể, rồi xem bản chỉnh sửa tiếp theo của agent có làm theo cả lựa chọn lẫn điều kiện trong bình luận đó hay không.

Website đang có trong đầu trông thế nào? Kể mình nghe.