Ngày 2 tháng 9, blog dành cho nhà phát triển của Google đăng một bài viết về kỹ thuật harness, tác giả là Shir Meir Lador. Bài viết đưa ra một định nghĩa khá thẳng thắn về harness: toàn bộ những thành phần xác định (deterministic) bọc quanh mô hình lớn — lớp điều phối, sandbox thực thi, cơ chế lưu trạng thái, công cụ kiểm định — đều nằm trong đó.
Mở đầu bài viết là một con số đối lập: trong một sản phẩm thử nghiệm nội bộ của OpenAI, số dòng code viết tay là 0, ba kỹ sư chỉ dựa vào code do mô hình sinh ra để dựng và phát hành bản beta nội bộ. Tác giả dùng ví dụ này để đặt vấn đề không nằm ở năng lực mô hình, mà nằm ở lớp cấu trúc giữ cho mô hình chạy trong một quy trình có thể kiểm soát được.
Dây cương, miếng che mắt và đường đua
Bài viết dùng phép ví von đua ngựa: mô hình là con ngựa, harness là đường đua, miếng che mắt và dây cương, có nhiệm vụ giữ cho nó chạy đúng một hướng.
"The harness is composed of all the deterministic components that wrap the LLM."
Harness được cấu thành từ toàn bộ các thành phần xác định bao bọc quanh mô hình ngôn ngữ lớn.
Định nghĩa này dịch chuyển một mảng công việc trước đây vẫn được xếp vào "prompt engineering". Muốn ràng buộc hành vi mô hình chỉ có hai cách: viết vào prompt, hoặc viết vào code bên ngoài. Cách đầu dựa vào việc mô hình tự giác tuân thủ, đổi mô hình là phải tinh chỉnh lại; cách sau là ràng buộc cứng, mô hình đổi đời vẫn có hiệu lực. Trong năm qua, phần lớn các đội làm sản phẩm agent đều đã thử cả hai, và cũng đã trả giá cho cả hai. Câu prompt "đừng sửa file test" — đến vòng thứ ba mươi trong ngữ cảnh dài, mô hình bắt đầu "mù chọn lọc" với chính câu đó.
Ba nguyên tắc thiết kế
Ranh giới nghiêm ngặt. Nhốt agent vào sandbox, không cho nó cơ hội đụng vào dữ liệu production. Trong bản demo của bài viết, agent chỉ được ghi file trong thư mục ./sandbox; thao tác vượt ranh giới đơn giản là không được thực thi.
Vòng lặp tự sửa. Lỗi không nên bị ném thẳng cho con người. Test chạy trượt, harness đưa log sạch phản hồi lại cho mô hình để nó tự sửa. Ở đây ADK 2.0 dùng workflow dựa trên đồ thị (graph) — bản thân bước kiểm định là một nút định tuyến trong đồ thị, chạy trượt sẽ tự động đưa luồng điều khiển vòng lại nút sinh code, không cần viết tay logic retry trong code điều phối.
Cấu trúc repo có thể khám phá dần. Đừng viết một file hướng dẫn dài hàng nghìn dòng rồi nhét thẳng cho agent một lần. Hãy tổ chức repo sao cho agent có thể đào sâu từng lớp, tự khám phá ngữ cảnh khi cần.
Antigravity SDK đi kèm phụ trách phía môi trường cục bộ: phân định ranh giới workspace, đồng thời cung cấp khả năng lưu trữ bộ nhớ lâu dài. Hai công cụ ghép lại, phủ đúng hai vấn đề: "agent chạy ở đâu" và "chạy sai thì quay lại bằng cách nào".
Giới hạn 5 vòng và cái công tắc đó
Vòng lặp tự chữa lành trong bản demo đi trọn một chu kỳ: agent viết code trong sandbox bị giới hạn, tự chạy test, test trượt, log được phản hồi ngược, agent sửa, rồi chạy lại. Giới hạn được đặt ở 5 vòng, chạm mốc đó thì harness cắt ngang, tác giả gọi đó là kill switch.
Con số 5 này là con số thực dụng nhất trong cả bài viết. Kiểu thất bại điển hình của vòng lặp tự chữa lành là mô hình nhảy qua nhảy lại giữa hai trạng thái lỗi, mỗi vòng đều đốt token mà không hội tụ. Đặt một giới hạn cứng, tức là chấp nhận trước rằng có lúc mô hình bó tay, và trả vấn đề lại cho con người sớm hơn. Không có công tắc này, một vòng lặp chạy lệch có thể đốt sạch ngân sách trong một đêm không ai giám sát.
So với các framework agent phổ biến hồi nửa đầu năm nay, sự dịch chuyển trọng tâm khá rõ. Các framework đời đầu nói nhiều về điều phối — làm sao nối nhiều agent lại, phân công thế nào, truyền message ra sao. Giờ người ta nói nhiều hơn về kiểm định và ranh giới: thực thi ở đâu, lỗi quay về bằng cách nào, khi nào thì dừng. Cái trước giải quyết "có chạy được không", cái sau giải quyết "có dám để nó chạy trên dự án thật hay không".
Với những đội không dùng đúng bộ công cụ của Google, bản thân ADK 2.0 và Antigravity SDK chưa chắc dùng được, nhưng ba nguyên tắc thì hoàn toàn có thể áp dụng nguyên xi. Sandbox, vòng lặp sửa lỗi, ngữ cảnh khám phá dần — bất kỳ agent lập trình tự xây nào cũng phải đối mặt với ba thứ này, khác nhau chỉ ở chỗ thiết kế trước hay đợi đến khi nó xóa mất file test một lần rồi mới vá lại.
Nguồn tham khảo: blog nhà phát triển Google, CocoLoop, tài liệu dự án ADK và Antigravity SDK; định nghĩa harness, ba nguyên tắc thiết kế và giới hạn 5 vòng được đối chiếu theo bài gốc, số liệu 0 dòng code viết tay và 3 kỹ sư được dẫn theo bài viết.