Prompt Caching
프롬프트 캐싱은 LLM이 반복되는 프롬프트 접두부에 대해 계산한 키-값 상태를 재사용하므로, 후속 요청에서 해당 계산을 생략하고 비용을 줄일 수 있습니다.
접두사 캐싱이라고도 하는 프롬프트 캐싱은 대규모 언어 모델 (LLM)이 프롬프트 앞부분을 처리해 계산한 중간 결과를 저장하고, 정확히 동일한 텍스트로 시작하는 후속 요청에 재사용합니다. 많은 요청은 시스템 프롬프트, 도구 정의, 예시 모음, 긴 문서, 지금까지의 대화처럼 변하지 않는 긴 접두사 뒤에 짧은 새 내용을 덧붙여 공유합니다. 캐시 적중이 발생하면 서버는 새 토큰만 처리하므로 첫 출력 토큰까지 걸리는 시간이 줄어듭니다. 호스팅 API에서는 캐시된 입력의 가격도 일반 요금의 일부로 낮아집니다.
프롬프트 캐싱 작동 방식#
트랜스포머 LLM은 두 단계로 답변을 생성합니다. 프리필 단계에서는 각 레이어가 프롬프트 토큰마다 키 벡터와 값 벡터를 계산하며, 디코딩 단계에서는 새 토큰이 어텐션 메커니즘을 통해 모든 키와 값에 어텐션합니다. 하나의 요청 안에서는 KV 캐시가 이러한 텐서를 유지해 생성 토큰마다 프롬프트를 다시 계산하지 않도록 합니다. 프롬프트 캐싱은 이를 여러 요청에 걸쳐 유지합니다. 이러한 모델의 어텐션은 인과적이므로 토큰의 키와 값은 해당 토큰 이전의 토큰에만 의존합니다. 따라서 접두사가 동일한 두 프롬프트는 해당 접두사에 대해 동일한 키와 값을 가지며, 저장된 복사본을 다시 계산하는 대신 사용할 수 있습니다.
다음 예제는 Hugging Face Transformers의 GPT-2를 사용해 결과를 재사용하는 방법을 보여 줍니다. 409토큰 시스템 프롬프트를 한 번만 프리필한 다음, 캐시된 접두사에 각 질문의 토큰만 추가해 두 질문에 답하고 전체를 다시 계산한 결과와 비교합니다.
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}")Computed 8 of 417 tokens, same next-token scores: True 및 Computed 7 of 416 tokens, same next-token scores: True을 출력합니다. 각 요청은 프롬프트의 2% 미만만 모델에 입력했으며 전체 계산과 동일한 다음 토큰 점수를 얻었습니다.
오픈 소스 모델 서빙 엔진은 이를 자동으로 적용합니다. vLLM은 PagedAttention의 메모리 레이아웃인 고정 크기 블록으로 KV 캐시를 유지하고, 새 요청마다 가장 길게 일치하는 접두사의 블록을 재사용하며, GPU 메모리가 부족해지면 가장 오래전에 사용한 블록을 제거합니다. SGLang의 RadixAttention은 캐시된 접두사를 기수 트리로 유지하므로 앞부분을 공유하는 모든 요청이 이를 재사용하며, SGLang 논문은 다른 최신 추론 엔진보다 최대 6.4배 높은 처리량을 보고했습니다. MLSys 2024에서 발표된 In Gim과 동료들의 Prompt Cache 논문은 템플릿과 문서 같은 선언된 프롬프트 모듈까지 재사용 범위를 확장했으며, 첫 토큰까지 걸리는 시간을 GPU에서는 8배, CPU에서는 60배 단축했다고 보고했습니다.
LLM API의 프롬프트 캐싱#
호스팅 API는 이 기능을 요금과 함께 제공합니다. OpenAI의 프롬프트 캐싱은 지원 모델에서 기본적으로 활성화되어 있으며, Anthropic의 Claude 프롬프트 캐싱은 cache_control 필드로 활성화됩니다. 이 필드는 요청당 한 번 적용하거나 최대 4개의 콘텐츠 블록에 적용할 수 있습니다. Anthropic은 캐시 읽기에 기본 입력 가격의 10분의 1 이하를 청구하고 기본 5분 캐시에 쓰기 작업에는 기본 가격의 1.25배를 청구하며, 캐시 적중이 발생할 때마다 5분 수명이 초기화됩니다. 두 제공업체 모두 정확히 동일한 접두사만 일치시킵니다. Anthropic은 도구, 시스템 프롬프트, 메시지 순서로 비교하므로 도구 정의를 수정하면 그 뒤에 캐시된 모든 내용이 무효화됩니다. OpenAI 가이드는 안정적인 지침과 참조 자료를 앞에, 사용자별 세부 정보를 뒤에 배치하도록 안내합니다.
공유 접두사가 긴 워크로드에서 가장 큰 효과를 얻을 수 있습니다.
- AI 에이전트: 각 단계에서 도구 정의와 전체 대화 기록을 다시 전송합니다. 전체 대화 기록에는 이전 단계의 프롬프트와 최신 작업 및 그 결과가 포함됩니다.
- 챗봇: 대화가 한 차례 진행될 때마다 이전 차례의 프롬프트가 확장되므로, 새 메시지가 도착할 때까지 대화 기록이 캐시됩니다.
- 문서 질의응답: 하나의 긴 계약서, 보고서 또는 저장소에 관한 여러 질문은 처리된 문서를 재사용하며, 검색 파이프라인은 동일한 구절을 다시 검색할 때마다 해당 구절을 재사용합니다.
- 퓨샷 프롬프트: 미리 정해진 수십 개의 예시를 한 번만 계산한 뒤 모든 입력에 재사용합니다.
개방형 어휘 비전 모델도 비슷한 방식으로 프롬프트 계산을 재사용합니다. Ultralytics YOLOE는 set_classes()가 호출될 때 MobileCLIP 텍스트 인코더를 사용해 "forklift"와 같은 클래스 프롬프트를 한 번 인코딩하고, 결과 임베딩을 모델에 저장하므로 이후 예측에서는 텍스트 인코더를 완전히 건너뜁니다. save_prompt_embeddings()는 해당 임베딩을 NPZ 파일에 기록하며, 이후 세션은 인코더를 다시 실행하는 대신 load_prompt_embeddings()를 사용해 파일을 로드합니다.
프롬프트 캐싱과 관련 용어 비교#
- KV 캐시: 한 번의 생성 과정에서 토큰 간 키와 값을 재사용합니다. 프롬프트 캐싱은 서로 다른 요청 간에 이를 재사용합니다.
- 시맨틱 캐싱: 전체 응답을 저장하고 새 쿼리의 의미가 이전 쿼리와 같으면 해당 응답을 반환하여 모델 실행을 완전히 건너뜁니다. 프롬프트 캐싱은 새 프롬프트의 나머지 부분에 대해 계속 모델을 실행하고 새 답변을 생성합니다.
- 프롬프트 압축: 프롬프트 자체를 짧게 만드는 방식으로, 요청마다 달라지는 텍스트에 적합합니다. 두 방식을 함께 사용하면 효과적입니다. 프롬프트의 고정 부분은 캐시하고 가변 부분은 압축할 수 있습니다.
- 프롬프트 엔지니어링: 프롬프트에 무엇을 담을지 결정합니다. 캐싱은 서버가 프롬프트의 어느 정도를 다시 계산하는지만 바꾸며, 캐시가 적중하면 부동소수점 반올림 오차 범위 내에서 다음 토큰 점수는 변하지 않습니다.










