Khâu ingest là chốt chặn đầu tiên, và là chỗ hay bị bỏ qua vì mọi người chỉ phòng thủ ở khâu truy vấn.
Các kênh giấu lệnh thường gặp trong file upload:
- Chữ trắng trên nền trắng, cỡ chữ 0, text nằm ngoài vùng in trong PDF — người đọc không thấy, trình bóc text vẫn lấy ra.
- HTML comment, thuộc tính alt/title, metadata của file.
- Ký tự Unicode vô hình: zero-width space, bidi override, ký tự tag.
- Chuỗi giả dạng vai trò: <|im_start|>system, Assistant:, hoặc thẻ đóng của chính template bạn dùng.
Xử lý khi ingest:
def sanitize(text: str) -> str:
text = unicodedata.normalize("NFKC", text)
text = INVISIBLE_RE.sub("", text) # zero-width, bidi controls
text = ROLE_TOKEN_RE.sub("[removed]", text) # <|im_start|>, "System:", ...
return textNgoài lọc, ba biện pháp cấu trúc quan trọng hơn:
- Đánh dấu nguồn tin cậy: lưu source_trust trong metadata (tài liệu nội bộ đã duyệt vs file người dùng tự upload) và ghi rõ mức tin cậy đó ngay trong prompt.
- Bọc nội dung trong ranh giới rõ ràng (thẻ XML) và nêu trong system prompt rằng nội dung bên trong là dữ liệu để đọc, không phải chỉ thị để thi hành.
- Không cấp quyền theo nội dung tài liệu: quyền gọi tool phải quyết định bởi phiên của người dùng, không bởi thứ model đọc được.
Cuối cùng, nên có bước quét cảnh báo lúc ingest (phát hiện mẫu chỉ thị điển hình) và ghi log để review, thay vì im lặng chấp nhận mọi file.