Một trợ lý lập trình dựa trên AI trên hàng đợi máy chủ gói miễn phí đã viết một tệp di chuyển schema (schema-migration) sau khi quy tắc “đóng băng di chuyển” (freeze migrations) của hệ thống biến mất trong quá trình nén ngữ cảnh tự động. Sự cố này cho thấy việc dựa vào các hướng dẫn dựa trên prompt để thực thi tính an toàn có thể phản tác dụng khi các phiên chat dài bị tóm tắt.
Chuyện gì đã xảy ra
Một tác nhân (agent) lập trình dùng chung đã chạy với một system prompt chứa một quy tắc duy nhất: không được tạo hoặc sửa đổi các tệp migration. Quy tắc này giúp giữ cho các bản di chuyển schema luôn ở trạng thái đóng băng trên nhánh release trong khi các lập trình viên sử dụng agent để thực hiện các chỉnh sửa thông thường.
Trong một phiên làm việc kéo dài, cuộc hội thoại đã vượt quá giới hạn token của mô hình. Máy chủ đã thực hiện nén ngữ cảnh (context compaction), thay thế toàn bộ lịch sử chat bằng một bản tóm tắt ngắn để duy trì trong hạn mức token. Bản tóm tắt vẫn giữ lại các đề cập đến đường dẫn tệp nhưng đã loại bỏ ràng buộc phủ định (“do not write to migrations/**”). Khi mô hình tạo phản hồi tiếp theo, quy tắc đóng băng không còn nằm trong bộ nhớ làm việc của nó nữa.
Sau đó, agent đã đề xuất một tinh chỉnh SQL để cải thiện tốc độ truy vấn. Công cụ đi kèm đã lưu thay đổi đó thành một tệp migration trên đĩa. Các bài kiểm tra đơn vị (unit tests) vẫn vượt qua vì chúng không bao giờ thực thi các bản migration SQL thô, và sự thay đổi chỉ được phát hiện sau đó trong một bản diff khi review code.
Tại sao điều này lại quan trọng
- Các rào chắn (guardrails) biến mất: Các chính sách ở cấp độ prompt rất không ổn định. Khi ngữ cảnh của mô hình bị nén, bất kỳ mệnh đề "không được" nào cũng có thể bị mất, khiến hệ thống tự do thực hiện các hành động bị cấm.
- Unit test là chưa đủ: Các bài kiểm tra không chạy các script migration có thể tạo ra cảm giác an toàn giả tạo. Thay đổi đã lọt qua vì bộ kiểm tra chưa bao giờ thực thi đoạn SQL mới đó.
- Việc kiểm duyệt của con người bị chậm trễ: Vào thời điểm người kiểm duyệt nhìn thấy bản diff, tệp migration đã được commit, đòi hỏi phải rollback hoặc thực hiện thêm các bước dọn dẹp.
Lỗi này không gây ra sự cố ngừng hoạt động (outage), nhưng nó đã buộc phải làm thêm việc để hoàn tác một bản migration không cần thiết và làm tăng rủi ro về một sai sót tương tự có thể ảnh hưởng đến các cơ sở dữ liệu đang chạy (live databases).
Cách thức rào chắn thất bại
- Chỉ dựa vào prompt – Quy tắc đóng băng chỉ tồn tại dưới dạng văn bản thuần túy trong system prompt.
- Phiên làm việc dài – Cuộc hội thoại phát triển vượt quá cửa sổ ngữ cảnh (context window) của mô hình.
- Nén ngữ cảnh – Máy chủ đã thay thế toàn bộ bản ghi chép bằng một bản tóm tắt tập trung nhiều vào danh từ.
- Mất ràng buộc phủ định – Bản tóm tắt đã bỏ qua chỉ dẫn “không được”, làm mất đi quy tắc.
- Đầu ra của mô hình – Không có quy tắc, mô hình đã tạo ra một phản hồi tạo migration.
Các bộ tóm tắt có xu hướng giữ lại các danh từ (đường dẫn tệp, tên hàm) và loại bỏ các từ phủ định, đó là lý do tại sao quy tắc biến mất một cách âm thầm.
Cách khắc phục: chuyển rào chắn sang luồng ghi (write path)
Thay vì nhúng các lệnh cấm vào prompt, hãy thực thi chúng tại nơi mã nguồn tác động đến đĩa.
- Tạo một tệp chính sách (ví dụ:
agent_policy.txt) liệt kê các đường dẫn bị cấm nhưschema/**hoặcmigrations/**. - Thêm một script tiền áp dụng (pre-apply script) để đọc tệp chính sách và quét mọi bản diff trước khi công cụ áp dụng (apply tool) chạy.
- Nguyên tắc "Fail closed" (từ chối mặc định) nếu tệp chính sách bị thiếu, trống, hoặc nếu một bản diff tác động đến đường dẫn bị cấm.
- Đừng yêu cầu mô hình xác nhận danh sách bị cấm; việc xác nhận chỉ là một tín hiệu, không phải là sự thực thi.
Rào chắn chỉ dùng prompt so với rào chắn dựa trên đĩa
| Khía cạnh | Đóng băng chỉ dùng prompt | Cổng chặn dựa trên đĩa |
|---|---|---|
| Rủi ro nén ngữ cảnh | Quy tắc có thể biến mất | Tệp chính sách vẫn nguyên vẹn |
| Độ bao phủ unit-test | Có thể bỏ lỡ các lệnh ghi bị cấm | Kiểm tra đường dẫn sẽ chặn lệnh ghi bất kể test |
| Thời điểm review của con người | Thiệt hại có thể đã được commit | Lệnh ghi không bao giờ bắt đầu, người review không thấy thay đổi |
| Công sức triển khai | Tối thiểu (chỉ một dòng trong prompt) | Một script nhỏ + tệp chính sách |
Quan điểm đối lập
Những điều cần lưu ý tiếp theo
Bài học rút ra
Nếu bạn cần một quy tắc không bao giờ được phép bị bỏ qua—chẳng hạn như “không thực hiện migration trong thời gian đóng băng”—hãy lưu trữ nó trên đĩa và thực thi tại điểm ghi. Chỉ riêng văn bản prompt không thể đảm bảo tính bền vững một khi ngữ cảnh của mô hình bị nén.
