Semantic Chunking
Le découpage sémantique divise les documents aux changements de sujet, mesurés par la similarité des plongements entre phrases voisines, afin que chaque segment contienne une seule idée.
Le découpage sémantique divise les documents en segments destinés à la génération augmentée par récupération (RAG) et à la recherche, aux endroits où le sujet change. Ces points sont détectés en comparant les incorporations vectorielles de phrases voisines, plutôt qu’en découpant tous les nombres fixes de caractères ou de jetons. Chaque segment porte ainsi sur une seule idée, que son vecteur unique dans la base de données vectorielle représente bien ; un segment récupéré fournit au grand modèle de langage (LLM) une pensée complète, plutôt que la fin d’une section et le début de la suivante.
Fonctionnement du découpage sémantique#
L’algorithme courant, popularisé par les tutoriels de Greg Kamradt sur le découpage de texte et implémenté sous le nom de SemanticChunker dans LangChain, comporte quatre étapes. Le texte est divisé en phrases, puis chaque phrase est convertie en vecteur, souvent en regroupant ses voisines afin de réduire le bruit. La similarité cosinus entre chaque paire de phrases consécutives est convertie en distance. Un seuil marque les points de coupure où la distance est inhabituellement élevée : LangChain utilise par défaut le 95e centile de toutes les distances du document et propose aussi des seuils fondés sur l’écart-type, l’écart interquartile et le gradient. Les phrases situées entre les points de coupure forment un segment. Le séparateur sémantique de LlamaIndex utilise le même seuil de coupure par centile.
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
"The XR-12 coolant pump circulates water through the press line.",
"Inspect the XR-12 pump seals for leaks every week.",
"A worn pump bearing grinds loudly before it fails.",
"The staff cafeteria now opens for breakfast at 7:00.",
"The cafeteria menu adds vegetarian lunches in May.",
]
# Distance cosinus entre chaque phrase et la suivante
embeddings = model.encode(sentences, normalize_embeddings=True)
distances = 1 - np.sum(embeddings[:-1] * embeddings[1:], axis=1)
# Commence un nouveau segment lorsque la distance dépasse le 95e centile
threshold = np.percentile(distances, 95)
chunks = [[sentences[0]]]
for sentence, distance in zip(sentences[1:], distances):
if distance > threshold:
chunks.append([])
chunks[-1].append(sentence)
print(np.round(distances, 2))
print(*[" ".join(chunk) for chunk in chunks], sep="\n")Les distances entre phrases voisines sont de 0,56, 0,64, 0,98 et 0,62 ; le seul point de coupure se situe donc au saut de 0,98 entre le roulement de la pompe et la cafétéria. Le résultat comprend un segment de trois phrases sur la pompe XR-12 et un segment de deux phrases sur la cafétéria.
Comparaison des stratégies de découpage#
- Découpage en blocs de taille fixe : Divise le texte tous les N jetons, généralement avec un certain chevauchement entre les blocs voisins. Cette méthode est rapide et prévisible, mais ignore les limites thématiques.
- Découpage récursif : Divise le texte aux sauts de paragraphe, puis de ligne, puis de phrase, jusqu’à ce que chaque morceau respecte une limite de taille. LangChain recommande son séparateur récursif de caractères pour les textes génériques.
- Découpage tenant compte de la structure : Suit les titres, les sections Markdown, les éléments HTML ou la mise en page d’un PDF.
- Découpage sémantique : Suit les changements de sens, au prix du calcul de l’incorporation de chaque phrase lors de l’indexation et de tailles de segments très variables ; c’est pourquoi les implémentations imposent des longueurs minimales et maximales.
- Découpage tardif et récupération contextuelle : Ces méthodes remédient au manque de contexte d’un segment par rapport au reste de son document — par exemple, lorsqu’un pronom renvoie à un élément d’un segment antérieur — et se combinent avec toutes les méthodes de délimitation ci-dessus.
Le découpage en actions en robotique n’a que son nom en commun : une politique y prédit une séquence de commandes motrices futures comme une seule unité.
Le découpage sémantique au-delà du texte#
Les transcriptions issues des systèmes de reconnaissance vocale n’ont pas de sauts de paragraphe ; les points de coupure fondés sur les incorporations vectorielles sont donc courants pour détecter le changement de sujet d’une réunion ou d’un podcast. Les vidéos peuvent elles aussi être découpées selon leur contenu, de façon à ce que chaque clip montre un événement pour la compréhension vidéo ou la RAG multimodale, plutôt qu’un extrait arbitraire de 10 secondes. Ultralytics YOLO26 fournit de telles limites pour les scènes comportant des personnes et des véhicules : le mode suivi attribue à chaque objet détecté un ID persistant d’une image à l’autre ; un pipeline peut donc ouvrir un clip lorsqu’un nouvel ID entre dans la scène et le fermer lorsque tous les ID suivis en sont sortis.
Le découpage sémantique améliore-t-il la récupération ?#
Les limites thématiques sont surtout utiles lorsque des sujets sans lien se côtoient sans titres, comme dans les transcriptions, les pages Web récupérées et les notes concaténées. Les segments sémantiques dépendent aussi du modèle d’incorporation et du seuil ; un même document est donc découpé différemment si l’un ou l’autre change, et les deux doivent être réglés en fonction du rappel obtenu sur des requêtes réelles. L’étude Le découpage sémantique vaut-il son coût de calcul ? (2024) a comparé le découpage sémantique et le découpage en blocs de taille fixe pour la récupération de documents, la récupération de preuves et la génération de réponses fondée sur la récupération. Elle a constaté que le surcroît de calcul du découpage sémantique n’apportait pas de gains constants par rapport aux blocs de taille fixe.










