AI

[RAG] 하이브리드 검색 BM25 벡터 RRF 순위 결합

jykim23 2026. 7. 12. 20:58
반응형

하이브리드 검색 BM25 벡터 RRF 순위 결합 가중치 튜닝 불필요

부제: 키워드 검색과 벡터 검색을 점수 대신 순위로 합친 이유

한국어 문서 검색에 두 방식을 같이 썼다.
하나는 키워드 검색이다. 형태소로 자른 단어가 문서에 있는지를 본다.
다른 하나는 의미 검색이다. 문장을 벡터로 바꿔 뜻이 비슷한 문서를 찾는다.

각각 장단이 있어 둘 다 쓰기로 했다. 각 방식에서 상위 50개씩 뽑는다.
그다음이 문제였다.

두 결과를 어떻게 합치나

처음 떠오른 건 점수를 더하는 거였다.
키워드 점수와 벡터 점수를 합쳐서 다시 정렬하면 되지 않을까.

안 됐다.
두 점수는 스케일이 다르다.
벡터 유사도는 0에서 1 사이로 얌전한데, 키워드 점수(BM25)는 위로 열려 있고
문서·쿼리마다 분포가 제각각이다.
그냥 더하면 한쪽이 다른 쪽을 압도해 버린다. 합치는 의미가 없어진다.

가중치 튜닝은 답이 아니었다

그럼 가중치를 주면 되지 않나.
"키워드 0.3, 벡터 0.7" 식으로 비중을 조절하는 방법이다.

이것도 함정이 있었다.
최적 가중치는 데이터·도메인·쿼리 유형마다 다르다.
한 번 잘 잡아도 문서가 바뀌거나 질문 패턴이 달라지면 다시 맞춰야 한다.
계속 손이 가는 숫자를 하나 더 떠안는 셈이다.

점수 대신 순위로

그래서 점수를 버리고 순위만 쓰기로 했다.
RRF(Reciprocal Rank Fusion)다.

각 방식에서 문서의 순위(rank)만 가져다 이렇게 점수를 만든다.

rrf_score = 1/(k + 벡터순위) + 1/(k + 키워드순위)     # k = 60

핵심은 순위엔 스케일이 없다는 거다.
각 방식에서 1등이면 그냥 1등이다. 점수가 0.99든 152든 상관없다.
그래서 스케일 차이 문제가 사라지고, 맞춰야 할 가중치도 없어진다.
상위에 든 문서일수록 크게 기여하고, 순위가 뒤로 갈수록 기여가 뚝 떨어진다.

덤으로 자연스러운 성질이 하나 붙었다.
키워드가 아예 안 걸린 문서는 키워드 순위 목록에 없으니,
자동으로 벡터 순위만으로 반영된다.
한쪽에만 잡힌 문서도 버려지지 않고 제 몫만큼 섞인다.

정리

  • 키워드 검색과 벡터 검색을 각각 상위 50개씩 뽑아 하나로 합쳐야 했다
  • 점수를 직접 더하면 스케일·분포가 달라 한쪽이 지배한다
  • 가중치 튜닝은 데이터·도메인마다 다시 잡아야 해서 유지보수 부담이 크다
  • 점수 대신 순위로 합치는 RRF(1/(k+rank), k=60)로 — 스케일 무관, 가중치 튜닝 불필요
  • 한쪽에만 걸린 문서는 그 방식 순위만으로 자동 반영된다

스케일이 다른 점수를 합칠 땐, 점수를 정규화하려 애쓰기보다 순위로 바꿔 합치는 게 단순하고 튼튼했다.

반응형