Các nhà phát triển phát hiện ra rằng tính năng prompt caching của Claude có thể gặp lỗi âm thầm, tính phí ở mức premium trong khi trả về số lượng token được lưu trong bộ nhớ đệm (cached tokens) bằng không. Một đợt chạy log kéo dài một tuần trên một bộ xử lý WhatsApp cho thấy hoàn toàn không có lượt đọc cache nào, tuy nhiên API vẫn tính phí cho tính năng caching—khiến chi phí giảm từ 1.890 USD xuống còn 406 USD mỗi tháng.

Tại sao vấn đề này lại quan trọng

Prompt caching được thiết kế để cắt giảm chi phí và tăng tốc phản hồi bằng cách tái sử dụng một phần tĩnh của prompt (phần "prefix"). Khi hoạt động hiệu quả, các ứng dụng có lưu lượng truy cập cao có thể tiết kiệm hàng trăm đô la trong hóa đơn hàng tháng. Khi không hoạt động, các nhà phát triển phải trả tiền cho một tính năng mà họ thực sự không bao giờ sử dụng, và lỗi âm thầm này không đưa ra bất kỳ thông báo lỗi hay cảnh báo nào để gợi ý về vấn đề.

Lỗi này xuất hiện như thế nào

API chấp nhận một cờ cache-control và một prefix, sau đó báo cáo có bao nhiêu token đã được đọc từ cache. Trong trường hợp được quan sát, mọi yêu cầu đều trả về số lượng đọc cache bằng không. Lệnh gọi vẫn thành công, không có ngoại lệ nào được ném ra, và hóa đơn vẫn phản ánh mức phí cache premium. Lỗi này là vô hình trừ khi bạn ghi log số lượng đọc một cách rõ ràng.

Các cách phổ biến khiến cache bị hỏng

  • Prefix quá ngắn – Mỗi mô hình Claude đều quy định độ dài token tối thiểu cho một prefix có thể cache. Haiku 4.5 cần ít nhất 4.096 token; Sonnet 4.6 chỉ cần 1.024. Việc gửi một prefix ngắn hơn vẫn thỏa mãn định dạng yêu cầu nhưng dịch vụ sẽ bỏ qua chỉ dẫn cache.
  • Một byte biến động bị thay đổi – Việc caching yêu cầu sự khớp chính xác từng byte (byte-for-byte). Thêm một yếu tố động như dấu thời gian (timestamp), new Date(), hoặc email người dùng vào đầu system prompt sẽ làm thay đổi trình tự byte, khiến mọi yêu cầu đều bị coi là một lượt ghi mới, chưa được cache.
  • Thứ tự danh sách công cụ thay đổi – Các công cụ (tools) được chèn vào đầu prompt. Nếu mảng công cụ được xây dựng từ các khóa của đối tượng (object keys), thứ tự lặp có thể thay đổi giữa các lần gọi, làm thay đổi cấu trúc byte và phá vỡ cache.

Các giải pháp bạn có thể áp dụng ngay hôm nay

  • Kiểm tra độ dài prefix – Trước khi gửi yêu cầu, hãy ước tính số lượng token của prefix so với mức tối thiểu của mô hình. Từ chối hoặc chèn thêm (pad) prefix nếu nó không đủ độ dài.
  • Ghi log lượt đọc cache trong mỗi lần gọi – Ghi lại trường "cache read tokens". Một chuỗi các số 0 là dấu hiệu rõ ràng cho thấy cache không được sử dụng.
  • Cố định các byte đầu tiên của prompt – Giữ các dữ liệu động nằm ngoài phân đoạn được cache. Nếu bạn bắt buộc phải bao gồm thông tin cụ thể của người dùng, hãy đặt nó sau prefix đã được cache.
  • Đồng bộ hóa các định danh mô hình – Đảm bảo ID mô hình được sử dụng trong định tuyến (routing) khớp với ID được lưu trong bảng cache của bạn; các ID không khớp sẽ ngăn cản việc tra cứu cache.

Góc độ chi phí

Đối với một ứng dụng thực hiện hàng nghìn lượt gọi mỗi ngày, việc chuyển từ không dùng cache sang có dùng cache có thể làm giảm chi phí hàng tháng một cách đáng kể—từ khoảng 1.890 USD xuống còn 406 USD trong trường hợp được báo cáo. Ngay cả với lưu lượng truy cập khiêm tốn, mức tiết kiệm cũng rất đáng kể, và việc tăng hiệu suất nhờ tái sử dụng một prompt tĩnh lớn có thể giảm độ trễ.

Quan điểm ngược lại

Tuy nhiên, tính chất âm thầm của lỗi này có nghĩa là cách duy nhất để chắc chắn rằng bạn không đang trả thừa tiền là kiểm tra số lượng đọc cache—điều mà nhiều người thường bỏ qua.

Những điều cần theo dõi tiếp theo

  • Bảng điều khiển chỉ số (Metric dashboards) – Thêm một thước đo cho số lượng token đọc từ cache bên cạnh lưu lượng yêu cầu.
  • Sự ổn định của thứ tự công cụ – Nếu bạn dựa vào danh sách công cụ được tạo động, hãy cân nhắc sắp xếp chúng một cách xác định (deterministically) trước khi nhúng chúng vào prompt.

Tóm lại: Prompt caching của Claude không báo lỗi khi nó âm thầm bỏ qua yêu cầu của bạn. Hãy xác minh hiệu quả của cache bằng cách ghi log các token đã đọc, đảm bảo độ dài prefix phù hợp và giữ cho các byte đầu tiên của prompt không thay đổi (immutable). Chỉ khi đó, bạn mới có thể gặt hái được những lợi ích về chi phí và tốc độ như đã hứa.