AI Sparkup

최신 AI 쉽게 깊게 따라잡기⚡

멀티벡터 임베딩 – 토큰별 MaxSim으로 검색 정밀도를 높이는 Late Interaction

멀티벡터 임베딩(Multi-Vector Embedding)은 문서 전체를 하나의 벡터로 평균 내지 않고, 토큰 또는 이미지 패치마다 여러 벡터를 보존해 검색하는 방식이다. RAG에서 용어·숫자·표의 특정 항목처럼 세밀한 근거를 놓치기 어렵지만, 인덱스 크기와 검색 비용은 커진다.

단일 벡터 검색이 놓치는 것

일반적인 조밀 임베딩(dense embedding)은 문서 하나를 벡터 하나로 압축한다. 빠르고 저장 효율이 좋지만, 긴 문서의 서로 다른 주제를 한 좌표에 섞으므로 질의의 개별 핵심어가 희석될 수 있다.

멀티벡터 방식은 질의 토큰마다 문서 안에서 가장 잘 맞는 토큰 벡터를 찾고 이를 합산한다. 이를 MaxSim(maximum similarity)이라 한다.

score(query, document)
  = Σ 각 질의 토큰 q에 대해 max( q · 문서 토큰 d )

따라서 “2025년 매출”처럼 복합적인 질의에서도 각 단어가 문서의 다른 위치와 강하게 대응할 수 있다. ColBERT가 대표적인 late interaction 계열이며, Sentence Transformers 6.0의 MultiVectorEncoder는 이 계열 체크포인트를 같은 API 흐름으로 다룬다.

언제 선택하는가

상황권장
짧은 FAQ·소규모 문서, 낮은 지연 시간이 최우선단일 벡터 임베딩부터 사용
긴 기술 문서·법률·제품 카탈로그에서 정확한 용어 매칭이 중요멀티벡터를 평가
표·차트가 많은 PDF를 OCR 손실 없이 검색ColPali 계열 시각 문서 검색을 검토
대규모 코퍼스와 제한된 저장 공간1차 검색은 단일 벡터, 멀티벡터는 재랭킹 또는 후보군에 적용

핵심은 “더 좋은 임베딩”으로만 보지 않는 것이다. 멀티벡터는 저장·색인·검색의 설계를 함께 바꾸므로, 실제 질의 집합으로 단일 벡터 대비 검색 품질과 비용을 함께 측정해야 한다.

구현 흐름

Sentence Transformers에서는 문서와 질의를 구분해 인코딩하고, 반환된 토큰 벡터 행렬을 MaxSim 지원 엔진에 넣는다.

from sentence_transformers import MultiVectorEncoder

model = MultiVectorEncoder("lightonai/GTE-ModernColBERT-v1")
document_vectors = model.encode_document(documents)
query_vectors = model.encode_query(["계약 갱신 조건은?"])
# document_vectors: 문서마다 [토큰 수, 차원] 형태의 벡터 행렬

Qdrant, Weaviate, Vespa, LanceDB, Milvus 등은 멀티벡터 또는 MaxSim 흐름을 지원한다. 단, 제품마다 후보 검색과 MaxSim 재점수화의 위치가 다르므로 1차 후보 검색과 재랭킹을 분리해 설계하는 편이 안전하다.

비용을 낮추는 방법

문서 토큰 수만큼 벡터를 저장하므로 단일 벡터보다 인덱스가 커진다. 토큰 풀링(token pooling)은 유사한 문서 토큰 벡터를 묶어 대표 벡터로 바꾸는 완화책이다. 질의 벡터는 짧고 신호 손실에 민감하므로 보통 문서 쪽에만 적용한다.

  1. 기준 단일 벡터 검색의 recall·지연 시간·저장량을 기록한다.
  2. 멀티벡터를 후보 상위 N개 재랭킹에 먼저 적용한다.
  3. 풀링 비율을 올리며 품질 하락과 인덱스 감소를 측정한다.
  4. 충분한 품질 이득이 있을 때만 전면 색인으로 확장한다.

관련 문서

참고 자료



AI Sparkup 구독하기

최신 게시물 요약과 더 심층적인 정보를 이메일로 받아 보세요! (무료)