본문 바로가기
AI/Tool, 모델 소개

분산에서 통합으로: Rankify는 검색, 재정렬, 생성의 전체 과정을 어떻게 재구성하는가

by 주호파파 2025. 5. 14.
728x90
반응형

"어딘가에 놀라운 일이 알려지기를 기다리고 있을 거예요." - 칼 세이건

 

정보 폭발의 시대, Rankify는 어떻게 문제를 해결할까?

정보가 넘쳐나는 오늘날, 방대한 데이터 속에서 원하는 정보를 빠르고 정확하게 찾는 일은 수많은 연구자와 업계 종사자들을 괴롭히는 공통의 난제입니다.
오늘 소개할 Rankify는 이런 문제를 해결하기 위해 등장한 학계와 산업계에서 모두 주목받고 있는 Python 기반 툴킷입니다.
Rankify는 포괄적이고 모듈화된 구조, 그리고 사용자 친화적인 방식을 통해,
검색, 재정렬(Re-ranking), 그리고 검색 기반 생성(RAG) 전체를 하나로 통합한 솔루션을 제공합니다.

1. Rankify의 탄생 배경 

기존의 검색 시스템은 단어 기반의 전통적인 검색 방식에서, 밀집 임베딩 기반의 현대적 방법으로 진화해왔습니다.
또한 재정렬 모델(Re-ranking)의 등장으로 초기 검색 결과의 정확성과 관련성이 크게 향상되었습니다.
그리고 검색 기반 생성(RAG, Retrieval-Augmented Generation)은 이 기술들을 생성 모델과 결합하여, 언어 모델이 관련 문서를 즉시 참고함으로써 더 사실적인 답변을 생성할 수 있게 했습니다.

 

하지만 이 과정은 각 기능을 수행하는 여러 개의 도구를 조합해야만 했고, 도구 간의 연동은 번거롭고 비효율적이었습니다.
Rankify는 이런 ‘파편화’ 문제를 해결하기 위해 등장했습니다.
검색부터 재정렬, 최종 문장 생성에 이르기까지 전 과정을 하나의 시스템으로 통합하여, 일관되고 모듈화된, 그리고 안정적인 솔루션을 제공합니다.

2. Rankify 깊이 이해하기 

1. Rankify 비전

Rankify는 흩어진 검색 및 생성 프로세스를 한곳에 통합하려는 필요성에서 출발했습니다.
기존의 정보 검색(IR) 도구들은 검색 또는 재정렬 중 한 영역에만 집중하는 경우가 많았고, 일부 프레임워크는 RAG 기능은 제공하지만 정밀한 재정렬 기능은 부족했습니다.
Rankify는 이러한 공백을 메우고자 만들어졌습니다.

  • 검색 : BM25 같은 전통적인 희소(Sparse) 기반 검색부터, DPR, ANCE, BGE, Contriever, ColBERT 같은 최신 밀집(Dense) 모델 기반 검색까지 폭넓게 지원합니다. .
  • 재정렬(Re-ranking)  : MonoBERT부터 RankT5에 이르는 다양한 재정렬기를 탑재하고 있으며, Pointwise, Pairwise, Listwise 등 다양한 알고리즘으로 2차 정렬을 유연하게 처리할 수 있습니다
  • RAG : 검색된 문서를 기반으로 더 신뢰도 높은 답변을 생성할 수 있도록 지원하여 사실성(factuality)을 향상시킵니다 .

2. 기존 방식에 비해 주요 장점

  • 모듈성 : 단일 인터페이스를 통해 사용자는 검색 방법, 재배열 모델, RAG 방법을 자유롭게 결합할 수 있습니다.
  • 사전 검색된 데이터 : Rankify는 사전 검색된 문서와 Wikipedia, MS MARCO와 같은 대규모 코퍼스의 기성 인덱스를 제공합니다.
  • 확장성 : Python과 PyTorch를 기반으로 구축된 Rankify는 대규모 데이터 세트를 효율적으로 처리할 수 있습니다.
  • 비교 실험 : 다양한 방법을 통합함으로써 연구자들은 다양한 검색 또는 재순위 지정 전략의 성과를 체계적으로 비교할 수 있습니다.

3. '사고의 흐름(Chain of Thought)' 패러다임과의 차이점

1. "사고의 흐름 "이란 무엇인가요?

대규모 언어 모델 연구에서 "사고의 흐름 "는 일반적으로 모델(또는 방법)이 최종 결론에 도달하기 전에 중간 단계를 공개적으로 생각하는 추론 프레임워크를 의미합니다. 이 접근 방식은 인간의 추론 순서를 모방하여 각 단계가 투명하도록 보장합니다.

2. Rankify가 "사고의 흐름 " 접근 방식을 어떻게 넘어서는가

" 사고의 흐름" 추론은 통찰력이 있지만, 주로 외부 관련 맥락을 올바르게 검색하고, 가중치를 부여하고, 활용하는 것보다는 모델의 내부 논리를 전개하는 데 초점을 맞춥니다. 반면, 랭키파이는:

  • 맥락에 집중 : Rankify는 내부의 "사고의 흐름"에 의존하는 대신 관련 문서를 사전에 검색하고 체계적으로 다시 순위를 매겨 언어 모델이 정확한 외부 데이터를 기반으로 생성되도록 보장합니다.
  • 견고하고 모듈식 : 사고의 흐름은 모델의 숨겨진 계층에 깊이 통합되어 있기 때문에 평가하거나 확장하기 어렵습니다. 랭키파이는 성숙한 외부 검색기와 재배열기를 사용하므로 사용자 정의와 확장이 쉽습니다.
  • 지식 집약적 작업에 더 적합 : 사실적 정확성이 중요한 경우, 모델의 내부 "사고의 흐름"에만 의존하는 것은 환각적일 수 있습니다. 랭키파이의 프로세스는 관련성 있는 소스가 항상 최전선에 있도록 보장합니다.

"정보는 21세기의 석유이고 분석은 내연 기관입니다." - 피터 순드가드

Rankify의 핵심 구성 요소

1. 검색

Rankify는 희소(BM25) 리트리버와 고밀도(DPR, ANCE, BGE, Contriever, ColBERT) 리트리버를 모두 지원합니다.

  • 스파스 검색(BM25) : 짧은 쿼리와 정확한 키워드 일치만으로 충분할 때 매우 안정적입니다.
  • 고밀도 검색(예: DPR)은 신경망 임베딩을 활용하여 의미적 유사성을 포착하고 보다 미묘하거나 모호한 쿼리에 대해 희소 방법보다 우수한 성과를 내는 경우가 많습니다.

2. 재배열

일반적인 Rankify 워크플로에서 두 번째 단계는 재순위 지정입니다. 초기 문서 집합이 검색되면 이러한 문서는 보다 복잡하지만 더 정확한 모델을 사용하여 다시 순위가 매겨집니다.

  • 포인트 기반(예: MonoBERT, MonoT5)
  • 페어링됨
  • 목록 기반(예: RankT5, RankGPT, LiT5)

특히, 많은 수의 초기 검색 문서에서 고정밀 결과를 추출해야 할 때 이 단계는 매우 중요합니다.

3. 검색 향상 생성(RAG)

Rankify의 RAG는 검색과 생성의 장점을 결합합니다.

  • 검색기 : 사용자 쿼리와 가장 관련성이 높은 상위 문서를 검색합니다.
  • 생성기 : 이러한 상위 문서는 컨텍스트 기반 답변을 생성하는 데 입력으로 사용됩니다.

지원되는 방법에는 제로샷 생성, 디코더 융합(FiD) 방법, 문맥 학습(RALM) 등이 있습니다. 언어 모델을 실제 외부 데이터에 고정함으로써 사실 환각의 위험이 크게 줄어듭니다.

5. 설치 및 설정

1. 가상환경 구축

Rankify를 설치하기 전에 종속성 충돌을 방지하기 위해 전용 conda 환경을 만드는 것이 가장 좋습니다.

conda create -n rankify python=3.10
conda activate rankify

2. PyTorch 설치

Rankify는 PyTorch 2.5.1과 원활하게 작동합니다.

pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu124

GPU가 있고 학습/검색 성능을 최적화하려면 PyTorch의 CUDA 버전(12.4 또는 12.6)을 설치하세요.

3. Rankify 설치

  • 기본 설치 :
pip install rankify

이를 통해 검색, 재순위 지정, 검색 강화 생성을 위한 기본 기능을 사용할 수 있습니다.

  • 권장 설치 :
pip install "rankify[all]"

이 명령은 고급 검색기, 재배열기, 생성기 모듈을 포함한 전체 제품군을 설치합니다.

  • 선택적 종속성 : 특정 구성 요소만 설치하려는 경우:
    pip install "rankify[reranking]"
    
  • pip install "rankify[retriever]"
  • GitHub에서 설치(최신 개발 버전 받기) :
git clone https://github.com/DataScienceUIBK/rankify.git
cd rankify
pip install -e .

전체 기능을 보려면:

pip install -e ".[all]"

4. ColBERT Retriever 사용

Rankify와 함께 ColBERT를 사용하려면 추가 설정이 필요합니다.

  1. GCC와 필수 라이브러리를 설치하세요:
conda install -c conda-forge gcc=9.4.0 gxx=9.4.0
conda install -c conda-forge libstdcxx-ng
  1. 환경 변수 내보내기:
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
export CC=gcc
export CXX=g++
export PATH=$CONDA_PREFIX/bin:$PATH

6. 사전 검색 데이터셋 및 작업 

1. 사전 검색 데이터셋 

Rankify는 각 데이터셋마다 1000개의 사전 검색 문서를 제공합니다.
이는 색인을 직접 구축하거나 유지할 필요 없이 빠르게 시작하고자 하는 사용자에게 큰 도움이 됩니다. 

2. Rankify에서 데이터셋 다운로드 및 처리 

사용자는 단일 스크립트를 통해 인기 있는 질의응답(QA) 데이터셋의 사전 검색 문서를 다운로드할 수 있습니다.
예를 들어, BM25로 검색된 Natural Questions 데이터셋을 다운로드하려면 다음과 같습니다:

from rankify.dataset.dataset import Dataset
dataset = Dataset(retriever="bm25", dataset_name="nq-dev", n_docs=100)
documents = dataset.download(force_download=False)

"bm25"를 "dpr", "ance", "colbert", "bge", "contriever" 또는 "mss"로 바꾸면 동일한 데이터 세트에서 다양한 리트리버의 성능을 살펴볼 수 있습니다.

3. 검색

Rankify는 다양한 검색 방법에 대한 간단하고 통합된 인터페이스를 제공합니다. 다음은 BM25를 사용하여 위키피디아에서 문서를 검색하는 방법의 예입니다.

from rankify.dataset.dataset import Document, Question, Answer
from rankify.retrievers.retriever import Retriever
documents = [
    Document(question=Question("Who wrote Hamlet?"),
             answers=Answer(["Shakespeare"]), contexts=[])
]
bm25_retriever_wiki = Retriever(method="bm25", n_docs=5, index_type="wiki")
retrieved_docs = bm25_retriever_wiki.retrieve(documents)
for doc in retrieved_docs:
    print(doc)

4. 작업 재조정

상위 문서를 검색한 후, 이를 재정렬기로 입력하여 순서를 최적화합니다. Rankify는 20개 이상의 재순위 모델을 지원합니다.

from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.models.reranking import Reranking
question = Question("When did Thomas Edison invent the light bulb?")
answers = Answer(["1879"])
contexts = [
    Context(text="Lightning strike at Seoul National University", id=1),
    Context(text="Thomas Edison invented the light bulb in 1879", id=2),
]
doc = Document(question=question, answers=answers, contexts=contexts)
reranker = Reranking(method="monot5", model_name="monot5-base-msmarco")
reranker.rank([doc])
print(doc.reorder_contexts)

재정렬 후에는 doc.reorder_contexts 새로운 순서가 반영되어 사용자 질의에 가장 잘 맞는 문단이 강조 표시됩니다.

5. Generator 모듈 사용

Rankify의 Generator 모듈은 RAG(Retrieval-Enhanced Generation)를 워크플로에 통합합니다. 다음은 일부 컨텍스트를 검색하고 생성 모델을 사용하여 최종 답변을 생성하는 예입니다.

from rankify.dataset.dataset import Document, Question, Answer, Context
from rankify.generator.generator import Generator
question = Question("What is the capital of France?")
answers = Answer(["Paris"])
contexts = [
    Context(text="The capital of France is Paris.", id=1),
    Context(text="Berlin is the capital of Germany.", id=2),
]
doc = Document(question=question, answers=answers, contexts=contexts)
generator = Generator(method="in-context-ralm", model_name='meta-llama/Llama-3.1-8B')
output = generator.generate([doc])
print(output)

질문 자체뿐만 아니라 관련 맥락도 언어 모델에 포함하려는 경우 이러한 접근 방식은 매우 유용합니다.

7. 평가 지표

1. 검색 성능 측정

Rankify는 검색을 위한 상위 K 정확도 측정 항목을 제공합니다.

from rankify.metrics.metrics import Metrics
m = Metrics(documents)
before_rank = m.calculate_retrieval_metrics(ks=[1,5,10,20,50,100], use_reordered=False)
print(before_rank)

각 k(1, 5, 10, 20, 50, 100)에 대해 Rankify는 검색된 처음 k개의 구절에 정답이 나타나는지 확인합니다.

2. 재배열 효과 평가

많은 실험에서 모델을 재정렬하면 실제로 결과가 개선되는지 궁금할 수 있습니다.  차이점을 확인하기 use_reordered 위해 설정했습니다  True

after_rank = m.calculate_retrieval_metrics(ks=[1,5,10,20,50,100], use_reordered=True)
print(after_rank)

3. 평가 및 검색 강화 생성

Rankify는 또한 최종적으로 생성된 답변에 대한 정확한 일치(EM), 정밀도, 재현율, F1과 같은 측정 항목을 계산합니다. 이러한 측정항목은 질문 답변 및 지식 기반 생성 작업에 매우 중요합니다.

gen_metrics = m.calculate_generation_metrics(generated_answers)
print(gen_metrics)

8. 사용 사례 및 모범 사례

1. 질의응답 시스템

FAQ를 작성하거나 개방형 도메인 질문(의학, 과학 또는 기업 지식 기반 등)에 답변하는 경우 Rankify는 올바른 문서를 추출하고 높은 정확도로 다시 순위를 매기고, 선택적으로 간결하고 정확한 답변을 생성하는 데 탁월합니다.

2. 지식 기반 어시스턴트 

많은 챗봇들이 실패하는 이유는 참조 기준 없이 대형 언어 모델에만 전적으로 의존하기 때문입니다.
Rankify는 검색과 재정렬을 통해 외부 정보를 참고하고, 이를 생성 능력과 결합함으로써 ‘환각(hallucination)’의 위험을 줄입니다.
그 결과는 더 탄탄하고 신뢰할 수 있는 어시스턴트입니다. 

3. 학술 연구 및 벤치마킹

연구자들은 Rankify의 사전 검색된 데이터 세트를 사용하여 신속하게 통제된 실험을 수행할 수 있습니다. 그들은 새로운 검색이나 재순위 모델을 적용하고 매번 바퀴를 새로 만들지 않고도 지표를 직접 비교할 수 있습니다.

"우리가 무엇을 하고 있는지 알았다면, 그것을 여전히 연구라고 부를 수 있었을까?" —알베르트 아인슈타인

랭키파이는 이러한 철학을 구현합니다. 연구자들이 표준 검색 파이프라인을 구현하는 지루한 작업에서 벗어나 혁신적인 작업에 집중할 수 있도록 해줍니다.

9. Rankify가 돋보이는 이유

1. 통합 프레임워크

6~7개의 도구를 번갈아가며 사용하는 대신, 하나의 인터페이스를 통해 검색, 재정렬, RAG를 처리할 수 있습니다. 이러한 일관성 덕분에 개발 시간이 단축되고 통합 오류도 줄어듭니다.

2. 유연성과 모듈화 

Rankify는 플러그 앤 플레이 방식으로 설계되었습니다. 새로운 리트리버나 리어레인저를 추가하는 것은 일반적으로 기존 파이프라인에 원활하게 플러그인할 수 있는 인터페이스를 구현하는 문제일 뿐입니다. 이러한 모듈성은 사용자가 새로운 아이디어를 빠르게 시도해 볼 수 있기 때문에 혁신을 촉진합니다.

3. 커뮤니티와 생태계

오픈 소스 프로젝트인 Rankify는 커뮤니티 기여와 활발한 유지 관리를 통해 이익을 얻습니다. 철저한 문서화와 사용자 기반 확대로 자연어 처리 분야의 최신 발전에 발맞출 준비가 되었습니다.

"함께 모이는 것은 시작이고, 함께 있는 것은 진전이며, 함께 일하는 것은 성공입니다." - 헨리 포드

포드의 말처럼, 랭키파이는 연대와 협력의 정신으로 번창하며, 유연하고 강력한 프레임워크 아래 정보 검색 커뮤니티를 하나로 모읍니다.

10. 결론

Rankify 는 검색, 재순위 지정, 검색 강화 생성의 전체 파이프라인을 통합하는 차세대 툴킷의 한 예입니다.

이 솔루션은 일관되고 모듈식 플랫폼을 제공함으로써 현대 정보 검색 시스템의 복잡성과 단편화를 해결합니다.

사용자는 고전적인 BM25부터 DPR 및 ColBERT와 같은 고급 신경망 방법에 이르기까지 다양한 검색기를 쉽게 시도하고, 정교한 재순위 매기기(MonoT5, RankT5, LiT5, RankGPT 등)를 사용하여 결과를 더욱 최적화하고, 마지막으로 RAG를 사용하여 상황에 맞는 답변을 생성할 수 있습니다.

 

주로 내부의 불투명한 메커니즘에 의존하는 "사고의 흐름" 패러다임과 달리, 랭키파이는 명확한 외부 맥락에 확고하게 근거하여 답변을 제시합니다. 이러한 구분은 검증 가능한 정확성, 사실적 정확성, 견고한 성능이 요구되는 작업에 매우 중요합니다. 랭키파이는 관련 데이터가 어디에서 나오는지, 어떻게 구성되어 있는지에 초점을 맞춰 환상의 함정에 빠지지 않고 이론적인 AI 역량과 실제적이고 실용적인 신뢰성 간의 격차를 효과적으로 메웁니다.

728x90
반응형