Exercices — Session 4 : RAG, donner de la mémoire au modèle
Programme : Applied AI — Yann Isola · Niveau intermédiaire Rappel : RAG = Retrieval-Augmented Generation, c’est-à-dire Génération Augmentée par la Récupération.
Exercice 1 — Stratégie de découpage (chunking) sur document réel
Durée : 10 minutes · Format : binômes · Matériel : papier ou éditeur de texte
Contexte
Vous devez ingérer le document suivant dans un système RAG d’entreprise. Votre travail : décider où couper, et justifier chaque choix.
Document à découper
Politique de remboursement des frais professionnels — v3.2 (mise à jour : mars 2026)
1. Principes généraux Tout collaborateur peut demander le remboursement des frais engagés dans le cadre de ses missions. Les demandes se font via l’outil NotaFrais dans un délai de 30 jours après la dépense. Passé ce délai, la demande est refusée sauf dérogation du manager.
2. Barèmes de remboursement
Type de frais Plafond Justificatif requis Repas (déplacement) 25 € / repas Ticket ou facture Hôtel (France) 130 € / nuit Facture nominative Hôtel (étranger) 180 € / nuit Facture nominative Kilomètres (véhicule perso) 0,52 € / km Relevé de trajet Ces plafonds sont révisés chaque année en janvier. Les dépassements exceptionnels doivent être validés avant la dépense par le responsable de service.
3. Cas particuliers Les invitations de clients suivent une procédure distincte : le formulaire REP-07 doit être joint à la demande, avec la liste nominative des invités. Le plafond est de 60 € par convive. Toute invitation dépassant 500 € au total requiert la validation du directeur commercial.
4. Contact Pour toute question : service comptabilité, comptes@exemple.fr, poste 4412.
Questions
- Proposez un découpage en chunks. Pour chaque chunk : indiquez son contenu (par numéros de section ou de paragraphe) et sa taille approximative.
- Justifiez : pourquoi ces frontières et pas d’autres ?
- Le tableau des barèmes : que faites-vous ? Pourquoi ?
- Métadonnées : listez au moins 4 métadonnées que vous attacheriez à chaque chunk, et donnez pour chacune un usage concret (filtrage, citation, sécurité…).
- Question piège : un utilisateur demande « quel est le plafond pour un hôtel à Berlin ? ». Quel(s) chunk(s) doivent sortir ? Votre découpage le permet-il ?
Corrigé indicatif
- Découpage recommandé (4 chunks) :
- Chunk A : Section 1 entière (principes généraux) — une unité de sens complète, ~80 tokens ⚠.
- Chunk B : Section 2 entière avec le tableau intact et son introduction + les deux phrases qui suivent (révision annuelle, dépassements) — le tableau et ses règles associées forment un tout, ~120 tokens ⚠.
- Chunk C : Section 3 (cas particuliers / invitations clients) — sujet distinct, ~90 tokens ⚠.
- Chunk D : Section 4 (contact) — très court ; acceptable de le fusionner avec le chunk C ou de le garder seul avec de bonnes métadonnées. Les deux réponses se défendent.
- Justification : découpe sur la structure (les titres de section), jamais au milieu d’une phrase ; chaque chunk est autonome — compréhensible sans lire les autres. Le document est court : inutile de viser 800 tokens, on privilégie l’unité de sens.
- Tableau : jamais coupé. Une ligne « 130 € / nuit | Facture nominative » séparée de son en-tête et de la colonne « Type de frais » est inexploitable. On garde le tableau entier dans un seul chunk, avec la phrase d’introduction. Astuce avancée : préfixer le chunk d’un résumé (« Barèmes de remboursement des frais : repas, hôtel, kilomètres »).
- Métadonnées attendues :
source(Politique de remboursement v3.2) → citation dans la réponse ;section(1, 2, 3, 4) → citation précise ;date(mars 2026) → filtrage des versions périmées ;version(3.2) → détection de doublons entre versions ;niveau_acces(tous collaborateurs) → filtrage de sécurité à la récupération ;type(politique interne / RH-finance) → filtrage thématique. - « Hôtel à Berlin » doit sortir le chunk B (barèmes, ligne « Hôtel (étranger) : 180 € »). Piège : « Berlin » n’apparaît nulle part dans le document — c’est l’embedding qui doit rapprocher « Berlin » de « étranger ». Si le tableau a été coupé de son contexte, la récupération échoue. C’est exactement le genre de cas qui justifie de garder tableau + contexte ensemble.
Exercice 2 — Conception complète d’un pipeline RAG ⭐ (exercice central)
Durée : 25 minutes · Format : groupes de 3–4 · Matériel : grande feuille ou document partagé
Contexte
Vous êtes l’équipe chargée de concevoir « AssistDoc », un assistant interne pour le support client d’un éditeur de logiciels. Corpus disponible :
- 450 fiches produit (formats hétérogènes, certaines avec tableaux de compatibilité) ;
- 1 200 tickets de support résolus (question client + réponse de l’agent) ;
- 1 manuel utilisateur de 300 pages (PDF structuré en chapitres et sections) ;
- 80 notes de version (changelogs) datées, dont certaines contredisent les fiches produit anciennes ;
- 1 base de codes d’erreur : 600 codes du type
ERR-4471avec leur explication.
Les agents du support poseront des questions comme : « Le client a l’erreur ERR-4471 sur la version 12.3, que faire ? » ou « Est-ce que le module export est compatible avec le SSO ? » (SSO = Single Sign-On, authentification unique).
Votre mission — concevez le pipeline en répondant aux 6 volets
Volet 1 — Ingestion. Dessinez le pipeline d’ingestion (hors ligne) de bout en bout : quelles étapes, dans quel ordre, pour quels documents ?
Volet 2 — Chunking différencié. Le même découpage pour les 5 types de documents serait une erreur. Proposez une stratégie par type de document (taille, frontières, cas des tableaux, cas des tickets question/réponse, cas des codes d’erreur).
Volet 3 — Métadonnées. Définissez le schéma de métadonnées : quels champs, et pour quel usage (filtrage, citation, gestion des contradictions entre changelogs et fiches anciennes) ?
Volet 4 — Requête. Dessinez le pipeline de requête (en ligne) pour la question « Le client a l’erreur ERR-4471 sur la version 12.3, que faire ? ». Pourquoi une recherche purement vectorielle risque-t-elle d’échouer sur cette question précise ? Que proposez-vous ?
Volet 5 — Cadrage du prompt. Rédigez l’instruction système que vous donneriez au modèle au moment de la génération (3–5 lignes), en incluant : la restriction au contexte fourni, l’exigence de citations, et le comportement en cas d’absence de réponse.
Volet 6 — Plan de test. Proposez 3 questions de test qui vérifieraient chacune un risque différent (une pour les codes exacts, une pour les contradictions de version, une pour l’absence d’information).
Corrigé indicatif
Volet 1. Collecte → conversion en texte propre (PDF → texte, en conservant la structure des titres et des tableaux) → découpage en chunks selon la stratégie du volet 2 → attachement des métadonnées → calcul de l’embedding de chaque chunk (le sens devient géométrie) → indexation dans la base vectorielle + index lexical (mots-clés) en parallèle. Ré-ingestion planifiée à chaque nouvelle note de version.
Volet 2.
- Fiches produit : 1 fiche = 1 à 3 chunks, découpe sur les sections ; tableaux de compatibilité entiers, jamais coupés.
- Tickets résolus : 1 ticket = 1 chunk (la paire question/réponse est l’unité de sens ; séparer la question de sa réponse détruit la valeur). Filtrer les tickets de mauvaise qualité avant ingestion.
- Manuel 300 pages : découpe sur la hiérarchie chapitre → section → sous-section, chunks de 300–800 tokens ⚠ avec chevauchement de 10–20 % ⚠ ; préfixer chaque chunk de son fil d’Ariane (« Chapitre 4 > Export > Formats supportés ») pour qu’il reste autonome.
- Notes de version : 1 note = 1 chunk si courte ; découpe par rubrique sinon ; la date et le numéro de version en métadonnées obligatoires.
- Codes d’erreur : 1 code = 1 chunk (petit, autonome), avec le code lui-même répété dans le texte et en métadonnée.
- Toute réponse qui applique une taille unique à tout le corpus doit être challengée au débrief.
Volet 3. source_type (fiche / ticket / manuel / changelog / code_erreur), produit, version_produit, date, chapitre_section, code_erreur (si applicable), qualite (pour les tickets). Usages : filtrer par version (« ne récupérer que les documents ≤ 12.3 » ou privilégier les plus récents), citer la source exacte dans la réponse, résoudre les contradictions en donnant priorité au changelog le plus récent — règle exprimable grâce à date + source_type.
Volet 4. Question → embedding → recherche vectorielle top-k + recherche par mots-clés sur ERR-4471 (et filtre métadonnée version_produit) → fusion des résultats → assemblage du prompt → génération. Risque du vectoriel pur : ERR-4471 est une chaîne arbitraire sans contenu sémantique ; son embedding est quasi indistinguable de celui d’ERR-4472. La recherche lexicale (exacte) trouve le bon code à coup sûr → recherche hybride indispensable ici.
Volet 5. Exemple attendu :
« Tu es l’assistant du support client. Réponds uniquement à partir des extraits fournis ci-dessous. Cite systématiquement la source de chaque affirmation (nom du document et section). Si les extraits ne contiennent pas la réponse, réponds : “Je ne trouve pas cette information dans la documentation fournie” et suggère de reformuler ou de vérifier le document source. En cas de contradiction entre deux extraits, privilégie le plus récent et signale la contradiction. »
Volet 6. Exemples :
- Code exact : « Que signifie ERR-4471 ? » → vérifie que l’hybride retrouve le bon code (et pas ERR-4417).
- Contradiction : « Le module export est-il compatible SSO ? » quand une fiche de 2024 dit non et le changelog 12.2 dit oui → vérifie la priorité au plus récent et le signalement.
- Absence : « Quelle est la politique tarifaire pour les ONG ? » (absente du corpus) → vérifie le refus élégant au lieu d’une invention.
Exercice 3 — Autopsie d’un RAG qui échoue
Durée : 15 minutes · Format : individuel puis mise en commun
Contexte
Vous auditez le RAG interne d’une entreprise. Pour chaque incident ci-dessous, on vous donne : la question, les chunks récupérés (résumés), et la réponse générée. Diagnostiquez : la faute est-elle à la récupération ou à la génération ? Que corriger ?
Incident A
- Question : « Quel est le délai de rétractation pour un contrat signé en ligne ? »
- Chunks récupérés : [1] procédure de signature électronique ; [2] archivage des contrats ; [3] modèle d’e-mail de relance commerciale.
- Réponse : « Le délai de rétractation est de 14 jours. » (exact en droit français, mais absent des chunks)
Incident B
- Question : « Quelle est la procédure d’escalade pour l’incident P1 ? »
- Chunks récupérés : [1] définition des priorités P1–P4 ; [2] procédure d’escalade P1 complète ; [3] annuaire d’astreinte.
- Réponse : « En cas de P1, prévenez votre manager sous 4 heures. » (le chunk 2 dit : sous 15 minutes, l’astreinte, pas le manager)
Incident C
- Question : « Combien de jours de congé paternité chez nous en 2026 ? »
- Chunks récupérés : [1] accord congés 2022 (28 jours) ; [2] page intranet 2021 ; [3] FAQ RH 2022.
- Réponse : « 28 jours, selon l’accord congés. » (un avenant 2025 porte le congé à 32 jours ; il n’a jamais été ingéré)
Incident D
- Question : « Le produit AlphaSync gère-t-il la norme ISO 27001 ? » (ISO = Organisation internationale de normalisation)
- Chunks récupérés : [1] fiche AlphaSync — sécurité ; [2] fiche BetaSync — certifications (mentionne ISO 27001) ; [3] communiqué de presse générique.
- Réponse : « Oui, AlphaSync est certifié ISO 27001. » (c’est BetaSync qui l’est)
Questions
- Pour chaque incident : récupération ou génération ? Justifiez en une phrase.
- Pour chaque incident : une action corrective concrète.
- Question de synthèse : quel réflexe systématique de débogage ces quatre cas illustrent-ils ?
Corrigé indicatif
Incident A — Récupération défaillante + cadrage absent. Les chunks sont hors sujet ; le modèle a répondu depuis sa mémoire interne (la réponse est juste par chance, mais le système est incontrôlable). Corrections : améliorer la récupération (le document juridique pertinent est-il indexé ? le découpage est-il bon ?) et ajouter l’instruction « réponds uniquement à partir du contexte » — sans elle, on ne peut pas distinguer une réponse sourcée d’une réponse inventée.
Incident B — Génération défaillante. La récupération a parfaitement fonctionné (le chunk 2 contient la bonne procédure) ; le modèle a mal restitué. C’est le cas le plus rare mais il existe. Corrections : renforcer le prompt (exiger la citation textuelle de la procédure), tester un modèle plus capable, réduire le bruit dans le contexte (le chunk 3 était-il utile ?).
Incident C — Récupération défaillante : document manquant. Le modèle a correctement utilisé les chunks fournis — qui étaient tous périmés. Aucun modèle ne peut retrouver un avenant jamais ingéré. Corrections : processus de mise à jour de l’index (ré-ingestion à chaque nouvel accord) ; métadonnée date + privilégier les documents récents ; alerte sur l’âge des sources citées.
Incident D — Récupération partiellement défaillante + génération fautive. La récupération a mélangé deux produits (chunk BetaSync récupéré pour une question AlphaSync) et le modèle a fusionné les informations sans distinguer les sources. Corrections : métadonnée produit + filtrage à la récupération ; instruction de génération exigeant d’attribuer chaque affirmation à sa source ; test de non-confusion entre produits aux noms proches.
Synthèse attendue : avant d’accuser le modèle, toujours inspecter les chunks récupérés. Trois incidents sur quatre viennent de la récupération (hors sujet, périmée, ou mal filtrée). Le débogage d’un RAG commence côté récupération : les bons documents sont-ils dans l’index, bien découpés, bien filtrés, et effectivement récupérés ?