Prefill không còn được hỗ trợ: cách chuyển đổi prompt cho model Claude mới
Tóm tắt
Model Claude mới không nhận prefill ở lượt assistant cuối và trả lỗi 400. JSON và phân loại chuyển sang structured outputs hoặc tool có enum; bỏ mở đầu dùng chỉ dẫn hệ thống và thẻ XML; kiểm tra code cũ trước khi đổi model.
Nếu bạn từng viết prompt cho Claude đời cũ, rất có thể bạn đã dùng mẹo prefill: điền sẵn phần đầu câu trả lời của assistant, ví dụ { để ép trả JSON, hay "Đây là bản tóm tắt:" để bỏ lời mở đầu. Theo tài liệu Anthropic, từ các model Claude 4.6 trở đi, prefill ở lượt assistant cuối không còn được hỗ trợ: request như vậy sẽ nhận lỗi 400. Nếu bạn đang nâng cấp model, đây là danh sách việc phải sửa.
Thay đổi cụ thể
- Request kết thúc bằng một message assistant điền dở (prefill) gửi tới các model mới → lỗi 400.
- Các model đời trước vẫn hỗ trợ prefill.
- Message assistant ở giữa hội thoại (lịch sử chat) không bị ảnh hưởng.
- Lý do Anthropic đưa ra: khả năng làm theo chỉ dẫn đã đủ tốt để hầu hết trường hợp không còn cần prefill.
Bảng chuyển đổi theo mục đích
| Bạn từng prefill để | Cách làm thay thế |
|---|---|
| Ép định dạng JSON/YAML | Dùng structured outputs (ép theo schema), hoặc yêu cầu rõ định dạng kèm retry khi parse lỗi |
| Phân loại vào nhãn cố định | Tool có trường enum chứa danh sách nhãn hợp lệ, hoặc structured outputs |
| Bỏ lời mở đầu ("Here is…") | Chỉ dẫn trong system prompt: trả lời thẳng, không mở đầu; hoặc yêu cầu output trong thẻ XML rồi trích; lọt thì cắt ở hậu xử lý |
| Lách từ chối không cần thiết | Prompt rõ ràng trong message người dùng; model mới từ chối hợp lý hơn |
| Viết tiếp câu trả lời bị ngắt | Đưa phần đã có vào message người dùng: "Câu trả lời trước bị ngắt ở […]. Hãy viết tiếp từ đó"; hoặc gửi lại request |
| Nhắc lại vai trò, bơm ngữ cảnh định kỳ | Đưa lời nhắc vào lượt user; hệ thống agent thì bơm qua tool hoặc lúc compaction |
Ví dụ: bỏ lời mở đầu
# Trước (prefill, lỗi 400 trên model mới)
messages=[
{"role": "user", "content": "Tóm tắt văn bản sau…"},
{"role": "assistant", "content": "Tóm tắt:"},
]
# Sau
system="Trả lời thẳng vào nội dung. Không mở đầu bằng 'Đây là…', 'Dựa trên…'."
messages=[{"role": "user", "content": "Tóm tắt văn bản sau, đặt trong <summary>…"}]
Rủi ro khi nâng cấp
- Lỗi ẩn trong code cũ: prefill thường nằm sâu trong helper dùng chung; tìm mọi chỗ request kết thúc bằng role assistant.
- Hậu xử lý cũ phụ thuộc prefill: code ghép
"{" + responseđể ra JSON sẽ hỏng khi bỏ prefill; sửa đồng thời. - Đổi hành vi định dạng: chạy lại bộ eval sau khi chuyển, đặc biệt các tác vụ trích xuất và phân loại.
- Thư viện bên thứ ba: framework cũ có thể tự thêm prefill; kiểm tra phiên bản.
Áp dụng thế nào?
- Dev: Grep codebase tìm message cuối có role assistant; chuyển sang structured outputs cho mọi chỗ cần JSON.
- Tech Lead: Thêm test tích hợp gửi request thật tới model mới trước khi đổi model mặc định trong production.
- PM: Đưa "gỡ prefill" vào checklist nâng cấp model, cùng với chạy lại eval chất lượng.