RAG에서 Redis 캐싱: 정규화된 쿼리, 시맨틱 트랩 & 실제로 효과 있었던 것

발행: (2025년 12월 28일 오후 03:34 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

왜 Redis 캐싱이 RAG에 효과적인가

RAG 파이프라인은 반복적으로 다음 작업을 수행하기 때문에 비용이 많이 듭니다:

  • 임베딩 생성
  • 벡터 검색
  • 컨텍스트 조합
  • LLM 추론

많은 사용자 질문—특히 내부 도구에서는—답변이 요청 간에 변하지 않습니다. Redis는 다음을 제공합니다:

  • 서브밀리초 수준의 읽기
  • TTL 기반 만료
  • 간단한 운영 모델
  • 예측 가능한 비용

정규화된 쿼리가 실제 의미하는 바

문제

같은 의도를 가진 다양한 표현이 서로 다른 캐시 키를 생성합니다:

"Explain docker networking"
"Can you explain Docker networking?"
"docker networking explained"

원시 쿼리를 해시하면 Redis가 각각을 별개의 키로 취급해 히트율이 낮아집니다.

목표

  • 캐시 히트율 향상
  • 잘못된 답변 반환 방지

안전한 정규화

  • 소문자 변환
  • 공백 트리밍
  • 구두점 제거
  • 불필요한 구문 축소

위험한 정규화

  • 숫자 제거
  • 버전 문자열 축소
  • 도메인 용어 교체
  • 동의어 치환
  • 의미 추론

RAG 환경에서는 잘못된 캐시 히트가 미스보다 훨씬 큰 문제를 일으킵니다.

텍스트 정규화 예제 (Python)

import re

FILLER_PHRASES = ["can you", "please", "tell me", "explain"]

def normalize_query(query: str) -> str:
    q = query.lower().strip()

    for phrase in FILLER_PHRASES:
        q = q.replace(phrase, "")

    q = re.sub(r"[^\w\s]", "", q)   # remove punctuation
    q = re.sub(r"\s+", " ", q)      # collapse whitespace

    return q.strip()

이 예제가 의도적으로 피하는 것:

  • NLP 불용어 리스트
  • 임베딩
  • 동의어 확장

결과: 예측 가능하고 정확한 정규화.

강력한 캐시 키 만들기

정규화된 텍스트 외에도 모델 및 검색 구성을 포함합니다:

cache_key = hash(
    model_name +
    normalized_query +
    retrieval_config
)

이를 방지합니다:

  • 서로 다른 모델 간에 답변 재사용
  • 검색 전략 혼합
  • 조용한 정확성 버그

의미 기반 캐싱: 허용 가능한 경우

Semantic caching can be used when:

  • 질문이 FAQ일 때
  • 답변이 일반적일 때
  • 정확성 허용도가 높을 때
  • 정확한 캐시 폴백이 존재할 때

Safe pattern: two‑tier caching

  1. Exact cache – 정규화된 쿼리 사용 (권위적)
  2. Semantic cache – 선택적, 보호된, 절대 권위적이지 않음

구조화된 쿼리를 위한 Intent‑Level 정규화

RAG가 비텍스트 쿼리(SQL, Athena, API, 로그, 메트릭)를 포함할 때, “쿼리”는 의도와 제약 조건으로 구성됩니다. 원시 텍스트 대신 정규화된 표현을 캐시합니다.

{
  "source": "athena",
  "table": "deployments",
  "metrics": ["count"],
  "filters": {
    "status": "FAILED",
    "time_range": "LAST_7_DAYS"
  }
}

정규화된 JSON을 해시(예: 키를 정렬한 후)하여 결정적인 캐시 키를 얻습니다.

Final Setup

  • Redis 빠른 캐시 저장소용
  • 자유형 쿼리를 위한 보수적인 텍스트 정규화
  • 구조화된 쿼리를 위한 인텐트 수준 정규화
  • 중요한 경로에 대한 시맨틱 캐싱 없음
  • 데이터 신선도에 맞춘 TTL

Results

  • ~40 % cost reduction
  • Lower latency
  • Zero correctness regressions
  • Predictable behavior

Most importantly, the system regained trust.

주요 내용

  • 형식을 정규화하고, 의미는 정규화하지 않는 것이 핵심
  • 과도한 정규화는 조용히 RAG를 깨뜨립니다
  • 의미 기반 캐싱은 선택 사항이어야 하며, 기본값이 되어서는 안 됩니다
  • 구조화된 쿼리는 의도 수준의 정규화가 필요합니다
  • 결정론이 영리함보다 우수합니다

RAG에서 캐싱은 단순히 토큰을 절약하는 것이 아니라 정확성을 유지하는 것입니다. 정규화를 올바르게 수행하면 Redis는 강력한 도구가 됩니다.

P.S. 이것은 겉보기와 달리 매우 어려운 문제이며, 모든 상황에 맞는 단일 해결책이 없습니다. 다양한 RAG 설정은 컨텍스트가 어떻게 검색되고, 구조화되며, 검증되는지에 따라 서로 다른 정규화 전략을 요구합니다. 여기서 설명한 접근 방식은 개념적인 가이드일 뿐이며, 바로 적용할 수 있는 구현이 아닙니다.

Back to Blog

관련 글

더 보기 »