SPB Git

Repository Public Research preview

ch08_agents.tex 20.8 KB 252 lines latex

1\section{Travailler avec un agent IA}2\label{sec:agents}3% ------------------------------------------------------------------------------45\begin{enbref}6Comment travailler avec un agent sur un TP : dossier dédié, mode plan, plan validé, approbation par action, preuves exigées, relecture. Une session réelle annotée ligne par ligne, deux exemples guidés (comparaison et coût), et la sécurité des agents. Les requêtes d'agent de ce chapitre n'ont pas été testées par API : elles exigent un dossier de travail réel.7\end{enbref}89\subsection{Pourquoi un futur évaluateur devrait s'y intéresser}1011Un agent de codage n'est pas réservé aux programmeurs. Pour un évaluateur, il sert à :1213\begin{itemize}14  \item \textbf{automatiser un tableur} : construire une grille d'ajustement paramétrée, une ventilation de dépréciation par composante, un tableau d'amortissement, avec formules et mises en forme, à partir d'une description ;15  \item \textbf{analyser des données} : charger un fichier de ventes (CSV exporté d'un portail), nettoyer, calculer des prix au pied carré, des médianes par secteur, des régressions simples, produire des graphiques ;16  \item \textbf{produire des documents reproductibles} : un rapport dont les tableaux se régénèrent quand les données changent ;17  \item \textbf{apprendre} : les styles \emph{Explanatory} et \emph{Learning} de Claude Code expliquent chaque choix et vous laissent écrire des morceaux vous-même.18\end{itemize}1920Ce que l'agent ne fait pas : choisir vos comparables, juger de l'état d'un bâtiment, réconcilier des indications de valeur, signer.2122\subsection{Installation minimale}2324\begin{terminal}[Trois façons d'avoir un agent en dix minutes]25\begin{Verbatim}[commandchars=§¡¿]26§co¡# Claude Code (abonnement Claude Pro ou Max requis)¿27§tu¡$¿ curl -fsSL https://claude.ai/install.sh | bash      §co¡# macOS, Linux, WSL¿28§tu¡$¿ cd TP2_comparaison && claude2930§co¡# Codex (compte ChatGPT, forfait gratuit accepté avec limites)¿31§tu¡$¿ npm install -g @openai/codex32§tu¡$¿ cd TP2_comparaison && codex3334§co¡# Gemini CLI (compte Google personnel, gratuit)¿35§tu¡$¿ npm install -g @google/gemini-cli36§tu¡$¿ cd TP2_comparaison && gemini37\end{Verbatim}38\end{terminal}3940\begin{terminal}[Démarrer en lecture seule : la même précaution dans les trois agents]41\begin{Verbatim}[commandchars=§¡¿]42§tu¡$¿ claude --permission-mode plan        §co¡# ou Maj+Tab dans la session jusqu'à « plan mode »¿43§tu¡$¿ codex --sandbox read-only            §co¡# lecture seule ; les écritures sont refusées¿44§tu¡$¿ gemini --approval-mode plan          §co¡# propose, n'exécute rien sans vous¿45\end{Verbatim}46\end{terminal}4748Les trois s'utilisent aussi dans VS Code par une extension, et Claude Code existe en application de bureau et sur le Web sans installation \parencite{claudecode_overview}. GitHub Copilot s'installe comme extension VS Code avec le forfait étudiant gratuit.4950\begin{notebox}[Travaillez toujours dans un dossier dédié]51Créez un dossier par travail pratique (\texttt{TP2\_comparaison/}) contenant uniquement l'énoncé, votre gabarit Excel et vos fichiers de données. Lancez l'agent \textbf{depuis ce dossier}. Il ne verra que ce qui s'y trouve. Ne le lancez jamais depuis votre dossier personnel, vos documents de stage ou un dossier contenant des données de clients.52\end{notebox}5354\subsection{Anatomie d'une bonne session}5556Les recommandations officielles pour Claude Code valent pour tous les agents \parencite{claudecode_bestpractices}.5758\begin{enumerate}[label=\textbf{\arabic*.},leftmargin=2em]59  \item \textbf{Explorer en lecture seule.} Commencez en mode plan (Claude Code : \texttt{Maj+Tab} jusqu'à « plan mode » ; Codex : mode suggestion). Demandez à l'agent de lire les fichiers et de vous expliquer ce qu'il comprend de la tâche. Rien n'est modifié.60  \item \textbf{Faire produire un plan}, le lire, le corriger. Si vous ne comprenez pas une étape du plan, vous ne comprendrez pas le résultat.61  \item \textbf{Exécuter par petites étapes} et approuver chaque action qui modifie un fichier. Refusez le « mode automatique » sur un travail noté : vous devez voir chaque changement.62  \item \textbf{Donner à l'agent un moyen de se vérifier} : « recalcule la valeur conclue avec $B=3$ et $B=7$ et montre-moi les deux résultats », « compare le total du bordereau au total attendu dans l'énoncé ». Un agent qui a un test itère jusqu'à ce que le test passe ; sans test, il s'arrête quand « ça a l'air fini ».63  \item \textbf{Exiger les preuves} : la sortie de la commande, la capture, les valeurs de cellules, pas une affirmation de réussite.64  \item \textbf{Corriger tôt.} Après deux corrections infructueuses, recommencez une session propre avec une requête mieux formulée ; une conversation encombrée d'échecs produit des résultats de moins en moins bons.65  \item \textbf{Relire tout le résultat vous-même}, cellule par cellule ou ligne par ligne, avant de considérer le travail comme le vôtre. C'est la partie non négociable.66\end{enumerate}6768\subsection{Le fichier d'instructions du projet}6970Un \texttt{CLAUDE.md} (ou \texttt{AGENTS.md}) court, placé dans le dossier du travail, évite la plupart des erreurs de convention. La règle : n'y mettre que ce que l'agent ne peut pas deviner ; un fichier trop long est ignoré en partie \parencite{claudecode_bestpractices}. L'annexe~\ref{ann:claudemd} propose un modèle complet pour un travail pratique du cours.7172\subsection{Apprendre avec un agent : styles \emph{Explanatory} et \emph{Learning}}7374Claude Code offre deux styles de sortie pensés pour l'apprentissage \parencite{claudecode_outputstyles}. Le style \textbf{Explanatory} insère des encadrés « Insight » qui expliquent chaque choix d'implémentation et les compromis. Le style \textbf{Learning} va plus loin : l'agent écrit l'essentiel, mais laisse des marqueurs \texttt{TODO(human)} là où \emph{vous} devez écrire un morceau stratégique (la formule d'ajustement, le calcul de la dépréciation), puis commente ce que vous avez écrit. Activez-les avec la commande \texttt{/output-style}. Les autres agents s'y prêtent aussi par la requête : « explique chaque étape avant de la faire et laisse-moi écrire les formules de calcul ».7576\par\noindent\nontestebadge77\begin{vous}[requête d'ouverture d'une session d'apprentissage avec un agent]78\eCtx Je suis étudiant en évaluation immobilière. Dans ce dossier se trouvent l'énoncé du TP (\texttt{enonce.pdf}) et un classeur (\texttt{gabarit.xlsx}). \eTache Lis-les et explique-moi la structure du classeur : quelles feuilles, quelles cellules d'entrée, quelles cellules de résultat. \eContr Ne modifie rien. \eTache Ensuite, propose-moi un plan en cinq étapes pour compléter la grille d'ajustement, en m'indiquant à chaque étape ce que je devrais écrire moi-même et ce que tu pourrais préparer (mise en forme, vérifications). \eContr Attends ma validation avant toute action. \eFormat Plan numéroté, deux colonnes : « moi » / « toi ».79\end{vous}80\begin{analyse}81La requête impose le mode lecture seule (« ne modifie rien »), sépare explicitement ce qui vous revient de ce qui peut être délégué, et exige une validation avant toute action. C'est le patron « explorer, planifier, exécuter » de la documentation officielle \parencite{claudecode_bestpractices}, appliqué à un TP.82\end{analyse}8384\subsection{Une session annotée, ligne par ligne}8586Voici une session réelle (raccourcie) avec un agent en terminal, sur le TP2 d'IMM1003. Les repères \etape{1} à \etape{8} renvoient aux commentaires qui suivent. Ce qui compte n'est pas l'outil précis mais les \textbf{réflexes} : lecture seule d'abord, plan validé, approbation par action, preuves exigées, interprétation gardée pour vous.8788\begin{terminal}[Session d'agent annotée --- TP2, grille de comparaison (extrait)]89\begin{Verbatim}[commandchars=§¡¿,numbers=left]90§tu¡$¿ cd ~/UQO/IMM1003/TP2_comparaison && claude --permission-mode plan        §mk¡1¿9192§tu¡> Lis enonce.pdf et gabarit.xlsx. Décris la structure du classeur et les¿93§tu¡  conventions de l'énoncé. Ne modifie rien.¿9495  §hi¡Read¿(enonce.pdf)                                                          §mk¡2¿96  §hi¡Read¿(gabarit.xlsx)  → 4 feuilles : Accueil, Donnees, Grille, Dashboard97  …98  Structure : Accueil!D9 = B (dernier chiffre du code permanent). Donnees!B4:H9 =99  5 comparables. Grille!C12:H24 attend les ajustements ; Grille!H26 = valeur100  indiquée ; Dashboard lit Grille!H26. Conventions relevées dans l'énoncé :101  ajustements transactionnels séquentiels, seuils 15 % brut / 25 % net, arrondi102  final au 5 000 $. §ok¡Rien n'a été modifié.¿103104§tu¡> Propose un plan pour compléter la grille. Distingue ce que j'écris moi-même¿105§tu¡  de ce que tu prépares.¿                                                    §mk¡3¿106107  Plan108  1. §tu¡(moi)¿  ajustements transactionnels : conditions de vente, financement, date109  2. §tu¡(moi)¿  ajustements physiques : superficie, âge, garage, terrain110  3. §hi¡(toi)¿  formules de total brut / net et drapeaux 15 % / 25 % en Grille!I12:J16111  4. §hi¡(toi)¿  mise en forme conditionnelle des drapeaux ; graphique Dashboard112  5. §tu¡(moi)¿  réconciliation pondérée et arrondi ; interprétation en deux phrases113  Vérification proposée : changer Accueil!D9 (B=2 puis B=9) et comparer Grille!H26.114115§tu¡> D'accord pour 3 et 4 seulement. Sors du mode plan.¿                        §mk¡4¿116117  §hi¡Edit¿(gabarit.xlsx, Grille!I12:J16)  formules SOMME(ABS(…)) et SOMME(…)     §mk¡5¿118  §hi¡Edit¿(gabarit.xlsx, Grille!I12:J16)  mise en forme conditionnelle (>0,15 ; >0,25)119120  §hi¡Bash¿(python3 -c "openpyxl … recalcul … print(H26)")121  §ko¡Autoriser cette commande ? [o/N]¿  §tu¡o¿                                     §mk¡6¿122  B=2 → Grille!H26 = §ok¡603 250¿      B=9 → Grille!H26 = §ok¡610 250¿                §mk¡7¿123124§tu¡> Montre-moi les formules exactes que tu as écrites en I12 et J12.¿125126  I12 : =SOMME(ABS(C12:G12))/Donnees!C4127  J12 : =SOMME(C12:G12)/Donnees!C4                                              §mk¡8¿128129§tu¡> Merci. Je fais les étapes 1, 2 et 5 dans Excel. /rename tp2-grille¿130\end{Verbatim}131\end{terminal}132133\begin{description}[style=nextline,leftmargin=1.2em,itemsep=2pt]134  \item[\etape{1} Dossier dédié, mode plan dès le lancement.] L'agent ne voit que ce dossier, et ne peut rien écrire.135  \item[\etape{2} Lecture seule, restitution des conventions.] L'agent lit l'énoncé et le classeur, puis restitue ce qu'il a compris : c'est votre première occasion de le corriger si une convention est mal lue.136  \item[\etape{3} Plan à deux colonnes.] Vous décidez ce qui est délégué. Les ajustements et la réconciliation, qui portent le jugement, restent à vous.137  \item[\etape{4} Autorisation limitée.] Deux étapes seulement, et sortie explicite du mode plan.138  \item[\etape{5} Édition visible.] Chaque édition est affichée ; vous savez quelles cellules ont bougé.139  \item[\etape{6} Approbation d'une commande.] Le recalcul passe par une commande shell : le harnais demande votre accord (mode manuel).140  \item[\etape{7} Preuve du chaînage.] Le test de la chaîne (deux valeurs de $B$, deux résultats) est fait par l'outil, mais le résultat brut vous est montré.141  \item[\etape{8} Formules exactes.] Vous relisez les formules avant de considérer le travail comme le vôtre ; ici, vous vérifiez que le dénominateur est bien le prix du comparable.142\end{description}143144\subsection{Exemple concret : le script de vérification que l'agent écrit pour vous}145146À l'étape \etape{6} de la session, l'agent a exécuté une commande pour prouver que la valeur conclue change avec $B$. Voici à quoi ressemble ce script, une fois demandé explicitement (« écris un script \texttt{verif\_chaine.py} qui vérifie que la chaîne du classeur tient et qu'aucune formule n'a été remplacée par une valeur »). Il s'exécute en une seconde et vous rend deux preuves lisibles.147148\begin{fichier}[verif\_chaine.py --- deux tests sur le classeur du TP2 (à lancer après chaque modification)]149\begin{Verbatim}[commandchars=§¡¿,numbers=left]150§fk¡from¿ openpyxl §fk¡import¿ load_workbook151152§fc¡# Test 1 : aucune constante là où le gabarit attend des formules¿153wb = load_workbook(§fs¡"gabarit_travail.xlsx"¿)           §fc¡# formules, telles qu'écrites¿154g = wb[§fs¡"Grille"¿]155collees = [c.coordinate §fk¡for¿ ligne §fk¡in¿ g[§fs¡"I12:J16"¿] §fk¡for¿ c §fk¡in¿ ligne156           §fk¡if¿ c.value §fk¡is not¿ None §fk¡and not¿ str(c.value).startswith(§fs¡"="¿)]157print(§fs¡"Valeurs collées à la place de formules :"¿, collees §fk¡or¿ §fs¡"aucune"¿)158159§fc¡# Test 2 : la valeur conclue dépend bien de B (recalcul indépendant en Python)¿160d = wb[§fs¡"Donnees"¿]161prix  = [d.cell(row=r, column=3).value §fk¡for¿ r §fk¡in¿ range(4, 9)]   §fc¡# Donnees!C4:C8¿162ajust = [sum(g.cell(row=r, column=col).value §fk¡or¿ 0 §fk¡for¿ col §fk¡in¿ range(3, 8))163         §fk¡for¿ r §fk¡in¿ range(12, 17)]                            §fc¡# Grille!C12:G16¿164§fk¡for¿ B §fk¡in¿ (2, 9):165    valeurs = [p * (1 + 0.01 * B) + a §fk¡for¿ p, a §fk¡in¿ zip(prix, ajust)]  §fc¡# règle de l'énoncé¿166    conclue = round(sum(valeurs) / len(valeurs) / 5000) * 5000      §fc¡# arrondi au 5 000 $¿167    print(§fs¡f"B={B} → valeur conclue recalculée : {conclue:,.0f} $"¿)168\end{Verbatim}169\end{fichier}170171\begin{terminal}[Ce que le script affiche]172\begin{Verbatim}[commandchars=§¡¿]173§tu¡$¿ python3 verif_chaine.py174Valeurs collées à la place de formules : §ok¡aucune¿175B=2 → valeur conclue recalculée : §ok¡603 250 $¿176B=9 → valeur conclue recalculée : §ok¡610 250 $¿177\end{Verbatim}178\end{terminal}179180Deux remarques. La règle de calcul de la ligne 16 est \emph{votre} lecture de l'énoncé, que vous devez relire : si elle est fausse, le test est faux avec elle. Et les deux valeurs doivent coïncider avec ce qu'Excel affiche en \texttt{Grille!H26} pour les mêmes $B$ ; un écart de quelques dollars révèle en général un arrondi intermédiaire, un écart de dizaines de milliers une mauvaise convention.181182\subsection{Exemple guidé : analyser trente ventes comparables (IMM1003)}183184Contexte : vous avez exporté 30 ventes de bungalows d'Aylmer dans un fichier \texttt{ventes.csv} (prix, date, superficie habitable, terrain, âge, garage, secteur). Objectif : dégrossir le marché avant de choisir vos cinq comparables.185186\begin{enumerate}[label=\textbf{Étape \arabic*.},leftmargin=2.6em]187  \item \emph{Explorer.} « Lis ventes.csv et décris-moi les colonnes, les valeurs manquantes et les valeurs suspectes (prix au pied carré aberrants, dates hors période). Ne modifie rien. »188  \item \emph{Planifier.} « Propose un script Python qui calcule le prix au pied carré, la médiane et l'écart interquartile par secteur, et trace prix au pied carré en fonction de la date de vente. Montre-moi le plan, pas encore le code. »189  \item \emph{Exécuter.} Approuvez la création de \texttt{analyse.py} et son exécution. Demandez la sortie complète et le graphique.190  \item \emph{Vérifier.} Choisissez trois ventes au hasard et recalculez à la main le prix au pied carré. Demandez : « pour ces trois identifiants, montre-moi les valeurs calculées ». Comparez.191  \item \emph{Interpréter vous-même.} La tendance temporelle justifie-t-elle un ajustement pour le temps ? Quelles ventes retenir ? C'est votre jugement, et c'est ce qui est noté ; l'agent a seulement préparé le terrain.192  \item \emph{Déclarer.} « Claude Code, modèle X : préparation d'un script d'exploration des 30 ventes (statistiques par secteur, graphique). Sélection des comparables et grille d'ajustement faites manuellement. Résultats du script vérifiés à la main sur 3 ventes. »193\end{enumerate}194195\subsection{Exemple guidé : bordereau de coût neuf (IMM1033)}196197Contexte : le TP2 exige un bordereau par composantes pour un quadruplex, avec coûts directs, indirects et profit entrepreneurial séparés, et une vérification de cohérence avec les données de marché.198199\begin{enumerate}[label=\textbf{Étape \arabic*.},leftmargin=2.6em]200  \item \emph{Cadrer.} Écrivez dans \texttt{CLAUDE.md} les conventions : unités (pi\textsuperscript{2}), profit calculé séparément sur le total direct + indirect, arrondi, cellules d'entrée à ne pas toucher, valeur de $B$.201  \item \emph{Explorer.} « Lis gabarit.xlsx et liste les cellules d'entrée et les cellules qui devraient contenir des formules. Vérifie si la valeur conclue est chaînée aux entrées. Ne modifie rien. »202  \item \emph{Construire avec l'agent, pas par l'agent.} Demandez la structure des formules pour une composante, écrivez-la vous-même dans Excel, puis demandez : « vérifie que ma formule en D14 reproduit la logique décrite dans l'énoncé pour la charpente ».203  \item \emph{Tester la chaîne.} « Change la valeur de $B$ en Accueil!D9 et rapporte-moi la nouvelle valeur conclue. » Si elle ne bouge pas, la grille n'est pas chaînée, et le barème prévoit un plafond pour cela.204  \item \emph{Confronter au marché.} Le coût au pied carré obtenu est-il plausible face aux guides de coûts et aux permis de construction récents ? Cette confrontation est votre travail d'évaluateur.205\end{enumerate}206207\subsection{Sécurité des agents}208\label{sec:securite}209210Un agent a des capacités d'action ; les risques sont donc d'une autre nature que ceux d'un chatbot.211212\begin{figure}[!htb]213\centering214\begin{tikzpicture}215  \def\r{2.05}216  \coordinate (A) at (90:1.25);217  \coordinate (B) at (210:1.25);218  \coordinate (C) at (-30:1.25);219  \fill[uqoBleu,opacity=0.18] (A) circle (\r);220  \fill[uqoOr,opacity=0.22] (B) circle (\r);221  \fill[uqoRouge,opacity=0.18] (C) circle (\r);222  \draw[uqoBleu,thick] (A) circle (\r);223  \draw[uqoOr!80!black,thick] (B) circle (\r);224  \draw[uqoRouge,thick] (C) circle (\r);225  \node[align=center,font=\small\sffamily\bfseries,text=uqoBleu] at ($(A)+(0,1.1)$) {\faIcon{lock}~Accès à des\\ données privées};226  \node[align=center,font=\small\sffamily\bfseries,text=uqoOr!70!black] at ($(B)+(-1.0,-0.7)$) {\faIcon{file-import}~Contenu\\ non fiable lu};227  \node[align=center,font=\small\sffamily\bfseries,text=uqoRouge] at ($(C)+(1.0,-0.7)$) {\faIcon{paper-plane}~Communication\\ vers l'extérieur};228  \node[align=center,font=\footnotesize\sffamily\bfseries,text=black] at (0,0.05) {\faIcon{skull-crossbones}\\ exploitable};229  \node[etiq,text width=6.2cm,anchor=west] at (4.2,1.4) {\textbf{Exemples dans le cours}\\[2pt]230    \textcolor{uqoBleu}{\faIcon{lock}} votre dossier de stage, votre courriel, un classeur de clients\\[2pt]231    \textcolor{uqoOr!70!black}{\faIcon{file-import}} une page Web consultée, un PDF téléchargé, un fichier reçu d'un tiers\\[2pt]232    \textcolor{uqoRouge}{\faIcon{paper-plane}} accès Web sortant, envoi de courriel, connecteur MCP externe\\[4pt]233    \textbf{Parade :} ne jamais réunir les trois dans une même session. Un dossier de TP sans données personnelles + pas de Web = deux cercles sur trois manquent.};234\end{tikzpicture}235\caption{Le trio dangereux : données privées, contenu non fiable, communication sortante}\label{fig:trio}236\end{figure}237238\begin{alertbox}[Le trio dangereux]239Un agent devient exploitable dès qu'il réunit trois propriétés : \textbf{accès à des données privées}, \textbf{exposition à du contenu non fiable} (page Web, PDF téléchargé, courriel) et \textbf{capacité de communiquer vers l'extérieur} \parencite{willison2025}. Un document lu par l'agent peut contenir des instructions cachées qu'il suivra (injection de requête) ; c'est, en 2026, la première cause d'incident de sécurité des agents en production, et aucune défense ne l'élimine complètement \parencite{owasp_injection2026,nsa_mcp}.240\end{alertbox}241242Règles pratiques :243244\begin{itemize}245  \item \textbf{Un dossier par travail}, sans données personnelles ni de clients ; l'agent ne voit que ce dossier.246  \item \textbf{Pas de mode automatique} (exécution sans approbation) sur un travail noté ni sur des données réelles ; approuvez chaque commande et lisez-la avant.247  \item \textbf{Méfiance envers ce que l'agent lit sur le Web} : si vous lui demandez de consulter une page, ne lui donnez pas en même temps accès à des fichiers sensibles ni à votre courriel.248  \item \textbf{N'installez de connecteurs (MCP) que de sources connues} ; un serveur MCP malveillant a le même pouvoir que l'agent.249  \item \textbf{Relisez le code généré} : 45\,\% des échantillons de code générés par IA contiennent au moins une vulnérabilité classique lorsqu'aucun humain ne les relit \parencite{veracode2025,gatech2026}. Pour un script d'analyse local, l'enjeu est surtout la \emph{justesse} : une erreur de logique silencieuse (mauvaise colonne, division inversée) est plus probable qu'une faille.250  \item \textbf{Versionnez} (copie datée ou \texttt{git}) avant de laisser un agent modifier un classeur ; les points de restauration de l'agent ne remplacent pas une sauvegarde.251\end{itemize}252
Files main
Menu

Theme