Least-privilege giới hạn agent được làm gì. Nhưng ngay cả trong phạm vi được phép, agent vẫn có thể lạm dụng: gửi 10.000 email trong một phút, hoàn tiền liên tục, export dữ liệu ồ ạt vì bị prompt injection. Bài này xây lớp phòng thủ động: guardrail, rate limit và policy engine chặn hành vi bất thường ngay lúc nó xảy ra.
Ba lớp chặn lạm dụng
- Guardrail đầu vào/đầu ra: lọc prompt injection, chặn dữ liệu nhạy cảm rò ra.
- Rate limit & quota: giới hạn tần suất và tổng lượng theo agent + người dùng + tool.
- Policy engine: luật cho phép/từ chối dựa trên ngữ cảnh (số tiền, giờ, vai trò).
Ví dụ: chặn agent hoàn tiền bị lạm dụng
Giả sử tool issue_refund được phép. Ta vẫn ràng buộc:
MAX_REFUND = 500_000
DAILY_LIMIT = 3
def guard_refund(params, ctx):
if params["amount"] > MAX_REFUND:
return Deny("vượt hạn mức, cần người duyệt")
if rate.count(ctx.agent, "issue_refund", window="1d") >= DAILY_LIMIT:
return Deny("vượt số lần hoàn tiền/ngày")
if not business_hours():
return Deny("ngoài giờ hành chính")
return Allow()
Dù prompt có bị chèn lệnh "hoàn 10 triệu", guardrail chặn ở tầng dưới — LLM không phải là ranh giới bảo mật.
Policy engine dạng khai báo (declarative)
Thay vì rải if khắp code, tập trung luật vào một chỗ (ví dụ dùng OPA/Rego hoặc file policy nội bộ):
# policy.yaml — cho phép theo điều kiện
rules:
- tool: issue_refund
allow_if: "amount < 500000 and business_hours"
else: require_approval
- tool: export_customers
allow_if: "false" # cấm tuyệt đối
else: require_approval
- tool: send_email
rate: "20/hour per user"
Lợi ích: bảo mật tách khỏi logic agent, review được, đổi luật không cần sửa code agent.
Human-in-the-loop cho hành động cao rủi ro
Với hành động không thể hoàn tác (xóa dữ liệu, chuyển tiền lớn), đừng để agent tự quyết:
if decision.verdict == "require_approval":
ticket = approvals.create(tool, params, ctx) # gửi cho người duyệt
return "Đã gửi yêu cầu chờ phê duyệt: " + ticket.id
Các bước dựng lớp chống lạm dụng
- Xác định hành động rủi ro cao (tài chính, xóa, export, gửi hàng loạt).
- Đặt hạn mức cứng cho từng tool: số tiền, số lần, tổng khối lượng.
- Rate limit theo nhiều chiều: theo agent, theo người dùng, theo tool.
- Viết policy khai báo tập trung, tách khỏi code agent.
- Thêm human-in-the-loop cho hành động không thể hoàn tác.
- Chặn ở tầng tool/backend, không tin LLM tự tuân thủ.
Khung tư duy: "LLM không phải hàng rào bảo mật"
Mọi guardrail phải nằm bên ngoài model, ở tầng deterministic (code, policy engine, DB constraint). Prompt "đừng làm điều xấu" chỉ là gợi ý, không phải cơ chế chặn. Nếu một hành động bị chặn chỉ vì system prompt yêu cầu, coi như chưa được chặn.
Checklist chống lạm dụng
- [ ] Hành động rủi ro cao có hạn mức cứng (tiền, số lần, khối lượng).
- [ ] Rate limit theo agent + người dùng + tool.
- [ ] Policy tập trung, khai báo, review được.
- [ ] Hành động không hoàn tác được có human-in-the-loop.
- [ ] Guardrail nằm ở tầng code/backend, không phụ thuộc prompt.
- [ ] Có kill switch tắt tool/agent tức thời khi phát hiện bất thường.
Sai lầm thường gặp
- Dựa vào system prompt để chặn ("không được hoàn quá 500k") — injection vượt qua dễ dàng.
- Rate limit chỉ theo agent, quên theo người dùng — một user độc hại gọi agent xả quota.
- Không có kill switch: khi agent chạy loạn, phải đi sửa code + deploy mới dừng được.
- Cho agent tự quyết hành động không thể hoàn tác thay vì đẩy sang người duyệt.
- Guardrail chỉ ở đầu vào, quên kiểm đầu ra — dữ liệu nhạy cảm vẫn rò trong câu trả lời.