
BM25(Best Matching 25)는 검색 시스템에서 문서의 관련도를 계산하는 대표적인 키워드 기반 랭킹 알고리즘입니다. 사용자가 검색어를 입력했을 때, 각 문서가 그 검색어와 얼마나 관련 있는지를 점수로 계산하고, 점수가 높은 문서를 위에 배치합니다. BM25는 오래된 알고리즘입니다. 하지만 지금도 Elasticsearch, OpenSearch, Lucene 같은 검색 엔진에서 기본 랭킹 방식으로 널리 사용됩니다. 딥러닝 기반 검색과 벡터 검색이 보편화된 지금도 BM25가 사라지지 않는 이유는 명확합니다. 빠르고, 단순하고, 설명 가능하며, 여전히 강력하기 때문입니다.
핵심 아이디어
BM25의 핵심은 “검색어가 문서 안에서 얼마나 중요하게 등장하는가”를 계산하는 것입니다. 이를 위해 BM25는 크게 세 가지 요소를 봅니다.
첫째, 단어 빈도를 봅니다.
검색어가 문서 안에 많이 등장할수록 해당 문서는 검색어와 관련이 높다고 판단합니다. 예를 들어 BM25라는 단어가 한 번 등장한 문서보다 여러 번 등장한 문서가 더 관련 있을 가능성이 큽니다. 하지만 BM25는 단어가 많이 등장한다고 해서 점수를 무한히 올리지는 않습니다. 같은 단어가 1번에서 2번 등장할 때의 차이는 크게 보지만, 50번에서 51번 등장할 때의 차이는 작게 봅니다. 즉, 단어 빈도의 효과를 점점 줄어들게 만듭니다.
둘째, 단어의 희소성을 봅니다.
모든 문서에 자주 등장하는 단어는 중요도가 낮고, 일부 문서에만 등장하는 단어는 중요도가 높습니다. 예를 들어 문서, 검색, 정보 같은 단어보다 BM25, 역문서빈도, Okapi 같은 단어가 특정 주제를 더 잘 나타낼 수 있습니다.
셋째, 문서 길이를 보정합니다.
긴 문서는 단어가 많이 포함될 가능성이 높습니다. 따라서 단순히 검색어가 많이 등장했다는 이유만으로 긴 문서가 항상 유리해지면 안 됩니다. BM25는 문서 길이를 평균 문서 길이와 비교해 점수를 조정합니다.
정리하면 BM25는 단어 빈도, 단어 희소성, 문서 길이 보정을 조합해 문서의 관련도를 계산합니다.
BM25 공식
BM25의 대표적인 공식은 다음과 같습니다.
score(D, Q) = Σ IDF(qᵢ) *
(f(qᵢ, D) * (k1 + 1)) /
(f(qᵢ, D) + k1 * (1 - b + b * |D| / avgdl))
여기서 Q는 검색 질의이고, D는 점수를 계산할 문서입니다. qᵢ는 검색어에 포함된 각각의 단어이고, f(qᵢ, D)는 해당 단어가 문서 D에 등장한 횟수입니다. |D|는 문서의 길이이고, avgdl은 전체 문서의 평균 길이입니다. k1은 단어 빈도의 영향력을 조절하는 값이고, b는 문서 길이 보정 강도를 조절하는 값입니다.
일반적으로 k1은 1.2에서 2.0 사이 값을 많이 사용하고, b는 0.75를 기본값으로 자주 사용합니다. 공식이 복잡해 보이지만, 의미는 단순합니다. 검색어가 문서에 많이 등장하면 점수가 올라갑니다. 드문 단어일수록 더 큰 가중치를 받습니다.문서가 지나치게 길면 길이에 따른 보정을 받습니다.
BM25의 강점
BM25의 가장 큰 장점은 단순하지만 성능이 좋다는 점입니다. 별도의 학습 데이터가 없어도 문서 집합의 단어 통계만 있으면 바로 사용할 수 있습니다. 또한 BM25는 매우 빠릅니다. 보통 inverted index와 함께 사용되기 때문에 검색어가 포함된 문서만 빠르게 찾아 점수를 계산할 수 있습니다. 이 덕분에 대규모 문서 검색에서도 효율적으로 동작합니다. 설명 가능성이 높다는 점도 중요합니다.
딥러닝 모델은 왜 특정 문서를 높게 평가했는지 설명하기 어려운 경우가 많습니다. 반면 BM25는 특정 단어가 몇 번 등장했는지, 그 단어가 얼마나 희귀한지, 문서 길이가 어떻게 보정되었는지를 통해 결과를 비교적 명확하게 설명할 수 있습니다. 그리고 BM25는 키워드가 정확히 맞는 검색에 매우 강합니다. 사용자가 특정 용어, 코드, 상품명, 에러 메시지, 법령명, 문서 제목처럼 명확한 키워드를 입력하는 경우 BM25는 여전히 매우 좋은 성능을 냅니다.
BM25의 약점
BM25는 의미를 직접 이해하지 못합니다. 기본적으로 단어가 겹치는지를 보기 때문에, 같은 의미라도 표현이 다르면 관련성을 낮게 평가할 수 있습니다. 예를 들어 사용자가 자동차 보험료 줄이는 방법을 검색했는데 문서에는 차량 보장 비용 절감 전략이라고 쓰여 있다면, 두 표현은 의미적으로 비슷하지만 BM25는 이를 충분히 잘 연결하지 못할 수 있습니다. 또한 BM25는 단어 순서와 문맥을 깊게 이해하지 못합니다. A가 B를 인수했다와 B가 A를 인수했다는 의미가 다르지만, 포함된 단어만 보면 비슷하게 보일 수 있습니다. 한국어 검색에서는 토큰화 품질에도 크게 영향을 받습니다. 검색엔진, 검색 엔진, 검색엔진의, 검색 시스템 같은 표현을 어떻게 나누고 정규화하느냐에 따라 BM25의 검색 품질이 달라집니다. 또한 드물게 등장하는 단어를 항상 중요한 단어로 판단할 수 있습니다. 오타, 로그 ID, 해시값, 임시 코드처럼 의미 없는 토큰이 높은 가중치를 받아 검색 결과를 왜곡할 수 있습니다.
현대 검색에서 BM25의 위치
BM25는 현대 검색 시스템에서도 여전히 중요한 역할을 합니다. 다만 이제는 BM25 하나만으로 모든 검색 문제를 해결하기보다는, 다른 검색 방식과 함께 사용하는 경우가 많습니다.
대표적인 구조는 다음과 같습니다.
사용자 질문
-> BM25로 키워드 기반 후보 검색
-> 벡터 검색으로 의미 기반 후보 검색
-> 두 결과를 결합
-> reranker로 최종 재정렬
이 구조에서 BM25는 빠르고 안정적인 1차 후보 검색기 역할을 합니다. 정확한 키워드 매칭이 필요한 문서를 잘 찾아오고, 벡터 검색이 놓칠 수 있는 명시적인 용어 기반 결과를 보완합니다. 결국 BM25는 오래되었지만 낡은 알고리즘은 아닙니다. 검색의 가장 기본적인 문제인 “사용자가 입력한 단어와 문서가 얼마나 잘 맞는가”를 빠르고 안정적으로 해결합니다. 딥러닝 검색이 의미를 이해하는 방향으로 발전했다면, BM25는 여전히 키워드 검색의 단단한 기준점으로 남아 있습니다. 그래서 좋은 검색 시스템은 BM25를 버리는 것이 아니라, BM25의 강점을 이해하고 다른 검색 기법과 함께 조합해서 사용합니다.
나가는 말
BM25는 오래된 알고리즘이지만, 여전히 검색 시스템의 핵심에 가까운 위치에 있습니다. 그 이유는 단순합니다. BM25는 사용자가 입력한 검색어와 문서 안의 단어가 얼마나 잘 맞는지를 빠르고 안정적으로 계산합니다. 물론 BM25는 의미를 깊게 이해하지는 못합니다. 동의어, 문맥, 사용자 의도, 문장 구조처럼 현대 검색에서 중요한 요소를 직접 다루지는 못합니다. 그래서 벡터 검색이나 reranker 같은 기법과 함께 사용할 때 더 좋은 성능을 냅니다.
하지만 BM25는 지금도 매우 유용합니다. 특정 키워드, 상품명, 에러 메시지, 법령명, 고유명사처럼 정확한 단어 매칭이 중요한 검색에서는 여전히 강력합니다. 또한 별도의 학습 데이터 없이도 바로 사용할 수 있고, 검색 결과를 설명하기도 쉽습니다. 결국 BM25는 “낡아서 남아 있는 알고리즘”이 아니라, 기본기가 너무 좋아서 아직도 쓰이는 알고리즘입니다. 좋은 검색 시스템은 BM25를 대체할 대상으로만 보지 않습니다. BM25가 잘하는 일을 맡기고, 의미 검색이나 reranking이 잘하는 부분을 함께 조합합니다. 그래서 현대 검색에서 BM25의 위치는 분명합니다. BM25는 검색의 출발점이자, 하이브리드 검색의 든든한 기준선입니다.
'프로그래밍 PROGRAMMING > 인공지능 AI' 카테고리의 다른 글
| Reranker란 무엇인가 — Bi-encoder vs Cross-encoder (0) | 2026.04.28 |
|---|---|
| RRF(Reciprocal Rank Fusion)란 무엇인가 - 가장 우아한 검색 결과 결합방식 (0) | 2026.04.27 |
| RAG 챗봇이 느리고 비싸지는 이유 — 검색, 임베딩, LLM 호출 비용 줄이는 방법 (0) | 2026.04.24 |
| 왜 PDF를 넣으면 답변 품질이 떨어질까 — 표, 이미지, 페이지 구조를 AI가 못 읽는 문제 (1) | 2026.04.23 |
| Claude Design 시작하기: 말로 만들고, 대화로 다듬는 새로운 디자인 방식 (1) | 2026.04.22 |