Hầu hết mọi người đang cố sửa AI agent ở sai tầng.
Khi một agent thất bại, họ viết lại prompt. Khi nó lại thất bại, họ thêm nhiều chỉ dẫn hơn, đổi model, tăng context window hoặc kết nối thêm một công cụ khác.
Rồi những vấn đề cũ lại quay về.
Agent quên mất một quyết định quan trọng. Nó dùng sai công cụ. Nó không nhớ nổi chuyện gì đã xảy ra cách đó ba bước. Nó tuyên bố task đã xong mà chẳng thèm kiểm tra kết quả. Nó lặp đi lặp lại một hành động thất bại cho đến khi cạn sạch ngân sách.
Vấn đề không phải lúc nào cũng nằm ở model.
Vấn đề nằm ở môi trường xung quanh nó.
Môi trường đó chính là harness.
Harness Engineering (Kỹ thuật xây dựng Harness) là quá trình xây dựng hệ thống bao quanh một model để quyết định nó được thấy gì, được làm gì, ghi nhớ điều gì, thế nào là thành công và chuyện gì sẽ xảy ra khi có lỗi.
Một prompt tốt hơn có thể cải thiện một câu trả lời.
Một harness tốt hơn sẽ cải thiện mọi lần chạy.
Theo dõi Substack của tôi để đọc thêm các bài phân tích thực tế về AI agent, tự động hóa và hệ thống production:
1. Model Không Phải Là Agent
Một model có thể suy luận, tạo nội dung, so sánh và lựa chọn.
Điều đó không biến nó thành một agent đáng tin cậy.
Một agent thực thụ còn cần tìm đúng context, sử dụng công cụ, duy trì state, tuân thủ quyền hạn, tự kiểm tra kết quả của mình và phục hồi khi môi trường hoạt động khác với dự kiến.
Model chỉ là bộ máy suy luận.
Harness là toàn bộ phần còn lại giúp biến suy luận đó thành hành động thực tế.
1YÊU CẦU CỦA NGƯỜI DÙNG2 |3 v4+-----------------------------+5| HARNESS |6| |7| contract context |8| tools state |9| policy verification |10| traces recovery |11+-----------------------------+12 |13 v14 MODEL15 |16 v17MÔI TRƯỜNG THỰC TẾ
Đặt cùng một model vào khung chat, nó sẽ trả lời câu hỏi.

Đặt nó vào một repository có quyền truy cập terminal, test, công cụ trình duyệt, bộ nhớ dự án, quyền hạn được kiểm soát và vòng lặp review, nó có thể hoàn thành công việc thực sự.
Model không hề thay đổi.
Chỉ có harness thay đổi.
2. Biến Mọi Yêu Cầu Thành Một Bản Hợp Đồng
Ngôn ngữ tự nhiên rất linh hoạt.
Nhưng việc thực thi tự động thì không nên như vậy.
Một yêu cầu kiểu:
Cải thiện luồng onboarding.
thì ổn nếu có người ngồi cạnh model.
Nhưng nó cực kỳ tệ nếu dùng làm chỉ thị trong production.
Trước khi agent hành động, hãy biến yêu cầu đó thành một bản hợp đồng task có giới hạn rõ ràng.

1objective: giảm tỷ lệ rời bỏ ở bước onboarding23inputs:4 - tài liệu tóm tắt sản phẩm5 - dữ liệu analytics6 - repository78constraints:9 - giữ nguyên cơ chế xác thực10 - không thay đổi schema database11 - giữ nguyên hành vi hiện tại trên mobile1213deliverable:14 - pull request có thể review1516done_when:17 - test chạy qua18 - event analytics kích hoạt đúng19 - luồng desktop qua vòng review20 - luồng mobile qua vòng review2122approval_required:23 - triển khai lên production
Phần quan trọng nhất là done_when.
Không có nó, agent có thể giải quyết một phiên bản dễ hơn của bài toán rồi vẫn tự tin báo rằng task đã xong.
Có nó, việc hoàn thành mới trở nên đo lường được.
Agent không nên hỏi:
Tôi nên làm gì tiếp theo?
Nó nên hỏi:
Hành động nào đưa môi trường hiện tại tiến gần hơn đến kết quả đã cam kết trong hợp đồng?
Đó mới là một vòng lặp vững chắc hơn nhiều.
3. Cho Agent Một Tấm Bản Đồ, Đừng Nhét Cả Context Window Khổng Lồ
Phản xạ thường thấy khi agent mắc lỗi là nhồi thêm context cho model.
Thêm tài liệu.
Thêm lịch sử hội thoại.
Thêm file.
Thêm output từ công cụ.
Cuối cùng, agent nhận được mọi thứ nhưng lại hiểu ít đi.
Context không phải nơi lưu trữ.
Nó là ngân sách chú ý.

Thay vì đổ cả dự án vào mỗi lần chạy, hãy cho agent một tấm bản đồ nhỏ chỉ ra thông tin hữu ích nằm ở đâu.
1BẢN ĐỒ DỰ ÁN23quy tắc sản phẩm -> docs/product/4kiến trúc -> docs/architecture.md5frontend -> apps/web/6backend -> services/api/7test -> tests/8câu lệnh -> docs/commands.md9bảo mật -> docs/security.md
Sau đó chỉ mở rộng khi thực sự cần.
1TASK2 |3 v4BẢN ĐỒ DỰ ÁN5 |6 v7HỆ THỐNG LIÊN QUAN8 |9 v10FILE CỤ THỂ11 |12 v13CHỈ THỊ NỘI BỘ
Tài liệu gốc gọi đây là progressive disclosure (tiết lộ dần dần): harness chỉ nên tải thêm thông tin vì task cần đến nó, chứ không phải chỉ vì thông tin đó tồn tại.
Mục tiêu không phải là context tối đa.
Mục tiêu là tín hiệu hữu ích tối đa.
4. Đặt Một Cổng Kiểm Soát Giữa Model Và Các Công Cụ
Một model có hai mươi công cụ không tự động mạnh gấp hai mươi lần.
Nó có thể chỉ có thêm hai mươi cách để thất bại.
Mỗi công cụ đều cần một bản hợp đồng.
1CÔNG CỤ: edit_file23INPUTS4path5patch67ĐIỀU KIỆN TIÊN QUYẾT8path tồn tại9path nằm trong workspace1011THÀNH CÔNG12patch được áp dụng13trả về diff1415THẤT BẠI16lỗi có cấu trúc17không ghi đè một phần1819RỦI RO20có thể đảo ngược
Khi đó, luồng thực thi sẽ trở thành:
1MODEL ĐỀ XUẤT2 |3 v4CỔNG KIỂM TRA XÁC THỰC5 |6 v7POLICY PHÊ DUYỆT8 |9 v10CÔNG CỤ THỰC THI11 |12 v13HARNESS GHI NHẬN KẾT QUẢ
Model quyết định nó muốn làm gì.
Harness quyết định hành động đó có hợp lệ, được phép và an toàn hay không.

Sự phân biệt này trở nên sống còn khi công cụ có thể gửi tin nhắn, thay đổi production, tiêu tiền hoặc xóa dữ liệu.
Một cổng kiểm soát công cụ tốt còn có thể thêm timeout, xác thực tham số, giới hạn đường dẫn file, chuẩn hóa lỗi và giúp việc thử lại trở nên an toàn.
Công cụ tốt sẽ giảm bớt số thứ mà model phải đoán.
5. Đưa Bộ Nhớ Ra Khỏi Cuộc Hội Thoại
Cuộc hội thoại không nên là nơi lưu trữ dữ liệu gốc của hệ thống.
Các agent chạy dài cuối cùng sẽ chạm giới hạn context, sập, khởi động lại hoặc chuyển giao công việc sang session khác.
Nếu mọi quyết định quan trọng chỉ tồn tại trong đoạn chat, workflow đó cực kỳ mong manh.
Hãy lưu state bền vững ở nơi khác.

1{2 "task_id": "feature_042",3 "status": "đang xác minh",4 "current_step": "kiểm_tra_mobile",56 "completed": [7 "triển khai",8 "unit_tests",9 "kiểm_tra_desktop"10 ],1112 "decisions": [13 "tái sử dụng endpoint export hiện có",14 "giữ nguyên định dạng ngày tháng hiện tại"15 ],1617 "artifacts": [18 "export.csv",19 "desktop-after.png"20 ],2122 "open_risks": [23 "thanh công cụ trên mobile có thể bị tràn"24 ],2526 "next_action": "hiển thị viewport mobile"27}
Một hệ thống hữu ích sẽ chia bộ nhớ thành bốn loại:
1DỮ KIỆN2kiến thức ổn định34QUYẾT ĐỊNH5đã chọn gì và tại sao67STATE8lần chạy hiện tại đang ở đâu910BÀI HỌC11những lỗi cần ảnh hưởng đến các lần chạy sau
Session agent tiếp theo nên kế thừa trạng thái công việc, chứ không phải một câu chuyện tóm tắt về cuộc hội thoại trước đó.
6. Lấy Bằng Chứng Làm Điều Kiện Để Hoàn Thành
Agent nói "xong rồi" không có nghĩa là việc đã xong.

Đó chỉ là một output khác của model.
Harness cần bằng chứng quan sát được.
1TUYÊN BỐ BẰNG CHỨNG23"đã sửa bug" test từng lỗi giờ đã chạy qua45"trang hoạt động" luồng trình duyệt đã hoàn tất67"dữ liệu chính xác" giá trị khớp với nguồn89"migration an toàn" dry run + rollback thành công1011"task hoàn tất" mọi bước kiểm tra chấp nhận đều đạt
Hãy dùng các bước kiểm tra tất định trước.
1cú pháp2 |3 v4kiểu dữ liệu5 |6 v7test cục bộ8 |9 v10integration test11 |12 v13review trực quan / ngữ nghĩa14 |15 v16con người phê duyệt
Đừng bắt một model khác trả lời thứ mà compiler, test, schema hay câu query database có thể chứng minh.
Dùng model để phán đoán.
Dùng hệ thống tất định để xác minh dữ kiện.
Model tạo ra artifact.
Môi trường tạo ra bằng chứng về artifact đó.
Harness quyết định xem bằng chứng đã đủ chưa.
7. Tách Người Xây Dựng Khỏi Người Kiểm Tra
Việc tự review còn một vấn đề nữa.
Agent tạo ra lỗi thường mang chính những giả định đó vào bước review.

Một kiến trúc vững chắc hơn sẽ tách riêng worker và verifier.
1BUILDER2 |3 v4tạo ra bản nháp5 |6 v7VERIFIER8 |9 +-- kiểm tra hợp đồng10 +-- tìm các trường hợp bị thiếu11 +-- kiểm chứng các tuyên bố chưa có căn cứ12 +-- cố gắng phá vỡ kết quả13 |14 +------ ĐẠT ------> CHẤP NHẬN15 |16 +------ LỖI ------> TRẢ VỀ BẰNG CHỨNG
Verifier không nên hỏi:
Nhìn ổn chưa?
Nó nên hỏi:
Điều gì sẽ khiến thứ này không thể chấp nhận được?
Điều đó biến việc review từ xác nhận thành nỗ lực bác bỏ.
Tài liệu gốc đặc biệt khuyến nghị việc cung cấp cho khâu xác minh bộ tiêu chí từ chối riêng và đủ sự độc lập để thách thức các giả định đã tạo ra kết quả ban đầu.
8. Đưa Quyền Hạn Ra Khỏi Model
Một số quy tắc không bao giờ nên phụ thuộc vào việc model có nhớ chúng hay không.
1không bao giờ publish khi chưa được duyệt2không bao giờ để lộ secret3không bao giờ vượt hạn mức chi tiêu4không bao giờ ghi file ngoài workspace5không bao giờ nhận bừa là test đã chạy qua nếu chưa chạy
Đây không phải gợi ý trong prompt.

Đây là policy.
Một thang phân quyền đơn giản:
1RỦI RO THẤP23đọc4tìm kiếm5kiểm tra67-> tự động89CÓ THỂ ĐẢO NGƯỢC1011chỉnh sửa workspace12chạy test13tạo bản nháp1415-> tự động + ghi log1617CÓ TÁC ĐỘNG RA BÊN NGOÀI1819gửi20deploy21mua hàng2223-> cần phê duyệt2425KHÔNG THỂ ĐẢO NGƯỢC / NHẠY CẢM2627xóa dữ liệu28xoay vòng credential29publish toàn cầu3031-> chặn cứng hoặc cấm hoàn toàn
Hậu quả càng lớn, kiểm soát càng chặt.
Model có thể đề xuất hành động.
Harness phê duyệt hành động đó.
Công cụ thực thi nó.
Tự chủ không có nghĩa là thiếu kiểm soát.
Nó là sự tự do bên trong một ranh giới được thực thi nghiêm ngặt.
9. Ngừng Thử Lại Một Cách Mù Quáng
Một trong những chính sách phục hồi tệ nhất là:
Có lỗi xảy ra. Thử lại đi.
Nếu không có gì thay đổi, hệ thống chỉ đang trả tiền để tái tạo lại đúng lỗi đó.
Lỗi cần được phân loại trước.

1TOOL TIMEOUT2-> thử lại với backoff34THAM SỐ KHÔNG HỢP LỆ5-> sửa lại lệnh gọi tool67THIẾU CONTEXT8-> lấy thêm nguồn dữ liệu bị thiếu910TEST THẤT BẠI11-> kiểm tra hành vi gây lỗi1213BỊ TỪ CHỐI QUYỀN14-> yêu cầu phê duyệt1516YÊU CẦU MÂU THUẪN NHAU17-> leo thang xử lý1819LỖI LẶP LẠI KHÔNG THAY ĐỔI20-> dừng
Một vòng lặp agent hữu ích sẽ trông như thế này:
1QUAN SÁT2 |3 v4QUYẾT ĐỊNH5 |6 v7HÀNH ĐỘNG8 |9 v10ĐO LƯỜNG11 |12 +---- CHẤP NHẬN13 |14 +---- SỬA LỖI15 |16 +---- LEO THANG17 |18 +---- DỪNG
Mỗi vòng lặp đều cần giới hạn về số lần thử, thời gian, chi phí và phạm vi tác động.
Một agent đáng tin cậy cần biết cách tiếp tục.
Nó cũng cần biết khi nào việc thử thêm không còn đáng nữa.
10. Biến Chỉ Dẫn Lặp Đi Lặp Lại Thành Hạ Tầng
Giả sử prompt có dòng:
Luôn chạy formatter.
Quy tắc đó sẽ mạnh hơn nhiều nếu formatter tự động chạy.
Giả sử chỉ dẫn ghi:
Code UI không được truy cập trực tiếp vào database.
Điều đó sẽ mạnh hơn nếu biến thành một architecture test tự báo lỗi khi quy tắc bị vi phạm.
Quá trình tiến hóa diễn ra như sau:
1GIẢI THÍCH2 |3 v4CHECKLIST5 |6 v7TEMPLATE8 |9 v10KIỂM TRA TỰ ĐỘNG11 |12 v13POLICY BẮT BUỘC
Prompt nên giải thích cách phán đoán.
Harness nên thực thi các bất biến.
Mỗi lỗi lặp đi lặp lại nên được đẩy xuống một bậc trong thang này.
Cuối cùng, model không cần phải nhớ bài học đó nữa.
Môi trường sẽ nhớ thay cho model.
11. Ghi Lại Quá Trình Chạy
Một artifact cuối cùng hoàn hảo có thể che giấu một luồng thực thi thảm họa.
Có thể agent đã truy cập sai nguồn.
Có thể nó phớt lờ một lệnh bị lỗi.
Có thể nó lặp lại một hành động bên ngoài tới hai lần.
Có thể nó tiêu tốn gấp mười lần ngân sách dự kiến.
Có thể nó ra đáp án đúng nhưng vì lý do sai.
Hãy ghi lại đủ thông tin để dựng lại những gì đã xảy ra.
109:14 tạo hợp đồng task209:15 tải architecture.md309:17 chỉnh sửa checkout.ts409:18 test cục bộ thất bại509:21 sửa lại phần triển khai609:22 test cục bộ đạt709:24 integration test đạt809:25 deploy bị chặn: cần phê duyệt
Log hữu ích bao gồm nguồn context, lệnh gọi tool, thay đổi state, kết quả xác minh, lý do thử lại, quyết định phê duyệt, chi phí và độ trễ.
Mục đích không phải là thu thập log cho vui.
Mục đích là khoanh vùng lỗi.
Nếu bước 18 hỏng, bạn phải sửa được bước 18.
Bạn không nên phải chạy lại toàn bộ quá trình.
12. Cấp Biên Lai Cho Mỗi Lần Chạy
Đừng ép con người phải đọc lại đoạn chat dài bốn mươi tin nhắn.
Hãy tổng hợp kết quả thành một biên lai ngắn gọn.
1MỤC TIÊU23Sửa lỗi áp dụng coupon trùng lặp.45ĐÃ THAY ĐỔI67xác thực checkout8regression test910ĐÃ XÁC MINH1112lint đạt13unit test đạt14integration test đạt1516CHƯA XÁC MINH1718nhà cung cấp thanh toán trên production1920RỦI RO2122client mobile đời cũ không khả dụng2324CẦN PHÊ DUYỆT2526deploy lên staging
Đây không phải bản tóm tắt những gì model tự nhận là đã làm.
Đây là bản tóm tắt những gì harness có thể chứng minh là đã xảy ra.
Chính sự khác biệt đó giúp biên lai trở nên hữu ích cho việc review, bàn giao và các session agent sau này.
13. Để Mỗi Thất Bại Giúp Harness Tốt Hơn
Hầu hết các team chỉ sửa output bị lỗi.
Cách tốt hơn là sửa cái hệ thống đã để lỗi đó xảy ra.
1THIẾU CONTEXT2-> cải thiện bản đồ dự án34SAI CÔNG CỤ5-> cải thiện routing hoặc hợp đồng tool67OUTPUT TỆ8-> thêm validator910VÒNG LẶP VÔ TẬN11-> thêm giới hạn retry1213HÀNH ĐỘNG KHÔNG AN TOÀN14-> thêm cổng kiểm soát quyền1516MẤT QUYẾT ĐỊNH17-> lưu state bền vững1819LỖI CHƯA RÕ NGUYÊN NHÂN20-> cải thiện tracing
Đây là lúc Harness Engineering bắt đầu phát huy sức mạnh cộng gộp.
Sửa một output chỉ giúp được một lần chạy.
Sửa một harness sẽ cải thiện mọi lần chạy sau đó.
Những hệ thống agent tốt nhất ngày càng đáng tin cậy vì mỗi lỗi để lại một mảnh hạ tầng phía sau.
14. Bắt Đầu Với Harness Hữu Ích Nhỏ Nhất
Bạn không cần một nền tảng orchestration khổng lồ để bắt đầu.
Hãy xây dựng theo từng lớp.
1LEVEL 023prompt4model56LEVEL 178hợp đồng task9bản đồ dự án10công cụ1112LEVEL 21314state có cấu trúc15xác minh16vòng lặp có giới hạn1718LEVEL 31920quyền hạn21log vết22phục hồi23cổng kiểm soát của con người
Một task nghiên cứu ngắn có thể chỉ cần prompt và một lần review.
Một task code kéo dài sáu tiếng có quyền truy cập file, mạng và khả năng deploy thì cần nhiều hơn thế.
Chỉ thêm độ phức tạp khi bề mặt lỗi đòi hỏi điều đó.
Chứ không phải vì kiến trúc agent trông có vẻ ngầu.
Checklist Harness Engineering
Trước khi trao cho agent quyền tự chủ thực sự, hãy tự hỏi:
1[ ] Tiêu chí thành công đã được định nghĩa trước khi thực thi chưa?23[ ] Agent có tìm được đúng context4 mà không cần tải mọi thứ không?56[ ] Mỗi công cụ có mục đích,7 schema và trạng thái lỗi rõ ràng không?89[ ] Các quyết định quan trọng có được lưu10 ngoài cuộc hội thoại không?1112[ ] Việc hoàn thành có yêu cầu bằng chứng không?1314[ ] Các hành động rủi ro có được bảo vệ bởi policy không?1516[ ] Mỗi vòng lặp có giới hạn retry không?1718[ ] Quá trình chạy có thể tiếp tục sau khi bị gián đoạn không?1920[ ] Bạn có thể dựng lại mọi hành động quan trọng không?2122[ ] Thất bại có giúp cải thiện quy tắc, công cụ,23 test, bản đồ hay quyền hạn không?2425[ ] Thay đổi cuối cùng có thể rollback không?
Nếu nhiều câu trả lời là không, một model mạnh hơn sẽ không tự động làm agent đáng tin cậy hơn.
Nó có thể chỉ khiến lỗi xảy ra nhanh hơn và tốn kém hơn.
Sự Chuyển Dịch Thực Sự
Prompt engineering hỏi:
Tôi nên nói gì với model?
Context engineering hỏi:
Model nên biết gì ngay lúc này?
Harness engineering hỏi:
Hệ thống nào cho phép model hành động, xác minh công việc, phục hồi sau lỗi và vận hành an toàn?
1PROMPT2-> chỉ thị34CONTEXT5-> góc nhìn làm việc67HARNESS8-> môi trường vận hành910LOOP11-> điều chỉnh cục bộ1213GRAPH14-> phối hợp
Các model sẽ liên tục thay đổi.
Lợi thế bền vững nằm ở phần bao quanh chúng.
Hợp đồng của bạn tốt hơn.
Công cụ của bạn tốt hơn.
Test của bạn tốt hơn.
State của bạn sạch hơn.
Quyền hạn của bạn an toàn hơn.
Logic phục hồi của bạn thông minh hơn.
Thất bại của bạn biến thành hạ tầng.
Đó là cách các model mạnh mẽ trở thành agent đáng tin cậy.
Đó chính là Harness Engineering.
Nếu Bạn Đã Đọc Đến Đây
Hãy lưu lại hướng dẫn này.
Theo dõi tôi trên X: x.com/0xjmori
Đăng ký Substack của tôi: substack.com/@lunarresearcher
Gửi bài viết này cho ai đó vẫn đang cố sửa mọi lỗi của agent bằng một prompt dài hơn.



![[Lời xin lỗi] Tôi không còn khuyên làm Freelance để tự chủ nữa.](/cdn-cgi/image/width=1920,quality=90,format=auto,metadata=none/https%3A%2F%2Fcms-assets.youmind.com%2Fmedia%2F1790615558140_ndvona_HTQ9s6laYAAX4J7.jpg)

