검색 증강 생성(RAG) 파이프라인에서 가장 널리 쓰이는 표준 밀집 검색(Dense Retrieval)은 수백 개 토큰으로 구성된 문서 전체를 단 하나의 고정 크기 벡터(예: 768차원 또는 1536차원)로 압축(Mean Pooling)하는 방식을 취합니다.
하지만 긴 문서 내에 여러 세부 사실이 혼재되어 있을 경우, 단일 벡터 압축 과정에서 미세한 문맥 정보가 심각하게 손실되는 정보 병목(Information Bottleneck)이 발생합니다. 반대로 모든 질의-문서 쌍을 통째로 트랜스포머에 통과시키는 크로스 인코더(Cross-Encoder)는 정확도는 높지만 연산 복잡도가 $O(N)$으로 폭증하여 대규모 실시간 검색에 적용할 수 없습니다. 본 글에서는 스탠포드 대학교에서 제안한 ColBERT(Contextualized Late Interaction over BERT)의 후기 상호작용(Late Interaction) 메커니즘과 토큰 단위 정밀 정렬을 수행하는 MaxSim 연산 아키텍처를 심층 분석합니다.
1. 바이인코더와 크로스인코더의 트레이드오프와 후기 상호작용
기존 정보 검색 아키텍처는 속도와 정확도 사이의 극단적인 양자택일 구조였습니다.
- 바이인코더(Bi-Encoder, 조기 독립): 질의와 문서를 완전히 독립적으로 인코딩하여 단일 벡터로 축약한 뒤 코사인 유사도를 계산합니다. ANN(FAISS, HNSW) 인덱싱이 가능해 밀리초 단위로 수백만 건을 검색하지만, 문서의 국소적 핵심 키워드가 평균화에 묻히는 정밀도 저하가 발생합니다.
- 크로스인코더(Cross-Encoder, 완전 상호작용): 질의와 문서를 하나로 이어 붙여 모든 토큰 간의 전체 어텐션(All-to-all Attention)을 계산합니다. 검색 정확도는 가장 우수하지만, 문서 사전 인덱싱이 불가능하여 매 쿼리마다 모든 후보 문서에 대해 무거운 트랜스포머 추론을 재수행해야 합니다.
- 후기 상호작용(Late Interaction)의 돌파구: 질의와 문서를 독립적으로 인코딩하여 토큰별 다중 벡터 시퀀스로 보관(사전 인덱싱 가능)하되, 검색 시점의 최종 유사도 산출 단계에서만 토큰 간 정밀 내적 연산을 가볍게 수행합니다.
2. MaxSim 연산자: 토큰 레벨 정밀 매핑 메커니즘
ColBERT의 핵심 점수 산출 함수는 MaxSim(Maximum Similarity)입니다. 질의(Query)의 각 토큰 임베딩에 대해, 문서(Document)의 모든 토큰 임베딩 중 내적 유사도가 가장 높은 최댓값을 찾고, 이 값들을 질의의 모든 토큰에 걸쳐 단순 합산합니다.
수식: Score(Q, D) = sum_{q in Q} max_{d in D} (E_q . E_d)
# ColBERT MaxSim 토큰 레벨 유사도 연산 개념 구현체
import numpy as np
def calculate_maxsim_score(query_embeddings: np.ndarray, doc_embeddings: np.ndarray) -> float:
"""
query_embeddings: (Q_len, D_dim) - L2 정규화된 질의 토큰 벡터들
doc_embeddings: (D_len, D_dim) - L2 정규화된 문서 토큰 벡터들
formula: sum_{q in Q} max_{d in D} (E_q . E_d)
"""
# 1. 모든 질의 토큰과 문서 토큰 간의 내적 코사인 유사도 행렬 계산 (Q_len x D_len)
similarity_matrix = np.matmul(query_embeddings, doc_embeddings.T)
# 2. 각 질의 토큰별로 문서 전체에서 가장 유사도가 높은 최댓값(Max) 추출 (Q_len,)
max_similarities_per_token = np.max(similarity_matrix, axis=1)
# 3. 질의 토큰들의 최댓값을 총합(Sum)하여 최종 관련도 점수 산출
final_relevance_score = float(np.sum(max_similarities_per_token))
return final_relevance_score
위 MaxSim 연산 구조를 통해 질의 내의 ‘심장’, ‘수술’, ‘병원’ 등의 각 단어는 문서 내에서 문맥상 가장 관련성이 높은 최적의 토큰 위치와 1:1로 부드럽게 정렬(Soft Alignment)됩니다. 문서의 길이가 아무리 길고 비관련 문장이 섞여 있더라도, 질의 토큰과 완벽하게 매칭되는 지점만 정밀 타격하여 점수를 부여하므로 단일 벡터 모델 대비 압도적인 검색 재현율(Recall)을 달성합니다.
1. 벡터 저장 공간 절감을 위한 ColBERTv2 잔차 압축: 모든 토큰 벡터(128차원)를 원시 부동소수점으로 저장하면 메모리가 폭증합니다. ColBERTv2의 센트로이드 양자화(Centroid Clustering + Residual Quantization)를 적용하여 토큰당 용량을 16비트 이하(6~10배 압축)로 축소해야 합니다.
2. 질의 마스크(Query Augmentation) 토큰 활용: ColBERT는 질의 뒤에 특수 [MASK] 토큰을 32개까지 패딩하여 질의 확장(Query Expansion) 및 관련 잠재 개념 탐색을 자동으로 유도합니다.
3. 2단계 파이프라인(ANN Candidate Pruning) 결합: 수천만 건 문서 전체에 MaxSim을 완전 탐색하지 않고, 센트로이드 반전 파일(PLAID 엔진)을 통해 후보 문서를 상위 수백 건으로 먼저 좁힌 뒤 정밀 MaxSim을 적용하여 수십 밀리초 이내 응답을 보장해야 합니다.
3. 결론 및 도입 성과
ColBERT의 후기 상호작용은 바이인코더의 고속 오프라인 인덱싱 장점과 크로스인코더의 세밀한 토큰 수준 문맥 파악력을 수학적으로 우아하게 결합한 아키텍처입니다. 복잡한 다중 도메인 매뉴얼이나 전문 기술 규정집을 다루는 RAG 시스템에서 ColBERT를 도입하면, 문맥 유실 없는 정밀한 정보 검색을 통해 LLM 생성 답변의 환각을 획기적으로 낮출 수 있습니다.
출처 및 1차 공식 기술 문서
- Omar Khattab & Matei Zaharia — ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT (SIGIR 2020)
- Keshav Santhanam et al. — ColBERTv2: Effective and Efficient Retrieval via Lightweight Late Interaction (NAACL 2022)
- Stanford Future Data Lab — ColBERT Official Implementation and Benchmark