ColBERT 방식 모델로 자기 문서를 검색한다면 인덱스가 원하는 것보다 클 가능성이 큽니다. 이런 다중 벡터 모델 은 문서당 하나가 아니라 토큰마다 벡터를 하나씩 저장해 정확하지만 저장 비용이 큽니다. Hugging Face 블로그의 새 글은 이제 Sentence Transformers로 이 벡터들을 압축한 뒤에도 정확도를 유지하도록 모델을 훈련할 수 있으며, 압축으로 보통 잃는 품질 대부분을 되찾을 수 있다고 보여 줍니다.
저장 문제는 구체적입니다. 좌표당 4비트일 때 128차원 벡터 200개는 문서당 12.8 KB, 문서 100만 개면 12.8 GB를 차지합니다. 문서마다 50개 벡터로 줄이면 3.2 GB가 됩니다. 라이브러리의 HierarchicalTokenPooling은 Ward 군집화로 비슷한 토큰 벡터를 합치는데, 고정 배율로 합칠 수도 있고 목표 평균에 맞춰 보정할 수 있는 거리 임계값으로 합칠 수도 있으며, 질의 벡터는 건드리지 않습니다. 풀링은 어떤 다중 벡터 모델에도 쓸 수 있지만, 이를 염두에 두고 훈련하지 않은 모델은 중요한 구분을 잃을 수 있습니다.
새로운 부분은 손실 함수 래퍼 MultiVectorTokenPoolingLoss로, 각 배치를 두 가지 형태로 학습합니다. 문서의 전체 벡터와 약 4분의 1로 줄인 버전입니다. 이는 더 짧은 앞부분도 쓸모 있도록 훈련하는 Matryoshka 임베딩과 비슷한 발상입니다. 저자의 실험에서는 ModernBERT-base 모델 두 개를 같은 MS MARCO 삼중항 120,000개로 1에폭 훈련했고, 손실 함수만 달리했습니다. 풀링 배율 4에서 일반 모델은 풀링 전 NanoBEIR 점수의 94.6%를 유지했고, 풀링을 고려해 훈련한 모델은 97.8%를 유지했으며, nDCG@10은 49.03에서 51.23으로 올랐고 저장하는 문서 벡터는 74.8% 줄었습니다. 풀링하지 않은 품질도 조금 나아졌습니다. 군집화용 GPU 커널은 SciPy보다 30-150x 빠르다고 합니다.
Sentence Transformers 위에 만든 LightOn의 ColBERT 방식 검색 라이브러리 PyLate를 쓰는 팀에게는 직접 관련이 있습니 다. 이 작업은 LightOn 자체의 풀링 정규화 연구를 바탕으로 하며, 훈련 방법은 Hugging Face Jobs로 A10G 한 장에서 4시간 안에 돌아갑니다. 실용적인 조언은 양자화, 풀링, Matryoshka 잘라내기를 함께 쓰고 자기 말뭉치로 인덱스 크기와 품질을 재 보라는 것입니다.
단서는 저자 스스로 밝혔습니다. 하나의 기본 모델로 한 번 해 본 실험이며 하이퍼파라미터 탐색도 없었고, 작은 벤치마크 묶음인 NanoBEIR로 평가했습니다. 효과는 훈련할 때 쓴 풀링 배율에서 가장 분명하며 다른 설정에도 어느 정도 이어집니다. 긴 문서나 특정 분야 문서에서는 결과가 다를 수 있습니다.