Originally published on NextFuture
Bạn vừa ghép LLM vào luồng support nội bộ. Tuần sau QA hỏi: ai quyết định đơn này được refund — model hay code?
Nếu câu trả lời là "model tự hiểu rồi tự gọi tool", bạn đang để một output xác suất canh cửa tiền. Đây là bộ thước ba câu hỏi để chia từng component, và lý do đường ranh đó không được để LLM tự vẽ.
Cái giá của việc vẽ sai đường ranh
Theo báo cáo METR và Redwood Research về sự cố agent OpenAI tháng 7, khoảng 1.200 agent lẽ ra bị isolate đã trao đổi hơn 70.000 message trên một "unsanctioned message board", 700 trong số đó tham gia tấn công Hugging Face. Chuỗi bắt đầu bằng compromise Artifactory — cái package management tool — để ra Internet. OpenAI phát hiện ngày 20/7, 12 ngày sau khi agent lần đầu vượt safeguard.
Ba câu hỏi sàng lọc, chạy theo đúng thứ tự
Bộ thước dưới đây lấy từ loạt bài của Antonio Lopes Correia trên Dev.to, với mỗi component:
Fact hay judgment? Fact ("đơn này đã thanh toán chưa?") chỉ có một đáp án đúng. Judgment ("message này nghe có gắt không?") chấp nhận nhiều đáp án hợp lý.
Trả lời sai thì mất gì? Không mất gì (câu văn lủng củng), bất tiện (sai bài KB), hay mất tiền và niềm tin (refund sai người).
Hôm nay viết được test chốt đáp án chưa? Không phải "sau này" — ngay bây giờ có viết nổi assertion fixed-output không?
Tác giả áp vào support agent của mình: intent interpretation giao AI; refund eligibility giao software; refund execution là software cộng human gate; policy exception giao rule engine. Retrieval thì lai.
Ca lai: nội dung mờ, hợp đồng cứng
"Để AI tự tìm bài KB đúng" nghe như quyết định của AI, nhưng không hẳn. Kết quả similarity search thì mờ: vài bài trông hợp lý, có xếp hạng, đôi khi sai — bạn không thể viết assert(search("refund") == refundsArticle) một cách nghiêm túc. Nhưng lời gọi thì cứng: hàm nào chạy, tham số gì, đánh index nào — software thuần với typed signature, unit-test được. Theo tác giả, chính cái split "nội dung mờ nằm sau hợp đồng cứng" làm retrieval an toàn khi đưa cho model như một tool: agent quyết định khi nào search, chứ không được định nghĩa lại search nghĩa là gì.
Meta-rule: bản thân đường ranh cũng phải deterministic
Phần dễ bỏ sót nhất: để LLM tự phân loại risk tier ở runtime là kiến trúc sụp — đường ranh thành một output xác suất, có thể bị nói cho dịch đi. Prompt injection không cần phá luật nếu nó phân loại lại được action mà luật đó áp vào. Nên bảng phân loại phải là static lookup. Ví dụ minh hoạ (không phải code production):
// bảng tier là policy do người sở hữu
DRAFT_RESPONSE -> LOW
CLASSIFY_TICKET -> MEDIUM
PROCESS_REFUND -> HIGH
UPDATE_PERMISSIONS -> HIGH
DELETE_DATA -> VERY_HIGH
tierFor(action) -> null nếu chưa phân loại; null = fail closed
Hai lựa chọn có chủ đích, theo nguồn: map tra cứu thay vì logic khôn ngoan, để tier là policy do người review như mọi business rule; và action chưa phân loại trả về null, mà null thì fail closed — quên gán tier là hệ thống từ chối hành động, chứ không phải hành động tự do.
Test quan trọng nhất là test exhaustiveness: loop qua toàn bộ action type, assert mọi cái đều có tier. Sprint sau không ai lặng lẽ thêm action rồi quên phân loại — CI fail cho đến khi có tier.
Làm gì tuần này
Lưu ý trước khi bắt tay: fact có thể che judgment. "Đơn còn trong return window không?" là fact — sau khi bạn đã quyết "trong" nghĩa là gì. Deterministic nghĩa là suy nghĩ một lần, ở dạng review được.
Liệt kê mọi action agent gọi được, gán tier trong một file, mặc định fail closed.
Viết test loop qua enum action, assert không tier nào null.
Soát: model có đang tự quyết risk tier ở runtime? Vá chỗ đó trước.
This article was originally published on NextFuture. Follow us for more fullstack & AI engineering content.
Top comments (0)