BM25란? AI에서 단어의 반복과 문서 길이를 반영해 검색 순위를 매기는 방법
TL;DR
BM25는 검색어의 문서 내 출현 빈도, 문서 모음에서의 희소성, 문서 길이를 함께 반영해 검색 결과의 순위를 매기는 방법입니다. 같은 단어가 반복될 때 점수가 끝없이 비례해 늘지 않도록 조절합니다. RAG의 후보 문서를 찾는 키워드 검색에 쓰이며, 점수가 높다고 내용이 사실이거나 질문의 정답이라는 보장은 없습니다.
핵심 3줄 요약
- 핵심 1
단어 일치를 점수로 바꿉니다. 검색어가 문서에 얼마나 나오며 전체 문서에서 얼마나 드문지를 봅니다. - 핵심 2
반복과 길이를 함께 조절합니다. 같은 단어의 추가 효과는 점차 줄이고, 평균에 비해 긴 문서의 빈도는 길이에 맞춰 보정합니다. - 핵심 3
점수보다 검색 결과를 검증합니다. 분석기·문서 분할·검색 필드가 바뀌면 결과도 달라집니다. 실제 질문과 관련 문서로 비교합니다.
이 글에서 다룰 내용
- BM25의 한 문장 정의와 키워드 검색 예시
- 단어 빈도·희소성·길이 보정의 작동 원리
- k1과 b가 조절하는 대상
- TF-IDF·벡터 검색·하이브리드 검색·리랭킹과의 차이
- RAG와 사내 문서 검색의 활용법
- 한국어 분석기·문서 분할·검색 점수 점검법
- AI 초보자가 자주 묻는 질문
BM25를 한 문장으로 정의하면 무엇인가요?
BM25는 질의에 포함된 단어의 희소성과 문서 내 빈도에 길이 보정을 적용해 문서의 검색 점수를 계산하는 순위화 방법입니다.
Okapi BM25라고도 부릅니다. Stanford의 정보 검색 교재는 단어의 존재 여부만 보는 모형에서 나아가 빈도와 문서 길이에 민감하도록 만든 확률적 검색 모형으로 설명합니다. 여기서 확률적이라는 이름이 검색 점수를 정답 확률로 읽어도 된다는 뜻은 아닙니다.
문서는 게시글 한 편일 수도 있고 검색용으로 나눈 문단 하나일 수도 있습니다. Elasticsearch처럼 필드별로 점수를 계산하는 구현에서는 제목과 본문을 서로 다른 길이와 통계를 가진 검색 대상으로 다룹니다. 무엇을 한 문서로 색인했는지가 계산의 출발점입니다.
한 줄 정리: BM25는 어떤 문서가 질문의 단어와 더 관련 있는지 비교하는 검색 점수이며, 답변을 생성하는 언어 모델은 아닙니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 내부 도움말에서 배송 지연을 검색한다고 가정해 보겠습니다. 아래 상황은 원리를 설명하려고 만든 예시이며 실제 검색 엔진을 측정한 결과는 아닙니다.
- 첫 문서는 배송 지연 처리 절차만 짧게 설명합니다.
- 둘째 문서는 주문·결제·배송·환불을 모두 담은 긴 매뉴얼이며 배송 지연은 일부에만 나옵니다.
- 셋째 문서는 같은 의미를 택배가 늦게 도착할 때라는 표현으로 설명합니다.
두 문서에서 검색 단어가 나온 횟수와 다른 조건이 같다면 길이 보정을 켠 BM25는 짧은 문서의 해당 단어를 더 집중된 신호로 봅니다. 긴 문서가 항상 밀리는 규칙은 아닙니다. 긴 매뉴얼에 검색어가 더 많이 나오거나 다른 질의 단어도 맞으면 결과가 달라집니다.
셋째 문서는 사람이 보기에는 관련 있어도 분석 후 검색어와 일치하는 단어가 없다면 기본적인 BM25 단어 매칭만으로는 놓칠 수 있습니다. 동의어 처리나 의미 검색을 더하는 이유입니다. 어떤 문서가 위에 나올지는 실제 토큰과 검색 조건을 확인한 뒤 판단합니다.
쉬운 예시: 관련 단어를 반복한 횟수만 세는 대신, 그 단어가 얼마나 드물고 문서 안에서 얼마나 집중되어 있는지 함께 보는 방식입니다.
왜 AI에서 BM25가 중요한가요?
RAG가 읽을 후보 문서를 고릅니다
검색 증강 생성에서는 언어 모델에 모든 원문을 전달하기보다 질문과 관련된 자료를 먼저 가져옵니다. BM25는 이 첫 검색의 한 방법입니다. 제품명·규정명·전문 용어처럼 표현이 명확한 자료를 찾는 기준으로 쓸 수 있습니다. 검색 이후 요약과 답변 생성은 별도 단계입니다.
벡터 검색과 비교할 기준을 만듭니다
의미 검색을 새로 도입할 때는 단어 기반 검색과 같은 질문 묶음으로 비교하는 편이 좋습니다. 의미가 비슷한 질문에서는 벡터 검색이 유리해도 특정 이름이나 코드가 필요한 질문에서는 결과가 다를 수 있습니다. BM25를 기준 검색기로 두면 어떤 유형의 질문에서 변화가 생겼는지 살펴보기 쉽습니다.
관련성 판단의 단서를 추적합니다
BM25는 단어 빈도·문서 빈도·길이 같은 통계를 사용합니다. 결과가 이상하면 어떤 단어가 매칭되었는지, 제목과 본문 중 어느 필드가 점수에 영향을 줬는지 확인할 단서가 있습니다. 다만 검색 엔진의 필드 가중치와 쿼리 구조까지 합쳐진 최종 점수를 BM25의 한 항만으로 설명해서는 안 됩니다.
BM25는 어떤 순서로 점수를 계산하나요?
문서와 검색어를 분석해 단어를 맞춥니다
검색 엔진은 문서를 색인할 때 단어와 그 단어가 나타난 문서의 관계를 저장합니다. 질의도 분석기를 거쳐 검색에 쓸 토큰으로 나눕니다. BM25는 이 토큰의 일치 정보를 바탕으로 점수를 계산합니다. 띄어쓰기·형태소·대소문자 처리 방식이 달라지면 같은 원문도 다른 단어 집합이 됩니다.
드문 단어와 반복 출현을 함께 반영합니다
역문서 빈도인 IDF는 여러 문서에 흔하게 나오는 단어보다 적은 문서에 나오는 단어의 기여를 높이는 요소입니다. 문서 안의 출현 횟수인 TF와는 구분합니다. 한 매뉴얼에 같은 단어가 여러 번 나와도 그 단어가 포함된 문서 수를 셀 때는 하나의 문서로 셉니다.
빈도 기여에는 포화가 있습니다. 처음 한 번 등장했을 때와 이미 여러 번 등장한 뒤 한 번 더 나왔을 때의 추가 효과가 같지 않습니다. 단어를 반복해서 넣는 것만으로 관련성이 비례해 높아진다고 보지 않는 설계입니다. 흔한 TF-IDF 표현과 비교할 때 이 비선형 빈도 처리와 길이 보정이 중요한 차이입니다.
평균 길이와 비교해 단어 기여를 보정합니다
문서 또는 해당 필드의 길이를 평균 길이와 비교합니다. 다른 조건이 같다면 긴 문서는 단어가 등장할 기회가 많았다는 점을 감안해 빈도를 보정합니다. Elasticsearch 문서에서 말하는 길이는 화면의 글자 수가 아니라 분석된 단어 수에 바탕을 둡니다. 한국어 가시문자 수를 그대로 대입하면 다른 계산이 됩니다.
질의에 여러 단어가 있으면 기본 설명에서는 각 단어의 기여를 합칩니다. 실제 검색 요청에는 구절 조건, 필드별 가중치, 필터나 다른 점수 함수가 더해질 수 있습니다. BM25가 같다는 이유만으로 서로 다른 제품의 최종 점수까지 같다고 예상하지 않습니다.
k1과 b는 무엇을 조절하나요?
k1은 단어 빈도의 포화 정도, b는 문서 길이 보정의 강도를 조절합니다.
Elastic의 기본 BM25 설정은
k1=1.2
,
b=0.75
입니다. Apache Lucene 9.12.0의 BM25Similarity 문서도 같은 기본값을 안내합니다. 이는 확인한 구현의 기본값이며 모든 BM25 도구가 반드시 따르는 고정 상수는 아닙니다.
k1을 크게 하면 반복 출현의 차이가 점수에 더 오래 반영됩니다.
k1=0
에서는 매칭된 단어의 빈도 차이를 반영하지 않는 형태가 됩니다. 값을 크게 설정하면 정확도가 좋아진다는 보장은 없으므로 반복이 많은 문서가 상위로 올라오는 이유부터 확인합니다.
b=0
은 길이 보정을 끄는 설정이고,
b=1
은 BM25 식에서 길이 보정을 완전히 적용하는 설정입니다. 그 사이에서는 보정 강도를 조절합니다. 짧은 제목과 긴 본문에 같은 값을 쓰는 것이 적합한지는 각각의 검색 결과로 판단합니다.
실전 팁: 설정값을 바꿀 때는 분석기와 평가 질문을 고정합니다. 문서 분할까지 동시에 바꾸면 무엇 때문에 순위가 달라졌는지 구분하기 어렵습니다.
BM25와 헷갈리는 용어는 무엇이 다른가요?
TF-IDF와 BM25의 차이
TF-IDF는 단어 빈도와 역문서 빈도를 결합한 가중치 표현입니다. 문서 벡터를 만들어 분류나 유사도 비교에 활용합니다. BM25는 질의와 문서의 검색 순위를 계산하는 데 초점을 두며 빈도 포화와 문서 길이 보정을 포함합니다. 둘 다 단어 통계를 쓰지만 TF-IDF 벡터의 코사인 유사도와 같은 계산은 아닙니다.
벡터 검색과 BM25의 차이
밀집 임베딩을 쓰는 벡터 검색은 숫자 벡터의 거리나 유사도로 의미가 가까운 후보를 찾습니다. BM25는 분석된 단어의 일치와 통계에 의존합니다. 기본 BM25가 동의어나 문맥의 의미를 스스로 학습한다고 설명하면 부정확합니다. 분석기에 동의어 규칙을 넣은 경우에는 그 전처리의 효과를 구분합니다.
하이브리드 검색과 BM25의 차이
하이브리드 검색은 키워드 검색과 벡터 검색 등의 결과를 결합하는 구성입니다. 그 안에서 키워드 순위를 만드는 방법으로 BM25를 쓸 수 있습니다. BM25 하나를 실행했다고 하이브리드 검색이 되는 것은 아닙니다. 결합 단계의 순위 또는 점수 처리도 별도로 정해야 합니다.
리랭킹과 BM25의 차이
리랭킹은 이미 찾은 후보의 순서를 다시 평가하는 단계입니다. BM25로 후보를 찾은 뒤 질문과 문서를 더 자세히 비교하는 모델로 재정렬할 수 있습니다. 처음 후보 목록에서 빠진 문서는 그 목록만 받는 리랭커가 복구하지 못하므로 초기 검색의 누락도 점검합니다.
같이 읽기: 단어 가중치의 기본 개념은 TF-IDF 용어 설명, 검색 결과를 합치는 구조는 하이브리드 검색 용어 설명에서 이어서 확인할 수 있습니다.
실전에서는 어디에 쓰이나요?
사내 문서와 도움말 검색
규정 이름, 업무 용어, 제품 이름이 문서에 직접 들어 있는 검색에서 활용합니다. 제목과 본문을 나눠 검색한다면 어느 필드를 얼마나 중요하게 볼지 정합니다. 이름이 일치한다는 이유만으로 최신 규정이나 사용자에게 허용된 문서라는 조건까지 충족되는 것은 아닙니다.
RAG의 초기 자료 검색
질문에 포함된 전문 용어로 관련 문단을 좁혀 언어 모델에 전달합니다. 긴 원문을 나눈 청크마다 점수를 매기면 원문 전체를 색인한 경우와 문서 빈도·평균 길이가 달라집니다. 청킹은 저장 편의만의 문제가 아니며 검색 통계에도 영향을 줍니다.
검색 품질 실험의 기준선
새 검색 방식을 비교할 때 BM25 결과와 사람이 판정한 관련 문서를 함께 남깁니다. 용어가 정확한 질문과 표현이 다른 질문을 나눠 보면 차이가 드러납니다. 검색 점수의 평균이 높아졌다는 이유만으로 새 방식이 더 좋은 것은 아닙니다. 상위 결과에 필요한 근거가 실제로 들어왔는지가 중요합니다.
BM25를 쓸 때 어떤 순서로 확인하나요?
1. 검색 단위와 필드를 고정합니다
원문 한 편을 검색할지 문단을 검색할지 먼저 정합니다. 제목·본문·코드 필드가 분석되는 방식과 길이 계산 범위를 기록합니다. 문서가 추가되거나 분할 방식이 바뀌면 기존 점수와 단순 비교하지 말고 같은 질문으로 결과를 다시 확인합니다.
2. 실제 분석 토큰을 확인합니다
원문에 글자가 있다는 사실과 검색 토큰이 일치한다는 사실은 다릅니다. 한국어 조사와 복합어가 어떻게 나뉘는지, 제품 번호의 하이픈이 유지되는지 봅니다. 정확한 코드 검색이 필요하다면 적합한 필드와 질의 조건을 별도로 설계합니다.
3. 기본값으로 관련 문서를 확인합니다
처음부터 k1과 b를 여러 값으로 바꾸기보다 기본 설정에서 상위 문서와 누락 문서를 살핍니다. 질의마다 관련 문서의 기준을 정하고 같은 후보 개수로 비교합니다. 튜닝에 쓴 질문과 최종 평가 질문은 나눠 두어 특정 질문에만 맞춘 설정을 피합니다.
4. 오류 원인에 맞춰 한 요소씩 조정합니다
토큰이 맞지 않으면 분석기나 동의어 처리를, 긴 문서가 불리한 문제가 확인되면 길이 보정을 검토합니다. 의미가 같은 다른 표현을 놓친다면 벡터 검색과의 결합을 비교합니다. 모든 오류를 BM25 설정값 하나로 해결하려고 하지 않습니다.
사용할 때 무엇을 주의해야 하나요?
검색 점수는 정답 확률이 아닙니다. 높은 점수는 현재 질의와 색인 통계에서 관련성이 높다는 신호입니다. 질문이 다르거나 색인이 달라진 점수를 그대로 비교해 공통 합격선을 정하지 않습니다. 문서의 사실성·작성 시점·사용 권한은 별도로 확인합니다.
BM25라는 이름만으로 계산식을 같다고 보지 않습니다. IDF 식과 길이 저장 방식 등은 구현에 따라 다릅니다. Lucene 문서는 양수 형태의 로그 IDF를 사용하지만 정보 검색 교재에는 다른 IDF 변형도 나옵니다. 교재의 설명식을 실제 엔진 점수와 대조할 때는 해당 버전의 구현을 확인합니다.
길이 보정은 문서 내용의 품질 평가가 아닙니다. 짧은 문서를 무조건 선호하거나 긴 문서를 불량 문서로 판단하는 규칙이 아닙니다. 같은 단어가 나온 횟수를 문서 길이와 함께 해석하는 장치입니다. 문서마다 작성 형식이 크게 다르면 검색 단위부터 검토합니다.
검색어의 순서나 부정을 점수만으로 판단하지 않습니다. 단어가 비슷해도 환불 가능과 환불 불가처럼 뜻이 달라질 수 있습니다. 기본 단어 기여의 합만으로 정확한 문장 의미를 보장하지 않습니다. 필요한 경우 구절 검색이나 후속 검토를 더하고 실제 문장을 읽습니다.
주의: 관련 단어가 많은 잘못된 문서도 높은 순위에 오를 수 있습니다. 검색과 근거 검증을 분리하고, AI가 인용한 원문까지 확인합니다.
자주 묻는 질문
Q1. BM25는 학습이 필요한 AI 모델인가요?
기본 BM25는 신경망의 가중치를 학습하는 방식이 아닙니다. 색인의 단어 통계와 정해진 점수식을 사용합니다. 다만 분석기·검색 필드·k1·b 같은 설정은 실제 관련성 평가 자료로 조정할 수 있습니다.
Q2. TF-IDF를 쓰고 있으면 BM25와 같은가요?
아닙니다. 두 방법은 단어 빈도와 희소성을 사용하지만 계산과 목적이 다릅니다. BM25는 반복 출현의 포화와 평균 길이에 대한 보정을 검색 점수에 반영합니다. TF-IDF 벡터를 만든 뒤 코사인 유사도로 비교한 점수와 혼용하지 않습니다.
Q3. b를 0으로 두면 긴 문서가 항상 이기나요?
아닙니다. 길이 보정의 영향이 사라질 뿐입니다. 검색어가 실제로 등장했는지, 얼마나 반복됐는지와 각 단어의 희소성이 여전히 중요합니다. 문서의 다른 조건을 확인하지 않고 승패를 예측할 수는 없습니다.
Q4. 한국어에도 사용할 수 있나요?
사용할 수 있습니다. 다만 한국어를 어떤 토큰으로 나누는지가 검색 품질에 영향을 줍니다. 형태소·복합어·띄어쓰기 처리를 확인하고 색인과 질의의 분석 결과가 의도대로 맞는지 먼저 시험합니다.
Q5. BM25를 쓰면 벡터 검색이나 리랭킹이 필요 없나요?
업무에 따라 다릅니다. 정확한 용어가 있는 질문과 표현을 바꾼 질문에서 강점이 다릅니다. BM25만으로 필요한 문서가 충분히 검색되는지 평가하고, 누락이나 순위 문제가 확인될 때 다른 방식과 결합해 비교합니다.
출처
마무리
BM25는 질의 단어의 희소성·반복·문서 길이를 함께 고려하는 검색 순위화 방법입니다. 문서가 길거나 단어가 많다는 이유만으로 높은 점수를 주지 않고, 반복의 추가 효과와 길이를 조절합니다.
처음에는 점수식을 외우기보다 검색 단위와 실제 토큰을 확인하세요. 기본값으로 관련 문서를 찾는지 살핀 뒤 k1과 b를 조정하고, 의미가 같은 표현을 놓치는 문제는 다른 검색 방식과 비교합니다. 높은 검색 점수와 믿을 만한 답변은 별개의 검증 대상입니다.
