Back to flin
flin

Stratégies de découpage de texte

Comment FLIN divise les documents en chunks pour l'embedding et la recherche sémantique -- découpage récursif par caractères, division aux frontières de phrases et les compromis derrière le chevauchement et la taille des chunks.

Thales & Claude | March 30, 2026 3 min flin
EN/ FR/ ES
flinchunkingragtext-processingembeddings

Les modèles d'embedding ont des fenêtres de contexte. Les meilleurs modèles open source acceptent 512 tokens. Certains en acceptent 8 192. Aucun n'en accepte 50 000. Quand un utilisateur téléverse un PDF de 50 pages, vous ne pouvez pas intégrer le document entier comme un seul vecteur.

Le découpage résout cela en divisant les documents en morceaux qui tiennent dans la fenêtre de contexte du modèle d'embedding. Mais le découpage n'est pas juste « diviser tous les N caractères ». Un mauvais découpage détruit le sens.

La session 221 a implémenté le module de découpage de FLIN : le pont entre l'extraction de documents et la génération d'embeddings. Vingt tests, 400 lignes de Rust et deux stratégies de découpage.

Le struct Chunk

Chaque chunk porte des métadonnées sur sa position dans le document original :

rust#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Chunk {
    pub text: String,          // Le contenu du chunk
    pub index: usize,          // Position dans la séquence de chunks
    pub start_offset: usize,   // Décalage caractère dans le texte original
    pub end_offset: usize,     // Décalage caractère dans le texte original
    pub total_chunks: usize,   // Nombre total de chunks
}

Les décalages permettent l'attribution de source. Quand la recherche sémantique retourne un chunk, l'application peut mettre en surbrillance le passage exact dans le document original.

Découpage récursif par caractères

La stratégie principale divise le texte aux frontières de caractères avec taille de chunk et chevauchement configurables. La configuration par défaut est de 1 000 caractères par chunk avec 200 caractères de chevauchement.

Pourquoi les caractères, pas les tokens

La taille des chunks est mesurée en caractères, pas en tokens. C'est un choix délibéré. Les nombres de tokens dépendent du tokeniseur, qui dépend du modèle. Le dimensionnement basé sur les caractères est indépendant du modèle.

Sécurité UTF-8

La fonction utilise chars().count() au lieu de len() et indexe dans un Vec<char> plutôt que des tranches d'octets. C'est critique pour le contenu multilingue -- les documents français avec accents, les documents japonais avec kanji multi-octets sont tous découpés correctement.

Découpage aux frontières de phrases

La seconde stratégie divise aux frontières de phrases, produisant des chunks plus cohérents sémantiquement car chaque chunk contient des phrases complètes. Meilleur pour la prose -- articles, documents juridiques, essais.

Chevauchement : pourquoi c'est important

Le chevauchement (200 caractères par défaut) s'assure que les concepts divisés aux frontières de chunks sont toujours capturés dans au moins un chunk. Le compromis est le stockage -- environ 20 % de chunks et d'embeddings en plus -- mais l'amélioration de qualité en vaut la peine.

Connexion au pipeline

Dans le code d'application FLIN, le découpage est typiquement invisible. Le type de champ semantic text déclenche le découpage et l'embedding automatiques quand un document est sauvegardé :

flinentity KnowledgeArticle {
    title: text
    content: semantic text
}

article = KnowledgeArticle.create({
    title: "Introduction au SYSCOHADA",
    content: extracted_text  // Depuis document_extract()
})
save article
// Automatiquement : découper -> embedder -> stocker les vecteurs

Ceci est la partie 130 de la série « Comment nous avons construit FLIN », documentant comment un CEO à Abidjan et un CTO IA ont conçu et construit un langage de programmation à partir de zéro.

Navigation de la série : - [129] Grants de téléchargement et clés d'accès - [130] Stratégies de découpage de texte (vous êtes ici) - [131] Intégration chunk-embedding

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles