AI Sparkup

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

Sentence Transformers 튜토리얼 – MultiVectorEncoder로 후기 상호작용 검색 학습하기

멀티벡터 임베딩은 문서 전체를 벡터 하나로 줄이지 않고 토큰별 표현을 남긴다. Sentence Transformers 6.0의 MultiVectorEncoder는 ColBERT식 후기 상호작용(late interaction) 모델을 같은 라이브러리 흐름에서 학습·파인튜닝하게 만든다. 제품명·조항·부품 번호처럼 세밀한 일치가 중요한 검색에 적합하다.

1. 학습 데이터부터 점검한다

각 학습 예제는 query, 관련 문서 positive, 가능하면 헷갈리지만 틀린 negative로 구성한다. 단일 벡터 데이터셋을 그대로 쓰기보다 실제 검색 실패 사례를 hard negative로 넣어야 MaxSim의 이점을 검증할 수 있다. 데이터 누수 방지를 위해 같은 문서의 인접 청크가 학습·평가에 나뉘지 않게 한다.

2. 문서와 질의를 분리해 인코딩한다

from sentence_transformers import MultiVectorEncoder

model = MultiVectorEncoder("lightonai/GTE-ModernColBERT-v1")
doc_vectors = model.encode_document(["계약 갱신은 30일 전 통지한다."])
query_vectors = model.encode_query(["계약 갱신 통지 기한은?"])

두 결과는 문서·질의마다 여러 토큰 벡터를 가진다. 검색 엔진은 각 질의 토큰과 가장 가까운 문서 토큰의 유사도를 합산하는 MaxSim으로 점수를 계산한다. 따라서 이 벡터를 단일 벡터 DB의 일반 필드에 평균 내어 저장하면 목적이 사라진다.

3. 학습 전후를 같은 지표로 비교한다

지표확인할 질문
Recall@k, MRR, nDCG정답 문서가 더 높은 순위로 올라왔는가
색인 크기토큰 벡터 보존 비용을 감당할 수 있는가
p95 검색 지연MaxSim 재점수화가 서비스 목표를 넘지 않는가
slice 평가숫자·고유명사·긴 문서에서 실제로 개선됐는가

처음부터 전 코퍼스를 바꾸지 말고, 단일 벡터 1차 검색 뒤 상위 후보에 멀티벡터 재랭킹을 적용해 품질·비용을 비교한다. Qdrant, Weaviate, Vespa, LanceDB, Milvus 등에서는 멀티벡터 또는 MaxSim 지원 범위가 다르므로 저장 형식과 재점수화 위치를 확인해야 한다.

관련 문서

참고 자료



AI Sparkup 구독하기

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