Agent thực sự hiếm khi giải quyết xong việc trong một tool call. Nó chọn tool → nhận kết quả → suy nghĩ → chọn tool tiếp → ... cho đến khi đủ dữ liệu để trả lời. Đây là agent loop (vòng lặp agent), trái tim của mọi hệ thống agentic.
Giải phẫu agent loop
1. Gửi tin nhắn + danh sách tool cho model
2. Model trả về: hoặc câu trả lời cuối, hoặc (các) tool call
3. Nếu là tool call: thực thi → thêm kết quả vào lịch sử hội thoại
4. Quay lại bước 1 với lịch sử đã cập nhật
5. Lặp cho đến khi model trả câu trả lời cuối (hoặc chạm giới hạn vòng lặp)
Điểm cốt lõi: bạn phải duy trì lịch sử hội thoại đầy đủ — mỗi lượt gồm: tin nhắn model (chứa tool call) VÀ tin nhắn kết quả tool. Thiếu một mắt xích, model mất ngữ cảnh.
Ví dụ chuỗi phụ thuộc: hoàn tiền đơn hàng
Yêu cầu: "Hoàn tiền đơn hàng gần nhất của khách hàng có email an@example.com".
Bước 1: find_customer(email="an@example.com") -> customer_id=42
Bước 2: get_latest_order(customer_id=42) -> order_id=987, amount=500000, status="delivered"
Bước 3: check_refund_policy(order_id=987) -> eligible=true
Bước 4: create_refund(order_id=987, amount=500000) -> refund_id=R-100
Bước 5: model trả: "Đã hoàn 500.000đ cho đơn 987."
Mỗi bước dùng output bước trước. Không thể song song. Model tự điều phối chuỗi này nếu bạn cung cấp đủ tool và mô tả tốt.
Các bước xây dựng vòng lặp bền vững
- Vòng
whilevới biến đếm vàmax_iterations(ví dụ 10) để chống lặp vô tận. - Sau mỗi tool call, append cả tool call lẫn kết quả vào messages.
- Kiểm tra điều kiện dừng: model không còn gọi tool → xong.
- Xử lý lỗi tool ngay trong loop: trả lỗi về cho model để nó thử cách khác thay vì crash.
- Giới hạn ngân sách: đếm token/thời gian, dừng khi vượt ngưỡng.
- State machine cho flow nhạy cảm: với chuỗi có bước không thể đảo (đã hoàn tiền), dùng máy trạng thái để tránh lặp lại hành động.
messages = [system, user]
for _ in range(MAX_ITER):
resp = model.call(messages, tools=TOOLS)
if not resp.tool_calls:
return resp.content # điều kiện dừng
messages.append(resp.message) # lưu tool call
for tc in resp.tool_calls:
result = safe_execute(tc) # bọc try/except
messages.append(tool_result(tc.id, result))
raise MaxIterationsExceeded()
Khung tư duy: ReAct (Reason + Act)
Mỗi vòng lặp là một chu kỳ "suy luận rồi hành động": model nghĩ cần gì → hành động (gọi tool) → quan sát kết quả → nghĩ tiếp. Thiết kế tool và prompt để khuyến khích model nêu lý do trước khi hành động sẽ tăng độ tin cậy của chuỗi.
Checklist agent loop production
- [ ] Có
max_iterationschống lặp vô tận? - [ ] Lịch sử lưu ĐỦ cả tool call lẫn tool result?
- [ ] Lỗi tool được trả về model, không crash loop?
- [ ] Có giới hạn token/thời gian/chi phí?
- [ ] Hành động không thể hoàn tác (thanh toán) có chốt chặn idempotency?
- [ ] Có log từng bước để truy vết khi sự cố?
Sai lầm thường gặp
- Quên append tool result vào lịch sử. Model gọi tool nhưng không thấy kết quả, sẽ gọi lại mãi hoặc bịa kết quả.
- Không giới hạn vòng lặp. Một model lú có thể gọi tool vô hạn, đốt sạch chi phí.
- Crash khi tool lỗi. Nên trả lỗi về model để nó thích ứng, thay vì ném exception ra ngoài.
- Thiếu idempotency cho hành động ghi. Nếu loop chạy lại bước
create_refund, khách bị hoàn tiền hai lần. Dùng khóa idempotency. - Song song hóa chuỗi phụ thuộc. Cố gọi
create_refundtrước khi cóorder_idlà công thức gây lỗi.