본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Prompt caching; 프롬프트 캐싱
여러 요청이 공유하는 프롬프트 앞부분(접두사)의 KV 캐시를 저장해 두고 다시 써서, 그 부분의 프리필 계산을 건너뛰는 기법

프롬프트 캐싱(prompt caching)은 대형 언어 모델 요청끼리 앞부분이 같을 때, 이전 요청에서 계산해 둔 KV 캐시를 재사용해 프롬프트 처리 시간과 비용을 줄이는 기법이다. 긴 시스템 프롬프트, 도구 정의, 문서, 대화 기록처럼 매 요청 반복되는 앞부분이 클수록 효과가 크다. 서빙 엔진에서는 접두사 캐싱(prefix caching)이라고도 부른다. 앤트로픽, OpenAI, 구글(컨텍스트 캐싱), 아마존 베드록, 마이크로소프트 등이 API 기능으로 제공하며 캐시에서 읽은 입력 토큰을 할인한다.[1][2][3]

출력 토큰 생성에는 영향이 없다. 같은 입력이면 캐시를 쓰든 안 쓰든 응답 분포는 같다.[1]

왜 접두사만 재사용할 수 있나

편집 원본 편집

디코더 전용 트랜스포머는 인과 마스크를 쓰므로 i번째 토큰의 층별 키·값 ki(ℓ),vi(ℓ)는 그 토큰과 앞 토큰들 x1,…,xi에만 의존한다. 두 프롬프트가 처음 P개 토큰까지 똑같다면 그 구간의 KV 캐시도 비트 단위로 같으니, 한 번 계산해 저장해 두면 다음 요청은 P+1번째 토큰부터 프리필하면 된다.

반대로 한 토큰이라도 앞에서 달라지면 그 뒤의 모든 키·값이 달라진다. 위치 인코딩(예: RoPE)도 절대 위치를 반영하므로 같은 문서라도 앞에 붙은 내용이 다르면 재사용할 수 없다. 프롬프트 캐싱이 "정확히 같은 접두사"를 요구하는 이유다.

얼마나 아끼나

편집 원본 편집

매개변수 N개 모델의 프리필은 토큰당 약 2N FLOPs에 어텐션 비용이 더해진다. 접두사 P개를 캐시에서 읽으면 이 계산이 빠지고, 대신 저장해 둔 KV 캐시를 메모리에서 읽는다. 그래서 첫 토큰까지의 시간(TTFT)이 크게 줄고, 출력 토큰당 시간은 거의 그대로다. 앤트로픽은 2024년 발표 당시 10만 토큰짜리 책을 캐시한 대화에서 TTFT가 11.5초에서 2.4초로 줄고 비용이 90% 줄었다는 예를 들었다.[4]

대가는 메모리다. 토큰당 KV 캐시 크기는 다음과 같다.

bytes/token=2×nlayers×nkv_heads×dhead×bytes per element

예를 들어 층 32개, KV 헤드 8개(그룹 쿼리 어텐션), 헤드 차원 128인 80억 매개변수급 모델을 BF16으로 저장하면 토큰당 2×32×8×128×2=131,072바이트, 즉 128KiB다. 10만 토큰이면 약 12.5GiB라, 캐시를 오래 붙잡아 두면 다른 요청의 배치 자리를 빼앗는다. 상용 API가 캐시 수명을 몇 분 단위로 짧게 두고, 오래 보관하면 따로 요금을 받는 이유다.

방식 재사용 단위 찾는 법 예
블록 해시 체인 고정 크기 KV 블록 블록마다 "앞 블록 해시 + 블록 안 토큰 + 추가 식별자"로 해시를 만들어 해시 표에서 찾는다. 꽉 찬 블록만 캐시, LRU로 내보냄 vLLM 자동 접두사 캐싱[5]
기수 트리 토큰 열 모든 요청의 접두사를 기수 트리(radix tree)로 저장해 가장 긴 공통 접두사를 찾는다. LRU로 내보냄 SGLang RadixAttention[6]
모듈 단위 재사용 프롬프트 안의 정해진 조각(문서, 예시) 조각마다 위치를 미리 정한 스키마로 KV를 따로 계산·저장해, 접두사가 아니어도 끼워 맞춘다 Prompt Cache(MLSys 2024). GPU에서 TTFT 약 8배, CPU에서 약 60배 단축[7]
명시적 캐시 객체 사용자가 만든 캐시 캐시를 API로 생성하고 이름으로 참조. TTL 동안 보관 구글 Gemini 명시적 컨텍스트 캐싱

vLLM은 V1 엔진부터 접두사 캐싱을 기본으로 켰다. 적중률이 0%여도 처리량 손실이 1% 미만이 되도록 자료 구조를 고쳤기 때문이다.[8] 멀티 테넌트 환경에서는 캐시 솔트(cache salt)를 첫 블록 해시에 섞어 같은 솔트를 가진 요청끼리만 공유하게 할 수 있다.[5]

공급자별 방식

편집 원본 편집

아래는 2026년 10월 16일 공식 문서 기준이다. 가격, 최소 길이, 지원 모델은 자주 바뀌므로 쓰기 전에 공식 문서를 다시 확인해야 한다.

항목 앤트로픽 OpenAI 구글 Gemini
도입 2024년 클로드 3.5 소네트 등에 공개 베타, 2024년 12월 17일 정식[4] 2024년 10월 1일, 자동 적용[9] 2024년 5월 명시적 캐싱, 2025년 5월 8일 암묵적 캐싱[10]
켜는 법 요청 최상위에 cache_control 하나(자동), 또는 콘텐츠 블록마다 cache_control(명시적 중단점, 최대 4개) 기본으로 켜짐. GPT-5.6 이후 모델은 prompt_cache_options.mode(implicit/explicit)와 prompt_cache_breakpoint로 위치 지정 가능, 이전 모델은 암묵적 캐싱만 2.5 이후 모델은 암묵적 캐싱이 기본. 명시적 캐싱은 caches.create로 캐시를 만들고 cached_content로 참조(일부 모델만)
캐시 순서 tools, system, messages 순서로 접두사를 이룬다 숨은 시스템 지시, 도구, 개발자 메시지, 대화 기록 순 캐시 내용이 프롬프트 앞부분이 된다
최소 길이 모델별 512~4,096토큰 GPT-5.6 이후 1,024토큰. 캐시 적중 토큰 수는 128 단위로 내림 모델별 2,048~4,096토큰(암묵적)
수명 기본 5분(쓰일 때마다 갱신), 선택 1시간 GPT-5.6 이후 최소 30분. 이전 모델은 in_memory(보통 비활성 5~10분, 최대 1시간)나 24h 명시적 캐싱 TTL 기본 1시간, 상하한 없음
가격 쓰기는 기본 입력가의 1.25배(5분) 또는 2배(1시간), 읽기는 0.1배(일부 최신 모델은 0.05배, 0.025배) GPT-5.6 이후 쓰기 1.25배, 읽기 대개 0.1배. 도입 당시에는 쓰기 할증 없이 읽기 50% 할인 캐시 토큰 할인(도입 당시 75%)에 명시적 캐싱은 보관 시간당 저장 요금 추가
격리 조직 간 공유 없음. 클로드 API 등에서는 워크스페이스 단위 격리 조직 간 공유 없음, 처리 지역 경계를 넘어 재사용 안 함 문서에 명시 없음
확인 필드 cache_creation_input_tokens, cache_read_input_tokens cached_tokens, cache_write_tokens usage_metadata의 캐시 토큰 수

출처: 앤트로픽,[1] OpenAI,[2] 구글.[3][11]

세부 동작 차이도 크다.

  • 앤트로픽: 쓰기는 중단점 위치에서만 일어난다. 읽을 때는 중단점에서 시작해 뒤로 최대 20블록까지 거슬러 올라가며 예전 요청이 써 둔 항목을 찾는다. 그래서 매 요청 바뀌는 블록(시각, 요청별 문맥)에 중단점을 두면 적중이 영영 안 난다. 동시에 보낸 요청은 첫 응답이 시작된 뒤에야 캐시를 쓸 수 있다.[1]
  • OpenAI: 캐시는 개별 머신에 저장되므로 요청이 그 머신으로 가야 적중한다. 앞부분 토큰의 해시와 prompt_cache_key로 라우팅하며, GPT-5.6 이전 모델에서는 키 하나당 분당 15건 안팎을 넘으면 다른 머신으로 넘쳐 적중률이 떨어진다.[2]
  • 구글: 암묵적 캐싱은 할인 보장이 없고, 명시적 캐싱은 저장 요금을 내는 대신 할인이 보장된다. 최신 일부 모델은 명시적 캐싱을 지원하지 않는다.[11]

앤트로픽 파이썬 SDK에서 긴 시스템 프롬프트에 명시적 중단점을 두는 예다.

import anthropic

client = anthropic.Anthropic()
manual = open("manual.md", encoding="utf-8").read()   # 매 요청 같은 긴 문서

resp = client.messages.create(
    model="모델 ID",
    max_tokens=1024,
    system=[
        {"type": "text", "text": "너는 사내 규정 안내 도우미다."},
        {"type": "text", "text": manual,
         "cache_control": {"type": "ephemeral"}},     # 여기까지가 캐시 접두사
    ],
    messages=[{"role": "user", "content": "연차는 며칠까지 이월되나?"}],
)
u = resp.usage
print(u.cache_creation_input_tokens, u.cache_read_input_tokens, u.input_tokens)
# 첫 요청: 쓰기 토큰 > 0, 5분 안의 다음 요청: 읽기 토큰 > 0

자체 서빙에서는 vLLM이 접두사 캐싱을 기본으로 켜므로, 같은 시스템 프롬프트로 시작하는 요청을 보내기만 해도 재사용된다(--enable-prefix-caching, --disable-prefix-caching로 조정).[12]

프롬프트 설계 요령

편집 원본 편집
  • 바뀌지 않는 것을 앞에, 바뀌는 것을 뒤에: 도구 정의, 시스템 지시, 참고 문서, 퓨샷 예시, 대화 기록, 새 질문 순서로 둔다.
  • 앞부분에 현재 시각, 요청 ID, 사용자 이름처럼 매번 달라지는 값을 넣지 않는다. 한 토큰만 달라도 그 뒤 전부가 캐시 실패다.
  • 도구 목록과 순서를 고정한다. 쓰지 않을 도구를 빼기보다 호출을 막는 옵션(tool_choice 등)을 쓰는 편이 캐시에 유리하다.[2]
  • 모델, 응답 형식(구조화된 출력 스키마), 추론 노력 같은 설정을 바꿔도 내부 지시문이 달라져 캐시가 깨질 수 있다.[2][1]
  • 손익 계산: 쓰기 1.25배, 읽기 0.1배라면 같은 접두사를 n번 쓸 때 비용은 1.25+0.1(n−1)배이고 캐시가 없으면 n배다. 두 번만 써도 1.35배 대 2배로 이득이고, 10번이면 2.15배 대 10배다.[2] 수명 안에 다시 쓰이지 않으면 쓰기 할증만 남는다.

캐시 적중은 응답이 빨라지므로 시간 차이가 정보를 흘릴 수 있다. 2025년 스탠퍼드 연구진은 통계적 감사로 실제 API 공급자 7곳(OpenAI 포함)에서 사용자 간 전역 캐시 공유를 탐지했고, 이것이 다른 사용자의 프롬프트를 추정하는 데 쓰일 수 있다고 지적했다. 같은 방법으로 OpenAI 임베딩 모델이 디코더 전용 트랜스포머라는 비공개 정보도 추정했다.[13] 현재(2026-10) 앤트로픽과 OpenAI 문서는 조직 단위(앤트로픽은 워크스페이스 단위) 격리를 명시하고 있다.[1][2] 자체 서빙에서 여러 고객을 받는다면 vLLM의 캐시 솔트처럼 테넌트별로 캐시를 나눠야 한다.

  1. ↑ 1.0 1.1 1.2 1.3 1.4 1.5 Prompt caching, Claude API Docs.
  2. ↑ 2.0 2.1 2.2 2.3 2.4 2.5 2.6 Prompt caching, OpenAI API Docs.
  3. ↑ 3.0 3.1 Context caching, Gemini API Docs.
  4. ↑ 4.0 4.1 Prompt caching with Claude, Anthropic.
  5. ↑ 5.0 5.1 Automatic Prefix Caching, vLLM Documentation.
  6. ↑ Lianmin Zheng 외, 〈SGLang: Efficient Execution of Structured Language Model Programs〉, NeurIPS 2024. arXiv:2312.07104
  7. ↑ In Gim 외, 〈Prompt Cache: Modular Attention Reuse for Low-Latency Inference〉, MLSys 2024. arXiv:2311.04934
  8. ↑ vLLM V1: A Major Upgrade to vLLM's Core Architecture, vLLM Blog, 2025-01-27.
  9. ↑ Prompt Caching in the API, OpenAI, 2024-10-01.
  10. ↑ Gemini 2.5 Models now support implicit caching, Google Developers Blog, 2025-05-08.
  11. ↑ 11.0 11.1 Context caching (generateContent API), Gemini API Docs.
  12. ↑ Engine Arguments, vLLM Documentation.
  13. ↑ Chenchen Gu 외, 〈Auditing Prompt Caching in Language Model APIs〉, ICML 2025. arXiv:2502.07776