Tips

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/YAMLDù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ố địnhTool 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ếtPrompt 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.

Nguồn & tham khảo

  1. Prompting best practices: Migrating away from prefilled responses — Claude Docs