Retour au blog
Analyse Technique · IA Native · 7 min de lecture

Choisir la dimension de ses embeddings (768/1536/3072) : impact perf/coût

Affane Daylami · Fondateur· 24 août 2026

Le choix entre 768, 1536 et 3072 dimensions n'est pas un réglage cosmétique. Il fixe le volume de stockage de votre base vectorielle, le type d'index utilisable et le prix payé à chaque appel d'API. OpenAI documente lui-même l'écart de qualité entre ses deux modèles actuels : text-embedding-3-small, en 1536 dimensions natives, atteint 62,3 % sur le benchmark MTEB, contre 64,6 % pour text-embedding-3-large en 3072 dimensions natives. Un gain réel, mais qui se paie ailleurs qu'on ne le croit.

Cet article s'appuie sur la documentation officielle publiée par OpenAI, sur des retours d'équipes recensés dans les discussions de la communauté développeurs OpenAI, et sur le comportement vérifié dans le code d'Aurabase, qui route nativement ces trois classes de dimensions vers trois colonnes vectorielles distinctes. Chaque chiffre externe est daté et sourcé ; pour la méthodologie qu'on applique à nos propres mesures, voir notre pilier Méthodologie de benchmark.

L'essentiel
  • 1536 dimensions reste le choix le plus équilibré pour la majorité des cas : text-embedding-3-small natif, ou text-embedding-3-large tronqué, sans sortir du support HNSW natif de pgvector.
  • 3072 dimensions (text-embedding-3-large) offre le score MTEB le plus élevé publié par OpenAI (64,6 % contre 62,3 %), mais dépasse la limite de 2000 dimensions du type vector de pgvector : l'index HNSW exige un cast en halfvec.
  • Tronquer un embedding via le paramètre dimensions d'OpenAI (technique Matryoshka) réduit le stockage et accélère la recherche, mais ne réduit pas le prix : celui-ci dépend du modèle interrogé, pas de la taille du vecteur renvoyé.
  • Grâce au stockage halfvec (2 octets par dimension), un vecteur en 3072 dimensions occupe chez Aurabase le même espace disque brut qu'un vecteur 1536 en vector classique (4 octets par dimension) : environ 6 Ko.
  • Aurabase supporte nativement exactement 3 classes de dimensions, 768, 1536 et 3072, chacune sur sa propre colonne (vérifié dans services/aura-ai/src/embeddings/mod.rs) : pas de champ dimension libre.
#
Vue d'ensemble

768, 1536 ou 3072 : ce que chaque palier change réellement

En clair, choisir entre text-embedding-3-small et text-embedding-3-large revient d'abord à choisir entre 1536 et 3072 dimensions natives, avant même de parler de troncature. Le tableau ci-dessous résume les faits vérifiables sur les trois paliers que reconnaît nativement pgvector côté indexation, et que route Aurabase.

Critère768 dimensions1536 dimensions3072 dimensions
Modèle(s) associésTroncature OpenAI, ou modèle legacy/open source (natif)text-embedding-3-small (natif) ou 3-large tronquétext-embedding-3-large (natif)
Score MTEB moyennon publié en natif par OpenAI à cette taille62,3 %64,6 %
Tarif OpenAI indicatif / 1M tokensdépend du modèle interrogé, pas de la taille0,02 $ (small) ou 0,13 $ (large tronqué)0,13 $ (text-embedding-3-large)
Poids brut stocké / vecteur3 Ko (float32)6 Ko (float32)12 Ko (vector) ou 6 Ko (halfvec, Aurabase)
Index HNSW pgvector natifouiouinon : cast halfvec requis (>2000 dims)
Colonne Aurabase (vérifié code)embedding_768embedding_1536embedding_3072

Sources : OpenAI, blog officiel « New embedding models and API updates », 25 janvier 2024 (scores MTEB et tarifs de lancement, à vérifier sur la page de tarification actuelle avant usage) ; services/aura-ai/src/embeddings/mod.rs, Aurabase (colonnes et support d'index, vérifié le 24 août 2026).

#
Stockage

L'impact sur le stockage : le calcul qui change tout

Un embedding se stocke comme un tableau de nombres à virgule flottante. En pgvector, le type vector classique encode chaque dimension sur 4 octets (float32) : 768 dimensions pèsent donc environ 3 Ko de données brutes par vecteur, 1536 dimensions environ 6 Ko, et 3072 dimensions environ 12 Ko, avant même de compter l'en-tête pgvector et l'overhead de page Postgres.

C'est là qu'intervient le type halfvec de pgvector, qui encode chaque dimension sur 2 octets (float16) au lieu de 4. Un vecteur en 3072 dimensions stocké en halfvec pèse environ 6 Ko : exactement le poids d'un vecteur en 1536 dimensions stocké en vector classique.

3 Ko
768 dims
vector, float32 (4 octets/dim)
6 Ko
1536 dims
vector, float32 : même poids que 3072 en halfvec
12 Ko
3072 dims
vector classique, float32 (avant cast halfvec)

Conséquence directe et peu intuitive : chez Aurabase, passer de 1536 à 3072 dimensions ne double pas le stockage réel sur disque, puisque la colonne embedding_3072 est interrogée via un cast halfvec. Le vrai surcoût de 3072 dimensions n'est donc pas d'abord le disque : c'est le tarif du modèle OpenAI associé, et la sortie du support d'index natif du type vector, détaillée dans la section suivante.

#
pgvector / HNSW

Pourquoi 3072 dimensions change de type d'index sous pgvector

Le type vector de pgvector ne permet pas de construire un index HNSW ou IVFFlat au-delà de 2000 dimensions. 3072 dimensions dépasse donc cette limite : aucune requête de recherche vectorielle sur une colonne vector(3072) ne peut s'appuyer sur un index approximatif, elle retombe sur un scan séquentiel complet, inutilisable à l'échelle d'un corpus RAG en production.

Le code d'Aurabase gère ce cas explicitement : la colonne embedding_3072 est castée en halfvec(3072) à chaque requête d'insertion et de recherche, un type que pgvector sait indexer jusqu'à 4000 dimensions. Les colonnes 768 et 1536 restent en vector natif, sans cast, puisqu'elles n'approchent pas la limite.

services/aura-ai/src/embeddings/mod.rs (extrait simplifié)
RUST
// Pour 3072 (>2000), HNSW n'indexe pas le type `vector` → cast halfvec
fn vec_query_parts(dims: usize) -> AuraResult<(&'static str, &'static str, &'static str)> {
match dims {
768 => Ok(("embedding_768", "", "::vector")),
1536 => Ok(("embedding_1536", "", "::vector")),
3072 => Ok(("embedding_3072", "::halfvec(3072)", "::halfvec(3072)")),
other => Err(...), // dimension non supportée
}
}

Ce détail explique aussi pourquoi une dimension d'embedding non listée dans [768, 1536, 3072] échoue explicitement côté Aurabase, plutôt que d'être acceptée puis mal indexée : le nom de colonne provient toujours d'une allowlist fixe, jamais d'une valeur libre envoyée par le client. Pour creuser la construction d'un index HNSW sur Postgres au-delà de ce cas précis, voir notre article index HNSW et recherche vectorielle Postgres.

#
Coût API

Réduire la dimension sans tout perdre : la troncature Matryoshka d'OpenAI

Depuis janvier 2024, l'API Embeddings d'OpenAI accepte un paramètre dimensions qui raccourcit le vecteur renvoyé sans réappeler un modèle différent. La technique s'appelle Matryoshka Representation Learning : le modèle est entraîné pour concentrer l'information utile dans les premières dimensions du vecteur, de sorte qu'une troncature perd de la précision progressivement plutôt que brutalement.

OpenAI illustre l'efficacité de cette technique avec un exemple précis dans son annonce : text-embedding-3-large, tronqué à 256 dimensions seulement, dépasse encore le score MTEB de l'ancien text-embedding-ada-002 utilisé à sa pleine taille de 1536 dimensions (source : OpenAI, blog officiel, 25 janvier 2024). Un vecteur 12 fois plus petit qui fait mieux qu'un vecteur complet, sur ce benchmark précis.

services/aura-ai/src/llm/openai.rs (extrait, requête d'embedding)
RUST
let body = json!({
"model": self.embed_model, // ex. "text-embedding-3-large"
"input": text,
"dimensions": self.embed_dimensions, // tronque 3072 → la valeur configurée
});

Point important, et souvent mal compris : tronquer ne réduit pas le prix facturé. OpenAI facture selon le modèle interrogé, pas selon la taille du vecteur renvoyé, puisque le coût réel est le calcul effectué sur le texte d'entrée. Demander 1536 dimensions à text-embedding-3-large coûte donc le même tarif que ses 3072 dimensions natives (source : OpenAI, blog officiel, 25 janvier 2024) ; seuls le stockage et la vitesse de recherche changent.

C'est précisément le choix par défaut d'Aurabase, vérifié dans config/mod.rs : le modèle configuré par défaut est text-embedding-3-large, mais la dimension de sortie configurée par défaut est 1536, pas 3072. Le service paie donc la représentation du modèle large, tronquée pour rester sur une colonne vector indexable en HNSW natif, sans le cast halfvec requis à 3072.

#
Décision

Quelle dimension choisir selon votre cas d'usage

1536 dimensions reste le point de départ raisonnable pour la majorité des projets RAG ou de recherche sémantique : le score MTEB de text-embedding-3-small (62,3 %) reste proche de celui du modèle large, le stockage reste léger, et le type vector classique de pgvector s'indexe en HNSW sans configuration particulière.

3072 dimensions se justifie quand le corpus est ambigu ou technique, là où l'écart de qualité entre 62,3 % et 64,6 % se traduit par des résultats de recherche visiblement meilleurs sur vos propres requêtes, pas sur le benchmark général d'OpenAI. Plusieurs retours d'équipes recensés dans les discussions de la communauté développeurs OpenAI vont dans ce sens : le gain de 3072 dimensions se mesure au cas par cas, il ne se suppose pas.

768 dimensions convient surtout quand le volume prime sur la nuance : un corpus volumineux où le budget de stockage ou de calcul est la contrainte réelle, ou l'usage d'un modèle d'embedding legacy déjà en 768 dimensions natives.

Une règle simple avant de trancher
Ne fixez pas la dimension avant d'avoir mesuré la qualité de recherche sur un échantillon représentatif de votre propre corpus, pas seulement sur le score MTEB général publié par OpenAI. Le MTEB moyenne des dizaines de tâches hétérogènes ; votre corpus RAG n'en est qu'une seule.

Ce choix de dimension s'inscrit dans une pile RAG plus large, embeddings, index HNSW, recherche hybride, que documente notre page IA native.

#
Questions fréquentes

Ce qu'on nous demande le plus souvent

Peut-on changer la dimension d’un corpus déjà indexé sans tout réindexer ?+
Non. Aurabase filtre chaque recherche sémantique par modèle ET dimension exacts (colonne embedding_model + colonne dédiée à la dimension). Un corpus indexé en 1536 dimensions devient invisible à une recherche menée en 3072, et inversement : changer de dimension impose de réindexer le corpus sous la nouvelle classe.
Gemini permet-il d’aller au-delà de 3072 dimensions ?+
Non. Le client Gemini d’Aurabase rejette explicitement toute valeur supérieure à 3072 (outputDimensionality), avec une erreur invitant à configurer GOOGLE_EMBED_DIMENSIONS <= 3072, vérifié dans services/aura-ai/src/llm/gemini.rs. 3072 est le plafond commun aux trois classes supportées par Aurabase, tous fournisseurs confondus.
Faut-il toujours choisir 3072 dimensions pour de meilleurs résultats ?+
Pas nécessairement. L’écart de score MTEB entre 1536 et 3072 (62,3 % contre 64,6 % selon OpenAI) reste modeste face au changement d’architecture qu’implique 3072 : sortie du support HNSW natif du type vector, cast halfvec obligatoire, et tarif du modèle large. Le gain doit se vérifier sur votre corpus avant de justifier ce coût.
text-embedding-3-small ou text-embedding-3-large pour un projet RAG en production ?+
Cela dépend du budget et de la nature du corpus, pas d’une règle universelle. Text-embedding-3-small (1536 dimensions natives) couvre la majorité des cas à moindre coût ; text-embedding-3-large se justifie sur un corpus ambigu où le gain de précision se mesure concrètement sur vos propres requêtes de test, pas seulement sur le score MTEB général.
#
En résumé

Le bon choix n'est pas le plus grand, c'est le mieux mesuré

768, 1536 et 3072 dimensions ne se départagent pas sur un seul axe. 3072 gagne en score MTEB publié par OpenAI, mais sort du support HNSW natif de pgvector et paie le tarif du modèle large, quelle que soit la dimension finalement demandée. 1536 reste l'équilibre par défaut le plus courant, y compris chez Aurabase. 768 sert les cas où le volume prime sur la nuance.

Le paramètre dimensions d'OpenAI change la question à se poser : ce n'est plus « quel modèle choisir », mais « quelle troncature accepter, pour quel gain mesuré sur mon corpus ». Avant de figer un choix en production, testez la qualité de recherche sur un échantillon réel, pas seulement sur un benchmark général. Notre guide pipeline RAG avec pgvector détaille la mise en place complète, de l'ingestion à la recherche hybride.

IA NATIVE

RAG et embeddings natifs, sans pipeline à assembler.

Trois classes de dimensions supportées nativement (768/1536/3072), indexation HNSW gérée automatiquement. Créez un projet gratuit pour tester sur votre propre corpus.

Créer un projet gratuit Découvrir l'IA native
Aucune carte bancaire requise · 500 MB gratuits · 50 000 MAU