Prompt Caching
Bộ nhớ đệm prompt tái sử dụng các trạng thái key-value mà LLM đã tính cho phần tiền tố prompt lặp lại, nhờ đó các yêu cầu sau bỏ qua bước tính toán này và giảm chi phí.
Lưu bộ nhớ đệm prompt, còn gọi là lưu bộ nhớ đệm tiền tố, lưu các kết quả trung gian mà mô hình ngôn ngữ lớn (LLM) tính toán cho phần đầu của prompt, rồi tái sử dụng cho các yêu cầu sau có phần mở đầu giống hệt. Nhiều yêu cầu dùng chung một tiền tố dài, không thay đổi, chẳng hạn prompt hệ thống, định nghĩa công cụ, tập ví dụ, tài liệu dài hoặc toàn bộ cuộc hội thoại cho đến hiện tại, rồi nối thêm phần mới ngắn. Khi cache hit, máy chủ chỉ xử lý các token mới; nhờ đó thời gian đến token đầu ra đầu tiên ngắn hơn và, với API được lưu trữ, chi phí cho phần đầu vào đã cache giảm xuống chỉ còn một phần nhỏ so với mức thông thường.
Cách hoạt động của lưu bộ nhớ đệm prompt#
LLM dựa trên transformer trả lời theo hai giai đoạn. Trong bước prefill, mỗi lớp tính một vector key và value cho từng token trong prompt; khi giải mã, mỗi token mới chú ý đến tất cả key và value đó thông qua cơ chế attention. Trong một yêu cầu, KV cache giữ các tensor này để mỗi token được tạo không phải tính toán lại prompt. Lưu bộ nhớ đệm prompt giữ chúng giữa các yêu cầu. Vì attention trong các model này có tính nhân quả, key và value của một token chỉ phụ thuộc vào các token đứng trước nó; do đó, hai prompt có cùng tiền tố sẽ có key và value giống hệt nhau cho tiền tố đó, nên bản lưu trữ có thể thay cho việc tính toán lại.
Ví dụ sau minh họa cách tái sử dụng với GPT-2 từ Transformers của Hugging Face. Ví dụ này prefill prompt hệ thống dài 409 token một lần, sau đó trả lời hai câu hỏi bằng cách chỉ chạy các token riêng của từng câu hỏi trên tiền tố đã cache, rồi so sánh kết quả với việc tính toán lại toàn bộ:
import copy
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
# A long system prompt shared by every request, followed by different user questions
system = "You answer questions about a camera store. " + "Returns are accepted within 30 days with a receipt. " * 40
questions = [" Question: Can I return a lens?", " Question: Do you ship abroad?"]
prefix_ids = tokenizer(system, return_tensors="pt").input_ids
with torch.no_grad():
# Prefill the shared prefix once and keep its key-value cache
prefix_cache = model(prefix_ids).past_key_values
for question in questions:
ids = tokenizer(question, return_tensors="pt").input_ids
# Cache hit: only the question's tokens run through the model
cached = model(ids, past_key_values=copy.deepcopy(prefix_cache)).logits[0, -1]
# No cache: the whole prompt is computed from scratch
full = model(torch.cat([prefix_ids, ids], dim=1)).logits[0, -1]
same = torch.allclose(cached, full, atol=1e-3)
print(f"Computed {ids.shape[1]} of {prefix_ids.shape[1] + ids.shape[1]} tokens, same next-token scores: {same}")Chương trình in ra Computed 8 of 417 tokens, same next-token scores: True và Computed 7 of 416 tokens, same next-token scores: True: mỗi yêu cầu chỉ đưa chưa đến 2% số token trong prompt qua model nhưng vẫn có điểm token tiếp theo giống với phép tính đầy đủ.
Các engine mã nguồn mở phục vụ model tự động áp dụng cơ chế này. vLLM lưu KV cache trong các khối có kích thước cố định theo cách bố trí bộ nhớ của PagedAttention, tái sử dụng các khối của tiền tố khớp dài nhất cho mỗi yêu cầu mới và loại bỏ những khối ít được sử dụng gần đây nhất khi bộ nhớ GPU sắp cạn. RadixAttention của SGLang lưu tiền tố đã cache trong cây radix, nhờ đó các yêu cầu chia sẻ bất kỳ đoạn đầu nào cũng có thể tái sử dụng; bài báo SGLang báo cáo thông lượng cao hơn tới 6.4x so với các engine suy luận hiện đại khác. Bài báo Prompt Cache của In Gim và các cộng sự, được trình bày tại MLSys 2024, mở rộng khả năng tái sử dụng từ tiền tố trùng khớp chính xác sang các module prompt được khai báo như template và tài liệu, đồng thời báo cáo mức giảm thời gian đến token đầu tiên từ 8x trên GPU đến 60x trên CPU.
Lưu bộ nhớ đệm prompt trong API LLM#
API lưu trữ cung cấp cùng cơ chế này nhưng tính phí. Lưu bộ nhớ đệm prompt của OpenAI được bật mặc định cho các model được hỗ trợ; lưu bộ nhớ đệm prompt của Claude từ Anthropic được bật bằng trường cache_control, áp dụng một lần cho mỗi yêu cầu hoặc cho tối đa bốn khối nội dung. Anthropic tính phí đọc cache bằng một phần mười hoặc thấp hơn giá đầu vào cơ bản, còn ghi vào cache mặc định năm phút có giá gấp 1.25 lần mức cơ bản; mỗi lần cache hit sẽ đặt lại thời hạn năm phút. Cả hai nhà cung cấp chỉ khớp tiền tố giống hệt nhau: Anthropic so sánh công cụ trước, rồi đến prompt hệ thống và tin nhắn; vì vậy, sửa định nghĩa công cụ sẽ làm mất hiệu lực mọi nội dung đã cache phía sau. Hướng dẫn của OpenAI khuyên đặt chỉ dẫn ổn định và tài liệu tham khảo ở đầu, còn thông tin riêng cho từng người dùng ở cuối.
Các workload có tiền tố dùng chung dài sẽ hưởng lợi nhiều nhất:
- Tác tử AI: Mỗi bước gửi lại định nghĩa công cụ và toàn bộ lịch sử, tức prompt của bước trước cộng với hành động mới nhất và kết quả của hành động đó.
- Chatbot: Mỗi lượt trong cuộc hội thoại đều nối dài prompt của lượt trước, vì vậy lịch sử được lưu vào cache cho đến khi có tin nhắn mới.
- Hỏi đáp tài liệu: Nhiều câu hỏi về một hợp đồng, báo cáo hoặc repository dài sử dụng lại tài liệu đã được xử lý; các pipeline truy xuất cũng tái sử dụng tài liệu mỗi khi truy xuất lại cùng những đoạn văn bản.
- Prompt few-shot: Hàng chục ví dụ cố định được tính toán một lần rồi sử dụng lại cho mọi đầu vào.
Các model thị giác có vocabulary mở tái sử dụng quá trình tính toán prompt theo cách tương tự. Ultralytics YOLOE mã hóa các prompt lớp như "forklift" bằng một text encoder MobileCLIP một lần, khi gọi set_classes(), rồi lưu các embedding thu được trong model, nhờ đó các dự đoán sau này bỏ qua hoàn toàn text encoder; save_prompt_embeddings() ghi chúng vào tệp NPZ để phiên làm việc sau tải bằng load_prompt_embeddings() thay vì chạy lại encoder.
Prompt caching và các thuật ngữ liên quan#
- KV cache: Tái sử dụng key và value giữa các token trong một lần sinh. Prompt caching tái sử dụng chúng giữa các request riêng biệt.
- Semantic caching: Lưu toàn bộ phản hồi và trả về phản hồi đó khi truy vấn mới có ý nghĩa giống một truy vấn trước, bỏ qua hoàn toàn model. Prompt caching vẫn chạy model trên phần prompt mới và tạo câu trả lời mới.
- Nén prompt: Rút ngắn chính prompt, phù hợp với văn bản thay đổi theo từng request. Hai phương pháp kết hợp hiệu quả: phần cố định của prompt được cache, còn phần thay đổi được nén.
- Prompt engineering: Quyết định nội dung prompt. Caching chỉ thay đổi lượng nội dung mà server phải tính toán lại; cache hit giữ nguyên điểm số token tiếp theo, ngoại trừ sai số làm tròn dấu phẩy động.










