Đây là bài "aha" của khóa học: khi bạn nối sửa file với chạy test trong một vòng lặp, agent có thể tự sửa lỗi — sửa, chạy test, đọc lỗi, sửa lại, cho tới khi xanh. Ta gọi đây là vòng lặp edit-run-observe.
Nguyên lý: lỗi là thức ăn, không phải chướng ngại
Trong agent tự sửa, thông báo lỗi (traceback, assertion, exit_code≠0) không phải điều cần giấu — nó là tín hiệu quý nhất. Toàn bộ thiết kế tool ở bài 3–5 (trả lỗi thay vì raise, kèm stderr, kèm exit_code) chính là để phục vụ vòng lặp này.
Bước 1: Prompt hệ thống định hướng hành vi tự sửa
Bạn là coding agent. Quy trình bắt buộc:
1. Đọc code liên quan trước khi sửa.
2. Sau MỖI lần sửa, CHẠY test để kiểm chứng.
3. Nếu test rớt, đọc kỹ lỗi và sửa nguyên nhân gốc.
4. CHỈ báo hoàn thành khi test xanh (exit_code=0).
Không được tuyên bố xong khi chưa chạy test.
Câu số 4 cực kỳ quan trọng: nó chặn thói "lạc quan" của LLM — hay tuyên bố "đã sửa xong" mà chưa hề chạy.
Bước 2: Chu trình edit-run-observe
lặp:
edit_file(...) # sửa
kq = run_command("pytest -q") # kiểm chứng
nếu "exit_code=0" trong kq:
báo hoàn thành; dừng
ngược lại:
đọc lỗi trong kq -> sửa tiếp # LLM tự làm ở vòng sau
Vòng lặp agent (bài 3) tự nhiên hiện thực hóa chu trình này: mỗi lần LLM gọi run_command và nhận kết quả rớt, nó có đủ thông tin để quyết bước sửa kế.
Ví dụ đầy đủ: sửa bug off-by-one
- Task: "Test
test_rangeđang rớt, sửa hàmbuild_range." - LLM
run_command("pytest test_range.py")→exit=1, expected [0,1,2] got [0,1]. - LLM
read_file→ thấyrange(n-1). - LLM
edit_file:range(n-1)→range(n). - LLM
run_command("pytest test_range.py")→exit=0, 1 passed. - LLM ngừng gọi tool → "Đã sửa off-by-one và test xanh."
Bước 3: Chống vòng lặp vô ích
Agent có thể kẹt: sửa → rớt → sửa lại y hệt → rớt... Chiến lược chống kẹt:
- Đếm số lần thử trên cùng một lỗi; sau N lần (ví dụ 3), buộc agent đổi chiến lược hoặc dừng và hỏi người dùng.
- So sánh output test giữa các vòng; nếu lỗi không đổi nhiều lần, cảnh báo agent "cách tiếp cận hiện tại không hiệu quả, thử hướng khác".
- Trần vòng lặp tổng (max_steps) như một phanh cứng.
Khung tư duy: Red → Green → Refactor cho agent
- Red: chạy test, xác nhận nó rớt (hiểu đúng lỗi).
- Green: sửa tối thiểu để test xanh.
- Refactor: dọn code, chạy lại test đảm bảo vẫn xanh.
Checklist agent tự sửa
- [ ] System prompt cấm tuyên bố xong khi chưa chạy test.
- [ ] Tool trả lỗi đầy đủ (stderr + exit_code) để agent "thấy".
- [ ] Có cơ chế phát hiện lặp vô ích (đếm thử lại).
- [ ] Có trần vòng lặp tổng.
- [ ] Agent chạy lại test sau mỗi lần sửa, không gộp nhiều sửa rồi mới test.
Sai lầm thường gặp
- Agent tự nhận "đã sửa xong" mà chưa chạy test. Thiếu ràng buộc verify là lỗi thiết kế phổ biến nhất; luôn ép chạy test.
- Che giấu lỗi khỏi LLM (nuốt stderr, hoặc raise làm sập). LLM mất tín hiệu để tự sửa.
- Không chống vòng lặp lặp lại. Agent sửa đi sửa lại cùng một chỗ, đốt token vô ích.
- Sửa nhiều chỗ rồi mới test một lần. Khi rớt, không biết thay đổi nào gây lỗi. Sửa nhỏ, test thường xuyên.
- Tin lời tự đánh giá của LLM thay vì tín hiệu khách quan (exit_code). Luôn ưu tiên bằng chứng máy móc.