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도 가능해진다.