Le Modèle codestral-embed
Mis à jour le 29 juillet 2026
Embeddings spécialisés pour le code
Alors que mistral-embed est conçu pour le texte naturel, codestral-embed est un modèle d’embedding optimisé spécifiquement pour les langages de programmation. Il comprend la syntaxe, la sémantique et la logique du code, ce qui le rend nettement supérieur à un modèle textuel générique pour toutes les tâches liées au code source.
La différence se mesure sur un cas simple. Deux fonctions qui font la même chose, l’une écrite avec une boucle for et l’autre en compréhension de liste, ne partagent presque aucun token. Un modèle textuel les voit comme deux blocs de ponctuation distincts ; un modèle entraîné sur du code les rapproche parce qu’il a appris que ces deux formes expriment la même intention.
Caractéristiques techniques
Le modèle codestral-embed se distingue de mistral-embed sur plusieurs points :
| Caractéristique | codestral-embed | mistral-embed |
|---|---|---|
| Dimensions par défaut | 1536 | 1024 |
| Dimensions maximales | 3072 (le double du défaut) | — |
| Types de sortie | float, int8, uint8, binary, ubinary | — |
| Optimisation | entraîné sur du code source multi-langage | texte naturel |
Cette souplesse sur les dimensions et les types de sortie est ce qui sépare vraiment les deux modèles à l’usage : un index de code atteint vite le million de vecteurs, et pouvoir en diviser le poids par quatre change la facture d’infrastructure.
Utilisation de base
L’API est identique à mistral-embed, avec le nom de modèle codestral-embed. Rien d’autre ne change dans votre code d’appel, ce qui vous permet de faire cohabiter les deux modèles dans un même projet en ne modifiant qu’un paramètre.
from mistralai import Mistral
client = Mistral(api_key=api_key)
# Encoder des snippets de code
response = client.embeddings.create(
model="codestral-embed",
inputs=[
"def fibonacci(n): return n if n <= 1 else fibonacci(n-1) + fibonacci(n-2)",
"function fibonacci(n) { return n <= 1 ? n : fibonacci(n-1) + fibonacci(n-2); }",
"public int fibonacci(int n) { return n <= 1 ? n : fibonacci(n-1) + fibonacci(n-2); }",
],
)
for i, data in enumerate(response.data):
print(f"Snippet {i+1}: vecteur de {len(data.embedding)} dimensions")
# Snippet 1: vecteur de 1536 dimensions
# Snippet 2: vecteur de 1536 dimensions
# Snippet 3: vecteur de 1536 dimensions
Remarquez que les trois snippets implémentent la même logique (Fibonacci) dans trois langages différents. Leurs embeddings seront très proches malgré la syntaxe différente. C’est la propriété qui rend possible la recherche cross-langage : sur une base de code polyglotte, un développeur Python peut retrouver l’implémentation Java qu’il cherche sans connaître un mot de Java.
Paramètre output_dimension
Vous pouvez réduire la taille des vecteurs pour économiser de l’espace de stockage, au prix d’une légère perte de précision :
# Dimensions réduites (512 au lieu de 1536)
response = client.embeddings.create(
model="codestral-embed",
output_dimension=512,
inputs=["def hello(): print('Hello, World!')"],
)
embedding = response.data[0].embedding
print(f"Dimensions: {len(embedding)}") # 512
Les premières dimensions du vecteur sont les plus informatives. Le modèle est conçu pour que les n premières dimensions conservent un maximum d’information, ce qui permet cette réduction sans perte catastrophique. Autrement dit, tronquer un vecteur ne revient pas à jeter un tiers du sens au hasard : vous conservez l’essentiel du signal et vous perdez la finesse, ce qui reste parfaitement jouable pour un premier filtrage.
Choix de la dimension
Les valeurs suivantes servent de repères selon le contexte du projet — une recherche de haute précision sur un corpus modeste ne se paramètre pas comme un index embarqué sur une machine contrainte :
# Recommandations par cas d'usage
DIMENSIONS = {
"recherche_precise": 3072, # Qualité maximale
"usage_general": 1536, # Défaut, bon compromis
"gros_volume": 768, # Compromis stockage/qualité
"prototype": 512, # Développement rapide
"embarque": 256, # Contrainte mémoire forte
}
Paramètre output_dtype
Le type de sortie contrôle la précision et la taille des valeurs. Là où output_dimension réduit le nombre de nombres, output_dtype réduit le poids de chacun d’entre eux — les deux leviers sont indépendants et se cumulent.
# Float (défaut) - précision maximale
response_float = client.embeddings.create(
model="codestral-embed",
output_dtype="float",
inputs=["def add(a, b): return a + b"],
)
# Int8 - 4x plus compact que float32
response_int8 = client.embeddings.create(
model="codestral-embed",
output_dtype="int8",
inputs=["def add(a, b): return a + b"],
)
# Binary - extrêmement compact
response_binary = client.embeddings.create(
model="codestral-embed",
output_dtype="binary",
inputs=["def add(a, b): return a + b"],
)
Combiner dimension et dtype
Vous pouvez combiner les deux paramètres pour un contrôle précis. Les deux appels ci-dessous encodent la même requête SQL et illustrent les deux extrémités du spectre : le premier vise un index léger interrogé en continu, le second une recherche de référence où chaque point de précision compte.
# Compact et rapide : 512 dimensions en int8
response = client.embeddings.create(
model="codestral-embed",
output_dimension=512,
output_dtype="int8",
inputs=["SELECT * FROM users WHERE active = true"],
)
# Haute qualité : 3072 dimensions en float
response = client.embeddings.create(
model="codestral-embed",
output_dimension=3072,
output_dtype="float",
inputs=["SELECT * FROM users WHERE active = true"],
)
Une règle vaut d’être posée dès maintenant : les vecteurs de votre index et ceux de vos requêtes doivent partager exactement les mêmes paramètres. Encoder un corpus en 512 dimensions puis interroger en 1536 ne produit pas des résultats médiocres, cela produit une erreur ou des scores dénués de sens.
Langages supportés
codestral-embed fonctionne avec tous les langages de programmation courants. Côté applicatif, vous couvrez Python, JavaScript et TypeScript, ainsi que Java, C, C++, C#, Go et Rust. Côté données et présentation, le modèle traite SQL, HTML et CSS. Côté outillage et configuration, il gère Shell/Bash, YAML et JSON — et bien d’autres, en réalité tout langage présent dans les données d’entraînement. Concrètement, un dépôt typique mêlant du Python, des templates HTML, des migrations SQL et des manifestes YAML s’indexe intégralement avec un seul modèle.
Points clés à retenir
- codestral-embed est optimisé pour le code source, pas le texte naturel
- 1536 dimensions par défaut, extensible jusqu’à 3072
- Le paramètre
output_dimensionpermet de réduire la taille des vecteurs - Le paramètre
output_dtypecontrôle la précision (float, int8, binary, etc.) - Le modèle comprend la sémantique du code indépendamment du langage