RAG 파이프라인에 리랭커(Reranker)를 추가했더니 — 모든 게 망가졌다

RAG 파이프라인에 리랭커를 추가했습니다. 그러자마자 테스트가 실패했습니다.

버전 2에서는 FAISS와 BM25를 사용한 하이브리드 검색(hybrid retrieval)을 사용했습니다. 19개의 테스트 질문을 모두 통과했죠. 그러다 정밀도(precision)를 높이기 위해 크로스 인코더(cross-encoder) 리랭커를 추가했습니다.

이론은 간단합니다:

  • 1단계: 빠른 검색을 통해 광범위한 후보군을 확보합니다.
  • 2단계: 스마트한 리랭커를 사용하여 최적의 후보를 선택합니다.

구현하는 데는 20분밖에 걸리지 않았습니다. 하지만 즉시 19개의 테스트 중 2개가 실패했습니다.

실패 원인은 데이터 형식 때문이었습니다. 제 데이터에는 다음과 같은 밀집된 표 형식의 청크(tabular chunks)가 포함되어 있었습니다: "Company: Zentara Robotics | CEO: Iris Kallas | Employees: 287"

크로스 인코더 모델은 자연어 문단으로 학습되었습니다. 모델이 표의 행을 보았을 때, 매우 낮은 점수를 부여했습니다. 모델은 해당 청크가 관련이 없다고 판단한 것입니다.

하이브리드 검색은 정답을 찾아냈지만, 리랭커가 이를 버려버렸습니다.

이를 해결하기 위해 7가지 방법을 시도했습니다:

  • 더 큰 후보군(candidate pool) 사용하기.
  • 리랭커와 검색기(retriever)의 점수를 혼합하기.
  • 랭크 퓨전(rank fusion) 사용하기.

어느 것도 효과가 없었습니다. 리랭커 점수가 너무 낮아서 다른 모든 요소를 압도해 버렸습니다. 모델은 단순히 순위를 낮게 매긴 것이 아니라, 표 형식을 적극적으로 거부하고 있었습니다.

저는 수학적인 문제를 해결하려는 시도를 멈추고 구조를 변경했습니다.

리랭커가 모든 것을 결정하게 두는 대신, 가장 좋은 결과들을 보호하기로 했습니다. 저는 "보장된 슬롯(guaranteed slot)" 전략을 사용했습니다:

  • 상위 3개의 결과를 원한다면, 1단계에서 얻은 상위 2개는 그대로 유지합니다.
  • 리랭커는 오직 3번째 결과만을 선택하는 데 사용합니다.

이렇게 하면 하이브리드 검색 결과가 최종 리스트에 포함되도록 보장할 수 있습니다. 리랭커는 나머지 슬롯의 품질을 높이는 역할만 수행합니다.

결과: 19/19 테스트 통과.

배운 점:

  • 리랭커는 즉각적인 업그레이드가 아닙니다. 구조화된 데이터나 표 형식의 데이터에서는 성능을 저하시킬 수 있습니다.
  • 평가 세트(evaluation set)는 안전망입니다. 19개의 테스트가 없었다면, 저는 망가진 시스템을 그대로 출시했을 것입니다.
  • 잘 작동하는 것을 보호하세요. 1단계 검색 결과가 좋다면, 리랭커가 이를 덮어쓰게 두지 마세요.

리랭커를 찾기 전에 강력한 검색기(retriever)를 먼저 구축하세요.

Source: https://dev.to/santanu_mohanta_29/i-added-a-reranker-to-my-rag-pipeline-it-broke-everything-then-i-fixed-it-1c9i

Optional learning community: https://t.me/GyaanSetuAi