Gần đây tôi quan sát được sự lo ngại của nhiều người trong việc apply GenAI vào software development hoặc xây dựng Agentic AI application. Họ nghi ngại về việc GenAI không có tính tất định, hay tính xác định (deterministic), như các công nghệ truyền thống.
Ví dụ khi so sánh với các công cụ tạo code scaffolding. Những công cụ này luôn tuân theo quy tắc cố định, chỉ tạo ra khung mã với cú pháp xác định. Chạy mười lần, ra mười kết quả giống hệt nhau. Nhưng họ không biết đó cũng chính là giới hạn của công cụ truyền thống. Nó xác định vì phạm vi bài toán của nó hẹp. Đưa cho nó một bài toán có ngữ cảnh mở, nó bó tay.
Khi nói tới GenAI, hãy so sánh với con người. Cùng một người, hôm nay viết một đoạn code, tuần sau viết lại chính logic ấy, liệu từng từ, từng dòng có còn giống nhau tuyệt đối? Không. Biến số có thể đổi tên, cấu trúc control flow có thể khác, comment có thể thêm bớt. Nhưng logic nghiệp vụ, kết quả đầu ra, hành vi hệ thống thì không đổi.
Cái quan trọng ở đây là chúng ta nên xem xét sự giống nhau trên phương diện semantic, ngữ nghĩa, thay vì word by word. Một compiler xác định vì nó so khớp cú pháp. Một kỹ sư giỏi, hay một agent giỏi, được đánh giá bằng việc output có đúng ngữ nghĩa, đúng chức năng, đúng ràng buộc, hay không. Đó là hai loại xác định khác nhau, không nên gộp chung để so sánh.
Vậy làm sao để hạn chế việc GenAI agent sáng tạo quá mức, sinh ra những kết quả lệch chuẩn, khó kiểm soát? Vài cách tôi hay áp dụng.
Một, define rõ conventions, rules, recipe trước khi để agent generate. Không thả agent vào không gian mở, phải cho nó rào chắn.
Hai, ask agent học từ chính codebase hiện tại, hoặc từ document chuẩn, để extract style, pattern, naming convention. Agent không đoán mò, nó bắt chước cái đã được xác lập.
Ba, verify bằng test case, bằng eval, bằng golden output, không verify bằng cách đọc từng dòng code so với kỳ vọng trong đầu. Nếu output pass được contract, pass được test, thì việc nó viết khác cách con người viết không còn là vấn đề.
Non-determinism không phải là điểm yếu chí mạng của GenAI. Nó là đặc tính của một hệ thống có khả năng generalize. Vấn đề thật sự không phải là làm sao để GenAI trở nên deterministic như compiler. Vấn đề là làm sao để kiểm soát được biên độ dao động ấy, và đo lường đúng thứ cần đo, tức là ngữ nghĩa và hành vi, chứ không phải câu chữ.