L'intégration d'abord, le regroupement ensuite : Récupération plus intelligente des RAG avec le découpage sémantique Max-Min
Lagénération augmentée par récupération (RAG) est devenue l'approche par défaut pour fournir un contexte et une mémoire aux applications d'IA - les agents d'IA, les assistants d'assistance à la clientèle, les bases de connaissances et les systèmes de recherche s'appuient tous sur elle.
Dans presque toutes les filières RAG, le processus standard est le même : prendre les documents, les diviser en morceaux, puis intégrer ces morceaux pour la recherche de similarités dans une base de données vectorielle comme Milvus. Comme le découpage se fait en amont, la qualité de ces morceaux a une incidence directe sur la qualité de la recherche d'informations par le système et sur la précision des réponses finales.
Le problème est que les stratégies de découpage traditionnelles découpent généralement le texte sans aucune compréhension sémantique. Le découpage à longueur fixe est basé sur le nombre de jetons et le découpage récursif utilise une structure de surface, mais ces deux stratégies ignorent toujours le sens réel du texte. En conséquence, les idées connexes sont souvent séparées, les lignes sans rapport sont regroupées et le contexte important est fragmenté.
Dans ce blog, j'aimerais vous faire part d'une stratégie de découpage différente : Le découpage sémantique Max-Min. Au lieu de procéder au découpage en premier, cette stratégie intègre le texte en amont et utilise la similarité sémantique pour décider où les limites doivent être formées. En intégrant le texte avant de le découper, le pipeline peut suivre les changements naturels de sens plutôt que de s'appuyer sur des limites de longueur arbitraires.
Fonctionnement d'un pipeline RAG type
La plupart des pipelines RAG, quel que soit le cadre, suivent la même chaîne de montage en quatre étapes. Vous en avez probablement déjà écrit une version vous-même :
1. Nettoyage et regroupement des données
Le pipeline commence par nettoyer les documents bruts : il supprime les en-têtes, les pieds de page, le texte de navigation et tout ce qui n'est pas du contenu réel. Une fois le bruit éliminé, le texte est divisé en petits morceaux. La plupart des équipes utilisent des morceaux de taille fixe - généralement de 300 à 800 tokens - car cela permet de gérer le modèle d'intégration. L'inconvénient est que les divisions sont basées sur la longueur, et non sur le sens, de sorte que les limites peuvent être arbitraires.
2. Intégration et stockage
Chaque morceau est ensuite intégré à l'aide d'un modèle d'intégration tel que celui d'OpenAI text-embedding-3-small ou l'encodeur de BAAI. Les vecteurs résultants sont stockés dans une base de données vectorielle telle que Milvus ou Zilliz Cloud. La base de données gère l'indexation et la recherche de similarités afin que vous puissiez rapidement comparer de nouvelles requêtes à tous les morceaux stockés.
3. Requête
Lorsqu'un utilisateur pose une question - par exemple, "Comment RAG réduit-il les hallucinations ?" - le système intègre la requête et l'envoie à la base de données. La base de données renvoie les K premiers morceaux dont les vecteurs sont les plus proches de la question. Ce sont les morceaux de texte sur lesquels le modèle s'appuiera pour répondre à la question.
4. Génération de réponses
Les morceaux récupérés sont regroupés avec la requête de l'utilisateur et introduits dans un LLM. Le modèle génère une réponse en utilisant le contexte fourni comme base.
Le découpage en morceaux se situe au début de toute cette chaîne, mais il a un impact considérable. Si les morceaux s'alignent sur le sens naturel du texte, la recherche est précise et cohérente. Si les morceaux ont été coupés à des endroits bizarres, le système a plus de mal à trouver la bonne information, même avec des enchâssements solides et une base de données vectorielle rapide.
Les défis d'une bonne segmentation
La plupart des systèmes RAG actuels utilisent l'une des deux méthodes de découpage de base, qui présentent toutes deux des limites.
1. Le découpage en morceaux de taille fixe
Il s'agit de l'approche la plus simple : diviser le texte en fonction d'un nombre fixe de jetons ou de caractères. Cette méthode est rapide et prévisible, mais elle ne tient absolument pas compte de la grammaire, des thèmes ou des transitions. Les phrases peuvent être coupées en deux. Parfois même des mots. Les encastrements que vous obtenez à partir de ces morceaux ont tendance à être bruyants parce que les limites ne reflètent pas la structure réelle du texte.
2. Découpage récursif des caractères
Cette méthode est un peu plus intelligente. Elle divise le texte de manière hiérarchique en se basant sur des indices tels que les paragraphes, les retours à la ligne ou les phrases. Si une section est trop longue, elle la divise de manière récursive. Le résultat est généralement plus cohérent, mais il reste incohérent. Certains documents manquent de structure claire ou présentent des sections de longueur inégale, ce qui nuit à la précision de la recherche. Et dans certains cas, cette approche produit encore des morceaux qui dépassent la fenêtre contextuelle du modèle.
Les deux méthodes sont confrontées au même compromis : précision contre contexte. Les petits morceaux améliorent la précision de la recherche mais perdent le contexte environnant ; les gros morceaux préservent le sens mais risquent d'ajouter du bruit non pertinent. Trouver le bon équilibre est ce qui rend le découpage à la fois fondamental et frustrant dans la conception des systèmes RAG.
Le découpage sémantique Max-Min : Intégrer d'abord, découper ensuite
En 2025, S.R. Bhat et al. ont publié Rethinking Chunk Size for Long-Document Retrieval : A Multi-Dataset Analysis. L'une de leurs principales conclusions est qu'il n'existe pas de taille de bloc "optimale" pour les RAG. Les petits morceaux (64-128 tokens) ont tendance à mieux fonctionner pour les questions factuelles ou de type recherche, tandis que les morceaux plus grands (512-1024 tokens) sont plus utiles pour les tâches narratives ou de raisonnement de haut niveau. En d'autres termes, le découpage en morceaux de taille fixe est toujours un compromis.
Cela soulève une question naturelle : au lieu de choisir une longueur et d'espérer que tout se passe au mieux, pourrions-nous procéder à un découpage en fonction de la signification plutôt que de la taille ? Le découpage sémantique Max-Min est une approche que j'ai trouvée et qui tente précisément de faire cela.
L'idée est simple : intégrer d'abord, découper ensuite. Au lieu de diviser le texte et d'intégrer ensuite les morceaux qui en résultent, l'algorithme intègre toutes les phrases dès le départ. Il utilise ensuite les relations sémantiques entre les phrases incorporées pour décider de l'emplacement des limites.
Diagramme illustrant le flux de travail “embed-first chunk-second” dans le cadre du découpage sémantique Max-Min
D'un point de vue conceptuel, la méthode traite le découpage comme un problème de regroupement contraint dans l'espace d'intégration. Vous parcourez le document dans l'ordre, une phrase à la fois. Pour chaque phrase, l'algorithme compare son intégration avec celles du bloc actuel. Si la nouvelle phrase est sémantiquement assez proche, elle rejoint le groupe. Si elle est trop éloignée, l'algorithme commence un nouveau bloc. La contrainte principale est que les morceaux doivent suivre l'ordre original des phrases - pas de réorganisation, pas de regroupement global.
Le résultat est un ensemble de morceaux de longueur variable qui reflètent l'endroit où le sens du document change réellement, et non l'endroit où un compteur de caractères arrive à zéro.
Fonctionnement de la stratégie de découpage sémantique Max-Min
Le découpage sémantique Max-Min détermine les limites des morceaux en comparant la façon dont les phrases sont liées les unes aux autres dans l'espace vectoriel à haute dimension. Au lieu de s'appuyer sur des longueurs fixes, il examine la manière dont le sens évolue dans le document. Le processus peut être décomposé en six étapes :
1. Intégrer toutes les phrases et commencer un bloc
Le modèle d'intégration convertit chaque phrase du document en une intégration vectorielle. Il traite les phrases dans l'ordre. Si les n premières phrases forment le bloc actuel C, la phrase suivante (sₙ₋ₖ₊₁) doit être évaluée : doit-elle rejoindre le bloc C ou commencer un nouveau bloc ?
2. Mesurer la cohérence du morceau actuel
Dans le bloc C, calculez la similarité cosinus minimale par paire entre tous les enchâssements de phrases. Cette valeur reflète le degré d'interdépendance des phrases au sein du bloc. Une similarité minimale plus faible indique que les phrases sont moins liées, ce qui suggère que le bloc doit être divisé.
3. Comparez la nouvelle phrase à l'ensemble
Ensuite, calculez la similarité maximale en cosinus entre la nouvelle phrase et toute phrase déjà présente dans C. Cette valeur reflète le degré d'alignement sémantique de la nouvelle phrase avec le bloc existant.
4. Décider s'il convient d'étendre le bloc ou d'en créer un nouveau.
Il s'agit de la règle de base :
Si la similarité maximale de la nouvelle phrase avec le bloc C est supérieure ou égale à la similarité minimale à l'intérieur de C, → La nouvelle phrase s'adapte et reste dans le bloc.
Sinon, → commencer un nouveau bloc.
Cela permet de s'assurer que chaque bloc conserve sa cohérence sémantique interne.
5. Ajuster les seuils au fur et à mesure que le document change
Pour optimiser la qualité des morceaux, des paramètres tels que la taille des morceaux et les seuils de similarité peuvent être ajustés dynamiquement. Cela permet à l'algorithme de s'adapter à des structures de documents et à des densités sémantiques variables.
6. Traiter les premières phrases
Lorsqu'un bloc ne contient qu'une seule phrase, l'algorithme traite la première comparaison en utilisant un seuil de similarité fixe. Si la similarité entre la phrase 1 et la phrase 2 est supérieure à ce seuil, elles forment un bloc. Dans le cas contraire, elles se séparent immédiatement.
Points forts et limites du découpage sémantique Max-Min
Le découpage sémantique Max-Min améliore la manière dont les systèmes RAG découpent le texte en utilisant le sens plutôt que la longueur, mais il ne s'agit pas d'une solution miracle. Voici un aperçu pratique de ce qu'il fait de bien et de ce qu'il ne fait pas encore.
Ce qu'il fait bien
Le découpage sémantique Max-Min améliore le découpage traditionnel de trois manières importantes :
1. Des limites de morceaux dynamiques, basées sur le sens
Contrairement aux approches basées sur la taille fixe ou la structure, cette méthode s'appuie sur la similarité sémantique pour guider le découpage. Elle compare la similarité minimale au sein du bloc actuel (degré de cohésion) à la similarité maximale entre la nouvelle phrase et ce bloc (degré d'adéquation). Si cette dernière est plus élevée, la phrase rejoint le bloc ; sinon, un nouveau bloc est créé.
2. Réglage simple et pratique des paramètres
L'algorithme ne dépend que de trois hyperparamètres principaux :
la taille maximale des morceaux,
la similarité minimale entre les deux premières phrases, et
le seuil de similarité pour l'ajout de nouvelles phrases.
Ces paramètres s'ajustent automatiquement en fonction du contexte : les morceaux plus grands nécessitent des seuils de similarité plus stricts pour maintenir la cohérence.
3. Faible surcharge de traitement
Étant donné que le pipeline RAG calcule déjà les enchâssements de phrases, le découpage sémantique Max-Min n'ajoute pas de calculs lourds. Tout ce dont il a besoin, c'est d'un ensemble de vérifications de la similarité des cosinus lors de l'analyse des phrases. Il est donc moins coûteux que de nombreuses techniques de regroupement sémantique qui nécessitent des modèles supplémentaires ou un regroupement en plusieurs étapes.
Ce qu'elle ne peut toujours pas résoudre
Le découpage sémantique Max-Min améliore les limites des morceaux, mais n'élimine pas tous les défis de la segmentation des documents. Étant donné que l'algorithme traite les phrases dans l'ordre et ne procède qu'à des regroupements locaux, il peut encore passer à côté de relations à longue portée dans des documents plus longs ou plus complexes.
La fragmentation du contexte est un problème courant. Lorsque des informations importantes sont réparties dans différentes parties d'un document, l'algorithme peut placer ces parties dans des morceaux distincts. Chaque morceau ne contient alors qu'une partie de la signification.
Par exemple, dans les notes de mise à jour de Milvus 2.4.13, comme indiqué ci-dessous, un bloc peut contenir l'identifiant de la version tandis qu'un autre contient la liste des fonctionnalités. Une requête telle que "Quelles sont les nouvelles fonctionnalités introduites dans Milvus 2.4.13 ?" dépend des deux. Si ces détails sont répartis entre différents morceaux, le modèle d'intégration peut ne pas les relier, ce qui affaiblit l'extraction.
-
Exemple montrant la fragmentation du contexte dans les notes de mise à jour de Milvus 2.4.13 avec l’identifiant de la version et la liste des fonctionnalités dans des morceaux distincts.
Cette fragmentation affecte également l'étape de génération du LLM. Si la référence de la version se trouve dans un morceau et les descriptions des caractéristiques dans un autre, le modèle reçoit un contexte incomplet et ne peut pas raisonner proprement sur la relation entre les deux.
Pour atténuer ces cas, les systèmes utilisent souvent des techniques telles que les fenêtres glissantes, le chevauchement des limites des morceaux ou les analyses à plusieurs passages. Ces approches réintroduisent une partie du contexte manquant, réduisent la fragmentation et aident l'étape d'extraction à conserver les informations connexes.
Conclusion
Le découpage sémantique Max-Min n'est pas une solution magique à tous les problèmes de RAG, mais il nous donne une façon plus raisonnable de penser aux limites des morceaux. Au lieu de laisser les limites de jetons décider de l'endroit où les idées sont découpées, il utilise les enchâssements pour détecter les endroits où le sens change réellement. Pour de nombreux documents du monde réel (API, spécifications, journaux, notes de mise à jour, guides de dépannage), cette approche peut à elle seule améliorer sensiblement la qualité de la recherche.
Ce qui me plaît dans cette approche, c'est qu'elle s'intègre naturellement dans les pipelines RAG existants. Si vous intégrez déjà des phrases ou des paragraphes, le coût supplémentaire se résume à quelques contrôles de similarité de cosinus. Vous n'avez pas besoin de modèles supplémentaires, d'un regroupement complexe ou d'un prétraitement lourd. Et lorsque cela fonctionne, les morceaux produits semblent plus "humains", plus proches de la façon dont nous regroupons mentalement les informations lorsque nous lisons.
Mais la méthode comporte encore des zones d'ombre. Elle ne perçoit le sens que localement et ne peut pas reconnecter des informations intentionnellement dispersées. Des fenêtres qui se chevauchent, des balayages en plusieurs passages et d'autres astuces de préservation du contexte sont encore nécessaires, en particulier pour les documents où les références et les explications sont éloignées les unes des autres.
Néanmoins, le découpage sémantique Max-Min nous fait avancer dans la bonne direction : nous nous éloignons du découpage arbitraire du texte et nous nous dirigeons vers des pipelines de recherche qui respectent réellement la sémantique. Si vous cherchez des moyens de rendre RAG plus fiable, cela vaut la peine d'expérimenter.
Vous avez des questions ou souhaitez aller plus loin dans l'amélioration des performances de RAG ? Rejoignez notre Discord et communiquez avec des ingénieurs qui construisent et mettent au point des systèmes de recherche réels tous les jours.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



