Recherche sémantique, recommandation, intelligence artificielle capable de retrouver le bon document : derrière ces outils se cache la même opération. Textes, images, sons et dates deviennent des suites de nombres. Chercher du sens revient alors à mesurer des distances.

Vectoriser, c’est donner une géographie aux données afin que les concepts proches puissent devenir des voisins.

Cette représentation fonde les embeddings et le RAG — la génération augmentée par récupération de documents. Elle ne rend pas la machine consciente : elle construit une carte statistique où les ressemblances deviennent calculables.

Qu’est-ce qu’un vecteur de données ?

Un vecteur est une liste ordonnée de nombres, par exemple [0{,}21 ;-0{,}40 ;0{,}88]. On peut l’imaginer comme les coordonnées d’un point. Avec deux nombres, ce point se place sur une feuille ; avec trois, dans un volume. Avec 1 536 nombres, le principe ne change pas, même si aucun écran ne peut montrer directement l’espace obtenu.

La donnée d’origine peut être un mot, une photographie, une catégorie de produit ou une heure de la journée. Une fonction déterministe ou un modèle appris lui attribue des coordonnées. L’essentiel n’est pas la valeur isolée de chaque nombre, mais l’organisation collective : deux éléments jugés similaires doivent aboutir à des points proches.

mindmap
  root((Vectorisation))
    Donnees
      Texte
      Categoriel
      Numerique
      Dates
    Techniques
      One-hot
      TF-IDF
      Embeddings denses
      Encodage cyclique
    Similarite
      Cosinus
      Euclidienne
      Produit scalaire
    Recherche
      kNN exact
      ANN mHNSW
      MariaDB VECTOR

La vectorisation réunit donc plusieurs transformations adaptées aux données. Un index accélère ensuite l’exploration, tandis qu’une métrique définit ce que « proche » signifie.

flowchart LR
    A[Donnee brute<br/>texte, date, image] --> B[Encodage<br/>modele / fonction]
    B --> C[Vecteur<br/>0.21, -0.40, 0.88, ...]
    C --> D[Index mHNSW]
    D --> E[Recherche kNN]
    E --> F[Voisins les plus proches]

Le modèle encode d’abord les données et la base construit l’index. À chaque requête, la question subit le même encodage avant la recherche de ses voisins.

2D, 3D, 4D… et bien au-delà

La dimension d’un vecteur est simplement son nombre de coordonnées. Deux dimensions décrivent un plan, trois un volume. Une quatrième ajoute un axe indépendant, puis une cinquième, une centième ou une millième font de même. Notre intuition visuelle s’arrête à trois, pas les équations.

L’exemple célèbre « roi − homme + femme ≈ reine », popularisé par Word2Vec, suggère que certaines relations deviennent des directions. Le graphique suivant n’est toutefois qu’une projection pédagogique : les mots originaux vivent dans un espace beaucoup plus vaste.

quadrantChart
    title Projection 2D d'embeddings de mots
    x-axis Feminin --> Masculin
    y-axis Roturier --> Royal
    quadrant-1 Royal masculin
    quadrant-2 Royal feminin
    quadrant-3 Roturier feminin
    quadrant-4 Roturier masculin
    Roi: [0.82, 0.85]
    Reine: [0.20, 0.85]
    Homme: [0.80, 0.20]
    Femme: [0.18, 0.22]
Modèle Dimensions Année
Word2Vec (Google News) 300 2013
GloVe 50 / 100 / 200 / 300 2014
BERT-base / large 768 / 1024 2018
OpenAI ada-002 1536 2022
OpenAI text-embedding-3-large 3072 (Matryoshka) 2024

Pourquoi multiplier les axes ? Registre, domaine, grammaire, contexte et associations réclament de la capacité. En haute dimension, deux vecteurs aléatoires sont aussi très probablement quasi orthogonaux : des concepts sans rapport interfèrent moins.

Pour voir cette carte, on la projette en deux ou trois dimensions. PCA privilégie la variance globale ; t-SNE et UMAP révèlent les voisinages. Toute projection déforme cependant certaines distances.

De la donnée « normale » au vecteur

Texte : du comptage au sens distribué

Le codage one-hot associe à chaque mot un vecteur aussi long que le vocabulaire, rempli de zéros sauf à la position du mot. Il distingue parfaitement les termes, mais « chat » et « félin » y sont aussi éloignés que « chat » et « turbine ». Le bag-of-words compte leurs occurrences dans un document ; simple et efficace, il perd l’ordre des mots.

TF-IDF améliore ce comptage en valorisant un terme fréquent dans un document mais rare dans l’ensemble du corpus. Si N est le nombre de documents et df(t) le nombre de ceux qui contiennent le terme t :

\text{tfidf}(t,d) = \text{tf}(t,d)\times\log\frac{N}{df(t)}

Ces vecteurs, souvent normalisés en norme L2, restent clairsemés et liés au vocabulaire. Les embeddings denses franchissent une étape supplémentaire : un réseau apprend quelques centaines ou milliers de coordonnées continues, de sorte que les usages contextuellement proches occupent des régions voisines.

Catégories : gare au faux ordre

Pour une couleur, une marque ou un pays, le one-hot préserve l’absence d’ordre. Le label encoding transforme BMW, Honda et Toyota en 1, 2 et 3, créant l’arithmétique fictive (BMW+Toyota)/2=Honda. Ce biais touche les modèles linéaires et kNN, mais peu les arbres. À forte cardinalité, les entity embeddings de Guo et Berkhahn (2016) rapprochent les catégories aux comportements similaires.

Nombres : remettre les échelles à niveau

Mélanger un âge compris entre 18 et 90 avec un chiffre d’affaires pouvant atteindre un million donnerait au second une influence mécanique. La normalisation min-max, (X-X_{min})/(X_{max}-X_{min}), ramène généralement les valeurs entre 0 et 1. Le z-score, (X-\mu)/\sigma, exprime plutôt l’écart à la moyenne en nombre d’écarts-types. Le choix dépend de la distribution et de la sensibilité aux valeurs extrêmes.

Dates et heures : refermer le cercle

Coder l’heure comme un entier crée une anomalie : 23 h et 0 h paraissent distantes de 23 unités alors qu’elles se suivent. Une période P — 24 heures, 7 jours ou 12 mois — se représente sur un cercle :

x_{\sin} = \sin\!\frac{2\pi t}{P}, \qquad x_{\cos} = \cos\!\frac{2\pi t}{P}

Le sinus et le cosinus sont tous deux nécessaires. Un sinus seul prend la même valeur à deux endroits du cycle ; le couple fournit une position unique et rapproche naturellement la fin de la période de son commencement.

Images et sons : encoder des motifs

Un réseau convolutif transforme pixels, contours et formes en un embedding tiré de sa couche pénultième. Pour l’audio, un mel-spectrogramme alimente souvent un CNN ; VGGish produit ainsi 128 dimensions.

Mesurer la ressemblance

La distance euclidienne est la longueur de la ligne droite entre deux points :

d(\vec{a},\vec{b}) = \sqrt{\sum_{i=1}^{n}\left(a_i-b_i\right)^2}

Elle tient compte de la magnitude. Deux vecteurs pointant dans la même direction, mais de tailles différentes, peuvent donc être éloignés. La similarité cosinus ne regarde que l’angle :

\cos(\theta) = \frac{\vec{a}\cdot\vec{b}}{\lVert\vec{a}\rVert\,\lVert\vec{b}\rVert} = \frac{\displaystyle\sum_{i=1}^{n} a_i b_i}{\sqrt{\displaystyle\sum_{i=1}^{n} a_i^2}\;\sqrt{\displaystyle\sum_{i=1}^{n} b_i^2}}

Sa valeur va de −1 à 1 : 1 indique des directions identiques, 0 des directions orthogonales et −1 des directions opposées. Le produit scalaire combine angle et magnitude ; pour des vecteurs normalisés, il est égal au cosinus.

Trouver exactement les k plus proches voisins coûte O(N\cdot D) pour N vecteurs de D dimensions. Au-delà du million d’objets, les méthodes ANN sacrifient un peu de rappel — la proportion des vrais voisins retrouvés — pour gagner beaucoup de vitesse.

HNSW, proposé par Malkov et Yashunin en 2016, organise les vecteurs en graphe multi-couches. Les niveaux supérieurs, clairsemés, permettent de longs sauts ; les niveaux inférieurs, plus denses, affinent l’arrivée. Cette navigation approche une recherche logarithmique. D’autres familles existent : IVF découpe l’espace en cellules de Voronoï, tandis que PQ quantifie des sous-vecteurs.

En pratique avec MariaDB VECTOR

MariaDB a introduit la recherche vectorielle en 11.6 sous forme de préversion en juillet 2024, puis l’a déclarée GA avec la 11.7 le 13 février 2025. Pour la production, la branche 11.8 LTS, publiée en mai 2025, constitue le choix durable. Le type VECTOR(n) stocke jusqu’à 16 383 composantes float32 IEEE 754, soit quatre octets chacune.

Une architecture peut séparer les documents métier de leurs représentations, même si l’exemple SQL suivant réunit titre et embedding :

erDiagram
    DOCUMENTS ||--|| EMBEDDINGS : possede
    DOCUMENTS {
        bigint doc_id PK
        varchar titre
        text contenu
    }
    EMBEDDINGS {
        bigint doc_id PK "FK vers DOCUMENTS"
        vector embedding "VECTOR(1536)"
    }

L’index mHNSW, version modifiée de HNSW, exige une colonne NOT NULL et MariaDB n’en autorise qu’un par table. Sa distance est euclidienne par défaut ou cosinus ; M, compris entre 3 et 200, règle la connectivité du graphe.

-- MariaDB 11.7+ : colonne VECTOR + index mHNSW (distance cosinus)
CREATE TABLE embeddings (
    doc_id    BIGINT UNSIGNED PRIMARY KEY,
    titre     VARCHAR(255) NOT NULL,
    embedding VECTOR(1536) NOT NULL,
    VECTOR INDEX (embedding) M=8 DISTANCE=cosine
);

L’application calcule l’embedding avec le modèle choisi, puis le transmet sous forme textuelle. MariaDB le convertit en représentation binaire little-endian :

-- Le vecteur (sortie du modele d'embedding) est passe en texte JSON
INSERT INTO embeddings (doc_id, titre, embedding) VALUES
  (1, 'Facture 2026-001', VEC_FromText('[0.0123, -0.0457, 0.0891, ... ]')),
  (2, 'Devis Dupont',     VEC_FromText('[0.0210, -0.0330, 0.0774, ... ]'));

-- Verification du stockage binaire (little-endian float32)
SELECT HEX(VEC_FromText('[1,2,3]'));  -- => 0000803F0000004000004040

La requête kNN ordonne les lignes par distance. Le détail décisif est contractuel : l’index n’est utilisé que si la fonction du ORDER BY correspond à la distance déclarée sur l’index et si la requête est bornée par LIMIT k. Employer ici une distance euclidienne provoquerait un parcours complet.

-- Recherche des 5 documents les plus proches d'un vecteur de requete.
-- L'index mHNSW n'est exploite que si la distance du ORDER BY
-- correspond a celle declaree sur l'index (ici : cosine).
SELECT doc_id, titre,
       VEC_DISTANCE_COSINE(embedding, VEC_FromText('[0.0190, -0.0402, 0.0810, ... ]')) AS distance
FROM   embeddings
ORDER  BY VEC_DISTANCE_COSINE(embedding, VEC_FromText('[0.0190, -0.0402, 0.0810, ... ]'))
LIMIT  5;

VEC_DISTANCE_EUCLIDEAN, VEC_DISTANCE_COSINE et VEC_DISTANCE couvrent les métriques disponibles ; cette dernière reprend celle de l’index. Le paramètre mhnsw_ef_search ajuste la finesse de l’exploration, donc le compromis entre latence et rappel. Un enregistrement applicatif doit également conserver le modèle et ses paramètres :

{
  "doc_id": 1,
  "titre": "Facture 2026-001",
  "modele": "text-embedding-3-small",
  "dimensions": 1536,
  "distance": "cosine",
  "index": { "type": "mhnsw", "M": 8, "ef_search": 20 },
  "embedding": [0.0123, -0.0457, 0.0891, 0.0042, "... (1536 valeurs)"]
}

Une interface peut convertir la distance en indicateur, à condition de documenter la transformation et de ne pas présenter arbitrairement le score comme une probabilité :

{% set resultats = [
  { titre: "Facture 2026-001", score: 0.92 },
  { titre: "Devis Dupont",     score: 0.78 },
  { titre: "Bon de commande",  score: 0.64 }
] %}
Resultats de la recherche vectorielle :
{% for r in resultats %}
- {{ loop.index }}. {{ r.titre }} — pertinence {{ (r.score * 100)|number_format(0) }} %
{% endfor %}

Dans un système RAG, la base vectorielle joue le rôle de documentaliste. Elle ne rédige pas la réponse : elle sélectionne les passages susceptibles de l’étayer, que le grand modèle de langage reçoit ensuite comme contexte.

sequenceDiagram
    participant U as Utilisateur
    participant App
    participant Emb as Modele d'embedding
    participant DB as MariaDB VECTOR
    participant LLM
    U->>App: Question en langage naturel
    App->>Emb: Encoder la question
    Emb-->>App: Vecteur de 1536 nombres
    App->>DB: kNN VEC_DISTANCE_COSINE LIMIT k
    DB-->>App: Top-k documents pertinents
    App->>LLM: Question + documents (contexte)
    LLM-->>U: Reponse sourcee

Le RAG réduit les hallucinations sans les éliminer. Sa qualité dépend du découpage, du modèle d’embedding, du rappel de l’index et des consignes au LLM.

Atouts, inconvénients et limites

Atouts Limites et risques
Recherche sémantique (le sens, pas les mots) Fléau de la dimension (Bellman, 1957)
RAG : ancre le LLM sur des sources Vecteurs opaques : perte d’interprétabilité
Recommandation, déduplication, clustering Dérive : changer de modèle = tout ré-encoder
Détection d’anomalies Stockage lourd (≈ 6 Ko / vecteur en 1536 dims)
Index ANN : passage à l’échelle (millions de vecteurs) Biais hérités des données d’entraînement

Le « fléau de la dimension », expression forgée par Richard Bellman en 1957, décrit plusieurs phénomènes qui apparaissent lorsque les axes se multiplient. Le volume disponible croît démesurément, les données deviennent clairsemées et les distances tendent à se concentrer : le plus proche voisin ressemble de moins en moins nettement au « bon » voisin. Ajouter des dimensions n’est donc pas gratuitement synonyme de meilleure précision.

L’interprétabilité recule elle aussi. Dans un TF-IDF, chaque axe correspond à un terme ; dans un embedding neuronal, une coordonnée isolée n’a généralement aucun sens stable. Les audits doivent alors étudier les voisinages et les performances sur des jeux de tests plutôt que lire les dimensions une à une.

Le modèle fait en outre partie du schéma des données. Passer à un autre encodeur change la géométrie : anciens et nouveaux vecteurs ne sont pas comparables. Il faut versionner le modèle, ses dimensions, son prétraitement et sa métrique, puis ré-encoder tout le corpus et reconstruire l’index lors d’une migration.

Le stockage devient vite matériel : 1536\times4 octets représentent environ 6 Ko par vecteur ; 100 millions d’éléments approchent 600 Go, avant même l’index et les métadonnées. La quantification int8 divise environ ce poids par quatre, la représentation binaire par 32, tandis que PQ peut économiser autour de 97 %, au prix d’une perte de fidélité à mesurer.

Enfin, un embedding hérite des textes et des choix qui l’ont formé. Bolukbasi et ses coauteurs ont montré en 2016 que le biais de genre pouvait apparaître comme une direction de l’espace. En 2017, Caliskan, Bryson et Narayanan ont proposé dans Science le test WEAT, qui retrouve dans les associations vectorielles certains biais humains. La proximité mathématique n’est donc ni neutre ni nécessairement juste.

Une histoire de soixante ans

timeline
    title De l'index documentaire aux embeddings neuronaux
    1972 : IDF (Karen Sparck Jones)
    1975 : Vector Space Model (Salton, Cornell)
    2013 : Word2Vec (Google) - 300 dims
    2014 : GloVe (Stanford)
    2017 : Transformer - Attention is all you need
    2018 : BERT (Google) - 768 dims
    2022 : OpenAI ada-002 - 1536 dims
    2024 : text-embedding-3 (3072) et MariaDB Vector

La vectorisation documentaire précède de plusieurs décennies l’IA générative. Dans les années 1960, Gerard Salton développe à Cornell le système SMART et le Vector Space Model. Avec Wong et Yang, il le formalise en 1975 dans Communications of the ACM. Entre-temps, Karen Spärck Jones introduit en 1972 la composante IDF : les mots rares à l’échelle d’une collection sont plus discriminants.

Le basculement neuronal s’accélère en 2013. Chez Google, Tomas Mikolov et son équipe publient Word2Vec, avec CBOW et Skip-gram. Ses vecteurs canoniques de 300 dimensions popularisent l’arithmétique sémantique. En 2014, GloVe, conçu à Stanford par Pennington, Socher et Manning, exploite les cooccurrences globales et propose des tailles de 50 à 300 dimensions. FastText, développé par Bojanowski, Grave, Joulin et Mikolov chez Facebook AI Research en 2016-2017, représente les mots par n-grammes de caractères et sait ainsi traiter des termes inconnus.

En 2017, l’article de Google Attention Is All You Need, signé Vaswani et ses coauteurs, introduit le Transformer. Les représentations deviennent profondément contextuelles : en 2018, ELMo, de l’Allen Institute for AI, utilise des biLSTM pour tenir compte de la polysémie ; BERT, chez Google la même année, s’appuie sur le Transformer, avec 768 dimensions pour BERT-base et 1 024 pour BERT-large.

Sentence-BERT, proposé en 2019 par Reimers et Gurevych au UKP Lab de la TU Darmstadt, emploie des réseaux siamois pour comparer efficacement des phrases entières. OpenAI poursuit la montée en capacité avec ada-002 en décembre 2022, sur 1 536 dimensions, puis text-embedding-3 le 25 janvier 2024 : 1 536 dimensions pour small, jusqu’à 3 072 pour large. Leur entraînement par Matryoshka Representation Learning permet de raccourcir les vecteurs tout en conservant une part organisée de l’information.

En soixante ans, l’idée centrale n’a donc pas changé : représenter les objets par des coordonnées et rapprocher ceux qui partagent des propriétés. Ce qui a changé, c’est la richesse de la géométrie — et la vitesse à laquelle les bases de données savent désormais la parcourir.

Sources