Le cas d'usage et l'architecture
Le problème
Atelier Nova (entreprise fictive) a trois PDF : un guide d'accueil, une politique de télétravail, une procédure de notes de frais. Si l'on pose la question « combien de jours de télétravail ? » directement à Gemini, il répondra quelque chose de plausible… mais il n'a jamais lu vos documents. Il risque d'halluciner, c'est-à-dire d'inventer une réponse crédible et fausse.
Le RAG règle ce problème en deux temps :
- Récupérer (retrieve) les passages de vos documents qui parlent de la question ;
- Générer une réponse en donnant ces passages au modèle, avec la consigne de ne rien ajouter.
sequenceDiagram participant U as Utilisateur participant R as rag.py participant DB as index.db participant G as Gemini U->>R: "Combien de jours de télétravail ?" R->>G: embedding de la question R->>DB: lit tous les vecteurs R->>R: top-k par similarité cosinus R->>G: extraits + question + consigne de citer G-->>U: "2 jours [politique-teletravail.pdf p. 1]"
Les cinq briques
| Brique | Rôle | Outil dans ce lab | Alternative plus tard |
|---|---|---|---|
| Extraction | transformer le PDF en texte, page par page | pypdf | OCR (Document AI) pour les scans |
| Découpage (chunking) | couper le texte en morceaux de taille raisonnable | fonction chunk() maison | découpage par structure (lab 3) |
| Embeddings | transformer chaque morceau en vecteur | gemini-embedding-2, 768 dimensions | autre dimension (128 à 3072) |
| Index | stocker texte + page + vecteur | SQLite (fichier unique) | sqlite-vec, FAISS, Vector Search |
| Génération | rédiger la réponse citée | gemini-3.5-flash | gemini-3.5-flash-lite pour le volume |
Pourquoi le RAG réduit-il les hallucinations sur des documents internes ?
Le RAG ne modifie pas le modèle : il lui donne le bon contexte au moment de la question. C'est moins cher qu'un réentraînement et les documents peuvent changer à tout moment.
Générer le corpus
Les PDF sont fictifs et produits par un script avec reportlab (une bibliothèque qui écrit des PDF). Chaque document est une liste de pages, chaque page un titre et des paragraphes :
rl_config.invariant = 1 # PDF identiques octet pour octet d'une génération à l'autre (pas de date)
DOCS = {
"politique-teletravail.pdf": [
("Politique de télétravail", [
"Tout salarié en CDI ayant terminé sa période d'essai peut demander à télétravailler. ...",
"Le télétravail est limité à 2 jours par semaine. Le mardi est un jour de présence obligatoire ...",
]),
("Équipement et indemnité", [...]),
],
...
}La ligne rl_config.invariant = 1 compte : sans elle, reportlab écrit la date de création dans le PDF, donc deux générations du même contenu donneraient deux fichiers différents. Notre réindexation incrémentale (leçon suivante) compare l'empreinte des fichiers : elle croirait à tort que tout a changé.
Le script complet : make_pdfs.py.
cd files
python -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # puis mettez votre clé dans .env
python make_pdfs.py # écrit docs/*.pdfQue se passerait-il si les PDF contenaient leur date de génération et qu'on les régénérait sans changer le texte ?
Le SHA-256 est calculé sur les octets du fichier. Une date différente suffit à changer les octets, donc l'empreinte, donc à déclencher une réindexation (et des appels d'API) pour rien.
Exercice : ajouter un document
Ajoutez au dictionnaire DOCS un quatrième PDF charte-informatique.pdf d'une page, qui dit que les clés USB personnelles sont interdites. Régénérez le corpus.
Voir la solution
"charte-informatique.pdf": [
("Charte informatique", [
"Les clés USB personnelles sont interdites sur les postes de l'entreprise. "
"Utilisez l'espace de partage interne pour échanger des fichiers.",
]),
],Puis python make_pdfs.py. Les trois PDF existants sont réécrits à l'identique (même hash) grâce à invariant = 1 : seul le nouveau sera indexé à la leçon suivante.
Résultat obtenu
Exécution du 2026-10-15 :
$ python make_pdfs.py
écrit docs/guide-accueil.pdf
écrit docs/politique-teletravail.pdf
écrit docs/notes-de-frais.pdfTrois PDF de 3, 2 et 3 pages, soit 8 pages au total.
Je sais faire
- Expliquer en deux phrases ce que fait un RAG et pourquoi il limite les hallucinations
- Citer les cinq briques (extraction, découpage, embeddings, index, génération)
- Générer un corpus PDF fictif reproductible