LLM 추론 비용과 지연을 줄이는 다층 캐싱 전략 — 의미론적 캐시, 프롬프트 캐시, KV 캐시, 임베딩 캐시, 그리고 캐시 무효화 전략을 다룹니다.
전통적인 시스템에서 캐싱은 성능 최적화 기법입니다. 하지만 AI 시스템에서 캐싱은 생존 전략에 가깝습니다. LLM 호출 한 번의 비용은 데이터베이스 쿼리의 수백 배에 달하고, 지연 시간은 수천 배에 달합니다.
| 연산 | 평균 지연 | 건당 비용 |
|---|---|---|
| Redis 조회 | 0.5ms | 거의 무료 |
| PostgreSQL 쿼리 | 5ms | 거의 무료 |
| Claude Sonnet (1K + 500 토큰) | 2,000ms | $0.0105 |
| Claude Opus (1K + 500 토큰) | 5,000ms | $0.0825 |
하루 10만 건의 LLM 호출이 발생하는 서비스에서, 캐시 적중률을 40%만 달성해도 월 $12,000 이상을 절감할 수 있습니다. 그러나 AI 캐싱에는 고유한 도전이 있습니다. 전통적인 캐싱은 "같은 키에 같은 값"이라는 전제에 기반하지만, AI 시스템에서는 "비슷한 질문에 같은 답을 써도 되는가?"라는 의미론적 판단이 필요합니다.
AI 시스템의 캐싱은 여러 계층이 협력하는 다층 구조로 설계합니다.
가장 단순하고 확실한 캐싱입니다. 동일한 프롬프트에 대해 동일한 응답을 반환합니다. 프롬프트, 모델명, temperature, max_tokens 등을 조합하여 SHA-256 해시 키를 생성하고, Redis에 TTL과 함께 저장합니다.
import hashlib, json
import redis.asyncio as redis
class ExactMatchCache:
def __init__(self, client: redis.Redis, ttl: int = 3600):
self.redis = client
self.ttl = ttl
def _key(self, model: str, messages: list[dict], **kw) -> str:
payload = json.dumps(
{"model": model, "messages": messages, **kw},
sort_keys=True, ensure_ascii=False,
)
return f"llm:exact:{hashlib.sha256(payload.encode()).hexdigest()}"
async def get(self, model, messages, **kw) -> str | None:
return await self.redis.get(self._key(model, messages, **kw))
async def set(self, model, messages, response: str, **kw):
await self.redis.setex(
self._key(model, messages, **kw), self.ttl, response,
)정확 매칭 캐시는 temperature가 0인 요청이나 구조화된 출력(분류, 추출 등)에 가장 적합합니다. temperature가 높은 창작 작업에서는 캐시가 다양성을 해칠 수 있으므로 주의하십시오.
의미론적 캐시(Semantic Cache)는 정확히 같은 프롬프트가 아니더라도, 의미적으로 충분히 유사한 프롬프트에 대해 캐시된 응답을 반환합니다. "Python의 장점이 뭔가요?"와 "Python 언어의 주요 장점을 알려주세요"는 다른 문자열이지만 같은 의미입니다.
핵심은 유사도 임계값(Similarity Threshold)의 설정입니다. 이 값이 캐시의 품질과 적중률을 결정합니다.
| 임계값 | 적중률 | 정확도 | 적합한 시나리오 |
|---|---|---|---|
| 0.99 | 낮음 | 매우 높음 | 법률, 의료 등 정확도 최우선 도메인 |
| 0.95 | 중간 | 높음 | 일반 Q&A, 문서 요약 |
| 0.90 | 높음 | 중간 | FAQ, 고객 지원 |
높은 임계값(0.97)으로 시작하여 안정성을 확인한 뒤 점진적으로 낮추십시오. 캐시 적중 시 원본 쿼리와 매칭된 쿼리를 함께 로깅하면 임계값 튜닝에 유용한 데이터를 확보할 수 있습니다.
프롬프트 캐시(Prompt Caching)는 LLM 프로바이더가 서버 측에서 제공하는 캐싱입니다. 긴 시스템 프롬프트나 대량의 컨텍스트를 반복 전송할 때, 이전에 처리한 토큰을 재사용하여 비용과 지연을 줄여줍니다.
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
system=[{
"type": "text",
"text": long_policy_document, # 수천 토큰의 정책 문서
"cache_control": {"type": "ephemeral"},
}],
messages=[{"role": "user", "content": "환불 정책이 어떻게 되나요?"}],
)
# 캐시 적중 시: 입력 토큰 비용 90% 절감
print(f"캐시 읽기 토큰: {response.usage.cache_read_input_tokens}")프롬프트 캐시는 긴 시스템 프롬프트, RAG 컨텍스트(동일 문서로 여러 질문 처리), 다수의 Few-shot 예시를 포함하는 반복 호출에서 효과적입니다.
KV 캐시(Key-Value Cache)는 Transformer 모델 내부에서 이전 토큰의 Key-Value 텐서를 저장하여 재계산을 피하는 메커니즘입니다. 애플리케이션 개발자가 직접 관리하지는 않지만, 대화형 애플리케이션에서 이전 턴의 KV 캐시를 유지하면 후속 턴의 응답 속도가 빨라진다는 점을 아키텍처에 반영할 수 있습니다.
임베딩 캐시(Embedding Cache)는 RAG 시스템에서 특히 중요합니다. 동일한 텍스트에 대한 임베딩 벡터를 Redis에 캐시하면 임베딩 API 호출을 크게 줄일 수 있습니다. 캐시 키에 모델 이름을 포함시키는 것이 중요합니다. 임베딩 모델을 교체하면 기존 캐시가 모두 무효화되기 때문입니다.
RAG 파이프라인의 검색 결과 자체를 캐시하는 것도 효과적입니다. 인기 있는 질문이 반복되는 고객 지원, FAQ 시나리오에서 벡터 검색과 리랭킹 비용을 절감합니다.
캐시에서 가장 어려운 부분은 "언제 캐시를 버릴 것인가"입니다.
| 트리거 | 무효화 대상 | 전략 |
|---|---|---|
| 모델 업데이트 | 정확 매칭, 의미론적 캐시 | 모델 버전을 캐시 키에 포함 |
| 프롬프트 변경 | 해당 프롬프트의 모든 캐시 | 프롬프트 버전 태깅 |
| 지식 베이스 업데이트 | RAG 결과 캐시 | 변경 문서 연관 캐시만 무효화 |
| 임베딩 모델 교체 | 의미론적/임베딩 캐시 | 전체 재인덱싱 |
과도한 캐싱은 오래된 응답을 반환하는 문제를 일으킵니다. 최신 정보가 중요한 도메인(뉴스, 주가)에서는 TTL을 짧게 설정하거나, 캐싱 대신 프롬프트 캐시(프로바이더 레벨)만 활용하는 것이 적절할 수 있습니다.
다층 캐싱의 실제 비용 절감 효과를 시뮬레이션합니다. 전제 조건은 일일 100,000건의 LLM 요청, 평균 입력 1,000토큰 + 출력 500토큰, Claude Sonnet 사용입니다.
| 캐싱 계층 | 적중률 | 절감되는 요청 | 월 절감액 |
|---|---|---|---|
| 정확 매칭 (L1) | 15% | 15,000건/일 | $4,725 |
| 의미론적 (L2) | 20% | 17,000건/일 | $5,355 |
| 프롬프트 캐시 (L3) | 나머지의 80% | 비용 90% 절감 적용 | $3,200 |
| 합계 | - | - | 약 $13,280/월 |
캐싱 인프라 비용 $500/월을 감안해도 월 $12,000 이상의 순 절감이 발생합니다.
6장에서는 캐싱을 포함한 AI 시스템의 전체 비용 관리 전략을 다룹니다. 토큰 최적화, 모델 티어링, 예산 제어, 비용 알림 등 AI 시스템을 경제적으로 운영하기 위한 아키텍처 패턴을 살펴보겠습니다.
이 글이 도움이 되셨나요?
관련 주제 더 보기
LLM API 비용을 제어하는 아키텍처 전략 — 토큰 예산 시스템, 모델 라우팅, 캐싱 경제학, 비용 모니터링, 그리고 비용 효율적 시스템 설계를 다룹니다.
이벤트 기반 아키텍처로 AI 워크로드를 처리하는 패턴 — 메시지 큐, 스트리밍 처리, 비동기 추론, 그리고 실시간 AI 파이프라인 설계를 다룹니다.
AI 시스템의 장애 시나리오와 회복 탄력성 패턴 — 서킷 브레이커, 폴백, 재시도, 타임아웃, 모델 장애 조치, 그리고 그레이스풀 디그레이데이션을 다룹니다.