Semantic Caching 전략
이 문서는 LLM 추론 파이프라인에서 게이트웨이 레벨 의미 기반 캐싱(Semantic Caching) 의 설계 원칙과 운영 고려사항을 다룹니다.
구현 가이드: 도구 비교 표, Gateway별 통합 패턴, 설정 예시, 배포 스니펫은 추론 게이트웨이 구성 가이드 — Semantic Caching 구현 옵션을 참조하세요.
1. 개요
왜 Semantic Cache가 필요한가
대규모 LLM 서비스에서 사용자 질의는 표현만 다르고 의미가 같은 경우가 매우 많습니다. 문자열 단위로 정확히 일치하는 전통적 캐시(HTTP cache, Redis key-value)로는 이러한 중복을 제거할 수 없습니다. Semantic Cache는 임베딩 기반 유사도로 의미가 유사한 요청을 탐지하여 이전 응답을 재사용함으로써 다음 3가지 문제를 동시에 개선합니다.
- 토큰 비용 감소: 캐시 HIT 시 LLM 호출을 건너뛰어 API 비용·GPU 시간을 절약
- 지연시간 단축: 생성 지연(수백 ms ~ 수 초) 대신 벡터 조회(수 ms)로 응답
- GPU 용량 확보: 자체 호스팅 vLLM/llm-d 환경에서 처리량(throughput)을 유효 확대
예상 절감률 (임계값별)
절감률은 사용자 질의의 반복성, 도메인(FAQ/고객 지원/코드 생성), 프롬프트 구조 에 따라 크게 달라지므로 아래 수치는 공개된 구현체 문서·벤더 블로그에서 관측되는 일반적 범위입니다. 각 조직은 점진적 롤아웃 과 A/B 평가로 실제 효과를 검증해야 합니다.
| 유사도 임계값 | 운영 정책 | 관측되는 절감률 범위 | 특징 |
|---|---|---|---|
| 0.95 (엄격) | 거의 동일한 질의만 캐시 | 약 10-15% | 오답 위험 매우 낮음, 엄격한 품질 요구 서비스 |
| 0.85 (균형) | 의미 동일·표현 차이 허용 | 약 30-40% | 일반 LLM 챗/어시스턴트 권장 기본값 |
| 0.70 (공격적) | 관련 주제까지 묶음 | 약 50-60% | FAQ/정적 KB 등 반복률 매우 높은 워크로드 한정 |
출처 참고: Redis — Building an LLM semantic cache, Portkey Semantic Cache 문서, Helicone Caching 문서, GPTCache README.
위 숫자는 공개 자료 기반의 대략적 범위 입니다. 모든 도메인에서 동일한 HIT 률이 나오지 않습니다. 대시보드(§6)로 자사 워크로드의 실제 HIT 률·false-positive 률 을 측정한 후 임계값을 확정하세요.
2. 캐시 계층 구분
LLM 추론 파이프라인에는 3가지 서로 다른 캐시 계층 이 존재합니다. 각각 동작 위치·저장 단위·비용 영향이 달라서, Semantic Cache는 다른 2계층을 대체하지 않고 보완 합니다.
3계층 캐시 흐름도
계층별 비교 표
| 항목 | KV Cache (vLLM PagedAttention) | Prompt Cache (Anthropic/OpenAI managed) | Semantic Cache (Gateway 레벨) |
|---|---|---|---|
| 동작 위치 | 추론 엔진 내부 (GPU HBM) | 모델 프로바이더 측 | Gateway (Bifrost/LiteLLM/Portkey) 앞단 |
| 저장 단위 | 토큰 단위 KV 블록 | 명시적 cache_control 마커 구간 | 전체 응답 객체 (텍스트/JSON) |
| 매칭 방식 | 접두사(prefix) 완전 일치 | 프로바이더 내부 해시 기반 완전 일치 | 임베딩 코사인 유사도 |
| 주 목적 | TTFT·throughput 개선 | 반복 시스템 프롬프트 비용 절감 | 중복 LLM 호출 자체를 제거 |
| 비용 영향 | GPU 시간 절감 (자체 호스팅) | 입력 토큰 단가 할인 (관리형) | API 호출 자체를 건너뜀 |
| 실패 시 영향 | 성능 저하만 | 캐시 미적용 시 일반 단가 | 응답 품질에 직접 영향 (오답 리스크) |
| 관련 문서 | vLLM 모델 서빙 | 프로바이더 공식 문서 | 본 문서 |
Semantic Cache HIT → 즉시 응답 (LLM 호출 생략). MISS 시 프로바이더 호출 → Prompt Cache가 시스템 프롬프트 입력 비용 절감 → 추론 엔진 내부 KV Cache가 생성 속도 개선. 세 계층은 서로 직교(orthogonal) 하므로 동시에 활성화하는 것이 일반적입니다.
적용 시점 비교
- 프로토타입/단일 모델: KV Cache(자동) + Prompt Cache(프로바이더 지원 시) 만으로 충분
- 멀티테넌트/멀티 프로바이더: Gateway 레벨 Semantic Cache 추가 — 동일 질의가 여러 사용자에서 반복되는 패턴을 흡수
- FAQ/챗봇/고정 KB: Semantic Cache 임계값을 낮춰(0.80~0.85) 적극 재사용
- 코드 생성/IDE 에이전트: Semantic Cache 보수적 적용(0.95) 또는 비활성 — 유사 질의라도 파일 컨텍스트가 달라 재사용 위험이 큼
3. 유사도 임계값 설계
임계값별 트레이드오프
임계값 선택 기준
| 임계값 | 적합 워크로드 | 부적합 워크로드 | 비고 |
|---|---|---|---|
| 0.95 이상 | 코드 생성, 법률·의료 어시스턴트, 금융 자문 | (광범위하게 적용 가능) | 표현 차이가 거의 없는 동일 질의만 HIT |
| 0.85-0.94 (권장) | 일반 챗봇, 고객 지원, 문서 요약, 제품 Q&A | 코드 생성(컨텍스트 민감) | 의미 동일·표현 차이 허용. 대부분 서비스의 기본값 |
| 0.75-0.84 | FAQ, 정적 KB, 사내 문서 검색 결과 설명 | 대화형 추론, 다중 턴 | 거짓 긍정 증가 — 응답 검증 레이어 필요 |
| 0.70 이하 | 거의 사용 안 함 — 대량 FAQ 한정 | 모든 범용 서비스 | 무관한 질의끼리 묶일 위험 |
임계값 설정 시 고려 요소
- 사용자 허용 오차: 고객 지원처럼 "가장 가까운 답"으로 충분하면 낮게, 코드·계산이면 높게
- 도메인 어휘 다양성: 용어 동의어가 많은 도메인(의료/법률)은 임베딩이 의미를 잘 묶어 낮춰도 안전한 경향
- 임베딩 모델 품질: 강력한 임베딩(예:
text-embedding-3-large,bge-m3)일수록 임계값을 낮춰도 안전성 유지 - 대화 컨텍스트: 멀티 턴 대화는 이전 턴을 해시 키에 포함해야 함(§5 참조)
- 언어·로케일: 다국어 서비스는 언어별 namespace를 분리하여 교차 오염 방지
초기에는 0.90 으로 보수적으로 시작하고, Langfuse/Grafana 대시보드에서 HIT 률, user dissatisfaction 지표(👎, regenerate 클릭 등) 를 모니터링하며 0.05 씩 조정하는 것이 안전합니다.
4. 구현 고려사항
Semantic Cache를 구현할 때는 다음 요소를 고려하여 솔루션을 선택합니다.
주요 고려 요소
- 기존 인프라 재사용 가능성: Redis/Milvus 등 벡터 DB가 이미 있다면 추가 백엔드 없이 구현 가능
- 게이트웨이 통합 필요성: 라우팅·가드레일과 캐시를 통합 관리할지, 독립 레이어로 분리할지
- 관리형 vs 셀프호스트: 운영 부담·규정 준수·비용 트레이드오프
- 관측성 요구사항: 캐시 HIT/MISS 추적, false-positive 모니터링 수준
- 벡터 검색 엔진 선호도: Redis/Milvus/FAISS/Qdrant 등 조직의 표준 스택
구현 패턴
패턴 A: Gateway 일체형 — 라우팅·캐시·관측성을 단일 제품에서 (예: Portkey, Helicone)
- 장점: 통합 구성, 빠른 배포
- 단점: 벤더 락인, 고급 기능은 관리형 플랜 의존
패턴 B: 모듈형 — 게이트웨이(Bifrost/LiteLLM) + 독립 캐시 레이어(RedisVL, GPTCache)
- 장점: 각 레이어 독립 교체 가능, 오픈소스 우선
- 단점: 통합 복잡도 증가
패턴 C: 관리형 — Redis Enterprise LangCache, Portkey SaaS
- 장점: 운영 부담 최소, 규정 준수 인증 포함
- 단점: 비용, 리전 제약
구체적인 도구별 비교 표, 설정 예시, 배포 스니펫은 Inference Gateway 구성 가이드 — Semantic Caching 구현 옵션을 참조하세요.
5. 캐시 키 설계와 멀티테넌시
Semantic Cache는 게이트웨이 앞단 에 위치하여 LLM 호출 자체를 건너뛰기 때문에, 캐시 키 설계와 namespace 분리가 응답 품질·보안·멀티테넌시에 직접적인 영향을 줍니다.
캐시 키 구성 요소
가장 단순한 키는 embedding(user_query) 하나지만, 실제 서비스에서는 다음 요소를 반드시 함께 키에 포함해야 합니다.
필수 포함 요소:
model_id: 모델 종류·버전 교차 오염 방지 (예:glm-5≠qwen3-4b)system_prompt_hash: 시스템 프롬프트가 다르면 완전히 다른 답tenant_id | user_id: 멀티테넌트/사용자별 격리language | locale: 언어 교차 오염 방지tool_set_hash: 에이전트의 사용 가능 도구 집합embedding(user_query): 의미적 유사도 매칭 대상
멀티테넌트 namespace 전략
| 계층 | namespace 패턴 예시 | 격리 목적 |
|---|---|---|
| 조직 / 테넌트 | cache:{tenantId}:* | 데이터 격리, 감사 경계 |
| 사용자 | cache:{tenantId}:{userId}:* | 개인정보 포함 질의의 사용자 간 누수 방지 |
| 언어 | cache:{tenantId}:ko:* / :en:* | 다국어 서비스에서 교차 오염 방지 |
| 도메인 | cache:{tenantId}:support:* / :billing:* | 컨텍스트가 다른 도메인 간 재사용 차단 |
| 모델 버전 | cache:{...}:glm-5:v2026-03:* | 모델 업그레이드 시 일괄 invalidation 가능 |