Nouvelle étape franchie dans l’univers des technologies d’intelligence artificielle.
Guide RRSI de Google Research : Maîtriser les agents IA auto-améliorants
Dans ce tutoriel, nous mettons en œuvre la méthode RRSI (Regularized Recursive Self-Improvement), qui offre la possibilité à un agent LLM de réécrire son propre harnais, ses invites, ses outils, sa mémoire, son flux de contrôle et ses sous-agents autour d’un modèle figé, sans que le harnais ne subisse de surapprentissage par rapport aux tâches sur lesquelles il évolue. La boucle complète de RRSI génère des propositions de modification avec Claude Opus sur Vertex AI et les évalue à l’aide des benchmarks Docker, ce qu’un notebook gratuit ne peut pas faire. La partie de RRSI qui met réellement en œuvre l’idée présentée dans l’article, à savoir les règles qui déterminent quelles propositions de modification conserver, est écrite en Python standard, et c’est cette partie que nous pilotons directement. Nous installons le paquet à partir du dépôt officiel, passons en revue son estimateur, sa bande de bruit calibrée, les deux branches de son algorithme de sélection, son budget d’édition « annealed », son filtre de fuite déterministe et son historique d’édition, puis nous intégrons un agent simulé dans l’interface « Domain » propre à RRSI. Comme nous avons nous-mêmes mis au point cet environnement simulé, nous connaissons l’impact réel de chaque modification, ce qui nous permet de vérifier les décisions de RRSI par rapport aux données réelles et de les comparer à une exploration non régularisée qui se contente de retenir le résultat le mieux classé.
Fait intéressant, nous installons RRSI à partir du dépôt « google-research », en le fixant sur le commit sur lequel ce notebook a été rédigé, car le paquet n’est pas disponible sur PyPI. Sa seule dépendance est le client Anthropic, que les rôles de recherche utilisent pour appeler Claude et que nous n’utilisons jamais. Nous affichons ensuite la correspondance, telle que documentée par le référentiel lui-même, entre les symboles de l’article et les fonctions qui les implémentent : le score empirique et l’estimation des coûts dans `evaluate`, la bande de bruit dans `calibrate`, l’algorithme 2 dans `selection`, le budget d’édition recuit dans `schedule`, le filtre de fuite dans `critic`, et l’historique des modifications avec ses résumés de rendement, d’élagage, de blocage et d’exploration dans `history`. RRSIConfig contient les hyperparamètres de l’article, et toutes les fonctions ci-dessous le reçoivent exactement comme le fait la boucle réelle.
La fonction `select_round` applique le critère d’évaluation à chaque candidat d’un tour et retient celui qui obtient le meilleur score parmi les candidats admissibles.
Le RRSI mesure deux valeurs par harnais : S, la récompense moyenne calculée sur l’ensemble des essais de chaque tâche, et C, le nombre moyen de jetons de politique par essai. La classe `TaskResult` enregistre les essais d’une tâche et les agrège. Le détail qu’il convient de reprendre dans toute évaluation d’agent concerne la manière dont sont gérés les essais manquants. Lorsqu’un candidat échoue à l’épreuve la plus difficile, un estimateur qui exclut les essais manquants affiche une valeur de 0,750 et donne l’impression que cet échec constitue une amélioration. Dans le même temps, le RRSI comptabilise chaque essai manquant comme une récompense nulle avec le dénominateur complet et affiche le même résultat de 0,500 qu’auparavant ; de cette manière, un candidat ne peut pas paraître meilleur en abandonnant les essais qu’il trouve difficiles. Les récompenses pondérées s’appliquent aux suites d’exercices notées selon une grille d’évaluation, telles que Harvey LAB, où la note S correspond à la fraction de tous les critères réussis plutôt qu’à la moyenne des notes obtenues pour chaque tâche.
Par ailleurs, avant qu’une règle puisse distinguer un gain réel de la chance, elle doit déterminer dans quelle mesure le score d’un harnais évolue de lui-même. Nous avons créé un petit agent simulé, dont la réussite à chaque tâche est une fonction logistique de la compétence du harnais moins la difficulté de la tâche, et nous avons évalué le harnais de départ inchangé à six reprises sur quarante tâches, avec deux essais pour chacune : les scores ont varié de 0,113 alors qu’aucun changement n’avait été apporté. Le calibrage transforme les évaluations répétées d’un même harnais en delta, soit deux fois l’écart-type de la différence entre deux séries d’essais. Avec 80 essais, le delta est d’environ 0,108 ; avec 3 200 essais, il tombe à environ 0,013, ce qui se situe dans la fourchette indiquée par l’article pour ses exemples (0,004 à 0,020). À des fins de sélection, tout gain inférieur à delta est impossible à distinguer d’une nouvelle exécution du même ensemble de tests.
L’algorithme 2 est implémenté sous forme de fonctions pures, ce qui nous autorise de lui transmettre des candidats et de lire ses justifications mot pour mot. Nous fixons un candidat de référence à S = 0,630 et 10 000 tokens, avec un meilleur score jamais atteint de 0,640 et un delta de 0,020, puis nous soumettons huit candidats au juge. Un candidat se situant en dessous du seuil minimal, c’est-à-dire le meilleur score jamais observé moins le delta, est immédiatement rejeté. Un gain supérieur à delta doit être compensé par des jetons supplémentaires, conformément à la règle selon laquelle la variation relative du coût doit rester inférieure à 0,10 plus 40 fois le gain ; un gain de +6 points avec un taux de jetons de +20 % est autorisé, tandis qu’un gain de +3 points avec un taux de jetons de +150 % ne l’est pas. Au sein de la fourchette, les scores sont considérés comme ex æquo et c’est un score pondéré, calculé en multipliant par 100 le gain moins 15 fois la variation de coût, auquel s’ajoute un petit bonus pour un composant structurel jamais accepté, qui fait pencher la balance ; c’est ainsi que le RRSI admet le candidat D, qui a obtenu un score inférieur à celui du titulaire mais coûte 20 % de jetons en moins, et c’est ainsi qu’un nouvel agent secondaire permet de départager une égalité, ce qu’un ajustement de la consigne ayant obtenu un score identique ne parvient pas à faire. Un gardien de domaine oppose son veto quel que soit le score.
À noter également, la fonction `select_round` applique le critère d’évaluation à chaque candidat d’un tour et retient celui qui obtient le meilleur score parmi les candidats admissibles. Nous lui fournissons le candidat le plus cher, celui qui est un peu moins bon mais moins cher, ainsi qu’un candidat que le critique a déjà rejeté. Le candidat ayant obtenu le plus grand nombre de points perd, car les trois points qu’il a gagnés ne lui permettent pas d’obtenir 150 % de jetons supplémentaires ; le candidat rejeté par les critiques n’est jamais soumis à l’évaluation ; et le vainqueur fait reculer le candidat sortant d’un demi-point tout en réduisant le coût de ses jetons d’un cinquième. Le détail qui garantit la sécurité de ce système est S*, qui ne fait que croître : le seuil est ancré au meilleur score jamais enregistré plutôt qu’à celui du titulaire actuel, de sorte qu’une succession d’échanges moins coûteux mais légèrement moins performants ne peut pas faire baisser le score au fil des tours.
En parallèle, le volet « proposition » réglemente la manière dont les modifications sont rédigées, et non celles qui sont retenues. edit_budget met en œuvre le budget L0 « annealed » présenté dans l’article : un calendrier cosinus allant de b_max à b_min, et par défaut, il autorise jusqu’à quatre modifications coordonnées par candidat pour les huit premiers tours, trois pour les cinq suivants et deux pour les sept derniers. Le plafond prévu dans la formule signifie que le budget n’atteint son minimum (égal à un) qu’à t = T, soit une étape après la fin de l’exécution, ce qui peut facilement passer inaperçu à la lecture de l’équation. Étant donné que chaque modification d’un ensemble hérite de la valeur « un » attribuée à cet ensemble, c’est la diminution du budget qui fait que l’historique de fin d’exécution est attribuable à un nombre réduit de composants. Le budget limite le nombre de modifications pouvant être regroupées, mais ne restreint en aucun cas les mécanismes que le harnais pourra éventuellement comporter.
Il faut souligner, avant de procéder à toute évaluation, le critique examine minutieusement chaque candidat selon deux critères. La première est une vérification préalable déterministe effectuée par rapport à un modèle générique d’identifiants d’authentification et à la liste noire propre au domaine ; grâce à des modèles pour les identifiants de tâches « evolve-set » et les chemins d’accès au correcteur, elle rejette un diff qui mémorise la réponse à la tâche_007, un autre qui lit la sortie attendue, un autre qui divulgue une clé API, ainsi qu’un diff vide, le tout sans appeler de modèle. Un diff valide passe à la deuxième étape, un examen minutieux effectué par Claude, et c’est là que le notebook révèle un véritable piège : lorsque RRSI_VERTEX_PROJECTS n’est pas défini, rrsi.llm.generate calcule un index modulo le nombre de projets en dehors de son bloc try et lève une exception ZeroDivisionError, de sorte que l’erreur de configuration utile dans le code n’est jamais atteinte. Nous examinons également la manière dont les modifications sont étiquetées : la normalisation ne conserve un composant déclaré que lorsque le diff en apporte la preuve ; par conséquent, une modification mineure ne peut pas passer pour une nouvelle compétence afin de bénéficier du bonus de nouveauté, et une modification de gestion du contexte mal étiquetée est classée comme telle.
Les prochaines semaines permettront d’en mesurer la portée réelle.
Dans le même ordre d’idées :
D’après MarkTechPost : MarkTechPost