jongkwan.dev
개발 · Essay №090

RAG 밀집 검색: DPR과 듀얼 인코더

질의와 문서를 각각 벡터로 인코딩해 의미 유사도로 찾는 밀집 검색과, 이를 오픈 도메인 QA에 적용한 DPR의 듀얼 인코더 구조를 정리합니다.

이종관2026년 5월 20일15 min read
Contents

질의와 문서를 각각 벡터로 바꿔 의미 유사도로 찾는 밀집 검색, 그리고 이를 구현한 DPR의 듀얼 인코더 구조를 다룹니다.

밀집 검색이 푸는 문제

검색 방식은 크게 희소 검색과 밀집 검색으로 나뉩니다. 희소 검색은 용어의 출현 여부와 빈도에 의존합니다. BM25가 대표적이며, 질의와 문서에 같은 용어가 등장해야 매칭이 이뤄집니다. 문서 벡터는 어휘 크기만큼의 차원을 갖지만 대부분의 값이 0이라 '희소'라 부릅니다.

밀집 검색(dense retrieval)은 질의와 문서를 신경망 인코더에 넣어 수백 차원 벡터로 바꿉니다. 그리고 벡터 사이의 유사도로 관련도를 판단합니다. 이 벡터는 대부분의 차원에 0이 아닌 값이 들어 있어 '밀집'이라 부릅니다.

구분희소 검색(BM25)밀집 검색
매칭 기준용어 출현·빈도(TF·IDF)벡터 의미 유사도
벡터 차원어휘 크기, 대부분 0수백 차원, 대부분 0 아님
강점정확한 키워드·고유명사동의어·표현 변이
약점용어 불일치드문 표기·정확 일치

두 방식은 서로 다른 종류의 실패를 보입니다. 밀집은 동의어와 표현 변이에 강하지만 드문 고유명사나 정확한 표기를 놓치기 쉽습니다. 희소는 정확 일치에 강하지만 동의어를 놓칩니다. 그래서 실무에서는 둘을 함께 쓰는 하이브리드 구성이 흔합니다.

DPR의 두 인코더

DPR(Dense Passage Retrieval)은 밀집 검색을 오픈 도메인 질의응답(open-domain QA)에 적용한 모델입니다. 구조는 듀얼 인코더(dual encoder)이며, 바이 인코더라고도 부릅니다. 듀얼 인코더는 질의와 문서를 각각 인코더에 넣어 두 벡터의 유사도를 비교합니다. DPR은 일반적인 듀얼 인코더와 달리 인코더를 둘로 분리합니다.

Sentence-BERT 같은 범용 듀얼 인코더는 질의와 문서에 같은 BERT를 공유하는 경우가 많습니다. 파라미터가 하나라 가볍고, 질의·문서 구분 없이 범용 임베딩을 만들 수 있습니다. DPR은 동일한 BERT-base로 초기화한 인코더를 두 개 두고, 학습 중 파라미터를 독립적으로 갱신합니다.

하나는 질문 인코더(question encoder)이고, 다른 하나는 패시지 인코더(passage encoder)입니다. 이런 구조를 비대칭 듀얼 인코더(asymmetric dual encoder)라 부릅니다. 질문은 짧고 의문 표현이 핵심 신호이며, 패시지는 길고 사실 서술이 주를 이룹니다. 인코더를 분리하면 각 입력 특성에 맞게 표현을 특화할 수 있습니다.

분리에는 비용도 따릅니다. 파라미터가 약 두 배 규모로 늘어납니다. BERT-base 기준 약 1.1억 파라미터가 두 벌이므로, 범용성이 줄어드는 트레이드오프가 있습니다.

대조 학습으로 정렬

두 인코더는 서로 다른 파라미터를 갖기 때문에, 같은 의미 공간에 놓이도록 맞추는 학습이 필요합니다. DPR은 대조 학습(contrastive learning)으로 이를 정렬합니다. 대조 학습은 관련 있는 쌍은 가깝게, 관련 없는 쌍은 멀게 벡터를 미는 방식입니다.

양성 쌍은 오픈 도메인 QA 데이터셋에서 만듭니다. Natural Questions나 TriviaQA에는 질문과 정답 문자열이 있습니다. 위키피디아에서 정답 문자열을 포함하는 패시지를 찾으면 질문-정답 패시지 쌍이 만들어집니다. 이 쌍이 대조 목표의 양성 쌍이 됩니다.

이전의 검색 표현 학습 기법인 ORQA는 ICT(Inverse Cloze Task)라는 대규모 비지도 사전학습에 기댔습니다. DPR은 그런 사전학습 없이 이 지도 학습 쌍만으로 BM25를 크게 넘었습니다.

손실 함수로는 InfoNCE(Noise-Contrastive Estimation 기반의 대조 손실)를 씁니다. 정답 패시지의 내적은 높이고 오답 패시지의 내적은 낮추는 형태입니다. 양성 하나와 음성 여럿을 소프트맥스로 경쟁시켜, 정답이 가장 높은 점수를 받도록 밀어줍니다.

오답, 즉 음성 샘플을 어디서 가져오느냐가 학습 품질을 좌우합니다. DPR은 두 종류의 음성을 함께 씁니다.

음성 종류출처난이도역할
배치 내 음성같은 배치 다른 질문의 정답 패시지쉬움(무작위에 가까움)안정적 기울기
BM25 하드 네거티브BM25 상위지만 정답 미포함어려움(용어 겹침)변별력 강화

배치 크기가 128이면 한 질문당 나머지 127개 질문의 정답 패시지가 배치 내 음성이 됩니다. 배치 내 음성만 쓰면 대부분 쉬운 음성이라 학습 신호가 약합니다. 하드 네거티브만 쓰면 어려운 사례에 치우쳐 학습이 불안정해집니다. DPR은 둘을 섞어, 안정적인 기울기와 변별력의 균형을 잡습니다.

하드 네거티브와 기울기

어려운 음성일수록 모델에 더 강한 학습 신호를 줍니다. 그 메커니즘은 손실 함수의 기울기에 있습니다. 대조 손실에서 음성에 흐르는 기울기는 그 음성 점수가 양성 점수에 가까울수록 커집니다.

음성이 쉬우면, 즉 q·d⁻q·d⁺보다 이미 훨씬 낮으면 손실이 작고 기울기도 약합니다. 모델이 이미 구별하는 쌍에서는 배울 것이 거의 없습니다. 반대로 음성이 어려우면, 즉 q·d⁻q·d⁺에 가까우면 강한 기울기가 발생합니다. 이 기울기가 모델을 경계에서 더 정밀하게 밀어주는 학습 신호입니다.

문제는 하드 네거티브의 난이도가 학습 도중 변한다는 점입니다. 모델이 좋아질수록 예전에 어렵던 음성이 쉬워집니다. 후속 기법인 ANCE는 이를 비동기 갱신으로 풉니다.

코퍼스 전체를 매 학습 단계마다 다시 인코딩하는 것은 비현실적입니다. ANCE는 일정 주기마다 코퍼스를 현재 모델로 다시 인코딩하고, ANN 인덱스(근사 최근접 탐색 인덱스)를 재구축합니다. 갱신 사이에는 이전 인덱스에서 채굴한 음성을 계속 씁니다. 인덱스가 모델보다 약간 뒤처지는 시차(staleness)가 생기지만, 학습 전에 고정한 BM25 음성보다는 현재 모델에 훨씬 가깝습니다.

인덱싱과 쿼리 타임

듀얼 인코더의 핵심 이점은 인코딩 시점을 둘로 나눌 수 있다는 데서 나옵니다. 패시지 벡터를 미리 만들어 두는 오프라인 인덱싱과, 질의가 들어올 때 벡터 하나만 만드는 온라인 검색입니다.

오프라인 인덱싱은 서비스가 질의를 받기 전에 한 번 수행합니다. 코퍼스의 패시지를 패시지 인코더에 넣어 벡터로 바꾸고, 검색 가능한 구조로 저장합니다. 패시지가 수백만 건이면 배치 단위로 묶어 인코딩해 속도를 올립니다.

온라인 검색은 세 단계입니다. 먼저 질문 인코더가 질의를 벡터 하나로 바꿉니다. 다음으로 그 벡터를 ANN 인덱스에 넣어, 내적이 가장 큰 패시지 벡터 상위 k개를 가져옵니다. 마지막으로 인덱스가 돌려준 번호로 실제 패시지 텍스트를 저장소에서 조회합니다.

규모가 작으면 전수 비교로 상위 k를 직접 고를 수 있습니다. 아래는 모든 패시지와 내적을 구해 상위 셋을 뽑는 최소 예시입니다.

python
import numpy as np
 
# passage_vectors: (N, d) 패시지 벡터, query_vector: (d,) 질의 벡터
scores = passage_vectors @ query_vector      # 내적 점수
top_k = np.argsort(scores)[-3:][::-1]         # 상위 3개 인덱스 번호

코퍼스가 수백만 건이면 이런 전수 비교가 느립니다. ANN은 전수 비교 없이 서브선형 비용으로 근사 상위 k를 돌려줍니다. 이 근사 덕분에 대규모 코퍼스에서도 실시간 검색이 가능해집니다.

미리 인덱싱이 가능한 이유는 인코더가 분리돼 있기 때문입니다. 질의와 패시지를 함께 인코더에 넣는 구조였다면, 질의 한 건마다 코퍼스 전체를 다시 인코딩해야 합니다. 듀얼 인코더는 패시지 벡터가 이미 있으므로, 질의 인코딩 한 번과 벡터 비교만으로 검색이 끝납니다.

top-k는 쿼리 타임에서 가장 자주 조정하는 값입니다. DPR 논문에서는 상위 20건 또는 100건을 기준으로 성능을 측정합니다. k를 키우면 정답 패시지가 포함될 재현율은 높아지지만, 이후 단계에서 처리할 후보가 늘어 비용도 커집니다.

정리

밀집 검색은 질의와 문서를 벡터로 바꿔 의미 유사도로 찾는 방식이고, DPR은 이를 오픈 도메인 QA에 적용한 듀얼 인코더 모델입니다. 질문 인코더와 패시지 인코더를 분리한 비대칭 구조가 입력 특성에 맞는 표현 특화를 가능하게 합니다. 두 인코더는 InfoNCE 대조 학습으로 정렬되며, 배치 내 음성과 BM25 하드 네거티브를 섞어 안정성과 변별력의 균형을 잡습니다.

하드 네거티브는 양성에 가까운 음성일수록 강한 기울기를 만들고, ANCE는 학습 중 이 난이도를 비동기로 갱신합니다. 운영에서는 오프라인 인덱싱으로 패시지 벡터를 미리 만들고, 온라인에서 ANN으로 상위 k를 빠르게 가져옵니다. 밀집과 희소가 놓치는 지점이 다르므로, 실무에서는 둘을 결합한 하이브리드로 보완하는 경우가 많습니다.