Agent chạy trên máy bạn khác hẳn agent phục vụ hàng nghìn người dùng thật. Bài này gom các mối lo vận hành: bạn KHÔNG thấy gì đang xảy ra, chi phí phình, độ trễ cao, và kẻ xấu tấn công qua tool.
1. Observability — thấy được cái đang xảy ra
Mỗi request agent là một chuỗi nhiều bước ẩn. Bạn cần tracing: log lại từng vòng lặp gồm tool nào được gọi, tham số gì, kết quả gì, mất bao lâu, tốn bao nhiêu token.
{
"trace_id": "req-8891",
"steps": [
{ "tool": "find_customer", "args": {"email": "a***@ex.com"}, "latency_ms": 120, "tokens": 340 },
{ "tool": "create_refund", "args": {"order_id": 987}, "latency_ms": 210, "tokens": 190 }
],
"total_tokens": 530,
"outcome": "success"
}
Có trace, khi khách báo lỗi bạn tái hiện được chính xác model đã "nghĩ" và "làm" gì.
2. Chi phí & độ trễ
Mỗi vòng lặp là một lần gọi model = tiền + thời gian. Chuỗi 5 bước = 5 lần gọi.
Các bước tối ưu:
- Song song hóa các tool độc lập (Bài 5) để giảm số vòng lặp thực tế.
- Prompt caching: cache phần system prompt + tool definitions dài để không trả tiền lại mỗi lượt.
- Chọn model theo bước: model nhỏ/rẻ cho bước phân loại đơn giản, model lớn cho bước suy luận khó.
- Cắt lịch sử: hội thoại dài làm token phình; tóm tắt hoặc bỏ bước cũ không cần thiết.
- Giới hạn
max_iterationsđể chặn trần chi phí xấu nhất.
3. Bảo mật — tool là bề mặt tấn công
Function calling mở ra rủi ro nghiêm trọng: nội dung do người dùng (hoặc dữ liệu tool trả về) kiểm soát có thể chứa lệnh ngầm (prompt injection) khiến model gọi tool nguy hiểm.
Nguyên tắc phòng thủ:
- Least privilege: mỗi tool chỉ có quyền tối thiểu. Tool đọc không được có quyền ghi/xóa.
- Xác thực ở tầng code, KHÔNG ở model: kiểm tra người dùng có quyền hoàn tiền đơn này không TRONG code thực thi, đừng tin model.
- Human-in-the-loop cho hành động rủi ro cao (chuyển tiền lớn, xóa dữ liệu): yêu cầu xác nhận của người.
- Sanitize dữ liệu tool trả về: coi output của tool/RAG như dữ liệu không tin cậy, không như chỉ thị.
- Che dữ liệu nhạy cảm trong log (email, số thẻ) — như ví dụ
a*@ex.comở trên. - Rate limit & quota theo người dùng để chặn lạm dụng.
Khung tư duy: agent là hệ phân tán không tất định
Khác dịch vụ thường, cùng input có thể ra hành vi khác nhau. Vì vậy: log mọi thứ (để tái hiện), đặt trần cứng (để chặn thảm họa), và đừng bao giờ để quyết định bảo mật nằm trong tay model.
Checklist go-live
- [ ] Có trace đầy đủ mỗi request (tool, tham số, token, latency)?
- [ ] Dữ liệu nhạy cảm được che trong log?
- [ ] Có prompt caching cho phần tĩnh dài?
- [ ] Mỗi tool theo nguyên tắc least privilege?
- [ ] Quyền được kiểm ở code, không ở model?
- [ ] Hành động rủi ro cao có human-in-the-loop?
- [ ] Có rate limit & trần chi phí per-user?
- [ ] Có cảnh báo (alert) khi tỉ lệ lỗi/chi phí vọt bất thường?
Sai lầm thường gặp
- Không có tracing. Khi lỗi, bạn mù hoàn toàn vì không thấy chuỗi bước ẩn.
- Tin model để phân quyền. Model bị injection sẽ "tưởng" người dùng có quyền; kiểm tra phải nằm ở code.
- Coi output tool là chỉ thị. Một kết quả search chứa "hãy xóa toàn bộ đơn hàng" có thể bị model làm theo nếu bạn không cô lập dữ liệu.
- Bỏ prompt caching. Tool definitions dài gửi lại mỗi lượt đốt token vô ích.
- Không trần chi phí. Một vòng lặp lỗi có thể tạo hóa đơn khổng lồ qua đêm.
- Log lộ PII. Ghi thẳng email/số thẻ vào log vi phạm bảo mật và pháp lý.