Semantic Caching
시맨틱 캐싱은 새 쿼리의 의미가 이전 쿼리와 같을 때 저장된 LLM 응답을 반환합니다. 임베딩을 비교해 모델 호출을 생략하고 비용을 줄입니다.
시맨틱 캐싱은 대규모 언어 모델(LLM)이나 다른 생성 모델의 응답을 저장하고, 표현이 다르더라도 의미가 이전 요청과 같은 새 요청에 재사용합니다. 캐시는 각 프롬프트를 임베딩으로 변환하고 저장된 프롬프트 중 가장 유사한 것을 찾아 유사도가 임계값을 넘으면 저장된 답변을 반환합니다. 캐시 적중 시 모델 호출을 완전히 건너뛰므로 지연 시간은 밀리초 단위로 줄어들고 요청에서 토큰을 소비하지 않습니다. 의미를 기준으로 일치 항목을 찾기 때문에 "비밀번호를 잊어버렸습니다"와 "비밀번호를 어떻게 재설정하나요?"는 저장된 답변 하나를 공유할 수 있습니다. 프롬프트 텍스트를 키로 사용하는 정확히 일치하는 캐시라면 두 답변을 각각 저장해야 합니다. Zilliz는 2023년에 이러한 방식의 오픈 소스 라이브러리 GPTCache를 공개했으며, 현재 벡터 데이터베이스와 API 게이트웨이에서도 기본 기능으로 제공됩니다.
시맨틱 캐시의 작동 방식#
문장 임베딩 모델은 입력 프롬프트를 인코딩하고 벡터 검색은 일반적으로 코사인 유사도를 사용해 이전에 답변한 프롬프트의 임베딩과 비교합니다. 작은 캐시는 메모리에 저장할 수 있고, 큰 캐시는 근사 최근접 이웃 인덱스가 있는 벡터 데이터베이스에 저장됩니다. 캐시 미스가 발생하면 모델이 새 답변을 생성하고, 새 프롬프트의 임베딩과 응답을 보통 만료 시간과 함께 저장합니다.
캐시 키에는 정답을 바꾸는 다른 모든 요소가 포함되어야 합니다. 시스템 프롬프트, 모델 버전, 사용자 권한 수준 또는 검색된 문서 집합이 다른 조건에서 생성된 응답은 별도의 범위에 저장하므로 한 고객의 캐시된 답변이 다른 고객에게 제공되지 않습니다. 최신성도 똑같이 신경 써야 합니다. 가격, 정책 또는 원본 문서가 바뀌면 이전 버전으로 만든 항목도 새 프롬프트와 계속 일치하므로, 각 항목에 TTL을 설정하고 원본 데이터가 바뀌면 영향을 받는 범위의 캐시를 비웁니다.
유사도 임계값 선택#
임계값은 두 프롬프트가 서로 얼마나 달라도 동일한 답변을 공유할 수 있는지 결정합니다. 이 예시는 Sentence Transformers의 all-MiniLM-L6-v2 모델을 인코더로 사용해 항목 세 개로 구성된 캐시를 만듭니다.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
# Earlier prompts whose answers are already stored in the cache
cached = ["How do I reset my password?", "What are your opening hours?", "How do I cancel my subscription?"]
cached_embeddings = model.encode(cached)
# Each new prompt reuses the closest cached answer if it clears the threshold
queries = ["I forgot my password, how can I change it?", "When does the store open?", "How do I cancel my order?"]
for query in queries:
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, cached_embeddings)[0]
best = scores.argmax().item()
status = "hit" if scores[best] >= 0.7 else "miss"
print(f"{query} -> {cached[best]} ({scores[best]:.2f}, {status})")비밀번호 관련 바꿔 쓰기 문장은 점수 0.89로 올바르게 적중합니다. 영업시간 관련 바꿔 쓰기 문장은 점수 0.61로 캐시를 적중하지 못합니다. "주문을 취소하려면 어떻게 해야 하나요?"는 "구독을 취소하려면 어떻게 해야 하나요?"와 점수 0.71을 기록하므로 잘못된 안내를 반환할 수 있습니다. 임베딩 유사도는 공통된 표현과 주제를 측정하므로 이 세 사례를 모두 구분하는 단일 임계값은 없습니다. 프로덕션 캐시는 자체 트래픽에서 추출한 바꿔 쓰기 문장 쌍으로 인코더를 미세 조정하고, 범주별로 임계값을 설정하거나, 캐시된 답변을 제공하기 전에 각 후보 적중 항목을 재순위화 모델에 전달해 두 프롬프트를 함께 평가하도록 하여 차이를 줄입니다.
시맨틱 캐시의 적용 분야#
시맨틱 캐시는 많은 사용자가 같은 질문을 하고 답변이 천천히 바뀌는 환경, 즉 지원 챗봇, 내부 헬프 데스크, 안정적인 문서를 기반으로 하는 검색 증강 생성(RAG) 어시스턴트에서 효과적입니다. 개인화된 요청, 시간에 민감한 요청, 창의적인 요청에는 재사용한 답변이 틀리거나 반복적일 수 있으므로 효과가 크지 않습니다.
LLM 서빙에서 사용되는 다른 두 캐시는 서로 다른 계층에서 작동합니다.
- 프롬프트 캐싱: 모델 서버가 정확히 반복되는 프롬프트 접두부의 계산된 상태를 저장해 프리필 시간을 줄이며, 모델은 여전히 새로운 답변을 생성합니다.
- KV 캐시: 이전 토큰의 키와 값을 단일 생성 과정 내에 보관하므로 새 토큰을 생성할 때마다 해당 값을 다시 계산하지 않아도 됩니다.
시맨틱 검색은 동일한 임베딩 검색을 사용해 질의에 맞는 문서를 검색하고, 시맨틱 캐시는 이를 사용해 완성된 답변을 검색합니다. 이 기능은 애플리케이션과 모델 제공업체 사이에 위치하는 AI 게이트웨이 내부에서 제공되는 경우가 많습니다.
이미지도 같은 방식으로 캐시 키를 만들 수 있습니다. Ultralytics YOLO의 embed()은 이미지마다 특징 벡터를 반환하므로, 이미지 분류용으로 학습한 YOLO26 모델이 조회 키를 제공할 수 있습니다. 이를 통해 거의 중복되는 카메라 프레임에서 비전 언어 모델이 이전에 생성한 설명을 재사용할 수 있습니다.










