Guide
Dimensions d'un embedding : réduire avec Matryoshka
Combien de dimensions garder pour vos vecteurs ? Ce que permet l'apprentissage Matryoshka, les modèles qui l'acceptent, et la normalisation à refaire.
Mis à jour le
La dimension d'un embedding est le nombre de valeurs de chaque vecteur : 1 024, 1 536, 3 072… Plus elle est élevée, plus chaque vecteur coûte en mémoire, en disque et en temps de calcul. Avec un modèle entraîné selon la technique Matryoshka, vous pouvez garder seulement les premières valeurs du vecteur et perdre peu en qualité. Reste à le vérifier sur vos données, et à renormaliser.
Pourquoi la dimension compte
Dans pgvector, un vecteur occupe 4 × dimensions + 8 octets. Le calcul est direct :
| Dimensions | Octets par vecteur (pgvector, vector) |
|---|---|
| 256 | 1 032 |
| 768 | 3 080 |
| 1 024 | 4 104 |
| 1 536 | 6 152 |
| 3 072 | 12 296 |
Il y a aussi une limite pratique : pgvector n'indexe pas un vector de plus de 2 000 dimensions (4 000 en demi-précision halfvec). Un modèle qui sort 3 072 dimensions par défaut oblige donc à réduire, ou à passer en demi-précision, pour profiter d'un index.
Matryoshka : le principe
La technique vient de l'article « Matryoshka Representation Learning » de Kusupati et al. (2022). Comme les poupées russes, le modèle est entraîné pour que les premières valeurs du vecteur portent déjà l'essentiel du sens, puis que chaque tranche suivante affine. On peut donc tronquer le vecteur : les 256 premières valeurs forment un plongement utilisable, les 512 premières un meilleur, et ainsi de suite.
Le blog de Hugging Face donne un ordre de grandeur sur un jeu de test de similarité de phrases (STSBenchmark) : à 8,3 % de la taille d'origine (64 dimensions sur 768), un modèle Matryoshka conserve 98,37 % de sa performance, contre 96,46 % pour un modèle classique tronqué de la même façon. Ce résultat vaut pour ce modèle et ce jeu de test ; il ne se transpose pas tel quel à votre corpus.
Quels modèles l'acceptent
D'après la documentation de chaque éditeur, lue le 15/11/2026 :
| Modèle | Dimensions possibles | Comment réduire |
|---|---|---|
| gemini-embedding-2 et gemini-embedding-001 (Google) | 128 à 3 072 ; 768, 1 536 ou 3 072 recommandés | paramètre output_dimensionality ; modèles entraînés en Matryoshka |
| voyage-4, -4-large, -4-lite (Voyage AI) | 256, 512, 1 024 (par défaut), 2 048 | paramètre output_dimension |
| Cohere embed-v5.0 (pro et fast) | 256, 512, 768, 1 024, 1 536, 2 048 (par défaut) | dimensions sélectionnables, Matryoshka |
| text-embedding-3-small et -large (OpenAI) | jusqu'à 1 536 et 3 072 | paramètre dimensions |
La documentation d'OpenAI donne un exemple parlant : raccourci à 256 dimensions, text-embedding-3-large reste meilleur sur le banc d'essai MTEB (voir Classement MTEB) que l'ancien ada-002 à 1 536 dimensions. Elle cite aussi le cas d'une base limitée à 1 024 dimensions.
La normalisation à refaire
Un vecteur normalisé a une longueur de 1, ce qui permet de remplacer la similarité cosinus par un simple produit scalaire (voir Similarité cosinus). Couper un vecteur casse cette propriété.
- Le blog de Hugging Face le rappelle : des plongements normalisés ne le sont plus après troncature, il faut les renormaliser.
- OpenAI précise que si vous raccourcissez vous-même un vecteur, au lieu de passer par le paramètre
dimensions, vous devez le renormaliser. - Google indique que gemini-embedding-2 normalise automatiquement les dimensions réduites, mais que pour gemini-embedding-001 il faut normaliser soi-même tout vecteur de moins de 3 072 dimensions.
Avec Sentence Transformers, la réduction se fait au chargement du modèle (exemple du blog de Hugging Face) :
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("tomaarsen/mpnet-base-nli-matryoshka", truncate_dim=64)
embeddings = model.encode(["The weather is so nice!", "It's so sunny outside!"])
print(embeddings.shape) # (2, 64)
Méthode pour choisir
- Partez de la dimension par défaut du modèle et mesurez la qualité sur vos questions (voir Choisir un modèle).
- Refaites la mesure à la moitié, puis au quart de la dimension.
- Gardez la plus petite dimension dont la perte reste acceptable pour vous.
- Fixez-la une fois pour toutes : changer de dimension, c'est recalculer et réindexer tous les vecteurs (voir Changer de modèle d'embedding).
Réduire la dimension n'est pas la seule façon d'alléger : on peut aussi réduire la précision de chaque valeur. Voir Quantification des embeddings.
Questions fréquentes
Peut-on couper soi-même un vecteur d'embedding ?
Seulement si le modèle a été entraîné pour cela (technique Matryoshka) ; on garde alors les premières valeurs, puis on renormalise le vecteur. Sur un modèle classique, la coupe dégrade davantage les résultats.
Combien de dimensions recommande Google pour Gemini ?
Sa documentation accepte de 128 à 3 072 dimensions et recommande 768, 1 536 ou 3 072.
Sources
Pages consultées pour écrire cet article :