Hybrid Dense-Sparse Retrieval for High-Recall Information Retrieval

JY·2026년 3월 21일

논문정리

목록 보기
8/9
post-thumbnail

지난 편에서 쿠키는 마인드팰리스를 만드는 방법을 배웠다.
벼락치기 대신 의미가 비슷한것끼리 모아두고, 질문이 오면 일단 던져보고 잘 붙는거에서 꺼내갖고 대답하는 방법.

근데 문제가 생겼다.

쿠키가 방이 어디 있는지 잘 기억 못한다

마인드팰리스는 지었는데 방이 수천 개다.
"임진왜란" 방을 찾아야 하는데 같은 전쟁이니까 "6.25전쟁" 방을 연다.
"월세 지원" 방을 찾아야 하는데 "청년주택" 방을 연다.

쿠키가 마인드팰리스를 지은 건 좋은데 방 찾는 방법이 일단 던져보고 갖다붙는걸로 정하니까 이런 일이 생긴다.

쿠키는 생각했다.

'아니 이게 진짜 되는게 맞나? 셜록홈즈는 닥터스트레인지마냥 잘 하던데'

답이 아주 없진 않았다.


1. 쿠키가 방을 찾는 법이 두 가지 있다

쿠키가 뭔가를 찾을 때를 생각해보면 크게 두 가지가 있다.

방법 1: 목차에서 찾기 (BM25)

쿠키가 "임진왜란"이라는 단어가 적힌 페이지를 찾는다.
목차 보고, 그 글자가 있는 곳을 딱 짚는다.

정확한 단어가 있으면 바로 찾는다.(키워드매칭)
근데 쿠키한테 "조선 후기 일본과의 전쟁"이라고 물어보면 못 찾는다. "임진왜란"이라는 단어가 없으니까.

방법 2: 느낌으로 찾기 (Dense)

쿠키한테 "조선 후기 일본과의 전쟁"이라고 물어봐도 의미가 비슷한 방을 찾아준다.
단어가 정확히 안 맞아도 "아 이거 비슷한 느낌인데" 하고 관련 있는 방을 연다.

근데 쿠키가 가끔 느낌만 비슷하고 전혀 다른 방을 연다. "전쟁" 느낌이 비슷하다고 "6.25" 방을 열어버린다.

지금까지 쿠키는 방법 2만 썼다. 1편에서 RAG 논문이 쓴 DPR이 그거다. 느낌으로만 찾았으니까 엉뚱한 방을 열었던 거다.


2. 쿠키가 하나로만 찾으면 안되는 이유는 이런건데

쿠키한테 이런 질문이 온다:

"주거안정지원금 알려줘" → 쿠키가 느낌(Dense)으로 찾으니까 "주거" "안정" "지원" 비슷한 느낌으로 "전세 대출" 방을 연다. 비슷하긴 한데 다른 정책이다.

반대로 쿠키가 목차(BM25)만 쓰면:

"월세 도와주는 거 있어?" → "주거안정지원금"이라는 단어가 없으니까 못 찾는다. 문제는 같은 걸 물어본 건데 쿠키는 멍하니 있다.

결국 둘 다 반쪽짜리다.

목차로 찾기(BM25)는 정확한 단어(키워드)가 있을 때 잘 되고,
느낌으로 찾기(Dense)는 단어가 달라도 의미가 비슷하면 잘 된다.

그렇다면.. 쿠키가 두가지 방법을 다 섞어서 쓴다면?


3. 쿠키가 둘 다 쓰면 진짜 좋아지냐 — 이 논문이 한 일

사실 BM25랑 Dense를 섞어서 쓰는 시도는 오래전부터 있었다. 2021년에 lexical 검색을 semantic이 보완하는 방식이 나왔고(CLEAR), 2023년 ACL에서는 sparse-dense 상보성을 더 잘 잡는 방법을 연구했다.

물론 나도 앞에서 그렇게 했다. 왜? 다들 그게 좋다고 하니까.

근데 그게 진짜인지, 얼마나 좋아지는지, 어떤 조건에서 좋아지는지를 비교적 깔끔하게 정리한 게 이 프리프린트(2026)다.
(피어리뷰 전이기도 하고 너무 최신이라 확실하진 않다)

쿠키의 성적표로 보면:

쿠키가 방 찾는 법MS MARCO Recall@10
느낌으로만 찾기 (Dense)기준값
목차로만 찾기 (BM25)Dense보다 낮음
둘 다 씀Dense 대비 최대 5.8배

MS MARCO에서 5.8배... "좀 나아졌다"가 아니라 차원이 다르다.

근데 이게 항상 이런 건 아니다. SciFact에서는 +1.2% 수준이었고, NFCorpus에서는 거의 개선이 없었다. "쿠키가 둘 다 쓰면 항상 이긴다"가 아니라 "조건이 맞으면 엄청 좋아진다"가 맞다.

그 조건이 뭐냐면:

쿠키한테 효과 큰 경우:

  • 질문하는 사람마다 말하는 방식이 다를 때 (같은 걸 물어보는데 누구는 "주거안정지원금"이라 하고 누구는 "월세 도와주는 거"라고 함)
  • 키워드로 물어보는 사람이랑 문장으로 물어보는 사람이 섞여있을 때

쿠키한테 추가 개선 폭이 작은 경우:

  • 의학이나 법률처럼 전문용어가 통일된 도메인 (쿠키가 둘 다 써도 추가로 얻는 게 적다는 뜻이다. 의미 없다는 건 아님)

쿠키가 마인드팰리스에서 방 찾을 때 목차(BM25)랑 느낌(Dense) 두 가지를 같이 쓰면 정답 방이 후보 목록 안에 들어올 확률이 확 올라간다. 특히 질문하는 사람마다 말하는 방식이 다를수록.

다만 후보 안에 들어왔다고 1등이 되는 건 아니다. 정답이 7번째에 있을 수도 있다. 그래서 순서를 다시 정렬해주는 게 필요한데 그건 다음 편에서.


4. 쿠키가 어떻게 합치냐면

쿠키가 두 방법의 결과를 합치는 건 생각보다 별거 아니다.

목차(BM25)가 추천한 방 순위 목록이 있고,
느낌(Dense)이 추천한 방 순위 목록이 있다.

쿠키가 이 두 목록의 점수를 각각 정규화한 다음 합쳐서 새로운 순위를 만든다.

최종 점수 = (Dense 정규화 점수 x a) + (BM25 정규화 점수 x (1-a))

a가 크면 느낌(Dense)을 더 믿고, a가 작으면 목차(BM25)를 더 믿는다. 논문 기준으로 a=0.5면 recall 최적, a=0.7이면 균형형, a=0.9면 거의 느낌(Dense) 위주다.

중요한 건 쿠키가 가중치를 잘 맞추면 한쪽만 쓰는 것보다 확실히 낫다는 거다. 근데 "잘 맞추면"이다. 데이터셋에 따라 다르니까 실험은 해봐야 한다.


5. 그래서 나는 프로젝트에서 쿠키한테 이걸 시켰다

복지나침반에서 이 논문이랑 같은 생각으로 쿠키(검색 파이프라인)를 만들었다.

문제: "월세 지원" 같은 키워드로 물어보는 사람도 있고, "혼자 사는데 집값이 부담돼요" 같은 문장으로 물어보는 사람도 있다. 쿠키가 한쪽만 쓰면 반드시 놓치는 사람이 생긴다.

적용: 쿠키한테 BM25(키워드 매칭)랑 Dense(의미 검색) 두 가지를 같이 시켰다.

결과:

  • 150건 Golden Set으로 A/B 테스트
  • 앙상블만으로 Hit@5 50.9% → 여기에 BGE Reranker 붙여서 84.3%
  • 특히 어려운 질문(Hard 케이스)에서 효과가 컸다

논문이 말한 "질문하는 사람의 말하는 방식이 다를수록 효과가 크다"가 정확히 맞았다. 복지 상담은 키워드로 물어보는 사람이랑 자기 상황을 설명하는 사람이 섞여있으니까.


이 비유의 한계

쿠키가 둘 다 쓴다고 완벽해지는 건 아니다. 최적의 가중치는 데이터마다 다르다. 이 논문도 "가중치 튜닝은 해야 한다"고 한다. 대충 합쳐도 나아지는 경우가 많지만 잘 합치려면 실험은 필요하다.

그리고 쿠키가 합쳐서 찾았다고 끝이 아니다. 정답 방이 후보 10개 안에 들어오긴 하는데, 1등이 아니라 7등에 있을 수 있다. 쿠키가 1등꺼 보고 답을 써버리면 틀린다. 그래서 찾은 다음에 "야 이거 진짜 맞아?" 하고 다시 확인하는 단계가 필요하다.


쿠키 이제 셜록홈즈 되는거야??


다음 논문

Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks (Reimers & Gurevych, 2019)
→ 쿠키는 방을 전부 일일이 비교하면 너무 느리다는 걸 깨닫는다
→ 그래서 먼저 SBERT처럼 빠르게 후보를 뽑고, 그다음 Cross-Encoder로 '진짜 이 방이 맞나?'를 다시 확인한다.

profile
평생 애처럼 살고싶습니다

0개의 댓글