Ce qui se passe
La v6.0 de Sentence Transformers ajoute un quatrième type de modèle,
MultiVectorEncoder, et la méthode d'entraînement complète qui va avec :
MultiVectorEncoderTrainer, MultiVectorEncoderTrainingArguments,
CachedMultiVectorMultipleNegativesRankingLoss,
MultiVectorInformationRetrievalEvaluator. Tout tourne après un
pip install -U "sentence-transformers[train]".
Le principe de l'interaction tardive tient en une phrase : au lieu d'un vecteur par document, on garde un vecteur par jeton, et le score MaxSim prend, pour chaque jeton de la requête, sa meilleure correspondance dans le document, puis additionne. Le signal fin survit là où une moyenne l'écrase.
Les chiffres
Le modèle de démonstration, multi-vector-encoder/mLateOn-medical, part du
point de contrôle lightonai/mLateOn-unsupervised et s'entraîne sur un million
de paires question/passage du jeu MIRIAD. Évaluation : 1 000 questions contre
200 000 passages.
| Modèle | Famille | NDCG@10 |
|---|---|---|
| mLateOn-medical (affiné) | Multi-vecteur | 0,9139 |
| lightonai/mLateOn | Multi-vecteur, zéro-coup | 0,8520 |
| Qwen3-Embedding-4B | Dense | 0,7817 |
| BM25 | Lexical | 0,7501 |
| naver/splade-v3 | Creux | 0,6853 |
La précision au premier rang passe de 75,8 % à 84,9 % : plus d'un tiers des erreurs de rang 1 supprimées. Le modèle dense le plus fort, avec environ 33 fois plus de paramètres actifs, reste 0,13 en dessous — et sa version 8B fait moins bien que la 4B.
Le coût : 14,5 heures sur une seule RTX 3090, pic à 17,5 Go de VRAM. Pour un budget plus serré, 100 000 paires (75 minutes) arrivent à 0,012 NDCG@10 du résultat obtenu avec le million. L'essentiel du gain tombe dans la première heure.
L'objection sérieuse : la taille de l'index
C'est la vraie limite du multi-vecteur, et l'article ne l'esquive pas. Avec environ 878 vecteurs par passage, le corpus de 200 000 passages pèse 45 Go en fp16, là où un index dense tient sous 1 Go. Ce sont des passages longs : sur des passages courts, le rapport est bien plus favorable.
Deux leviers, qui se composent — la quantification d'abord :
| Configuration | Taille de l'index | Score |
|---|---|---|
| Embeddings bruts fp16 | 45 GB | 0,9139 |
HierarchicalTokenPooling(pool_factor=4) |
11,2 GB | 0,8991 |
| PLAID 1 bit, tous les vecteurs | 3,37 GB | −0,0155 par rapport au brut |
| PLAID 1 bit + élagage | 1,45 GB | élagage naïf, à lire comme un plancher |
La dernière ligne du tableau vaut d'être lue deux fois : 1,45 Go, soit moins
que les embeddings fp16 de Qwen3-Embedding-8B (1,64 Go), pour 0,0895 de NDCG@10
en plus. Ces mesures ont été faites avec fast-plaid par Omar Khattab, en
quantification résiduelle 1 bit avec identifiants compacts.
Source : Hugging Face, Training and Finetuning Multi-Vector Embedding Models with Sentence Transformers