Back to Blog
Multi-faceted FilteringHierarchical IndicesDartboard RetrievalRAG

0x07. Advanced Filtering - 구조화된 검색으로 정밀도 높이기

메타데이터 필터링, 계층적 인덱스, Dartboard Retrieval 등 구조화된 검색 전략으로 RAG의 정밀도를 높이는 방법을 알아본다.

RAG 파이프라인에서 벡터 검색만으로 원하는 문서를 정확히 찾아내기란 쉽지 않다. "2023년에 발표된 AI 관련 논문"을 찾고 싶은데, 의미적으로 유사하기만 한 2019년 문서가 상위에 올라오는 상황을 생각해 보자. 혹은 수천 페이지의 기술 문서에서 특정 섹션의 세부 정보를 찾아야 하는데, 관련 없는 페이지의 청크가 결과를 채우고 있을 수도 있다.

이런 문제를 해결하려면 단순한 의미 검색을 넘어 구조화된 검색 전략이 필요하다. 이 글에서는 RAG의 검색 정밀도를 높이는 세 가지 기법을 다룬다. 메타데이터를 활용한 Multi-faceted Filtering, 요약과 상세 인덱스를 계층화하는 Hierarchical Indices, 그리고 관련성과 다양성을 동시에 추구하는 Dartboard Retrieval이다.


Multi-faceted Filtering: 메타데이터로 검색 범위 좁히기

Multi-faceted Filtering(다면적 필터링) 은 텍스트의 의미적 유사성을 찾는 벡터 검색(Vector Search)과, 문서의 구조화된 속성 정보인 메타데이터(Metadata) 기반 필터링을 결합하는 기법이다. 두 가지 축을 동시에 활용하여 검색의 정확도와 정밀도를 극대화한다.

벡터 검색이 "의미적으로 비슷한 문서 찾기"라면, Multi-faceted Filtering은 거기에 "조건에 맞는 문서만 남기기"를 더한 것이다.

작동 방식

전체 흐름은 네 단계로 나뉜다.

1. 메타데이터 인덱싱(Metadata Indexing)

문서를 청킹하고 임베딩할 때, 텍스트 내용뿐만 아니라 연도, 출처, 저자, 카테고리 등의 메타데이터를 함께 벡터 데이터베이스에 저장한다. 이 메타데이터가 이후 필터링의 핵심 기준이 된다.

2. 쿼리 분석(Query Analysis)

사용자 질문이 들어오면, 이를 분석하여 두 부분으로 분리한다.

  • 의미 검색을 위한 부분: "AI 관련 내용"
  • 필터링을 위한 조건: "2023년에 나온"

이 분리 작업은 LLM을 사용하거나 간단한 규칙 기반 파서로 구현할 수 있다.

3. 사전 필터링(Pre-filtering)

벡터 검색을 수행하기 전에, 메타데이터 조건을 만족하는 청크들만 남기고 나머지를 검색 대상에서 제외한다. 이 단계에서 검색 범위가 크게 좁혀진다.

4. 필터 후 검색(Filtered Search)

좁혀진 검색 범위 내에서만 의미론적 벡터 검색을 수행하여 가장 관련성 높은 청크를 찾는다.

왜 효과적인가

이 기법의 강점은 세 가지로 정리된다.

  • 높은 정확도와 정밀도: 검색 공간을 극적으로 줄여, 의미적으로 유사하지만 조건에 맞지 않는 문서를 걸러낸다. "2023년 AI 논문"을 찾을 때 2019년 논문이 아무리 의미적으로 가까워도 결과에 포함되지 않는다.
  • 복잡한 질의 처리: 여러 조건이 결합된 질문("2023년에 Google이 발표한 Transformer 관련 논문")도 효과적으로 처리할 수 있다.
  • 속도 및 효율성: 대규모 문서 컬렉션에서 사전 필터링을 통해 훨씬 작은 데이터셋에 대해서만 벡터 검색을 수행하므로, 검색 속도가 빨라지고 비용도 절감된다.

구현 시 고려사항

실제 구현에서는 다음을 체계적으로 설계해야 한다.

  1. 문서 특성에 맞는 명확한 메타데이터 스키마 정의
  2. 문서 수집 및 처리(ingestion) 파이프라인에서 스키마에 따라 메타데이터를 정확히 추출하고 저장
  3. 사용자 입력에서 메타데이터 필터 조건을 추출하는 쿼리 파서(Query Parser) 구현
  4. 벡터 데이터베이스 SDK/API를 사용하여, 검색 시 쿼리 벡터와 메타데이터 필터 조건을 함께 전달

대부분의 벡터 데이터베이스(Pinecone, Weaviate, Qdrant 등)가 메타데이터 필터링 기능을 네이티브로 지원하므로, 기존 인프라에 비교적 쉽게 통합할 수 있다.


Hierarchical Indices: 요약에서 상세로, 2단계 검색

방대한 문서를 한 번에 검색하면, 관련 없는 청크가 결과를 오염시키기 쉽다. Hierarchical Indices(계층적 인덱스) 는 이 문제를 해결하기 위해 요약 인덱스(Summary Index)상세 청크 인덱스(Detailed Chunk Index) 라는 2단계 계층 구조를 만들어 검색한다.

도서관에서 책을 찾는 과정을 떠올리면 된다. 먼저 목차(요약)를 훑어 관련 챕터를 찾고, 그 챕터 안에서 구체적인 내용(상세 청크)을 읽는 것이다.

작동 방식

1. 이중 인덱싱(Dual Indexing)

문서를 인덱싱할 때 두 개의 별도 벡터 데이터베이스를 구축한다.

  • 요약 DB: 문서의 각 페이지나 섹션별 요약문을 저장한다.
  • 상세 청크 DB: 원본 문서를 잘게 나눈 상세 청크들을 저장한다. 각 청크는 자신이 속한 페이지/섹션 번호를 메타데이터로 가진다.

2. 요약 탐색(Summary Search)

사용자 질문이 들어오면, 먼저 요약 DB에서 검색하여 질문과 가장 관련성 높은 페이지 또는 섹션을 식별한다. 이 단계는 "어디를 볼 것인가"를 결정하는 과정이다.

3. 상세 탐색(Detailed Search)

1단계에서 찾은 페이지/섹션 번호를 필터 조건으로 사용하여, 상세 청크 DB에서 검색을 수행한다. 관련성 높은 부분에서만 세부 내용을 찾는 것이다.

4. 최종 결과 반환

2단계에서 찾은 상세 청크들을 최종 검색 결과로 LLM에 전달한다.

왜 효과적인가

  • 효율성 및 확장성: 대규모 문서군에서 전체 청크를 검색하는 대신, 가벼운 요약 인덱스를 먼저 검색하므로 빠르고 효율적이다. 수만 개의 상세 청크를 직접 검색하는 것보다 수백 개의 요약만 검색하는 편이 훨씬 가볍다.
  • 문맥 보존: 큰 그림(요약)을 먼저 파악한 뒤 세부 내용을 찾기 때문에, 개별 청크가 원래 속한 문맥적 의미를 잃지 않고 정확한 정보를 찾을 수 있다.
  • 정확도 향상: 관련 없는 페이지의 상세 청크들이 처음부터 검색 대상에서 제외되므로, 노이즈가 줄어들고 결과의 질이 높아진다.

구현 시 고려사항

  1. LLM 기반 요약 생성: 각 문서 단위(페이지, 섹션)의 요약문을 LLM으로 생성한다. 요약의 품질이 1단계 검색의 정확도를 좌우하므로 신경 써야 한다.
  2. 벡터 DB 이중 구축: 요약문용과 상세 청크용 두 개의 인덱스를 관리한다.
  3. 메타데이터 연결: 1단계 검색 결과(요약문)의 메타데이터(페이지 번호 등)를 추출하여, 2단계 검색 시 필터 조건으로 활용하는 로직을 구현한다.

Hierarchical Indices는 앞서 다룬 Multi-faceted Filtering과도 자연스럽게 결합된다. 1단계에서 관련 섹션을 좁히고, 2단계에서 메타데이터 필터까지 적용하면 검색 정밀도를 더욱 높일 수 있다.


Dartboard Retrieval: 관련성과 다양성의 균형

벡터 검색의 결과가 서로 지나치게 비슷한 경우가 종종 있다. 상위 5개 결과가 거의 같은 내용을 담고 있다면, 한정된 컨텍스트 창을 사실상 하나의 정보로 낭비하는 셈이다. Dartboard Retrieval은 이 문제를 해결하기 위해, 검색 결과를 선택할 때 질문과의 관련성(Relevance) 뿐만 아니라 이미 선택된 문서들과의 다양성(Diversity) 을 함께 고려한다.

다트보드에 다트를 던지는 상황을 떠올리면 된다. 중앙(최고 관련성)을 노리면서도, 이미 꽂힌 다트와는 다른 위치(다양성)를 고려하여 보드 전체를 고르게 커버하는 것이다.

작동 방식

1. 초기 후보군 검색

최종적으로 필요한 결과 수(k)보다 훨씬 많은 수의 후보 문서를 일반적인 벡터 검색으로 미리 확보한다. 예를 들어 k=5라면 후보는 50개 정도를 가져온다.

2. 최초 문서 선택

후보군 중에서 질문과 가장 관련성이 높은 문서를 첫 번째 결과로 선택한다. 이 단계에서는 순수하게 관련성만 기준으로 삼는다.

3. 반복적 점수 계산

나머지 후보 문서들을 대상으로, 두 가지 점수를 가중합한 종합 점수를 계산한다.

종합 점수 = w1 * 질문과의 관련성 + w2 * 이미 선택된 문서들과의 거리

여기서 거리는 후보 문서가 이미 선택된 문서들 중 가장 유사한 것과의 거리를 의미한다. 거리가 클수록 기존 결과와 다른, 즉 다양성이 높은 문서라고 판단한다. w1은 관련성 가중치(RELEVANCE_WEIGHT), w2는 다양성 가중치(DIVERSITY_WEIGHT)이다.

4. 다음 문서 선택

종합 점수가 가장 높은 문서를 다음 결과로 선택하고, 이 과정을 k개의 문서가 모일 때까지 반복한다.

이 알고리즘은 탐욕적 선택(Greedy Selection) 방식이다. 매 단계에서 현재 시점의 최적 선택을 반복하여, 관련성과 다양성의 균형을 맞춘다.

왜 효과적인가

  • 정보 중복성 감소: 검색 결과에 동일하거나 매우 유사한 내용이 반복되는 것을 효과적으로 방지한다.
  • 포괄적인 컨텍스트 제공: 하나의 주제에 대해 다양한 측면이나 관점을 담은 문서들을 제공하여, LLM이 더 풍부하고 깊이 있는 답변을 생성하도록 돕는다.
  • 컨텍스트 효율성 증대: 한정된 컨텍스트 창을 낭비 없이, 밀도 높은 정보로 채울 수 있다. 같은 5개 문서라도 정보 커버리지가 크게 달라진다.

가중치 조절의 중요성

w1w2의 비율에 따라 검색 결과의 성격이 달라진다.

  • w1이 높으면: 관련성 중심 검색. 질문에 정확히 맞는 문서 위주로 선택되지만, 내용이 중복될 가능성이 있다.
  • w2가 높으면: 다양성 중심 검색. 폭넓은 관점을 제공하지만, 관련성이 떨어지는 문서가 포함될 수 있다.

실제 사용 시에는 도메인과 질문 유형에 따라 이 가중치를 조절하여 최적의 균형점을 찾아야 한다.


정리

이 글에서 다룬 세 가지 기법을 정리하면 다음과 같다.

기법핵심 아이디어해결하는 문제
Multi-faceted Filtering메타데이터 필터 + 벡터 검색조건에 맞지 않는 문서 혼입
Hierarchical Indices요약 검색 후 상세 검색대규모 문서에서의 노이즈
Dartboard Retrieval관련성 + 다양성 가중합검색 결과의 중복

세 기법 모두 단순한 벡터 유사도 검색의 한계를 보완하는 전략이다. Multi-faceted Filtering은 구조화된 조건으로 검색 범위를 좁히고, Hierarchical Indices는 계층적 탐색으로 효율과 정확도를 높이며, Dartboard Retrieval은 다양성 확보로 컨텍스트의 질을 극대화한다.

실무에서는 이 기법들을 개별적으로 사용하기보다, 상황에 따라 조합하여 적용하는 것이 일반적이다. 예를 들어 메타데이터 필터링으로 범위를 좁힌 뒤, 계층적 인덱스로 관련 섹션을 찾고, 최종 결과 선택에 Dartboard Retrieval을 적용하면 각 단계의 강점이 시너지를 낸다.