Re-ranker, Bi-encoder vs Cross-encoder: RAG 시스템을 더 똑똑하게!

RAG Re-ranker, Bi-encoder vs Cross-encoder: 당신의 RAG 시스템을 더 똑똑하게!

안녕하세요! 요즘 인공지능 분야에서 가장 뜨거운 키워드 중 하나는 바로 RAG (Retrieval Augmented Generation)입니다. 대규모 언어 모델(LLM)의 환각(Hallucination) 문제를 줄이고 답변의 정확도를 높이는 데 핵심적인 기술이죠. RAG는 크게 세 단계로 나뉩니다: 검색 (Retrieval) - 재랭킹 (Re-rank) - 생성 (Generation).

오늘은 이 중에서 '재랭킹(Re-rank)' 단계의 핵심인 Bi-encoderCross-encoder에 대해 자세히 알아보고, 실제 RAG 시스템에서 이 두 가지를 어떻게 활용하면 되는지 상세한 사용 사례와 함께 알려드리겠습니다.


1. RAG Re-ranker는 왜 필요할까요?

RAG 시스템의 첫 번째 단계인 '검색(Retrieval)'에서는 수많은 문서 중에서 사용자의 질문과 관련된 문서를 찾아냅니다. 이때 주로 Bi-encoder와 같은 효율적인 모델을 사용해 수십~수백 개의 후보 문서를 빠르게 가져오죠.

하지만 이렇게 1차로 검색된 문서들은 완벽하지 않을 수 있어요. 질문과 미묘하게 관련이 없거나, 정말 중요한 내용이 뒤쪽에 있을 수도 있습니다. 이때 필요한 것이 바로 Re-ranker입니다. Re-ranker는 1차로 검색된 문서들 중에서 가장 관련성이 높은 문서를 다시 선별하여 LLM에 전달함으로써, LLM이 더 정확하고 핵심적인 정보를 바탕으로 답변을 생성하도록 돕는 역할을 합니다.


2. Bi-encoder: 빠르고 넓게!

개념

Bi-encoder (쌍방 인코더)는 이름처럼 쿼리(질문)와 각 문서(Passage)를 독립적으로 인코딩하여 각각의 벡터(숫자 배열) 표현을 만듭니다. 그리고 이 두 벡터 간의 유사도(코사인 유사도 등)를 계산해서 관련성을 측정하죠.

  • 구조: 질문을 인코딩하는 모델과 문서를 인코딩하는 모델이 각각 따로 있습니다. (예: BERT, RoBERTa 같은 트랜스포머 기반 모델)
  • 학습: 주로 '(질문, 긍정 문서)' 쌍을 이용해, 긍정 문서의 유사도를 높이고 부정 문서의 유사도를 낮추도록 학습됩니다.

장점

  • 놀라운 속도: 모든 문서를 미리 인코딩해서 벡터 데이터베이스에 저장해둘 수 있어요. 질문이 들어오면 질문만 인코딩해서 저장된 문서 벡터와 비교하면 되니, 실시간 검색에 매우 유리합니다.
  • 뛰어난 확장성: 문서의 수가 아무리 많아도 효율적으로 처리할 수 있습니다. 수억 개의 문서도 문제없어요.
  • 상대적으로 낮은 비용: 대규모 문서 집합에 대해 초기 검색 단계에서 사용하기 적합합니다.

단점

  • 정확도 한계: 질문과 문서가 독립적으로 인코딩되다 보니, 둘 사이의 미묘한 상호작용(Interaction)을 직접적으로 파악하기 어렵습니다. 이 때문에 Cross-encoder보다는 정확도가 떨어질 수 있습니다.
  • 문맥 이해 부족: 질문과 문서 전체의 문맥을 깊이 이해하는 능력이 상대적으로 부족합니다.

실제 사용 사례

Bi-encoder는 주로 1차 필터링(Initial Retrieval) 단계에서 사용됩니다.

  • 대규모 문서 검색: 수많은 문서 중에서 빠르게 상위 N개(예: 100~1000개)의 후보 문서를 가져올 때 사용됩니다.
  • 벡터 데이터베이스 연동: ElasticSearch, Apache Solr 같은 검색 엔진의 랭킹 기능이나 Faiss, HNSWlib, Pinecone 같은 벡터 데이터베이스에서 유사도 검색 시 Bi-encoder로 생성된 임베딩이 활용됩니다.

3. Cross-encoder: 깊고 정확하게!

개념

Cross-encoder (교차 인코더)는 쿼리와 문서를 하나의 시퀀스로 결합하여 단일 모델에 입력합니다. 모델은 쿼리와 문서 내의 모든 토큰(단어 조각) 간의 상호작용을 직접 학습하여 관련성 점수를 출력합니다.

  • 구조: [CLS] 질문 [SEP] 문서 [SEP]와 같은 형태로 질문과 문서를 한 줄로 합쳐서 BERT, RoBERTa 같은 트랜스포머 기반 모델에 넣습니다. 모델은 최종적으로 관련성 점수를 예측합니다.
  • 학습: '(질문, 문서)' 쌍에 대한 관련성 점수(예: 0~1 사이의 확률)를 예측하도록 학습됩니다.

장점

  • 압도적인 정확도: 질문과 문서 간의 풍부한 상호작용을 모델링하므로 관련성 평가의 정확도가 Bi-encoder보다 훨씬 높습니다. 문맥적 이해도가 뛰어나 미묘한 관련성도 놓치지 않고 포착합니다.
  • 정교한 순위 지정: 재랭킹 단계에서 Top-K 문서에 대한 매우 정교한 순위 지정에 탁월한 성능을 보입니다.

단점

  • 느린 추론 속도: 질문이 들어올 때마다 각 후보 문서와 질문을 하나하나 합쳐서 모델에 넣고 개별적으로 점수를 계산해야 합니다. 이는 많은 계산 비용과 시간을 필요로 합니다.
  • 낮은 확장성: 처리해야 할 문서의 수가 많아질수록 계산 시간이 선형적으로 증가하여, 대규모 문서 집합에 직접 적용하기는 어렵습니다.
  • 높은 계산 비용: Bi-encoder보다 훨씬 많은 GPU/CPU 자원을 소모합니다.

실제 사용 사례

Cross-encoder는 주로 2차 필터링(Re-ranking) 단계에서 사용됩니다.

  • 최종 후보군 선별: Bi-encoder로 1차 검색된 Top-N (예: 100 ~ 1000개)의 후보 문서들을 Cross-encoder에 입력하여 최종적으로 Top-K (예: 3 ~ 10개)의 가장 관련성 높은 문서를 선정합니다.
  • 높은 정확도가 필요한 분야: 법률 문서 검색, 의료 정보 검색, 전문 지식 질의응답 시스템 등 정확한 정보가 필수적인 애플리케이션에서 Re-ranker로 활용됩니다.

참고


4. RAG 시스템에서 Bi-encoder와 Cross-encoder의 환상적인 조합!

대부분의 실제 RAG 시스템에서는 Bi-encoder와 Cross-encoder를 계층적으로 조합하여 사용하는 것이 가장 효과적입니다.

  1. 🔍 검색 (Retrieval) 단계 - Bi-encoder 활용:
    • 사용자의 쿼리가 들어오면, 미리 임베딩되어 벡터 데이터베이스에 저장된 수많은 문서 중에서 Bi-encoder를 활용해 가장 관련성이 높은 초기 후보군(Top-N)을 빠르게 검색합니다.
    • 이 단계에서 수십만, 수억 개의 문서 중 수십~수백 개의 후보 문서를 효율적으로 찾아냅니다.
  2. ✨ 재랭킹 (Re-rank) 단계 - Cross-encoder 활용:
    • Bi-encoder로 검색된 초기 후보군(Top-N)은 아직 노이즈가 있거나 미묘한 관련성을 놓칠 수 있습니다.
    • 이 후보군에 대해 Cross-encoder를 사용하여 쿼리와 각 문서 간의 정교한 상호작용을 분석하고, 가장 관련성이 높은 최종 후보군(Top-K)을 선정합니다.
    • Cross-encoder는 계산 비용이 높지만, 처리해야 할 문서의 수가 Bi-encoder 단계에서 크게 줄어들었기 때문에 현실적으로 적용 가능합니다.
  3. ✍️ 생성 (Generation) 단계:
    • 재랭킹 단계를 거쳐 최종적으로 선정된 Top-K 문서를 LLM에 Context로 제공하여 사용자 쿼리에 대한 답변을 생성합니다.

실제 사용 사례로 더 자세히 알아볼까요?

1. 고객 서비스 챗봇 (FAQ 및 지식 기반)

  • 목표: 고객 질문에 대해 방대한 FAQ 및 지식 기반 문서에서 가장 정확한 답변을 찾아 제공합니다.
  • 활용:
    1. Bi-encoder: 모든 FAQ 문서를 미리 임베딩하여 벡터 데이터베이스(예: ChromaDB)에 저장합니다. 고객 질문이 들어오면 Bi-encoder로 Top-50의 유사 문서를 빠르게 검색합니다.
    2. Cross-encoder: 검색된 Top-50 문서들을 Cross-encoder에 입력하여 고객 질문과의 관련성 점수를 계산하고, 이를 기반으로 Top-3~5의 핵심 문서를 최종 선정합니다.
    3. LLM: 최종 선정된 문서들을 LLM에 전달하여 고객 질문에 대한 정확하고 자연스러운 답변을 생성합니다.
  • 효과: Bi-encoder로 대규모 문서를 빠르게 필터링하고, Cross-encoder로 핵심 문서를 정확하게 재선정하여 빠르면서도 정확한 답변을 제공합니다.

2. 기업 내부 문서 검색 시스템

  • 목표: 직원들이 사내 방대한 보고서, 기술 문서 등에서 필요한 정보를 빠르게 찾을 수 있도록 돕습니다.
  • 활용:
    1. Bi-encoder: 사내 모든 문서를 Bi-encoder로 임베딩하여 벡터 인덱스(예: Elasticsearch)를 구축합니다. 직원이 검색어를 입력하면 Bi-encoder를 통해 Top-100~200개의 관련 문서를 1차로 가져옵니다.
    2. Cross-encoder: 이 Top-100~200개 문서에 대해 Cross-encoder를 적용하여 검색어와의 문맥적 관련성을 깊이 파악하고, Top-10의 최종 검색 결과를 선정합니다.
    3. 결과 제시: 선정된 Top-10 문서를 직원에게 리스트 형태로 보여주고, 필요시 LLM을 통해 문서 내용을 요약하여 함께 제시합니다.
  • 효과: 대규모 사내 문서에서 신속하게 후보군을 추출하고, Cross-encoder의 정밀한 재랭킹으로 사용자가 원하는 정확한 정보를 찾을 확률을 높여줍니다.

3. 법률 질의응답 시스템

  • 목표: 특정 법률 질문에 대해 방대한 법률 데이터베이스에서 정확한 관련 조항이나 판례를 찾아 사용자에게 제공합니다.
  • 활용:
    1. Bi-encoder: 모든 법률 문서를 법률 도메인에 특화된 Bi-encoder로 임베딩하여 벡터 데이터베이스를 구축합니다. 사용자의 법률 질문에 대해 Bi-encoder를 사용하여 Top-N(예: 50개)의 관련 법률 문서를 검색합니다.
    2. Cross-encoder: 검색된 Top-N 문서를 법률 도메인에 특화된 Cross-encoder로 다시 랭킹하여 Top-K(예: 5개)의 가장 정확한 문서를 선별합니다.
    3. LLM/결과 제시: 선정된 법률 문서를 바탕으로 LLM이 법률 질문에 대한 답변을 생성하거나, 해당 법률 문서의 원문과 주요 내용을 함께 제시합니다.
  • 효과: 법률 분야는 높은 정확도를 요구하므로, Bi-encoder의 속도와 Cross-encoder의 정확도를 결합하는 것이 필수적입니다. 미묘한 법률 용어와 문맥을 정확히 이해하여 올바른 정보를 제공하는 데 기여합니다.

결론: 두 마리 토끼를 잡는 지혜로운 전략

특징 Bi-encoder Cross-encoder
개념 쿼리/문서 독립 인코딩 후 유사도 계산 쿼리/문서 결합 후 단일 모델 인코딩 및 점수 예측
속도 매우 빠름 (미리 임베딩 가능) 느림 (쿼리마다 재계산)
정확도 상대적으로 낮음 (상호작용 부족) 매우 높음 (풍부한 상호작용 모델링)
확장성 높음 (대규모 문서 집합에 적합) 낮음 (처리 문서 수에 비례하여 비용 증가)
주요 사용처 초기 검색, 대규모 필터링, 빠른 응답 시스템 재랭킹, 높은 정확도 요구 시스템

RAG 시스템의 재랭킹 단계에서는 Bi-encoder의 빠른 속도와 확장성을 이용해 방대한 문서에서 1차 후보군을 빠르게 선별하고, Cross-encoder의 높은 정확도와 문맥 이해력을 이용해 선별된 후보군 중 최종적으로 가장 관련성 높은 문서를 찾아내는 '투 스테이지 랭킹(Two-Stage Ranking)' 전략이 가장 효과적입니다.