Introduction
Le semantic chunking dépasse le simple découpage par caractères ou tokens. Il regroupe les phrases selon leur signification grâce aux embeddings, améliorant la pertinence des contextes fournis aux LLM. En 2026, les systèmes RAG exigent une précision élevée pour éviter les hallucinations et optimiser les coûts de tokens. Cette approche utilise la similarité cosinus et des algorithmes de clustering pour créer des segments cohérents. Vous apprendrez à construire un pipeline complet, de l'extraction de texte à l'export des chunks optimisés. Chaque étape inclut des considérations de performance et de scalabilité adaptées aux environnements de production.
Prérequis
- Python 3.11+
- Connaissances solides en NLP et vector embeddings
- Accès à un GPU ou TPU pour les calculs intensifs
- Familiarité avec scikit-learn et sentence-transformers
Installation des dépendances
pip install sentence-transformers scikit-learn numpy pandasCette commande installe les bibliothèques essentielles pour générer des embeddings et effectuer du clustering sémantique. Évitez les versions obsolètes de scikit-learn qui peuvent causer des incompatibilités avec les matrices de similarité.
Chargement du modèle d'embeddings
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer('all-MiniLM-L6-v2')
def get_embeddings(sentences: list[str]) -> np.ndarray:
return model.encode(sentences, convert_to_numpy=True, normalize_embeddings=True)Le modèle all-MiniLM-L6-v2 offre un excellent compromis vitesse/qualité. La normalisation des embeddings facilite le calcul direct de la similarité cosinus sans division supplémentaire.
Calcul de la matrice de similarité
from sklearn.metrics.pairwise import cosine_similarity
def compute_similarity_matrix(embeddings: np.ndarray) -> np.ndarray:
return cosine_similarity(embeddings)Cette matrice capture les relations sémantiques entre toutes les paires de phrases. Elle sert de base pour identifier les frontières naturelles entre chunks.
Implémentation du chunking sémantique
import numpy as np
def semantic_chunking(sentences: list[str], embeddings: np.ndarray, threshold: float = 0.65) -> list[list[str]]:
sim_matrix = cosine_similarity(embeddings)
chunks = []
current_chunk = [sentences[0]]
for i in range(1, len(sentences)):
if sim_matrix[i-1, i] >= threshold:
current_chunk.append(sentences[i])
else:
chunks.append(current_chunk)
current_chunk = [sentences[i]]
chunks.append(current_chunk)
return chunksL'algorithme parcourt séquentiellement les phrases et coupe lorsque la similarité descend sous le seuil. Ajustez le threshold selon la densité sémantique de votre corpus.
Clustering hiérarchique avancé
from sklearn.cluster import AgglomerativeClustering
def hierarchical_semantic_chunking(embeddings: np.ndarray, n_clusters: int = 5) -> list[int]:
clustering = AgglomerativeClustering(n_clusters=n_clusters, metric='cosine', linkage='average')
return clustering.fit_predict(embeddings)Le clustering hiérarchique permet de créer des chunks de taille variable tout en respectant la structure sémantique globale du document. Idéal pour les textes longs et complexes.
Bonnes pratiques
- Toujours normaliser les embeddings avant calcul de similarité
- Tester plusieurs seuils sur un échantillon représentatif
- Conserver un minimum de 3 phrases par chunk pour préserver le contexte
- Monitorer la variance des tailles de chunks en production
- Versionner les modèles d'embeddings utilisés
Erreurs courantes à éviter
- Utiliser un seuil fixe sans validation sur le domaine métier
- Oublier de traiter les phrases très courtes qui faussent la similarité
- Ignorer la parallélisation lors du traitement de gros volumes
- Ne pas gérer les cas où tous les embeddings sont quasi-identiques
Pour aller plus loin
Approfondissez ces techniques avec nos formations Learni dédiées au RAG et au NLP avancé.