Log in to leave a comment
No posts yet
Les outils comme Cursor ou Devin sont pratiques. Cependant, il est difficile de savoir exactement ce qui se passe à l'intérieur, et ils massacrent parfois le code d'une manière que l'on ne souhaite pas. Pour un développeur backend, il est bien plus économique et fiable de créer son propre agent optimisé en combinant la bibliothèque standard de Python et les API de LLM.
Pour qu'un agent dépasse le stade de la simple écriture de code et puisse exécuter directement des commandes de terminal, il faut manipuler le module subprocess avec précision. L'utilisation imprudente de l'option shell=True expose à des attaques par injection de shell ou crée des processus zombies qui ne s'arrêtent pas en cas de timeout.
Lors de l'implémentation, définissez shell=False lors de l'appel à subprocess.run() et passez les commandes sous forme de liste. Fixez un timeout court, d'environ 30 secondes, et si une exception TimeoutExpired survient, appelez immédiatement process.kill() pour libérer les ressources. Il n'est pas nécessaire d'envoyer l'intégralité du résultat de l'exécution au modèle. Si le texte dépasse 1 000 caractères, tronquez-le pour ne renvoyer que les 20 dernières lignes. C'est suffisant pour que le modèle comprenne la cause de l'erreur tout en évitant le gaspillage de tokens.
Plus la conversation s'allonge, plus les données accumulées dans la fenêtre de contexte se transforment en une facture salée. Selon les annonces d'Anthropic, l'utilisation des marqueurs cache_control avec le modèle Claude 3.5 permet d'économiser jusqu'à 90 % du coût de lecture des données mises en cache, soit environ 0,30 $ par million de tokens.
Pour réduire les coûts, séparez strictement les messages système des entrées utilisateur. Fixez les informations immuables, comme l'arborescence complète des fichiers du projet, en haut du prompt système et définissez-les comme point de cache. Lorsque l'historique des messages s'accumule et dépasse la limite de tokens, utilisez tiktoken pour calculer le volume, puis employez une méthode de résumé hiérarchique où les anciens messages sont résumés par un appel LLM distinct. En conservant uniquement ce contexte résumé en haut et en appliquant une fenêtre glissante pour les messages récents, vous pouvez réduire les coûts de plus de 40 % lors de longues sessions de développement, tout en préservant la précision du raisonnement du modèle.
Demander à un agent de réafficher l'intégralité d'un fichier est inefficace et lent. Plus le nombre de tokens de sortie augmente, plus le risque que le modèle omette du code intermédiaire ou divague est élevé. La méthode dite de "l'astuce d'édition" (Edit Trick) consiste à inciter le modèle à ne modifier que le texte entourant la partie à corriger (Anchor). Cette technique peut réduire le volume de tokens de sortie jusqu'à 86 % sur des données réelles.
Utilisez re.sub() de Python pour appliquer localement les modifications transmises via des balises XML spécifiques ou des expressions régulières. De plus, au lieu d'inclure toute la documentation technique dans le prompt, concevez un système utilisant une base de données vectorielle légère comme LanceDB pour n'extraire que les fragments de documentation nécessaires. Avec cette structure, la vitesse de modification des fichiers est perçue comme étant 79 % plus rapide, résolvant ainsi le problème chronique de confusion du modèle lors du travail sur de gros fichiers.
Il faut arrêter de copier-coller manuellement les messages de débogage pour le modèle. Faites en sorte que l'agent rédige d'abord des tests basés sur pytest avant d'écrire le code.
Il suffit ensuite de construire une boucle de rétroaction où l'intégralité de la Traceback générée en cas d'échec du test est renvoyée telle quelle au modèle pour qu'il se corrige de lui-même. Cependant, pour les commandes dangereuses comme rm ou deploy, vous devez impérativement insérer des garde-fous utilisant la fonction input() de Python pour obtenir l'approbation de l'utilisateur. Une fois cette structure cyclique en place, le développeur n'a plus qu'à vérifier le résumé du git diff soumis par l'agent et à cliquer sur le bouton commit.
En fin de compte, l'essentiel de la construction d'un agent ne réside pas dans des frameworks sophistiqués, mais dans la précision du nettoyage et du caching des données entre le terminal et le LLM. 600 lignes de code Python écrites par vos soins refléteront mieux vos intentions qu'un outil "boîte noire" de plusieurs dizaines de milliers de lignes.