Làm phần mềm dễ dùng hơn cho trợ lý AI
Khi trợ lý AI lập trình làm việc qua một công cụ, nó chỉ có câu trả lời của công cụ để biết thay đổi đã thật sự được lưu hay mới là bản xem trước, và bước tiếp theo nên làm gì. Bài này kể cách mình làm bốn công cụ của mình để câu trả lời ấy rõ ràng hơn.
Tóm tắt
Khi làm việc qua một công cụ, trợ lý AI lập trình chỉ có câu trả lời của công cụ để biết thay đổi đã được lưu thật hay mới là bản xem trước, và bước tiếp theo là gì. Mình kể những quyết định mình đưa ra khi làm bốn công cụ của mình là Relay, Figma Lens, Outline CLI và Jira CLI để câu trả lời ấy rõ ràng hơn, kể cả cách xử lý khi agent cứ dùng sai một lệnh hợp lệ.

Khi mở một phần mềm lạ, người dùng thường nhìn quanh tìm vài dấu hiệu trước khi bấm vào đâu: họ đang ở màn hình nào, ở đây làm được gì, và cái nút trước mặt bấm vào có lưu lại thứ gì hay không. Agent lập trình, tức trợ lý AI có thể đọc và sửa code, cũng gặp đúng những câu hỏi ấy mỗi lần làm việc qua một công cụ, dù câu trả lời có thể chỉ là dữ liệu trong cửa sổ dòng lệnh (terminal) chứ không phải một màn hình hiển thị.
Thử lấy một yêu cầu giả định: sửa một màn hình cho khớp với bố cục mà người duyệt đã chọn trong vài phương án. Để làm xong, agent sẽ phải lấy lựa chọn của người duyệt, mở bố cục đó trong tệp thiết kế để xem kỹ, đọc tài liệu của nhóm mô tả màn hình, rồi cập nhật đầu việc khi đã sửa xong. Ở mỗi chặng, agent chỉ có câu trả lời của công cụ để tự suy ra:
- điều gì vừa xảy ra, thao tác đã xong hẳn hay mới chỉ là bản xem trước,
- trong những gì trả về, phần nào thật sự cần đọc,
- lệnh tiếp theo chỉ để xem hay sẽ thay đổi dữ liệu,
- và nếu đang làm thì bị ngắt giữa chừng, cần giữ lại gì để làm tiếp.
Những dự án cá nhân gần đây của mình bắt đầu từ chính mấy câu hỏi đó. Mình coi mọi thứ một công cụ trả về là giao diện mà agent nhìn thấy, nên phần trả về ấy cũng đáng được chăm chút như một màn hình làm cho người dùng, nghĩa là phải giúp agent hiểu điều gì vừa xảy ra và có thể làm gì tiếp theo.
Từ ý tưởng đó, mình tạo ra bốn công cụ, mỗi công cụ lo một chặng trong yêu cầu kiểu như trên. Relay giữ tài liệu cần xem xét nằm ngay cạnh phản hồi của người xem, giống như để bản nháp và tờ góp ý chung trên một mặt bàn. Figma Lens giúp agent xem kỹ bản thiết kế trước khi bắt tay vào làm giao diện. Còn Outline CLI và Jira CLI nối agent với tài liệu và hồ sơ công việc của nhóm, để nó đọc được những tài liệu và đầu việc mà nhóm đang dùng.
Khi lựa chọn của người duyệt được gửi về
Bạn thử nhờ ai đó tìm giúp một tài liệu, rồi nhận lại cả một trang dài kết quả tìm kiếm mà không có đường dẫn nào rõ ràng: bạn vẫn còn phải tự lục thêm mới dùng được câu trả lời. Agent cũng rơi vào cảnh đó khi công cụ trả lời lỏng lẻo, nên mình chú ý để kết quả có cấu trúc với các trường dữ liệu có tên và ý nghĩa ổn định. Nhờ vậy, một lệnh có thể nói rõ hành động đã hoàn tất hay chỉ là bản xem trước, kết quả đánh giá có thể giữ phương án đã chọn đi cùng ghi chú gắn với nó, và bước tiếp theo chỉ việc đọc thẳng những trường ấy.
Relay, chặng đầu tiên trong yêu cầu sửa màn hình, cho mình thấy điều này rất rõ. Người duyệt có thể chọn một bố cục và để lại bình luận nhờ chỉnh thêm một chi tiết, nên nếu agent chỉ đọc lựa chọn mà bỏ qua bình luận thì nó sẽ hiểu sai ý người duyệt. Vì thế, hướng dẫn của Relay yêu cầu agent đọc mọi kênh phản hồi.

Khi bản thiết kế và tài liệu dài hơn mức cần
Có bố cục rồi, agent cần xem nó trong tệp thiết kế và đọc những gì nhóm đã viết về màn hình. Lúc này đưa quá nhiều thông tin thì agent khó quyết định bước kế tiếp, còn đưa quá ít thì công việc dễ đi sai hướng, nên mình cho agent xem phần tổng quan gọn trước rồi để nó tự chọn chỗ cần đào sâu. Figma Lens chia việc xem thiết kế thành từng bước: agent có thể nhìn tổng thể một bảng thiết kế, chọn một màn hình rồi xem vài phần quan trọng ở kích thước đủ rõ, trong khi các tệp lớn nằm sẵn trong bộ nhớ đệm và kết quả trả về chỉ đường cho agent tìm đến chúng.
Với tài liệu, Outline CLI làm theo cách tương tự. Agent bắt đầu từ ID hoặc bản tóm tắt rồi mới mở trang đã chọn. Nhớ được tiêu đề từ lần trước giúp nó tìm ra nguồn, nhưng muốn biết nội dung hiện tại thì vẫn phải đọc lại trang. Phần tổng quan ở cả hai công cụ giúp agent chọn màn hình hoặc tài liệu cần xem kỹ hơn trước khi mở phần chi tiết.

Khi agent chuẩn bị cập nhật đầu việc
Đến đây agent mới chỉ đọc, còn cập nhật đầu việc ở cuối là thay đổi một hồ sơ mà cả nhóm đang dùng. Đọc một trang và sửa trang đó dẫn đến hệ quả khác nhau, nên mình muốn sự khác biệt ấy hiện ra ngay trong câu lệnh. Figma Lens chỉ đọc. Outline CLI yêu cầu nói rõ ý định ghi dữ liệu trước khi ghi, và khi xóa một tài liệu thì còn cần bằng chứng rằng chính tài liệu đó vừa được đọc gần đây. Jira CLI mặc định chỉ xem trước thay đổi, và phải có cờ thực thi thì mới gửi đi.
Những điều kiện này giúp một lần xem bình thường không vô tình biến thành một lần cập nhật. Thay đổi có được phép hay không vẫn do yêu cầu của người dùng quyết định, còn công cụ chỉ làm cho ranh giới ấy dễ tuân theo hơn chứ không quyết định thay họ.
Khi một lệnh đúng vẫn bị dùng sai
Danh sách tham số cho biết một lệnh nhận những đầu vào gì, nhưng không nói được mấy về lúc nào nên dùng lệnh đó hay lúc nào agent đã có đủ thông tin. Vì danh sách ấy chưa đủ để hướng dẫn cách dùng, mỗi dự án còn có một bộ hướng dẫn dành cho agent, gọi là skill. Hướng dẫn cho Figma yêu cầu agent mở ảnh trả về và xem kỹ chi tiết trước khi làm màn hình, hướng dẫn cho Outline yêu cầu đọc trước khi sửa, còn Relay giải thích khi nào một bảng làm việc có ích và khi nào chỉ cần trả lời ngắn trong cuộc trò chuyện.
Dù đã có hướng dẫn, agent đôi khi vẫn cứ dùng sai một lệnh hoàn toàn hợp lệ. Khi chuyện đó lặp lại, mình xem lại thiết lập mặc định và trình tự các bước trước, sau lệnh ấy, vì phần còn thiếu có thể là một kết quả rõ ràng hơn hoặc một ví dụ về cách làm tiếp sau khi gặp lỗi, trong khi cứ thêm hướng dẫn vào cuối một prompt dài có khi vẫn để nguyên chỗ mơ hồ ban đầu.
Khi công việc bị ngắt giữa chừng
Một yêu cầu như sửa màn hình cũng có thể bị gián đoạn giữa chừng, nên mỗi công cụ giữ lại thứ mà bước kế tiếp cần để làm tiếp. Relay có thể giữ bảng làm việc và phản hồi nháp sau khi lượt chờ kết thúc. Trước khi áp dụng một bản sửa, Outline kiểm tra xem tài liệu còn ở đúng phiên bản mà bản sửa dựa vào hay không. Với Figma, thông tin thiết kế đã lưu sẵn giúp agent quay lại xem kỹ riêng một phần của thiết kế.
Khi agent viết phần lớn code
Mình là người dẫn dắt việc phát triển Figma Lens, Outline CLI và Jira CLI. Mọi thứ bắt đầu từ những chỗ agent hay bị vướng, rồi từ đó mình đặt ra cách mỗi công cụ phản hồi và chỉ cho agent bước tiếp theo. Phần lớn code do agent lập trình viết, còn mình review các thay đổi và chạy thử cả quy trình qua nhiều công cụ, để chỉnh lại yêu cầu mỗi khi từng lệnh riêng lẻ chạy đúng mà làm việc qua lại vẫn còn bất tiện.
Nhờ mấy công cụ cá nhân này, mình có chỗ để thử các quyết định giao diện cụ thể ngay trong công việc của mình. Các bài ghi chép chi tiết về Relay, Figma Lens, Outline CLI và Jira CLI có đủ những lệnh và giới hạn đứng sau từng quyết định ấy.
Các quy ước giao tiếp phía sau quy trình
Outline CLI có các chế độ xem ids, summary và full, đồng thời yêu cầu performAction:true cho thao tác thay đổi dữ liệu. Jira CLI dùng --perform-action. Figma Lens cung cấp các bước gồm scout, focus hoặc focus-set, và detail. Trả về đường dẫn ảnh chụp màn hình không chứng minh agent đã xem ảnh. Relay trả phản hồi dưới dạng JSON và hỗ trợ đánh giá ở chế độ không buộc agent phải chờ liên tục, giữ nguyên định danh bảng qua các lần chờ. Những dự án cá nhân này cho phép mình thử các quyết định giao diện trong chính công việc của mình.
