RAG 아키텍처: 검색 증강 생성에서 과도한 설계 회피하기

검색 증강 생성(RAG)은 종종 과도하게 설계되며, 개발자들이 더 단순한 정보 검색 방법보다 먼저 임베딩과 벡터 데이터베이스로 뛰어드는 경우가 많습니다. 최적의 아키텍처는 데이터의 최신성, 코퍼스 특성, 쿼리 패턴, 규모에 따라 달라지지만, 대부분의 시스템은 전체 텍스트 검색과 LLM 기반 쿼리 재작성의 조합으로 성공적으로 구현할 수 있습니다.

RAG 아키텍처 선택 프레임워크

적절한 검색 전략을 선택하기 위해서는 불필요한 복잡성을 피하기 위해 다섯 가지 핵심 기술적 요소를 평가해야 합니다.

  • 데이터 최신성: 실시간 업데이트는 재색인화가 쉬운 경우를 선호하며, 안정적인 코퍼스는 사전 임베딩이 가능합니다.
  • 코퍼스 특성: 하루 10% 이상의 변화율을 보이는 고변동 코퍼스는 전체 사전 임베딩이 비현실적입니다.
  • 쿼리 패턴: 키워드 중심의 쿼리는 전체 텍스트 검색이 적합하며, 대화형 쿼리는 임베딩이 유리합니다.
  • 규모 및 성능: 하루 1,000건 미만의 쿼리 시스템은 일반적으로 전체 최적화가 필요하지 않습니다.
  • 팀 역량: 머신러닝 전문 지식이 없는 팀은 하이브리드 또는 고급 임베딩 파이프라인보다 전체 텍스트 검색과 쿼리 재작성을 우선시해야 합니다.

RAG 구현 레시피

검색 전략은 점진적으로 구현되어야 하며, 단순한 방법이 충분하지 않다는 데이터가 입증될 때만 더 복잡한 아키텍처로 전환해야 합니다.

1. 전체 텍스트 검색 (BM25)

Elasticsearch나 Postgres와 같은 도구를 사용한 전체 텍스트 검색은 키워드 스타일 쿼리와 정확한 일치(예: "invoice #12345")에 가장 효율적인 시작점입니다.

  • 장점: API 비용 0, 10ms 미만 지연, 디버깅 용이, 청크 전략이나 복잡한 평가가 필요 없음.
  • 단점: 동의어나 의미적 의도를 포착하지 못함(예: "car" vs "automobile").

2. 쿼리 재작성과 함께한 전체 텍스트 검색

LLM을 사용해 대화형 사용자 쿼리를 깔끔한 키워드 검색으로 변환하면, 검색보다 쿼리 구성 문제를 해결함으로써 많은 "의미 기반 검색" 문제를 해결할 수 있습니다.

  • 메커니즘: LLM은 불필요한 단어를 제거하고, 동의어를 추가하며, 도메인 전문 용어를 번역하고, 복잡한 쿼리를 분해합니다.
  • 혜택: 결과가 좋지 않으면 전체 코퍼스를 다시 임베딩하지 않고도 시스템 프롬프트만 조정하면 됩니다. 일반적인 임베딩 모델이 자주 오해하는 전문 용어에 특히 효과적입니다.

3. 하이브리드 검색 (BM25 + 임베딩 재정렬)

이 접근법은 BM25로 광범위한 후보군(상위 50~100개)을 검색한 후, 임베딩을 사용해 상위 10개를 재정렬합니다.

  • 교환 조건: 이 방법은 200~500ms의 지연을 추가하지만, 키워드 검색이 놓치는 의미적 의미를 포착합니다.
  • 복잡성: 청크 전략(고정 크기 vs 의미 기반)과 겹침 관리의 필요성이 생깁니다.

4. 실시간 임베딩

고변동 데이터(하루 10% 이상 업데이트) 또는 실시간 콘텐츠의 경우, 문서는 사전에 임베딩하지 않고 쿼리 처리 중에 임베딩됩니다.

  • 장점: 완벽한 데이터 최신성과 모델 전환의 간편함; 임베딩 모델을 변경하려면 재색인화 없이 코드 한 줄만 수정하면 됩니다.
  • 단점: 더 높은 쿼리 지연(200500ms)과 작은 재정렬 집합(K=2050)에 한정됨.

5. 핫/콜드 티어링

이 아키텍처는 자주 접근되는 문서("핫 티어")는 사전에 임베딩하고, 드물게 접근되는 문서는 실시간으로 임베딩합니다("콜드 티어").

  • 혜택: 접근 패턴의 파레토 분포(20%의 문서가 80%의 트래픽을 차지)를 최적화하여 지연과 유연성 사이의 균형을 맞춥니다.

6. 전체 사전 임베딩

전체 코퍼스를 사전에 임베딩하고 벡터 데이터베이스에 저장해 근사 최근접 이웃(ANN) 검색을 수행하는 것은 거대 규모(하루 1만 건 이상 쿼리)와 매우 안정적인 코퍼스에서만 정당화됩니다.

  • 위험: 모델 폐기로 인한 운영 부담이 큽니다. 모델을 전환하려면 전체 코퍼스를 다시 임베딩해야 하며, 이는 높은 컴퓨팅 비용, 다운타임, 광범위한 회귀 테스트를 수반합니다.

에이전트 기반 RAG와 쿼리 분해

다중 의도를 포함하는 복잡한 사용자 쿼리(예: "CSV 읽기, 데이터 정제, 결과 시각화")는 하위 쿼리로 분해되어야 합니다. 에이전트 시스템은 쿼리를 분해하고 각 하위 쿼리를 최적의 검색 방법(예: 일부는 간단한 키워드 검색, 일부는 임베딩)으로 라우팅한 후 결과를 결합합니다.

이 분해는 단일 복잡한 쿼리를 재작성하고 대규모 문서를 임베딩하려는 시도보다 훨씬 저렴하고 정확합니다.

커뮤니티 인사이트 및 반론

업계 전문가들은 벡터 검색의 운영 부담이 종종 과소평가된다고 강조합니다.

"의미적 유사성은 생각보다 좋지 않습니다... 점점 더 정교한 임베딩 검색을 위해 더 많은 또는 다른 텍스트 청크를 다시 임베딩해야 할 수밖에 없습니다... 그 후에는 500개의 키워드를 가진 검색 쿼리를 만들고, 물론 고통스럽지만, 그건 그냥 작동합니다."

다른 전문가들은 코드와 같은 특정 도메인에서는, 모델이 실제 소스 코드보다 잘못된 청크를 신뢰하는 경우가 있어 검색이 오히려 비효율적일 수 있다고 제안합니다. 이러한 경우, 간단한 도구인 grep 또는 ripgrep과 LLM 에이전트를 결합하는 것이 벡터 기반 RAG 파이프라인보다 더 신뢰할 수 있습니다.

구현 경로 요약

전략 최신성 복잡성 지연 최적 사용 사례
전체 텍스트 + 재작성 완벽 낮음 <50ms 사용 사례의 60%
실시간 임베딩 완벽 낮음 200-500ms 고변동 데이터
핫/콜드 티어링 혼합 중간 50-100ms 다양한 접근 패턴
전체 사전 임베딩 오래됨 높음 <50ms 거대 규모, 안정된 데이터

Sources

관련