Back to flin
flin

Découpage conscient du code pour le RAG

Comment la fonction chunk_text() de FLIN divise les documents en segments appropriés pour l'embedding tout en respectant les frontières de paragraphes, les blocs de code, les titres et la cohérence sémantique.

Juste A. Gnimavo (Thales) & Claude | March 26, 2026 4 min flin
EN/ FR/ ES
flinchunkingragcodeai

Les modèles d'embedding ont une fenêtre de contexte fixe. La plupart des modèles acceptent 512 tokens (environ 400 mots). Certains acceptent 8 192 tokens. Aucun n'accepte un document entier de 50 pages en entrée. Pour intégrer un long document, vous devez le diviser en chunks qui tiennent dans la fenêtre de contexte du modèle.

Le découpage naïf -- diviser tous les 500 caractères sans tenir compte du contenu -- produit de terribles embeddings. Un chunk qui commence au milieu d'une phrase et se termine au milieu d'un bloc de code n'a pas de sens cohérent. L'embedding est une moyenne floue de deux sujets sans rapport.

La fonction chunk_text() de FLIN est consciente de la structure du document. Elle divise le texte aux frontières sémantiques : sauts de paragraphe, frontières de titres, délimiteurs de blocs de code et fins de phrases. Le résultat est des chunks qui représentent chacun une seule idée cohérente.

La fonction chunk_text()

flinchunks = chunk_text(text, {
    max_size: 500,        // Taille maximale par chunk en caractères
    overlap: 50,          // Caractères de chevauchement entre chunks
    strategy: "semantic"  // "fixed", "paragraph", "semantic", "code"
})

Stratégies de découpage

Taille fixe

La stratégie la plus simple. Divise aux frontières exactes de caractères. À utiliser uniquement pour du texte non structuré sans titres, blocs de code ou frontières de paragraphe claires.

Conscient des paragraphes

Divise aux frontières de paragraphe (doubles sauts de ligne), en gardant les paragraphes intacts quand possible.

Sémantique (par défaut)

La stratégie la plus sophistiquée. Respecte les titres, paragraphes, listes et frontières sémantiques naturelles. Suit une hiérarchie de priorité :

  1. Ne jamais diviser au milieu d'un bloc de code. Un extrait de code est atomique.
  2. Préférer diviser aux titres. Un titre marque le début d'un nouveau sujet.
  3. Préférer diviser aux frontières de paragraphe.
  4. Préférer diviser aux frontières de phrase.
  5. En dernier recours, diviser aux frontières de mots.

Conscient du code

Une stratégie spécialisée pour le code source et la documentation technique avec beaucoup de code. Reconnaît les définitions de fonctions, les définitions de classes/structures, les blocs d'imports et les commentaires.

Chevauchement entre chunks

Les chunks peuvent se chevaucher pour s'assurer que l'information aux frontières des chunks n'est pas perdue. Le chevauchement (50 caractères par défaut) signifie qu'une requête portant sur une phrase qui enjambe la frontière correspondra aux deux chunks.

Le compromis est le stockage. Un chevauchement de 200 caractères signifie environ 20 % de chunks et d'embeddings en plus. Pour la plupart des applications, ce coût est négligeable comparé à l'amélioration de la qualité des résultats de recherche.

Exemple pratique : indexer un site de documentation

flin// Indexation par lot de toute la documentation
docs_dir = ".flindb/documents/"
files = list_files(docs_dir)

total_chunks = 0

for file_path in files {
    parsed = parse_document(file_path)

    doc = Document {
        title: parsed.metadata.title || file_name(file_path),
        file_path: file_path,
        format: parsed.format,
        full_text: parsed.text
    }
    save doc

    chunks = chunk_text(parsed.text, {
        max_size: 500,
        overlap: 50,
        strategy: if file_path.ends_with(".md") { "code" } else { "semantic" }
    })

    for chunk in chunks {
        save DocumentChunk {
            document_id: doc.id,
            content: chunk.text,     // semantic text -- auto-embedded
            position: chunk.position,
            chunk_index: chunk.index
        }
    }

    total_chunks = total_chunks + chunks.len
    log_info("Indexé {file_path}: {chunks.len} chunks")
}

log_info("Total: {files.len} documents, {total_chunks} chunks")

Le découpage est le pont entre les documents bruts et les embeddings recherchables. Si vous le faites mal, votre système RAG retourne des résultats non pertinents quel que soit la qualité du modèle d'embedding ou du LLM. Si vous le faites bien, chaque chunk représente un morceau de connaissance focalisé et récupérable.

Dans le prochain article, nous explorons la recherche hybride de documents -- combinant la recherche par mots-clés BM25 avec la recherche sémantique pour le meilleur des deux mondes.


Ceci est la partie 122 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 : - [121] Analyse de documents : PDF, DOCX, CSV, JSON, YAML - [122] Découpage conscient du code pour le RAG (vous êtes ici) - [123] Recherche hybride de documents : BM25 + sémantique - [124] Conception d'un langage IA-first

Share this article:

Responses

Write a response
0/2000
Loading responses...

Related Articles

Thales & Claude zerosuite

Ça marche, et ce n'est pas fini

Le dirigeant a parcouru lui-même tous les canaux de senndo — cinq canaux, à l'unité et en campagne, l'import, les statistiques, un remboursement, l'API — et tout a répondu. Le fichier de pilotage disait toujours non, et la seule ligne qui bloquait n'était pas du code : c'était un document qui avait discrètement cessé d'être vrai. Quatre affirmations vraies à l'écriture et fausses à la lecture, et les gardes lisibles par une machine qui attrapent désormais chacune de ces formes.

13 min Sep 14, 2026
senndocpaaslaunch-readinessdocumentation +8
Thales & Claude zerosuite

Le navigateur entre les mains de Claude : piloter le Chrome du dirigeant

Claude-in-Chrome permet à une session Claude Code de piloter le vrai navigateur du dirigeant — même profil, mêmes sessions ouvertes. Ce que l'outil fait réellement, pourquoi il vaut mieux que de demander à un humain de cliquer et de rapporter, et où l'humain garde l'avantage. Ancré dans le jour où Claude a conduit un parcours client complet dans la console de production de senndo, messages facturés compris.

9 min Aug 18, 2026
claude-in-chromebrowser-automationclaude-codeclaude-fable-5 +9
Thales & Claude deblo

Le segfault qui n'était pas le nôtre : livrer le tracking du jour de lancement de Déblo la nuit du lancement — analytics conditionnées par l'environnement, attribution native des stores, trois bugs que le compilateur ne pouvait pas voir, et un build à court de mémoire que nous avons diagnostiqué au lieu de le rétablir

Le 1er juillet 2026 — jour de lancement — le risque n'a jamais été le texte. C'était les campagnes payantes qui partaient à l'aveugle. Voici le build-log de la livraison des analytics et de l'attribution d'installation de Déblo sous forme de code, la nuit du lancement : des tags GA4, Meta et LinkedIn conditionnés par l'environnement, qui se déploient sans risque avant même que les comptes publicitaires existent ; une attribution routée par les canaux natifs des stores plutôt que par le pixel web ; un audit adverse qui a attrapé trois bugs que le typecheck et le build passaient tous les deux ; et un déploiement Easypanel qui a segfaulté au premier build — que nous avons prouvé ne pas venir de notre code avant d'en changer une seule ligne.

18 min Jul 1, 2026
deblolaunch-dayclaude-opus-4.8claude-code +26