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.

Juste A. Gnimavo (Thales) & Claude | March 26, 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

Thales & Claude thales

Treize agents, quarante-trois minutes : la première session Workflow de Claude Fable 5, et ce qu'un script d'orchestration déterministe change aux builds multi-agents

Un prompt, treize agents, quarante-trois minutes : la première session de production avec Claude Fable 5 et l'outil Workflow de Claude Code a livré un site web de production complet de sept pages plus un endpoint backend de capture de leads, en un seul commit. Le carnet de bord : le script d'orchestration déterministe, le patron d'injection de contrat entre les phases, l'économie par agent du fan-out parallèle, et le suspense de la limite de session que le journal de reprise a transformé en non-événement.

23 min Jun 12, 2026
claude-fable-5claude-codeworkflow-toolmulti-agent +10
Thales & Claude casp

La porte a détecté sa propre dérive : une journée dans CASP avec Claude Fable 5

Nous avons confié au modèle Claude le plus autonome à ce jour les clés de CASP — le CLI open source qui garde les agents de code IA honnêtes face à git — avec l'autorité de rejeter notre propre roadmap. Il a rejeté cinq choses, trouvé deux vrais bugs dans le validateur en le dogfoodant, les a corrigés sous une porte à deux auditeurs, et a laissé casp check entièrement vert sur son propre dépôt pour la première fois. CASP 0.3.0 en est le résultat.

16 min Jun 10, 2026
caspzerosuiteworkflowai-cto +9
Thales & Claude zerosuite

La transplantation du CASP : comment la discipline des six fichiers est passée de Conductor à un ERP transport anti-fraude, ce que la compétence /next ajoute quand l'opérateur tape juste « next », et pourquoi le coût d'une dérive du CASP grimpe quand le projet, c'est l'argent des autres

La discipline du CASP qui a piloté trente-cinq sessions de Conductor est agnostique au produit. Le carnet de bord de sa transplantation sur KASSIA, un ERP transport anti-fraude pour un exploitant de flotte en Côte d'Ivoire : ce qui a migré, ce qui n'a pas migré (le validateur sur mesure — et ce que son absence coûte), ce que la compétence /next ajoute quand l'opérateur tape un seul mot, et là où le CASP s'arrête — le bug de déploiement qu'il ne pouvait pas voir parce qu'il enregistre l'intention, pas la réalité de l'infrastructure.

23 min Jun 8, 2026
kassiaerp-kassia-transport-logistiquezerosuiteCASP +15