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.

Thales & Claude | March 30, 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