ContextualCompressionRetriever

Re-ranker와 Retriever를 파이프라인으로 묶는 고정밀 검색 전략

왜 ContextualCompressionRetriever인가?

대부분의 RAG 시스템에서 단순 벡터 유사도 검색만으로는 정확한 문서 검색이 어렵다. 특히 법률, 의료처럼 문맥의 정확성이 중요한 분야에서는 더욱 그렇다.

그래서 Re-ranking, Filtering, Compression 같은 후처리 단계가 필요해졌고, 이걸 유연하게 조합해주는 도구가 바로 ContextualCompressionRetriever 이다.

구조 먼저 보기: Re-rank 기반 Retriever 구성

from langchain_chroma import Chroma
from langchain_ollama import OllamaEmbeddings
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
 
# 문서 임베딩 모델
embeddings_model = OllamaEmbeddings(model="bge-m3")
 
# Re-rank 모델
rerank_model = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-v2-m3")
cross_reranker = CrossEncoderReranker(model=rerank_model, top_n=2)
 
vector_db = Chroma(
	embedding_function=embeddings_model,
	collection_name="vector_db",
	persist_directory="./chroma_db",
)
 
vector_db_retriever = ContextualCompressionRetriever(
	base_compressor=cross_reranker,
	base_retriever=vector_db.as_retriever(search_kwargs={"k": 5}),
)

동작 흐름: 3단계 파이프라인

1️. 벡터 기반 검색 (Dense Retrieval)

  • Chroma.as_retriever(k=5)를 통해 유사한 문서 5개 검색
  • 빠르지만 정확도는 낮을 수 있음 (cosine similarity 기준)

2️. CrossEncoder Re-ranker

  • BAAI/bge-reranker-v2-m3 모델로 query-document 쌍 점수 계산
  • 상위 top_n=2개만 필터링
  • 문맥 반영한 의미 기반 정렬 → 정확도 향상

3️. ContextualCompressionRetriever

  • 위 두 단계를 하나로 묶어줌
  • 최종적으로 상위 2개 문서를 반환

여기서는 LLM 기반 요약은 포함되지 않음

CrossEncoder는 Transformer 기반 모델이지만, 일반적인 LLM(Prompt-based) 요약기는 아님.

ContextualCompressionRetriever의 진짜 역할

흔히 “이게 문서를 요약해주는 거 아닌가요?”라고 오해를 하는데, 위 구조는 요약 없이 문서 필터링만 수행한다.

ContextualCompressionRetriever = Retriever + Compressor Wrapper
구성요소역할
base_retriever후보 문서 N개 가져오기 (예: Chroma)
base_compressor그 중 의미 기반으로 top K개만 남기기 (예: CrossEncoder)
ContextualCompressionRetriever이 둘을 자동으로 연결해주는 파이프라인 Wrapper
비유하자면:
  • Retriever = “도서관 검색기”
  • Compressor = “논문 평론가”
  • ContextualCompressionRetriever = “이 둘을 연결하는 스마트 비서”

정도가 되겠다.

회고 및 정리

  • ContextualCompressionRetriever는 기능 자체는 단순하지만 retrieval 파이프라인을 구조화하는 데 매우 중요한 역할을 한다.
  • 단순한 Retriever보다 정확도, 유연성, token 절약 측면에서 큰 장점이 있다.
  • Re-ranker(CrossEncoder)만 써도 상당한 정밀도를 확보할 수 있으며, LLM 요약기와의 조합으로 더욱 강력한 context selection도 가능해진다.