Viết prompt cho cache, đừng viết cho người đọc
Prefix caching tính tiền token lặp lại chỉ bằng một phần nhỏ giá gốc. Nắm được điều này rồi thì cách bố trí prompt thôi không còn là chuyện viết lách, mà thành chuyện hệ thống.
4 phút đọcViết từ Seoul và Nha Trang
Các LLM API hiện đại cache lại trạng thái key-value của phần đầu (prefix) của prompt. Gửi đi cùng một chuỗi token mở đầu hai lần, thì lời gọi thứ hai chỉ bị tính khoảng một phần mười giá input và trả về nhanh hơn thấy rõ. Đúng một sự thật này đã sắp xếp lại toàn bộ cách chúng tôi viết mọi prompt chạy khối lượng lớn.
Quy tắc
Mọi thứ ổn định xếp lên trước, giống nhau đến từng byte ở mọi lời gọi: system rules, output schema, các ví dụ few-shot, bảng tra cứu. Mọi thứ hay thay đổi dồn xuống cuối: task, các tài liệu vừa truy xuất, phần văn bản của người dùng. Cache vỡ ngay tại byte đầu tiên khác biệt, nên chỉ một cái timestamp trong header cũng đủ đầu độc cả prefix.
[ system rules ] stable, versioned ─┐
[ output schema ] stable, versioned ├─ cached prefix, ~91% of tokens
[ 12 few-shot examples ] stable, versioned ─┘
[ retrieved context ] volatile ──────────────── paid in full
[ the actual task ] volatile
Đo trên một trong các pipeline trích xuất của chúng tôi
| cách bố trí prompt | tái dùng prefix | chi phí mỗi 1k lời gọi | p50 latency |
|---|---|---|---|
| task lên trước, rules chèn giữa, timestamp trong header | 0% | $31.40 | 4.1 s |
| prefix ổn định, task xuống cuối | 91% | $6.90 | 1.8 s |
Cùng một model, cùng độ chính xác, rẻ hơn 78% và nhanh gấp đôi, chỉ nhờ một diff đơn thuần dời chỗ mấy đoạn văn.
Hệ quả về vận hành
- Prefix được đánh version như một API. Sửa nó là một lần phát hành có chủ đích, bởi mỗi lần sửa là một cú flush cache trên toàn bộ hệ thống và một cú vọt chi phí thấy rõ. Chúng tôi gắn cho prompt một hằng số version và đưa nó ra như đưa một schema migration.
- Hàng đợi batch được sắp theo prefix. Các request dùng chung một prefix chạy sát nhau để cache luôn nóng, thay vì bị dọn đi giữa hai lần trúng.
- Hit rate là một chỉ số được ghi log. API báo về số token được cache cho mỗi lời gọi; chúng tôi vẽ chúng lên biểu đồ. Một cú tụt lặng lẽ của cache hit rate đã tóm được hai lần lỡ tay sửa prompt trước cả khi hóa đơn kịp phát hiện.
- Cấm mọi thứ ngẫu nhiên bén mảng vào prefix. Không timestamp, không request ID, không cái trò xổ số thứ tự key trong dict. Việc serialize phải chuẩn tắc, key được sắp xếp, cũng cùng một lý do mà build system muốn đầu vào tất định.
Chẳng có điều nào trong số này đụng đến chất lượng. Nó thuần túy là chuyện giữ vệ sinh hệ thống, áp lên một tài nguyên mà phần lớn các team còn không biết là mình đang phí phạm.
Ghi thêm, tháng 6 năm 2026. Ghi chú này bỏ sót một điều kiện. Giá cache chỉ bật lên khi prefix vượt qua một số token tối thiểu, và ở dưới cái sàn đó thì một prefix ổn định tới đâu cũng không hề được cache. Vì cùng một nội dung lại có số token khác nhau ở mỗi ngôn ngữ, bản gốc tiếng Anh có thể là bên phải trả giá đầy đủ trong khi các bản dịch thì được cache. Chúng tôi phát hiện đúng điều đó trên hóa đơn của mình.