
Ai cũng đang nói về AI agent: tự viết code, tự gọi tool, tự sửa lỗi. Nghe như phép màu.
Thực tế thì không hẳn. Giao cho model một task rồi chúc "may mắn nhé", bạn có thể nhận về một kiệt tác, cũng có thể nhận về một thảm họa rất sáng tạo. Thứ quyết định kết quả nhiều khi không nằm ở model, mà ở phần hạ tầng bao quanh nó. Phần đó có tên: agent harness.
Đây là bài mở đầu cho một series về AI agent. Bài này lo phần nền: agent harness là gì, nó gánh những việc gì, vòng lặp của một agent chạy ra sao, và vì sao hai agent dùng cùng một model lại có thể làm việc chênh nhau một trời một vực. Các bài sau sẽ biến từng phần thành code.
Agent harness là gì?
Hình dung model như một lập trình viên cực giỏi, biết gần như mọi thứ, nhưng có hai tật. Thứ nhất, không có tay: chỉ nói được "tôi muốn chạy lệnh này", chứ không tự chạy được. Thứ hai, trí nhớ ngắn: hết một lượt trao đổi là quên sạch, trừ những gì bạn đưa lại cho đọc.
Agent harness là toàn bộ phần mềm bao quanh model để biến những lời nói đó thành hành động - và làm việc đó một cách đáng tin cậy.
Chữ "harness" nghĩa gốc là bộ yên cương. Con ngựa khỏe là một chuyện, nhưng phải có cương, có dây và có người cầm dây thì sức khỏe đó mới kéo xe đi đúng đường. Model cung cấp trí thông minh. Harness cung cấp tay chân, trí nhớ, và một chút lẽ thường.
Hình đầu bài vẽ đúng ý đó. Con ngựa là model: rất khỏe, nhưng tự nó không biết đi đâu. Cái xe là task. Bộ cương ở giữa là harness, và nó làm bốn việc: điều hướng (steers) để con ngựa đi đúng đường, kết nối (connects) sức kéo với cái xe, giới hạn (contains) để con ngựa không chạy lung tung, và đo lường (measures) để biết xe đã đi được bao xa. Giữ bốn chữ này trong đầu khi đọc năm việc của harness ngay bên dưới.
Viết gọn thành công thức:
AI agent = model + harness
Các coding agent bạn đang dùng, như Claude Code, về bản chất là một harness bọc quanh một model ngôn ngữ. Model trả lời câu hỏi; harness mới là thứ làm cho câu trả lời đó chạm được vào terminal, file và API của bạn.
Năm việc một agent harness phải lo
1. Quản lý context
Model chỉ "nhìn thấy" những gì nằm trong context window - lượng văn bản có giới hạn mà nó đọc được mỗi lượt. Task càng dài, lịch sử càng phình: output của lệnh, nội dung file, log lỗi. Harness quyết định cái gì được giữ nguyên, cái gì được tóm tắt, cái gì bỏ đi, để agent không quên mục tiêu giữa chừng hay chết chìm trong log của chính nó.
Ví dụ quen thuộc: nạp sẵn file hướng dẫn của dự án (như CLAUDE.md) vào đầu mỗi
phiên, và tự tóm tắt phần hội thoại cũ khi context sắp đầy để làm tiếp mà không
mất mạch.
2. Thực thi tool
Model không chạy được gì cả. Nó chỉ sinh ra một yêu cầu có cấu trúc, đại loại "gọi
tool run_command với tham số npm test". Harness mới là bên đọc yêu cầu đó, chạy
lệnh thật, đọc file, gọi API, rồi đóng gói kết quả gửi lại cho model.
Mỗi tool được khai báo bằng tên, tham số và một đoạn mô tả. Mô tả viết ẩu thì model dùng tool sai - giống như đưa cho người mới vào một thùng đồ nghề không dán nhãn.
3. Lập kế hoạch và điều khiển vòng lặp
Harness điều phối vòng nghĩ - làm - quan sát - lặp lại (chi tiết ở phần sau). Nó cũng quyết định khi nào dừng: task đã xong, hết số bước cho phép, hết ngân sách token, hay cần hỏi lại người dùng. Agent không có điểm dừng rõ ràng thì hoặc dừng quá sớm, hoặc chạy vòng vòng đến khi hết tiền.
4. An toàn và phân quyền
Đây là phần ngăn một task nhỏ biến thành một sự cố production. Harness quyết định
agent được đọc gì, ghi gì, lệnh nào chạy luôn, lệnh nào bắt buộc phải xin phép
(rm -rf, git push --force, một lời gọi API tốn tiền). Một số harness còn chạy
lệnh trong sandbox hoặc container, để lỡ có sai thì cũng chỉ sai trong phạm vi hẹp.
Nguyên tắc ở đây giống hệt khi khóa một VPS public trong 30 phút: chỉ mở đúng những gì cần, còn lại đóng mặc định. Agent là một tiến trình chạy lệnh thay bạn, nên hãy đối xử với nó như một user mới trên server - quyền tối thiểu, mở thêm khi có lý do.
5. Trạng thái và phục hồi
Lệnh fail, mạng chập chờn, API trả lỗi 500, model trả về JSON hỏng. Harness phải bắt được những lỗi đó, đưa thông tin lỗi lại cho model để nó thử cách khác, và lưu tiến độ để không phải làm lại từ đầu.
Điểm mấu chốt: lỗi của tool không nên làm sập cả agent. Với harness tốt, một lệnh fail chỉ là thêm một quan sát cho lượt tiếp theo - "cách này không được, thử cách khác".
Tóm lại: model là bộ não; harness là tay chân, trí nhớ, và cái phanh.
Vòng lặp agent chạy như thế nào
Bỏ hết chi tiết, mọi agent đều quay quanh một vòng lặp:
- Bạn đưa cho agent một mục tiêu.
- Model quyết định bước tiếp theo: trả lời luôn, hay gọi một tool.
- Harness thực thi tool đó.
- Harness thu kết quả và đưa ngược lại cho model.
- Lặp lại cho đến khi xong việc - hoặc đến khi ai đó hết token.
Viết thành code, phần lõi ngắn đến bất ngờ:
messages = [{"role": "user", "content": goal}]
while True:
response = model.generate(messages, tools=TOOLS)
messages.append(response)
if not response.tool_calls: # model không cần làm gì thêm
break
for call in response.tool_calls:
if not allowed(call): # phân quyền
result = "Từ chối: cần người dùng xác nhận"
else:
try:
result = run_tool(call) # thực thi tool
except Exception as e:
result = f"Lỗi: {e}" # lỗi cũng là một quan sát
messages.append(tool_result(call, result))
messages = trim_context(messages) # quản lý context
Chưa tới hai chục dòng. Vòng while thì ai cũng viết được; cái khó nằm trong
allowed, run_tool và trim_context - ba hàm mà một harness thật dành hàng
nghìn dòng cho chúng.
Một vòng chạy thật trông thế này. Bạn nhờ agent: "test login đang fail, sửa giúp
mình".
- Model gọi tool chạy
npm test. Harness chạy và trả về: một test fail,expected 200, got 401. - Model gọi tool đọc
src/auth.ts. Harness trả về nội dung file. - Model nhận ra phép so sánh thời hạn token bị viết ngược, gọi tool sửa đúng một dòng.
- Model chạy lại
npm test. Tất cả pass. - Model không gọi thêm tool nào, trả lời bạn kèm tóm tắt thay đổi. Vòng lặp dừng.
Suốt quá trình đó, model không hề chạm vào terminal hay file. Mọi tương tác với thế giới thật đều đi qua harness.
Đây là ý quan trọng nhất của bài: AI agent không chỉ là một LLM. Hệ thống bao quanh mới quyết định agent làm việc hiệu quả đến đâu ngoài đời thật.
Vì sao harness quan trọng không kém model
Lấy cùng một model, đặt vào hai harness khác nhau, bạn sẽ có hai agent khác hẳn nhau. Thiếu một harness tốt, model mạnh đến đâu cũng vấp ở những chỗ rất đời thường:
- Task dài: context đầy, model quên yêu cầu ban đầu, bắt đầu sửa những thứ không ai nhờ.
- Tool lỗi: một lệnh timeout làm cả phiên đứng lại, thay vì được thử lại.
- Vòng lặp vô tận: sửa A làm hỏng B, sửa B làm hỏng A, cứ thế đốt token.
- Báo cáo sai: agent tự tin báo "Done!" trong khi chưa chạy lại test lần nào.
Lỗi cuối là khó chịu nhất, vì nó trông y như thành công. Harness tốt chống lại nó bằng cách ép agent kiểm chứng - chạy test, đọc lại file, xem diff - trước khi được phép kết luận. Không ai muốn một agent hớn hở báo "xong rồi" khi thực ra chưa làm gì cả.
Một harness được thiết kế tốt làm agent:
- đáng tin hơn - xử lý được lỗi và task dài mà không lạc hướng;
- dễ quan sát hơn - mọi lời gọi tool đều có log, bạn biết agent đã làm gì và vì sao;
- an toàn hơn - quyền hạn rõ ràng, thao tác nguy hiểm phải qua tay người;
- dễ cải tiến hơn - đổi model, thêm tool, chỉnh prompt mà không phải viết lại từ đầu.
Những gì harness không làm được
Công bằng mà nói, harness cũng có giới hạn:
- Không biến model yếu thành model giỏi. Harness giúp model dùng hết khả năng vốn có, không thêm khả năng mà nó không có. Model không hiểu bài toán thì harness tốt mấy cũng chỉ giúp nó sai một cách có tổ chức hơn.
- Không thay được việc review. Phân quyền giảm rủi ro chứ không xóa rủi ro. Code do agent viết vẫn cần người đọc trước khi lên production.
- Nhiều tool hơn chưa chắc đã tốt hơn. Mỗi tool thêm vào là thêm một lựa chọn để model chọn sai, và thêm một đoạn mô tả chiếm chỗ trong context. Một bộ tool nhỏ, mô tả rõ ràng thường thắng một bộ tool to mà mơ hồ.
Tiếp theo: tự dựng một coding agent
Lý thuyết vậy là đủ. Đến lúc xắn tay áo.
Bài tiếp theo trong series sẽ dựng một coding agent kiểu Claude Code từ đầu, để xem một AI coding agent vận hành bên dưới ra sao: vòng lặp agent, cách thực thi tool, và cách quản lý context khi task kéo dài. Năm phần ở trên sẽ lần lượt thành code chạy được.
Cùng làm thứ gì đó hay ho. Và hy vọng là không xóa mất production.



