Field Log · Entry
ColBERT Late Interaction: Multi-Vector 검색과 Reranking (5/14)
이번 글의 결론
- ColBERT는 document를 vector 하나로 압축하지 않고 token별 contextual vector를 보존합니다.
- Query가 들어오면 각 query token이 가장 잘 맞는 document token을 찾는
MaxSim을 합산합니다. 이것이 late interaction입니다.- Document token vector를 offline에 계산할 수 있어 Cross-Encoder보다 재사용성이 높지만, single-vector index보다 저장량과 검색 구조가 복잡합니다.
- ColBERT는 corpus 전체를 찾으면 retriever이고, 다른 retriever의 후보에만 MaxSim을 계산하면 reranker입니다. 이름이 아니라 실행 범위가 역할을 정합니다.
- ColBERTv2는 residual compression과 denoised supervision을, PLAID는 centroid 기반 candidate pruning을 통해 late-interaction 검색의 공간·latency를 줄였습니다.
앞 글의 T5 계열과 3편의 Cross-Encoder는 query-document pair마다 full interaction을 다시 계산했습니다. 반대편의 dense Bi-Encoder는 빠르지만 document 전체를 vector 하나로 압축합니다.
ColBERT는 이 둘 사이에 있습니다.
Single-vector Late interaction Full interaction
q → one vector ─┐ q → token vectors ─┐ [q ; d] → Transformer
├─ dot ├─ MaxSim ↓
d → one vector ─┘ d → token vectors ─┘ relevance score
가장 재사용 가능 가장 세밀한 interaction
기존 ColBERT 전용 해설이 시각적 직관을 제공한다면, 이번 글은 reranker taxonomy와 production placement에 초점을 둡니다.
1. Single Vector가 만드는 Bottleneck
Bi-Encoder는 query와 document를 독립적으로 encode합니다.
q_vec = E_Q(q)
d_vec = E_D(d)
score(q, d) = q_vec · d_vec
Document 하나가 vector 하나이므로 ANN index가 단순하고 빠릅니다. 하지만 다음 정보를 제한된 차원에 모두 압축해야 합니다.
- 여러 entity와 attribute
- exact identifier와 숫자
- 부정·조건·예외
- 문서의 여러 topic
- query가 나중에 강조할 token
Query를 보기 전에 무엇이 중요할지 결정해야 하는 representation bottleneck입니다.
2. ColBERT는 Token Vector를 보존한다
Query token 수를 m, document token 수를 n, projection 차원을 h라 합시다.
Q = [q₁, q₂, ..., qₘ] ∈ R^(m×h)
D = [d₁, d₂, ..., dₙ] ∈ R^(n×h)
두 text는 Transformer로 독립 encoding되므로 document D는 offline에 저장할 수 있습니다. 다만 one vector가 아니라 token 수만큼의 vector입니다.
각 query token q_i가 document token 중 가장 유사한 하나를 찾습니다.
MaxSim(q_i, D) = max_j q_i · d_j
그리고 query token별 최대값을 합칩니다.
score(Q, D) = Σ_i max_j q_i · d_j
3. 작은 MaxSim 계산
설명을 위해 query token이 세 개라고 합시다.
query tokens: [S2, shutdown, temperature]
document tokens: [S1, S2, pressure, shutdown, 88°C]
Dot-product similarity matrix가 다음과 같다고 하겠습니다.
| query \ doc | S1 | S2 | pressure | shutdown | 88°C |
|---|---|---|---|---|---|
| S2 | 0.61 | 0.94 | 0.08 | 0.20 | 0.11 |
| shutdown | 0.10 | 0.18 | 0.31 | 0.91 | 0.22 |
| temperature | 0.06 | 0.14 | 0.52 | 0.25 | 0.78 |
Query token마다 row max를 선택합니다.
S2 → S2 = 0.94
shutdown → shutdown = 0.91
temperature → 88°C = 0.78
score = 0.94 + 0.91 + 0.78 = 2.63
각 query facet이 document의 서로 다른 위치와 맞을 수 있습니다. Document 전체를 한 vector로 평균내지 않는 장점입니다.
NumPy로 확인하기
import numpy as np
def colbert_maxsim(
query_vectors: np.ndarray, # [m, h]
document_vectors: np.ndarray, # [n, h]
) -> tuple[float, np.ndarray]:
similarities = query_vectors @ document_vectors.T # [m, n]
best_document_token = similarities.argmax(axis=1)
best_scores = similarities.max(axis=1)
return float(best_scores.sum()), best_document_token
실제 구현은 padding·masked token, normalization, lower precision, compressed representation을 처리합니다.
4. 왜 “Late” Interaction인가
Cross-Encoder에서는 query와 document가 Transformer 첫 layer부터 서로 영향을 줍니다.
early/full interaction
[q ; d] → layer 1 ↔ layer 2 ↔ ... ↔ score
ColBERT에서는 query와 document를 각각 contextualize한 뒤 마지막 scoring 단계에서 interaction합니다.
offline: d → contextual token vectors D
online: q → contextual token vectors Q
late: Q × Dᵀ → row-wise max → sum
따라서 document representation은 재사용할 수 있지만 query에 따라 document token 자체가 다시 contextualize되지는 않습니다.
5. MaxSim이 Full Attention과 같지는 않다
Late interaction은 token-level matching을 보존하지만 Cross-Encoder의 완전한 대체가 아닙니다.
ColBERT가 잘 표현하는 것
- 여러 query term이 document의 다른 위치에 대응
- contextualized synonym·paraphrase matching
- exact entity·identifier에 가까운 localized match
- query facet별 evidence 존재 여부
제한되는 것
- Query와 document가 서로 영향을 주며 여러 layer에서 만드는 복잡한 관계
- Document token 조합의 joint reasoning
- “A가 B보다 오래됐지만 C 조건에서는 유효” 같은 긴 composition
- Candidate 목록 전체의 비교 context
MaxSim은 각 query token의 최고 match를 독립적으로 고릅니다. 두 query token이 같은 document token을 골라도 기본 식은 막지 않습니다.
6. 저장량 Trade-off
Single-vector model이 document마다 vector 하나를 저장한다면 ColBERT는 유효 token마다 vector를 저장합니다.
설명을 위한 단순 계산:
documents = 10,000,000
avg token vectors = 120 per document
dimension = 128
bytes per value = 2 (FP16)
raw storage
≈ 10,000,000 × 120 × 128 × 2 bytes
≈ 307 GB
Metadata, index, padding, alignment은 별도입니다. 실제 시스템은 compression과 pruning을 적용합니다. 숫자는 architecture trade-off를 보여 주기 위한 예시이지 특정 구현의 요구량이 아닙니다.
7. ColBERTv2: Residual Compression과 Denoised Supervision
ColBERTv2는 late-interaction representation의 큰 공간 비용을 줄이기 위해 centroid와 residual을 사용합니다.
token vector
≈ nearest centroid
+ quantized residual
논문은 원래 late-interaction 공간 footprint를 6~10배 줄이면서 여러 in-domain·out-of-domain benchmark에서 품질을 개선했다고 보고했습니다.
품질 측면에서는 cross-encoder teacher와 hard negative를 활용한 denoised supervision을 사용했습니다. 즉 compression만 추가한 버전이 아니라 training signal도 바뀌었습니다.
따라서 다음 비교는 잘못된 attribution입니다.
ColBERT v1 vs ColBERTv2
→ 차이를 전부 compression 덕분이라고 결론
Architecture, supervision, negative mining, index가 함께 바뀌었습니다.
8. PLAID: 모든 Token Pair를 그대로 계산하지 않는다
Corpus 전체에서 query와 모든 document token의 MaxSim을 정확히 계산하면 여전히 비쌉니다. PLAID는 centroid interaction을 이용해 candidate를 빠르게 줄이고, 더 유망한 문서에만 정밀 scoring을 적용합니다.
개념적 pipeline은 다음과 같습니다.
query token vectors
→ centroid interaction
→ candidate generation
→ centroid-based pruning
→ decompressed residual scoring
→ exact/near-exact MaxSim ranking
즉 late-interaction model 안에서도 multi-stage retrieval이 일어납니다.
Index parameter를 바꾸면 다음이 함께 바뀝니다.
- candidate recall
- number of token postings visited
- decompression work
- latency
- final ranking quality
Model checkpoint만 versioning하고 PLAID index parameter를 빼면 결과를 재현할 수 없습니다.
9. Retriever인가, Reranker인가
Corpus 전체를 Search
query
→ ColBERT/PLAID index over entire corpus
→ top-100
이때 ColBERT는 first-stage 또는 standalone retriever입니다.
기존 Candidate에 Exact MaxSim
BM25 / dense hybrid top-1000
→ fetch candidate token vectors
→ ColBERT MaxSim
→ top-100
이때는 reranker입니다.
중간 Stage
hybrid top-1000
→ ColBERT top-100
→ Cross-Encoder top-10
ColBERT는 candidate reduction stage이고 Cross-Encoder 앞의 cascade reranker입니다.
Architecture와 pipeline role을 분리해야 “ColBERT와 reranker를 같이 쓸 수 있나?” 같은 질문이 풀립니다.
10. Candidate-only ColBERT의 장단점
장점
- 전체 PLAID index 없이 기존 retriever 후보에 적용할 수 있습니다.
- Document token vector를 offline 계산해 여러 query에서 재사용합니다.
- Cross-Encoder에 보내는 pair 수를 줄일 수 있습니다.
- Token-level match를 trace할 수 있습니다.
단점
- Candidate document의 multi-vector storage가 필요합니다.
- 후보 fetch에서 많은 작은 vector read가 생길 수 있습니다.
- Dense·BM25 candidate가 놓친 gold는 복구하지 못합니다.
- Full-corpus ColBERT의 candidate generation 장점을 사용하지 못합니다.
11. MaxSim Trace를 남긴다
최종 score만 저장하면 error를 설명하기 어렵습니다.
{
"query_id": "q-17",
"document_id": "manual-s2-v4",
"score": 18.42,
"matches": [
{
"query_token": "S2",
"document_token": "S2",
"document_offset": 37,
"similarity": 0.94
},
{
"query_token": "temperature",
"document_token": "88°C",
"document_offset": 91,
"similarity": 0.78
}
],
"model_version": "colbert-domain-v3",
"index_version": "token-index-v18"
}
Token match는 완전한 인과 설명은 아니지만 다음 진단에 유용합니다.
- stopword나 punctuation이 score를 지배하는가?
- identifier가 올바른 token에 match하는가?
- query language와 document language가 cross-lingual match하는가?
- truncated document의 answer span이 index에 남았는가?
12. 긴 문서에서는 Vector 수가 직접 늘어난다
Cross-Encoder의 긴 문서는 truncation과 attention cost가 문제였습니다. ColBERT는 document token을 더 많이 보존할 수 있지만 storage와 MaxSim search가 늘어납니다.
document tokens ↑
→ stored vectors ↑
→ index footprint ↑
→ candidate token matches ↑
Chunking, token pruning, punctuation masking, max document length를 실험해야 합니다.
Document-level retrieval이 필요하면 chunk를 독립 document로만 취급하지 말고 parent ID를 보존합니다.
chunk MaxSim scores
→ document aggregation
→ best evidence offsets
Max chunk score, top-m mean, learned aggregation은 질문 유형에 따라 다릅니다.
13. Multilingual Late Interaction
Original ColBERT 연구의 training·evaluation이 영어 중심이었다면, 이후 multilingual late-interaction model이 등장했습니다. 예를 들어 Jina-ColBERT-v2는 multilingual data와 training 개선을 결합한 general-purpose model을 제안했습니다.
하지만 “multilingual” label이 한국어 production 품질을 보장하지 않습니다.
- 한국어 query → 한국어 document
- 영어 product ID가 섞인 한국어 query
- 한국어 query → 영어 manual
- 띄어쓰기·조사·compound noun
- 표에서 추출된 짧은 cell text
이 slice를 따로 평가합니다. Model 선택은 10편에서 더 자세히 다룹니다.
14. Bi-Encoder·ColBERT·Cross-Encoder 비교
| 항목 | Single-vector | ColBERT | Cross-Encoder |
|---|---|---|---|
| Document representation | 1 vector | token vectors | query마다 재계산 |
| Offline precompute | 가능 | 가능 | 불가 |
| Interaction | dot product | MaxSim | full joint attention |
| Corpus-wide ANN | 가장 단순 | 전용 multi-vector index | 비현실적 |
| Storage | 작음 | 큼·compression 필요 | model 외 별도 doc vector 없음 |
| 세밀한 matching | 제한적 | token-level | 가장 풍부한 편 |
| 대표 역할 | first-stage | retrieval·middle-stage | final rerank |
실전 구성은 한 model로 통일하기보다 budget에 맞춰 cascade합니다.
low latency:
hybrid top-100 → small Cross-Encoder top-5
high recall + scale:
ColBERT/PLAID top-100 → Cross-Encoder top-10
existing index reuse:
BM25+dense top-1000 → ColBERT top-100 → Cross-Encoder top-10
15. 도입 판단 체크리스트
- Single-vector retrieval이 놓치는 실패가 token-level interaction으로 설명된다.
- ColBERT를 full retriever로 쓸지 candidate reranker로 쓸지 정했다.
- Raw token-vector·compressed index·metadata의 총 저장량을 계산했다.
- Candidate recall과 MaxSim ranking metric을 분리했다.
- Model checkpoint뿐 아니라 index·compression·search parameter를 versioning한다.
- Long document의 max token·chunk·aggregation 정책이 있다.
- 한국어와 cross-lingual slice를 직접 평가했다.
- Cross-Encoder와의 cascade가 품질·latency Pareto를 개선하는지 확인했다.
스스로 확인하기
- ColBERT가 single-vector bi-encoder보다 query의 여러 facet을 보존하는 방식은 무엇인가?
- MaxSim에서 각 query token이 하는 연산을 수식으로 설명할 수 있는가?
- Late interaction인데도 document vector를 미리 계산할 수 있는 이유는 무엇인가?
- ColBERTv2의 개선을 compression 하나로만 설명하면 안 되는 이유는 무엇인가?
- 같은 ColBERT checkpoint가 retriever 또는 reranker가 되는 기준은 무엇인가?
다음 글에서는 decoder-only LLM이 후보를 pointwise·pairwise·setwise·listwise로 판단하는 방법과 position bias·비용을 다룹니다.
참고자료
- ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT
- ColBERTv2: Effective and Efficient Retrieval via Lightweight Late Interaction
- PLAID: An Efficient Engine for Late Interaction Retrieval
- Jina-ColBERT-v2: A General-Purpose Multilingual Late Interaction Retriever
- ColBERT Late Interaction 시각적 해설