Field Log · Entry

ColBERT Late Interaction: Multi-Vector 검색과 Reranking (5/14)

Query token마다 document token 중 최대 유사도를 찾고 합산하는 ColBERT MaxSim과 사전 계산 가능한 multi-vector index 구조

이번 글의 결론

  • 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 \ docS1S2pressureshutdown88°C
S20.610.940.080.200.11
shutdown0.100.180.310.910.22
temperature0.060.140.520.250.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인가

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-vectorColBERTCross-Encoder
Document representation1 vectortoken vectorsquery마다 재계산
Offline precompute가능가능불가
Interactiondot productMaxSimfull joint attention
Corpus-wide ANN가장 단순전용 multi-vector index비현실적
Storage작음큼·compression 필요model 외 별도 doc vector 없음
세밀한 matching제한적token-level가장 풍부한 편
대표 역할first-stageretrieval·middle-stagefinal 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를 개선하는지 확인했다.

스스로 확인하기

  1. ColBERT가 single-vector bi-encoder보다 query의 여러 facet을 보존하는 방식은 무엇인가?
  2. MaxSim에서 각 query token이 하는 연산을 수식으로 설명할 수 있는가?
  3. Late interaction인데도 document vector를 미리 계산할 수 있는 이유는 무엇인가?
  4. ColBERTv2의 개선을 compression 하나로만 설명하면 안 되는 이유는 무엇인가?
  5. 같은 ColBERT checkpoint가 retriever 또는 reranker가 되는 기준은 무엇인가?

다음 글에서는 decoder-only LLM이 후보를 pointwise·pairwise·setwise·listwise로 판단하는 방법과 position bias·비용을 다룹니다.

참고자료