1 개요
Cross encoder reranker는 검색 증강 생성(RAG) 시스템의 성능을 향상시키기 위해 사용되는 기술입니다. 이 문서는 Hugging Face의 cross encoder 모델을 사용하여 retriever에서 reranker를 구현하는 방법을 설명합니다.
2 주요 특징 및 작동 방식
- 목적: 검색된 문서들의 순위를 재조정하여 질문에 가장 관련성 높은 문서를 상위로 올림
- 구조: 질문과 문서를 동시에 입력으로 받아 처리
- 작동 방식:
- 질문과 문서를 하나의 입력으로 사용하여 유사도를 직접 출력
- Self-attention 메커니즘을 통해 질문과 문서를 동시에 분석
- 장점:
- 더 정확한 유사도 측정 가능
- 질문과 문서 사이의 의미론적 유사성을 깊이 탐색
- 한계점:
- 연산 비용이 높고 시간이 오래 걸림
- 대규모 문서 집합에 직접 적용하기 어려움
3 실제 사용
- 일반적으로 초기 검색에서 상위 k개의 문서에 대해서만 reranking 수행
- Bi-encoder로 빠르게 후보를 추출한 후, Cross encoder로 정확도를 높이는 방식으로 활용
4 구현
- Hugging Face의 cross encoder 모델 또는 BAAI/bge-reranker와 같은 모델 사용
- LangChain 등의 프레임워크에서 CrossEncoderReranker 컴포넌트를 통해 쉽게 통합 가능
5 Reranker의 주요 장점
- 더 정확한 유사도 측정
- 심층적인 의미론적 유사성 탐색
- 검색 결과 개선
- RAG 시스템 성능 향상
- 유연한 통합
- 다양한 사전 학습 모델 선택 가능
6 Reranker 사용 시 문서 수 설정
- 일반적으로 상위 5~10개 문서에 대해 reranking 수행
- 최적의 문서 수는 실험과 평가를 통해 결정 필요
7 Reranker 사용시 Trade-offs
- 정확도 vs 처리 시간
- 성능 향상 vs 계산 비용
- 검색 속도 vs 관련성 정확도
- 시스템 요구사항 충족
- 데이터셋 특성 고려
간단한 예시를 통해 Cross Encoder Reranker의 구현 방법을 설명하겠습니다.
# 문서 출력 도우미 함수
def pretty_print_docs(docs):
print(
f"\n{'-' * 100}\n".join(
[f"Document {i+1}:\n\n" + d.page_content for i, d in enumerate(docs)]
)
)from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 문서 로드
documents = TextLoader("./data/appendix-keywords.txt").load()
# 텍스트 분할기 설정
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
# 문서 분할
texts = text_splitter.split_documents(documents)
# 임베딩 모델 설정
embeddingsModel = HuggingFaceEmbeddings(
model_name="sentence-transformers/msmarco-distilbert-dot-v5"
)
# 문서로부터 FAISS 인덱스 생성 및 검색기 설정
retriever = FAISS.from_documents(texts, embeddingsModel).as_retriever(
search_kwargs={"k": 10}
)
# 질의 설정
query = "Word2Vec 에 대해서 알려줄래?"
# 질의 수행 및 결과 문서 반환
docs = retriever.invoke(query)
# 결과 문서 출력
pretty_print_docs(docs)이제 기본 retriever를 ContextualCompressionRetriever로 감싸보겠습니다. CrossEncoderReranker는 HuggingFaceCrossEncoder를 사용하여 반환된 결과를 재정렬합니다.
- 다국어 지원 BGE Reranker: bge-reranker-v2-m3
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
# 모델 초기화
model = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-v2-m3")
# 상위 3개의 문서 선택
compressor = CrossEncoderReranker(model=model, top_n=3)
# 문서 압축 검색기 초기화
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor, base_retriever=retriever
)
# 압축된 문서 검색
compressed_docs = compression_retriever.invoke("Word2Vec 에 대해서 알려줄래?")
# 문서 출력
pretty_print_docs(compressed_docs)