데이터·DB

BM25

비엠 이십오

정보 검색 분야에서 쓰이는 Best Matching 25(베스트 매칭 25)의 약자로, 질의어와 문서의 단어 일치도를 점수로 매기는 키워드 기반 랭킹 함수입니다. 1970년대와 1980년대에 Robertson과 Spärck Jones 등이 세운 확률적 검색 모델을 잇는 TF-IDF 계열 기법입니다 [1]. 문서 길이 정규화를 맡는 b와 용어 빈도 포화를 맡는 k1, 두 파라미터가 점수를 조절합니다 [3]. Apache Lucene과 Elasticsearch, OpenSearch가 기본 스코어링으로 채택했습니다 [2]. RAG의 하이브리드 검색에서는 의미 기반 벡터 검색과 짝을 이룹니다 [4].

쉽게 말하면?

BM25는 Best Matching 25의 줄임말입니다. 질의어에 가장 잘 맞는 문서를 골라내는 계산식이라는 뜻입니다. 도서관 사서가 찾는 단어가 몇 번 나왔는지 세되, 같은 단어가 열 번 나왔다고 열 배 좋은 책으로 치지는 않는 장면을 떠올리면 됩니다. 두꺼운 책은 단어가 많이 들어갈 수밖에 없으니 분량을 감안해 점수를 깎아요.

한 줄로 비유하면?

검색어가 몇 번 나왔는지 세되 같은 단어의 반복은 어느 선에서 그만 인정하고, 두꺼운 책은 분량만큼 점수를 깎아 순위를 매기는 사서입니다.

어디에 쓰이나?

케이스 1Elastic — Elasticsearch의 기본 유사도 알고리즘을 BM25로 교체

Elastic은 기술 블로그에서 Elasticsearch 5.0부터 기본 유사도 알고리즘을 Okapi BM25로 전환했다고 밝혔습니다 [2]. 기반 라이브러리인 Apache Lucene도 6.0.0 API 문서에서 BM25Similarity의 기본 값을 k1 1.2, b 0.75로 명시합니다 [3]. 별도 설정 없이도 문서 길이 편차가 큰 색인에서 긴 문서가 무조건 상위로 올라가는 쏠림이 완화됩니다 [2]. 검색 팀은 파라미터를 건드리지 않아도 BM25 점수를 받게 됩니다 [2].
도입효과: 기본 스코어러 전환 시점 Elasticsearch 5.0 버전 기준, 기본 파라미터 k1 1.2·b 0.75 [2][3]

케이스 2Anthropic — Contextual Retrieval에서 임베딩과 BM25를 함께 사용

Anthropic은 2024년 9월 공개한 엔지니어링 글에서 청크마다 맥락 문장을 덧붙인 뒤 임베딩 검색과 BM25를 함께 돌리는 방식을 제시했습니다 [4]. 기준선인 상위 20개 청크 검색 실패율은 5.7%였습니다 [4]. 맥락 임베딩만 쓰면 3.7%로, 여기에 맥락 BM25를 더하면 2.9%로 내려갔습니다 [4]. 글은 임베딩이 놓치는 정확한 단어 일치를 BM25가 보완한다고 설명합니다 [4].
도입효과: 상위 20개 청크 검색 실패율 5.7% 기준 — 맥락 임베딩과 맥락 BM25 조합 49% 감소(2.9%), 리랭킹까지 추가 시 67% 감소(1.9%) [4]

케이스 3BEIR 벤치마크 — 제로샷 검색에서 BM25의 위치 측정

BEIR는 9개 검색 과제와 18개 데이터셋으로 제로샷 검색 성능을 재는 벤치마크입니다 [5]. 논문은 BM25를 견고한 베이스라인으로 결론지었고, 리랭킹과 후기 상호작용 모델이 평균적으로 가장 좋지만 연산 비용이 크다고 적었습니다 [5]. 표에 실린 BM25의 nDCG@10은 TREC-COVID 0.656, SciFact 0.665, NQ 0.329입니다 [5]. 밀집 검색 모델이 학습 데이터 밖 도메인에서 일반화에 어려움을 겪는다는 점이 함께 지적됐습니다 [5].
도입효과: nDCG@10 기준 BM25 대비 평균 성능(18개 데이터셋 제로샷) — 교차 인코더를 붙인 BM25+CE +11%, ANCE -2.8%, DPR -47.7% [5]

케이스 4네이버 플레이스 — 백오피스 AI 에이전트의 하이브리드 지식 검색

네이버 플레이스 개발 조직은 2025년 11월 공개한 구축기에서 OpenSearch의 BM25 희소 검색과 Milvus 벡터 검색을 RRF로 결합한 구조를 설명했습니다 [6]. 5개 출처에서 모은 11,173건 문서를 색인했고, 그중 84.5%가 GitHub 저장소 문서였습니다 [6]. 청크 크기와 리랭커 모델을 바꿔가며 검색 품질을 비교했습니다 [6]. 기존 어휘 검색 기반 구성과 대비해 만족도와 속도, 토큰 사용량을 함께 측정했습니다 [6].
도입효과: 기존 어휘 검색 기준 — 답변 만족도 2배, 응답 속도 1.4배, 토큰 사용량 66% 감소, 툴 호출 49% 감소 [6]

주의할 점은?

오늘 바로 해보기
01. 사내 문서 100건을 골라 rank_bm25 같은 라이브러리로 색인하고, 실제 사용자 질의 20개를 넣어 상위 5건을 눈으로 검수합니다.
02. 같은 질의를 벡터 검색에도 넣습니다. 두 결과를 나란히 놓고 겹치는 문서와 한쪽에만 나온 문서를 표시합니다.
03. Elasticsearch나 OpenSearch를 쓴다면 explain 기능으로 점수 분해를 열어 어떤 단어가 점수를 끌어올렸는지 확인합니다.
04. b를 0, 0.75, 1로 바꿔가며 긴 문서가 상위권에서 밀려나는 정도를 비교합니다. 기본값은 0.75입니다 [3].
05. 두 목록을 RRF로 합친 하이브리드 결과를 만들어 단독 BM25 대비 상위 10건의 정답 포함률을 기록합니다 [6].

한계와 진화
BM25는 단어 가방 방식이라 질의어와 문서의 표기가 어긋나면 점수를 주지 못합니다 [1]. 사용자가 연차라고 쓰고 문서에 유급휴가만 적혀 있으면 동의어를 연결하지 못합니다. 오탈자나 띄어쓰기 차이, 영문과 한글 혼용도 같은 문제를 만듭니다. 단어의 의미나 문장의 의도를 이해하는 단계가 없고, 단어의 등장 위치나 근접성도 고려하지 않습니다 [1]. 한국어는 조사와 어미가 붙는 교착어라 형태소 분석기 설정에 따라 결과가 크게 흔들려요.
그래서 현장에서는 BM25를 버리는 대신 겹쳐 쓰는 쪽으로 갔습니다. Azure AI Search는 2020년 7월 15일 이후 만들어진 서비스의 기본 랭킹 알고리즘으로 BM25를 두고 있습니다 [7]. RAG에서는 BM25와 벡터 검색을 RRF 같은 방식으로 합치는 하이브리드 검색이 표준 구성으로 자리 잡았고, 실패율과 만족도 개선이 함께 보고됐습니다 [4][6]. 학습된 희소 검색도 갈래를 넓혔습니다. Naver Labs Europe의 SPLADE는 역색인 구조를 유지하면서 신경망으로 용어 가중치와 확장을 학습합니다 [8]. 1차 검색은 BM25나 학습된 희소 검색으로 후보를 넓게 뽑고, 교차 인코더 리랭킹으로 순서를 다시 매기는 2단계 구성이 벤치마크에서 가장 좋은 평균 성능을 냈습니다 [5].

참고 자료

  1. Okapi BM25 — 백과사전 항목·Wikipedia·2026년 8월 열람 — https://en.wikipedia.org/wiki/Okapi_BM25
  2. Practical BM25 - Part 1: How Shards Affect Relevance Scoring in Elasticsearch — 기술 블로그·Elastic·2018 — https://www.elastic.co/blog/practical-bm25-part-1-how-shards-affect-relevance-scoring-in-elasticsearch
  3. BM25Similarity (Lucene 6.0.0 API) — API 문서·Apache Lucene·2016 — https://lucene.apache.org/core/6_0_0/core/org/apache/lucene/search/similarities/BM25Similarity.html
  4. Introducing Contextual Retrieval — 엔지니어링 블로그·Anthropic·2024 — https://www.anthropic.com/engineering/contextual-retrieval
  5. BEIR: A Heterogenous Benchmark for Zero-shot Evaluation of Information Retrieval Models — 논문·NeurIPS Datasets and Benchmarks Track·2021 — https://arxiv.org/abs/2104.08663
  6. Backoffice AI Agent 구축기 — 기술 블로그·네이버 플레이스 개발 블로그·2025 — https://medium.com/naver-place-dev
  7. Configure BM25 relevance scoring - Azure AI Search — 제품 문서·Microsoft·2026년 8월 열람 — https://learn.microsoft.com/en-us/azure/search/index-ranking-similarity
  8. SPLADE: sparse neural search — 코드·문서 저장소·Naver Labs Europe·2021 — https://github.com/naver/splade

대표 출처

기술 블로그 (2018) · Elastic, Practical BM25 - Part 1