프롬프트 캐싱 인프라: LLM 비용과 지연 시간 절감

Anthropic 프리픽스 캐싱으로 긴 프롬프트에서 90% 비용 절감과 85% 지연 시간 감소 달성. OpenAI 자동 캐싱 기본 활성화(50% 비용 절감). LLM 쿼리의 31%가 의미적 유사성을 보여...

프롬프트 캐싱 인프라: LLM 비용과 지연 시간 절감

프롬프트 캐싱 인프라: LLM 비용과 지연 시간 절감

2025년 12월 11일 업데이트

2025년 12월 업데이트: Anthropic 프리픽스 캐싱이 긴 프롬프트에서 90% 비용 절감과 85% 지연 시간 감소를 달성하고 있습니다. OpenAI 자동 캐싱은 기본으로 활성화되어 있습니다(50% 비용 절감). LLM 쿼리의 31%가 의미적 유사성을 보여—캐싱 인프라 없이는 엄청난 비효율이 발생합니다. 캐시 읽기는 토큰 100만 개당 $0.30, 새로 처리 시 $3.00입니다(Anthropic). 다중 계층 캐싱 아키텍처(의미적 → 프리픽스 → 추론)로 절감 효과를 극대화합니다.

Anthropic의 프롬프트 캐싱은 긴 프롬프트에서 비용을 최대 90%, 지연 시간을 최대 85%까지 줄입니다.¹ OpenAI는 기본 활성화된 자동 캐싱으로 50% 비용 절감을 달성합니다. 연구에 따르면 LLM 쿼리의 31%가 이전 요청과 의미적 유사성을 보이며, 이는 캐싱 인프라가 없는 배포에서 엄청난 비효율을 나타냅니다.² 프로덕션 AI 애플리케이션을 운영하는 조직들은 적절한 캐싱 전략 없이 상당한 비용을 낭비하고 있습니다.

프롬프트 캐싱은 여러 수준에서 작동합니다—KV 캐시 연산을 재사용하는 제공자 측 프리픽스 캐싱부터, 유사한 쿼리에 대해 이전 응답을 반환하는 애플리케이션 수준 의미적 캐싱까지. 각 계층과 배포 시점을 이해하면 조직이 특정 워크로드 패턴에 맞게 비용과 지연 시간을 최적화할 수 있습니다.

캐싱 기본 원리

LLM 추론 비용은 두 가지 원천에서 발생합니다: 입력 토큰 처리와 출력 토큰 생성. 캐싱 전략은 둘 다를 대상으로 합니다:

입력 토큰 캐싱 (프리픽스 캐싱)

모든 LLM 요청은 모델의 어텐션 메커니즘을 통해 입력 토큰을 처리하며, KV 캐시에 저장되는 키-값 쌍을 생성합니다. 여러 요청이 동일한 프리픽스(시스템 프롬프트, few-shot 예제, 문서 컨텍스트)를 공유할 때, KV 캐시 연산이 불필요하게 반복됩니다.

프리픽스 캐싱 솔루션: 공통 프리픽스에 대해 계산된 KV 값을 저장합니다. 일치하는 프리픽스를 가진 후속 요청은 재계산을 건너뛰고 캐시된 상태에서 시작합니다.

비용 영향: - Anthropic: 캐시 읽기 비용은 토큰 100만 개당 $0.30, 새로 처리 시 $3.00 (90% 절감) - OpenAI: 캐시된 토큰 50% 할인 - Google: 컨텍스트 윈도우에 따른 가변 가격

지연 시간 영향: 프리픽스 연산을 건너뛰면 프리픽스 길이에 따라 첫 번째 토큰까지의 시간이 50-85% 감소합니다.

출력 캐싱 (의미적 캐싱)

일부 요청은 동일한 응답을 받을 자격이 있습니다—반복되는 질문, 결정적 쿼리, 또는 재생성이 필요 없는 조회.

의미적 캐싱 솔루션: 의미적으로 유사한 입력을 키로 하여 응답 출력을 저장합니다. 일치하는 쿼리에 대해 LLM 호출 없이 캐시된 응답을 반환합니다.

비용 영향: 캐시된 응답은 API 호출을 완전히 제거합니다—캐시 적중 시 100% 절감.

지연 시간 영향: LLM 추론의 수 초와 비교하여 밀리초 단위로 응답이 반환됩니다.

캐싱 계층 구조

프로덕션 시스템은 일반적으로 여러 캐싱 계층을 구현합니다:

요청 → 의미적 캐시 (100% 절감) → 프리픽스 캐시 (50-90% 절감) → 전체 추론
              ↓                                  ↓                              ↓
         캐시된 응답              캐시된 KV 상태              새로운 연산

각 계층은 요청 유사성 패턴에 따라 다양한 최적화 기회를 포착합니다.

제공자 수준 프롬프트 캐싱

Anthropic Claude

Anthropic은 가장 구성 가능한 프롬프트 캐싱을 제공합니다:³

가격: - 캐시 쓰기: 기본 입력 가격 대비 25% 프리미엄 - 캐시 읽기: 90% 할인 (기본 가격의 10%) - 손익분기점: 캐시된 프리픽스당 2회 이상 캐시 적중

요구 사항: - 캐시 체크포인트당 최소 1,024 토큰 - 요청당 최대 4개 캐시 체크포인트 - 캐시 수명: 마지막 접근으로부터 5분 (정기적 적중 시 1시간으로 연장) - 최대 5개 대화 턴 캐시 가능

구현:

import anthropic

client = anthropic.Anthropic()

# cache_control로 캐싱할 콘텐츠 표시
response = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": "You are an expert assistant for our enterprise software...",
            "cache_control": {"type": "ephemeral"}  # 캐싱 표시
        }
    ],
    messages=[{"role": "user", "content": "How do I configure user permissions?"}]
)

모범 사례: - 정적 콘텐츠(시스템 프롬프트, 문서)를 프롬프트 시작 부분에 배치 - 동적 콘텐츠(사용자 입력, 대화)를 끝에 배치 - 자연스러운 경계에서 캐시 체크포인트 사용 - 최적화 검증을 위해 캐시 적중률 모니터링

OpenAI

OpenAI는 코드 변경 없이 자동 캐싱을 구현합니다:⁴

가격: - 캐시된 토큰: 기본 입력 가격의 50% - 캐시 쓰기 프리미엄 없음

요구 사항: - 캐싱 자격을 위한 최소 1,024 토큰 - 캐시 적중은 128 토큰 단위로 발생 - 캐시 수명: 비활성 상태에서 5-10분

자동 동작: - 1,024 토큰을 초과하는 프롬프트가 자동으로 캐시됨 - 시스템이 요청 간 일치하는 프리픽스 감지 - API 변경 불필요

모니터링:

response = client.chat.completions.create(
    model="gpt-4-turbo",
    messages=[...],
)

# 캐시 적중에 대한 사용량 확인
print(f"캐시된 토큰: {response.usage.prompt_tokens_details.cached_tokens}")
print(f"총 입력 토큰: {response.usage.prompt_tokens}")

Google Gemini

Google은 Gemini 모델을 위한 컨텍스트 캐싱을 제공합니다:⁵

가격: - 캐시된 컨텍스트 크기와 기간에 따른 가변 가격 - 캐시된 콘텐츠에 대한 스토리지 비용

기능: - 명시적 캐시 생성 및 관리 - 구성 가능한 TTL(Time-to-Live) - 요청 간 캐시 공유

구현:

from google.generativeai import caching

# 캐시된 콘텐츠 생성
cache = caching.CachedContent.create(
    model='models/gemini-1.5-pro-001',
    display_name='product-documentation',
    system_instruction="You are a product expert...",
    contents=[product_docs],
    ttl=datetime.timedelta(hours=1)
)

# 요청에서 캐시된 콘텐츠 사용
model = genai.GenerativeModel.from_cached_content(cached_content=cache)
response = model.generate_content("How do I configure feature X?")

Amazon Bedrock

AWS는 지원되는 모델에 대해 프리뷰 단계의 프롬프트 캐싱을 제공합니다:⁶

요구 사항: - Claude 3.5 Sonnet은 체크포인트당 최소 1,024 토큰 필요 - 두 번째 체크포인트는 2,048 토큰 필요

구현 패턴은 Bedrock의 API 구조 내에서 Anthropic의 cache_control 접근 방식을 따릅니다.

vLLM 프리픽스 캐싱

vLLM으로 자체 호스팅하는 추론에는 자동 프리픽스 캐싱이 포함됩니다:⁷

아키텍처

vLLM의 자동 프리픽스 캐싱(APC)은 해시 테이블에 KV 블록을 저장하여 트리 구조 없이 캐시 재사용을 가능하게 합니다:

핵심 설계: - 모든 KV 블록이 초기화 시 블록 풀에 저장됨 - 프리픽스 매칭을 위한 해시 기반 조회 - 블록 관리를 위한 O(1) 연산 - PagedAttention 메모리 효율성 유지

구성

from vllm import LLM

llm = LLM(
    model="meta-llama/Llama-3.1-8B-Instruct",
    enable_prefix_caching=True,  # APC 활성화
    gpu_memory_utilization=0.90,
)

성능 영향

PagedAttention을 사용한 vLLM은 단순 구현 대비 14-24배 높은 처리량을 보여줍니다.⁸ 프리픽스 캐싱은 다음을 추가합니다:

  • 캐시된 토큰과 캐시되지 않은 토큰 간 10배 비용 차이
  • 일치하는 프리픽스에 대한 수십 배 지연 시간 감소
  • 공유 KV 블록을 통한 메모리 효율성

보안 고려 사항

vLLM은 공유 환경을 위한 캐시 격리를 지원합니다:

# 요청별 캐시 솔트로 테넌트 간 캐시 접근 방지
response = llm.generate(
    prompt="...",
    sampling_params=SamplingParams(...),
    cache_salt="tenant-123"  # 테넌트별 캐시 격리
)

블록 해시에 캐시 솔트를 주입하면 공격자가 지연 시간 관찰을 통해 캐시된 콘텐츠를 추론하는 타이밍 공격을 방지합니다.

LMCache 확장

LMCache는 고급 캐싱 기능으로 vLLM을 확장합니다:⁹

기능: - 엔진 인스턴스 간 KV 캐시 재사용 - 다중 계층 스토리지 (GPU → CPU RAM → 디스크) - 비프리픽스 콘텐츠 캐싱 - 벤치마크에서 3-10배 지연 시간 감소

아키텍처:

vLLM Engine → LMCache → GPU VRAM (핫)
                     → CPU RAM (웜)
                     → 로컬 디스크 (콜드)

의미적 캐싱

의미적 캐싱은 의미적으로 유사한(단순히 동일한 것이 아닌) 쿼리에 대해 이전 응답을 반환합니다:

GPTCache

GPTCache는 LLM 애플리케이션을 위한 오픈소스 의미적 캐싱을 제공합니다:¹⁰

아키텍처:

쿼리 → 임베딩 → 벡터 검색 → 유사도 검사 → 응답/API 호출
              ↓           ↓              ↓
         BERT/OpenAI   Milvus/FAISS   임계값 (0.8)

구성 요소: - LLM Adapter: 다양한 LLM 제공자와 통합 - Embedding Generator: 쿼리 벡터화 - Vector Store: 유사성 검색 (Milvus, FAISS, Zilliz) - Cache Manager: 저장 및 검색 - Similarity Evaluator: 임계값 기반 매칭

구현:

from gptcache import cache
from gptcache.adapter import openai

# 의미적 캐시 초기화
cache.init(
    pre_embedding_func=get_text_embedding,
    data_manager=manager,
)

# 캐시된 OpenAI 호출 사용
response = openai.ChatCompletion.create(
    model='gpt-4',
    messages=[{"role": "user", "content": "What is machine learning?"}]
)
# 의미적으로 유사한 쿼리 ("Explain ML", "Define machine learning")
# 캐시된 응답 반환

성능

GPTCache는 상당한 효율성 향상을 달성합니다:¹¹

  • API 호출 감소: 쿼리 카테고리 전체에서 최대 68.8%
  • 캐시 적중률: 61.6% ~ 68.8%
  • 정확도: 97% 이상 긍정적 적중률
  • 지연 시간 감소: 캐시 적중 시 40-50%, 완전 적중 시 최대 100배

고급 기술

VectorQ 적응형 임계값:¹²

정적 유사도 임계값(예: 0.8)은 다양한 쿼리에서 성능이 저조합니다. VectorQ는 쿼리 복잡도에 맞게 조정되는 임베딩별 임계값 영역을 학습합니다:

  • 단순 사실 쿼리: 높은 임계값 (엄격한 매칭)
  • 개방형 쿼리: 낮은 임계값 (더 많은 재사용)
  • 모호한 쿼리: 동적 조정

SCALM 패턴 감지:

SCALM은 패턴 감지와 빈도 분석을 통해 GPTCache를 개선합니다: - 캐시 적중률 63% 향상 - 토큰 사용량 77% 감소 - 고빈도 캐시 항목 패턴 식별

의미적 캐싱 사용 시점

좋은 후보: - 제한된 답변 공간을 가진 FAQ 스타일 쿼리 - 조회 쿼리 (제품 정보, 문서) - 결정적 응답 (계산, 포맷팅) - 쿼리 반복이 있는 고트래픽 애플리케이션

나쁜 후보: - 고유성이 필요한 창작 생성 - 개인화된 응답 (사용자별 컨텍스트) - 시간에 민감한 정보 - 낮은 반복률의 쿼리 패턴

구현 패턴

채팅 애플리케이션

채팅 시스템은 프리픽스와 의미적 캐싱 모두로부터 이점을 얻습니다:

시스템 프롬프트 캐싱:

# 요청 시작 시 캐시되는 정적 시스템 프롬프트
system_prompt = """
You are a customer support agent for Acme Corp...
[2000+ tokens of guidelines and knowledge]
"""

# 캐시된 프리픽스 뒤에 동적 대화 추가
messages = [
    {"role": "system", "content": system_prompt, "cache_control": {...}},
    {"role": "user", "content": user_message}
]

대화 기록 캐싱: Anthropic은 최대 5개 대화 턴 캐싱을 지원하여 다중 턴 대화의 비용을 줄입니다.

RAG 애플리케이션

검색 증강 생성은 검색된 컨텍스트를 캐시합니다:

# RAG를 위한 캐시 구조
cached_context = {
    "system": system_prompt,           # 항상 캐시됨
    "documents": retrieved_chunks,      # 쿼리 클러스터별 캐시
    "examples": few_shot_examples       # 요청 간 안정적
}

# 사용자 쿼리만 변경됨
dynamic_content = {
    "query": user_question
}

문서 청크 캐싱: 여러 쿼리가 동일한 문서를 검색할 때, 프리픽스 캐싱은 공유 컨텍스트의 중복 처리를 제거합니다.

에이전트 워크플로우

도구 호출이 있는 에이전트 시스템은 프리픽스 캐싱으로부터 이점을 얻습니다:

``` 시스템 프롬프트 → 도구 정의 → 대화 기록 → 현재 쿼리 (캐시됨) (캐시됨) (부분

[번역을 위해 콘텐츠가 잘렸습니다]

견적 요청_

프로젝트에 대해 알려주시면 72시간 내에 답변드리겠습니다.

> 전송_완료

요청이 접수되었습니다_

문의해 주셔서 감사합니다. 저희 팀이 요청사항을 검토한 후 72시간 내에 답변드리겠습니다.

처리_대기_중