Mình từng giao cho một trợ lý AI cả một đợt làm lại trang quản trị. Nó làm tốt khoảng nửa đầu. Sau đó nó quên mất mình đã dặn gì, rồi báo "xong hết" trong khi còn sót cả chục chỗ. Nghe quen không? Người làm việc lâu cũng mệt và nhầm y như vậy.
Cách mình đổi là không bắt một AI làm hết nữa. Mình chia việc cho nhiều AI nhỏ, có một "người điều phối" đứng giữa. Bài này kể cách chia, và những thứ phải có để lỡ sai thì quay lại được.
Hình dung như một công trường
Một "agent" là một AI được cấp công cụ (đọc file, chạy lệnh, mở trình duyệt) và tự làm từng bước cho tới khi xong việc được giao. Bạn có thể coi nó như một thợ.
Giao cả căn nhà cho một thợ thì lâu và dễ sót. Cách thường thấy ở công trường là có một chủ thầu. Chủ thầu không tự cầm búa. Họ chia việc, giao cho từng thợ, kiểm tra rồi mới cho làm bước tiếp. Trong giới làm AI, người đó gọi là orchestrator, còn mỗi thợ là một agent con.
Thợ nhận phần việc nhỏ thì nhớ hết được những gì được dặn, nên ít lạc đề hơn.

Làm thế nào
Mình theo bốn nguyên tắc. Cái nào cũng đơn giản, nhưng bỏ cái nào là có ngày trả giá.
Chia việc thành lô nhỏ, ghi rõ được đụng vào đâu. Làm lại trang quản trị, mình không bảo "làm lại cho đẹp". Mình tách thành khung và menu, các trang danh sách, các form, rồi biểu đồ. Mỗi lô có danh sách file được sửa, một điều kiện "xong" đo được (build không lỗi, trang mở được), và một chỗ để quay lại. Hai lô không được sửa cùng một file cùng lúc, nên người điều phối xếp chúng thành từng "đợt" để không đợt nào có hai việc trùng file.
Đồ đắt thì chỉ cho một người dùng mỗi lúc. Bốn AI cùng mở trình duyệt để chụp màn hình thì máy hết bộ nhớ và kết quả đo bị nhiễu. Mình coi trình duyệt, card đồ hoạ hay cổng chạy thử như một chiếc chìa khoá treo trên tường. Ai lấy được thì dùng, người sau chờ. Trên Linux, việc này làm bằng một file khoá (lệnh flock).
Đừng tin lời AI báo xong, hãy tự đo. Câu "đã sửa, build đạt" chỉ là lời khai. Mình gặp hai kiểu: báo thành công nhưng file không đổi, và báo thành công nhưng làm hỏng một file khác. Vì vậy mình viết trước một lệnh kiểm riêng, như tìm đúng dòng chữ trong file, build lại, mở thử địa chỉ trang. Việc chỉ tính là xong khi AI nói ổn và phép đo của mình cũng ổn.

Ghi nhật ký và luôn có đường lùi. Nhật ký là một file chỉ ghi thêm, mỗi dòng là một sự kiện: bắt đầu, xong, đã lùi. Khi có chuyện bạn đọc lại được ai làm gì lúc nào. Còn đường lùi nghĩa là sao lưu trước khi làm, và việc quay lại phải chạy tự động, không dựa vào việc "chắc mình nhớ cách". Chưa thử quay lại lần nào thì coi như chưa có đường lùi.
Lúc đưa lên mạng thật
Bước dễ gây tai nạn nhất là đưa bản mới lên chạy thật (deploy). Cách mình làm: dựng bản mới ở một thư mục riêng, giữ nguyên thư mục đang chạy, rồi đổi tên hai thư mục cho nhau. Đổi tên gần như tức thì. Nếu bản mới trục trặc, đổi tên ngược lại là về như cũ.
Việc đưa lên chạy thật nên do người điều phối hoặc chính bạn làm, đừng giao cho agent con.
Cho bạn nào viết code
Bộ điều phối nhỏ mình dùng để thử khoảng 110 dòng Python, chỉ dùng thư viện có sẵn. Dưới đây là phần cốt lõi. Mỗi việc (Task) khai báo file được đụng, lệnh làm việc, lệnh kiểm riêng và tài nguyên cần giữ.
@contextmanager
def exclusive(resource: str):
"""One holder at a time, across threads AND processes."""
with open(ROOT / f"{resource}.lock", "w") as fh:
fcntl.flock(fh, fcntl.LOCK_EX)
try:
yield
finally:
fcntl.flock(fh, fcntl.LOCK_UN)
def execute(task: Task) -> bool:
dest = backup(task) # 1. copy the files first
log("start", task=task.name, backup=str(dest))
ctx = [exclusive(r) for r in sorted(task.needs)] # sorted order avoids deadlock
for c in ctx: c.__enter__()
try:
r = subprocess.run(task.run, cwd=ROOT / "site", capture_output=True, text=True, timeout=60)
v = subprocess.run(task.verify, cwd=ROOT / "site", capture_output=True, text=True, timeout=60)
finally:
for c in reversed(ctx): c.__exit__(None, None, None)
if r.returncode == 0 and v.returncode == 0: # agent claims AND we measured
log("done", task=task.name)
return True
restore(task, dest) # 2. otherwise go back
log("rolled_back", task=task.name, claimed_ok=r.returncode == 0, verified=v.returncode == 0)
return False
Phần chia đợt và phần đổi tên thư mục khi deploy:
def waves(tasks):
"""Group tasks so no two in the same wave touch the same file."""
out = []
for t in tasks:
for w in out:
if all(not (t.files & o.files) for o in w):
w.append(t); break
else:
out.append([t])
return out
mv build "build-old-$STAMP" # keep the live build: this is the way back
mv build-new build # near-instant swap
if ! "$@"; then # health check from the caller
mv build "build-bad-$STAMP"; mv "build-old-$STAMP" build; exit 1
fi
Mình chạy lại cả hai hôm 21/10/2026 với 5 việc giả lập: hai việc cần "trình duyệt", một agent nói dối (báo thành công nhưng ghi sai nội dung), một agent bị crash giữa chừng và một việc trùng file với việc đầu. Kết quả: đợt 1 có 4 việc, việc trùng file bị đẩy sang đợt 2. Hai việc dùng trình duyệt chạy lần lượt, đo được tối đa một người giữ khoá. Agent nói dối và agent crash đều bị bắt, file trở về nguyên trạng. Nhật ký ghi 5 lần bắt đầu, 3 lần xong, 2 lần lùi. Script đổi tên thư mục cũng thử trên thư mục giả: bản tốt thì giữ lại bản cũ để lùi, bản hỏng thì tự trả về bản cũ. Đây đều là agent giả bằng lệnh shell, mình chưa gọi AI thật trong phép thử này.
Lỗi hay gặp
Lỗi phổ biến nhất là giao việc mơ hồ. Câu "làm lại trang này cho đẹp" cho ra kết quả không có cách nào kiểm. Hãy viết điều kiện xong thành một lệnh chạy được.
Lỗi thứ hai là thêm AI khi cái thiếu là chìa khoá. Nếu máy đang nghẽn vì trình duyệt hay cơ sở dữ liệu, thêm thợ chỉ làm nghẽn hơn. Và lỗi đau nhất: để agent con tự đưa lên mạng thật. Một lần agent nói dối mà không ai đo, bạn sẽ thấy lỗi ngay trên trang khách đang xem.
Làm gì tiếp theo
Lần tới giao việc lớn cho AI, thử ba thứ trước: chia thành lô có danh sách file, viết sẵn lệnh kiểm cho từng lô, và sao lưu rồi thử quay lại một lần. Phần này là kỹ thuật làm phần mềm bình thường, và nó quyết định bạn có dám để AI làm việc lớn hay không.
Cách viết lời dặn cho từng agent con nằm ở bài Viết yêu cầu cho AI sao cho nó làm đúng và không bịa. Nếu muốn tự dựng vòng lặp gọi công cụ bằng code, xem Dùng Claude API trong sản phẩm của bạn: gọi hàm, hiện chữ dần và tiết kiệm tiền.



