최근 학술 논문부터 어린이를 위한 쉬운 설명에 이르기까지 BM25에 관한 수많은 글들을 읽어보았다. 그런데 모든 설명이 결국 동일한 세 가지 개념으로 귀결되었다. BM25가 그만큼 본질적으로 단순하기 때문이다.

BM25는 랭킹(순위 매김) 알고리즘이다. 검색어를 입력하면 코퍼스(문서 집합) 내 모든 문서의 점수를 계산하고, 가장 높은 점수를 얻은 문서가 상위에 노출된다. 1994년부터 지금까지 줄곧 쓰여온 방식이다. 구글, 엘라스틱서치(Elasticsearch), 루씬(Lucene), 오픈서치(OpenSearch) 등 대다수 검색 엔진이 BM25나 그 변형을 기본 스코어러로 채택하고 있다. 밀집 벡터 검색(dense vector retrieval)에 의존하는 최신 RAG 시스템조차 거의 항상 하이브리드 파이프라인의 일부로 BM25를 포함한다.

이름 뒤의 ’25’는 단순한 버전 번호다. 아이폰 25처럼 말이다. 스티븐 로버트슨(Stephen Robertson)과 카렌 스파크 존스(Karen Spärck Jones)는 24번의 시행착오를 거친 끝에 이 알고리즘에 도달했다.

세 가지 핵심 규칙

BM25는 모든 문서를 평가할 때 세 가지 질문을 던진다.

1. 검색한 단어가 문서에 포함되어 있는가?

어떤 문서에 “공룡(dinosaur)“이라는 단어가 10번 등장한다면, 한 번만 언급된 문서보다 공룡에 관한 글일 확률이 높다. 이것이 검색의 가장 기본적인 신호인 **단어 빈도(Term Frequency, TF)**다.

하지만 BM25는 이를 영리하게 다룬다. 0번에서 1번 언급되는 것은 엄청난 차이다. 1번에서 2번으로 늘어나는 것도 여전히 유의미하다. 하지만 50번에서 51번으로 늘어나는 것은 점수에 거의 영향을 미치지 않는다. 빈도 증가에 따른 점수 상승 폭이 점차 완만해지는 것이다.

이를 **TF 포화(TF Saturation)**라고 부르며, 키워드를 500번씩 도배하는 스팸 문서를 걸러내는 핵심 원리다. BM25는 단어 빈도로 인한 가산점에 상한선을 둔다. 좋은 답변을 한 학생에게 칭찬 스티커 1개를 주는 것이지, 같은 답을 100번 소리쳤다고 스티커 100개를 퍼주지 않는 선생님과 같다.

2. 매칭된 단어가 얼마나 희귀한가?

“the”, “and”, “is” 같은 단어는 거의 모든 문서에 등장한다. 이런 단어가 일치했다고 해서 문서를 찾는 데는 아무런 도움이 되지 않는다. 반면 “트리케라톱스(triceratops)”, “대사체학(metabolomics)”, “Part 11” 같은 단어는 드물게 나타난다. 이렇게 희귀한 단어와의 매칭은 흔한 단어 매칭보다 훨씬 더 높은 가치를 갖는다.

이것이 바로 **역문서 빈도(Inverse Document Frequency, IDF)**다. 널리 쓰이는 비유를 들자면, 건물의 모든 사람이 파란색 셔츠를 입고 있다면 파란 셔츠는 사람을 찾는 단서가 되지 못한다. 하지만 단 한 사람만이 보라색 모자를 쓰고 있다면 그것이 결정적 단서가 된다. 희귀 단어가 바로 그 ’보라색 모자’다.

3. 문서의 길이가 적절한가?

10쪽짜리 팜플렛에서 “청개구리”를 세 번 언급했다면 그 글은 분명 청개구리에 관한 문서다. 반면 1,000쪽짜리 백과사전에서 “청개구리”를 세 번 언급했다면? 청개구리가 주제일 가능성은 낮다.

BM25는 상대적으로 짧은 문서에 공정한 가산점을 부여한다. 긴 문서는 단순히 분량이 방대하기 때문에 검색 단어가 우연히 걸릴 확률이 높으며, 이는 문서의 관련성을 증명하지 못한다. **문서 길이 정규화(Document Length Normalization)**가 바로 이 왜곡을 보정한다.

수식으로 이해하기 (쉬운 설명)

점수 = 단어의 희귀도 × (상한이 적용된 단어 빈도) / (단어 빈도 + 문서 길이에 따른 페널티)

검색어에 포함된 모든 단어에 대해 BM25는 각 문서별로 이 점수를 계산한다. 그리고 검색 단어들의 점수를 모두 합산하여 가장 높은 총점을 얻은 문서가 승리한다.

실제 수식은 다음과 같다:

Score(D, Q) = Σ IDF(qi) × [f(qi, D) × (k1 + 1)] / [f(qi, D) + k1 × (1 - b + b × |D|/avgdl)]

두 가지 조절 손잡이(하이퍼파라미터):

  • k1 (보통 1.2–2.0): 반복 언급 시 가산점이 포화되는 속도를 결정한다. 값이 클수록 반복된 단어에 더 높은 가중치를 준다.
  • b (보통 0.75): 긴 문서에 부여할 페널티의 강도를 결정한다. 0이면 문서 길이를 완전히 무시하고, 1이면 길이에 따른 페널티를 최대로 부여한다.

왜 BM25는 사라지지 않는가?

몇 년 주기로 BM25의 시대가 끝났다고 선언하는 사람들이 등장한다. Word2vec, BERT 임베딩, 밀집 벡터 검색(dense retrieval), LLM 기반 검색까지 — 매번 새로운 기술이 BM25를 완전히 대체할 것이라 여겨졌다. 하지만 아무것도 BM25를 밀어내지 못했다.

이유는 단순하다. BM25는 압도적으로 빠르고, 결과의 해석이 명확하며, 정확한 키워드 매칭(exact term matching)에 극도로 강력하기 때문이다. GPU 추론이 필요 없고, 환각(hallucination)을 일으키지 않으며, 파인튜닝도 요구하지 않는다. 그저 단어를 지능적으로 셀 뿐이다.

벡터 검색은 의미론적으로 유사한 문맥을 찾는 데 탁월하다. 예를 들어 “전자기록은 안전한 시간순 이력을 유지해야 한다”는 문장과 “감사 추적(audit trail) 요건”은 의미가 겹치므로 벡터 공간에서 서로 연결된다. 하지만 벡터 검색은 정확한 명칭, 문서 ID, 약어, 규제 조항 번호 같은 고유 키워드 검색에서 자주 취약함을 드러낸다. BM25는 이런 작업을 손쉽게 해결한다.

현업에서 가장 효과적인 RAG 검색 아키텍처가 하이브리드 형태를 띠는 이유가 여기에 있다:

쿼리 → BM25 (정확한 키워드) + 벡터 검색 (의미적 맥락) → 결과 결합 → 리랭킹(Rerank) → LLM

BM25가 정밀한 전문 용어를 포착하고, 벡터 검색이 의역된 표현을 잡아내며, 리랭커가 둘을 통합한다. LLM은 이 두 세계의 장점만을 취하게 된다.

요약하며

BM25는 세 가지 카운팅 규칙과 두 개의 조절 손잡이로 이루어져 있다. 희귀한 단어에 더 큰 가중치를 둔다. 반복된 언급은 점수를 높이지만 상한선이 있다. 짧은 문서에는 공정한 보정을 더한다. 이것이 전부다.

BM25는 30년 넘게 정보 검색(Information Retrieval)의 든든한 척추 역할을 해왔다. 검색 엔진이나 RAG, 혹은 관련 문서를 찾아내야 하는 시스템을 구축하고 있다면 BM25를 반드시 이해해야 한다. 화려해서가 아니라, 확실하게 동작하기 때문이다.