Lección 1 — Le cas d'usage et l'architecture

Questions sur du code

4 min de lectura

Este contenido aún no está traducido. Se muestra la versión original.

Questions sur du code

Le code n'est pas de la prose

ParticularitéConséquence pour le RAG
unités nettes : fonctions, classes, méthodeson découpe sur ces frontières, pas tous les N caractères
position exacte (fichier, ligne)chaque morceau garde path, start, end pour produire des liens
identifiants (planifier_relances, REMISE_MAX_PCT)une recherche par mots (BM25) complète la recherche par sens
questions en français, code en anglais ou en « franglais »la recherche vectorielle fait le pont entre « relances » et niveau_relance
accents absents du code (numerotation.py)il faut normaliser les accents pour la recherche par mots

Trois familles de questions

flowchart TD
  Q["Question d'un développeur"] --> A["Où ? « Où est gérée la numérotation ? »"]
  Q --> B["Comment ? « Comment est calculé le total TTC ? »"]
  Q --> C["Et si ? « Que se passe-t-il si l'e-mail échoue ? »"]
  A --> A1["liste fichier:ligne, sans génération"]
  B --> B1["réponse expliquée + liens"]
  C --> C1["réponse expliquée + liens vers la gestion d'erreur"]

La première famille est la plus fréquente et la moins chère : on n'a souvent pas besoin d'une phrase, juste des emplacements à ouvrir. Le lab propose donc la commande ou, qui ne fait aucun appel de génération.

Pourquoi la commande « ou » ne fait-elle pas appel au modèle de génération ?

Le projet fictif facturo

make_project.py écrit 16 fichiers dans projet_demo/facturo/ : modèles de données, TVA, numérotation, remises, export, e-mail, relances, paiements, devises, stockage SQLite, authentification, journaux, API et ligne de commande.

projet_demo/facturo/relances.py (généré)
"""Relances des factures impayées."""
from datetime import date, timedelta

PALIERS_RELANCE = [7, 15, 30]  # jours de retard déclenchant une relance


def factures_en_retard(factures, aujourd_hui: date, delai_jours: int = 30) -> list:
    """Factures non payées dont l'échéance (émission + délai) est dépassée."""
    return [f for f in factures
            if not f.payee and f.date_emission + timedelta(days=delai_jours) < aujourd_hui]

Le projet est exécutable : le test test_le_projet_fictif_a_16_fichiers_valides compile chaque fichier. Un RAG sur du code faux apprendrait de mauvaises habitudes au lecteur.

terminal
pip install -r requirements.txt
cp .env.example .env            # votre clé dans .env
python make_project.py          # écrit projet_demo/facturo/*.py

Quelles questions un bon jeu de référence pour du code doit-il contenir ?

Exercice : écrire deux questions pièges

Écrivez deux questions sur facturo dont la réponse n'est pas dans le code, mais qui ressemblent à des choses présentes.

Voir la solution
Question piègeCe qui ressemblePourquoi ce n'est pas couvert
« Où est gérée la connexion avec un compte Google (OAuth) ? »auth.py (mots de passe, jetons de session)aucun fournisseur d'identité externe
« Comment le projet génère-t-il les QR codes de paiement ? »paiements.py, pdf_export.pypas de QR code

Ce sont les deux questions hors périmètre de golden.json. La première est la plus dangereuse : un modèle peu prudent répondrait « dans facturo/auth.py », ce qui est plausible et faux.

Résultat obtenu

Exécution réelle du 2026-10-15 :

$ python make_project.py
écrit projet_demo/facturo/__init__.py
écrit projet_demo/facturo/config.py
...
écrit projet_demo/facturo/api.py
écrit projet_demo/facturo/cli.py
$ python -c "from facturo.relances import planifier_relances ..."   # depuis projet_demo/
FAC-2025-0001 FAC-2025-0002 24.0
[('FAC-2025-0001', 2)]

Une facture de 2 × 10 € HT donne bien 24,00 € TTC, et une facture émise le 1er mars 2025 est au niveau de relance 2 le 20 avril (20 jours de retard après le délai de 30 jours).

Je sais faire

  • Expliquer ce qui distingue un RAG sur code d'un RAG sur documents
  • Classer une question en « où ? », « comment ? », « et si ? »
  • Préparer un projet de test exécutable et des questions pièges
Siguiente