Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 6 — Vòng lặp tự sửa lỗi: để agent đọc lỗi và tự vá

Đã đọc 0/9 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Đâ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àm build_range."
  • LLM run_command("pytest test_range.py") → exit=1, expected [0,1,2] got [0,1].
  • LLM read_file → thấy range(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ốn vòng, không cần bạn can thiệp. Đó là sức mạnh của vòng lặp tự sửa.

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.
Ép agent theo nhịp này (qua system prompt) cho kết quả ổn định hơn hẳn kiểu "sửa đại rồi mong đúng".

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.
Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi