MarkTechPost

Google open-source Harness2, un framework récursif d'harnachement d'agents

Google Research a publié Harness2, un framework sous licence Apache-2.0 qui réécrit le harnais d'un agent au moment du test. Une seule étape de raffinement a fait gagner 11,5 points à GLM-5 sur WorkBuddy-Bench sans…

Google Cloud AI Recherche a rendu open source Harness². Il s'agit d'un framework récursif d'harnachement d'agents qui améliore le code et les fichiers autour d'un modèle figé. Pour les développeurs, l'argument est simple. Votre agent peut s'améliorer sans un meilleur modèle.

TL;DR

  • Taille : Un framework, pas un modèle. 0 paramètre entraîné ; 8 composants de harnais modifiables. Version 0.1.0.
  • Fonctionne sur : Linux avec Python 3.12 ou 3.13 et uv. Les appels de modèles passent par Vertex AI. GPU requis : non communiqué.
  • Performances : 1 étape de raffinement a amélioré les 4 configurations de modèle et de harnais sur les 3 benchmarks.
  • Meilleur résultat : GLM-5 sous OpenCode est passé de 64,2 à 75,7 sur WorkBuddy-Bench (+11,5 points).
  • Pire résultat : GLM-5 sous Codex n'a gagné que 1,2 point sur JobBench (23,6 à 24,8).

Qu'est-ce que Harness² ?

Harness² est un framework plug-and-play de Google Research qui affine le harnais d'un agent pendant le déploiement. Un harnais, c'est tout ce qui entoure le modèle : les prompts, les outils, la mémoire, les compétences et l'orchestration. L'harnachement est le processus d'optimisation de ce système. Les poids du modèle ne changent jamais.

Le cadre cible est le monde ouvert. Les tâches arrivent sans avoir été vues, et aucun vérificateur n'indique si une réponse est correcte. L' équipe de recherche soutient que la plupart des méthodes d'auto-amélioration supposent l'existence d'étiquettes ou de cas de test. Harness² est conçu pour fonctionner sans eux.

Quels sont les 8 composants du harnais ?

Harness² expose 8 composants modifiables, chacun monté sous forme de fichier :

  1. Prompt système
  2. Garde-fous
  3. Mémoire
  4. Orientation des outils
  5. Sous-agents
  6. Compétences
  7. Scripts
  8. Plugins (middleware)

Ils couvrent la construction du contexte, l'interface des outils, la délégation et le comportement à l'intérieur de la boucle d'outils. Cette structure étend la répartition en 7 fichiers des travaux antérieurs Ingénierie de harnais agentique fonctionnent par 1 composant.

Comment fonctionne le harnais d'agent récursif ?

Le cadre exécute deux niveaux de récursion liés:

  • Récursion au niveau des tâches utilise une étape contrastive Proposer, Sonder, Composer. D'abord, l'agent exécute la tâche une fois avec le harnais de base. Un éditeur propose ensuite 2 candidats. Le candidat invariant cible les échecs généraux des agents tels que la planification ou l'utilisation des outils. Le candidat de domaine cible les connaissances et procédures du domaine courant. Les deux candidats s'exécutent sur la même tâche. Le compositeur compare leurs trajectoires à la référence et ne conserve que les modifications étayées par le comportement observé.
  • Récursion au niveau du harnais se produit après chaque tâche. Un réflecteur enregistre le harnais adopté ainsi qu'un fichier EXPERIENCE.md de leçons. Cette bibliothèque guide les propositions futures. Chaque nouvelle tâche repart toujours du harnais de base.

Le budget k met à l'échelle la recherche. Le mode parallèle sonde k les candidats invariants et k les candidats de domaine, puis effectue k compositions. Le mode séquentiel enchaîne k étapes de raffinement.

Lecture</button><button class="btn" id="h2-step">Étape →</button><button class="btn" id="h2-reset">↺ Réinitialiser</button><div class="prog"><i id="h2-prog"></i></div></div> <div class="fn">À k=1 : 1 référence + 2 sondages + 1 exécution finale par tâche. Le mode parallèle sonde k candidats d'invariant et k candidats de domaine ; le mode séquentiel enchaîne k étapes.</div> </div> <div class="pn" id="h2-p2"> <div class="cg" id="h2-cg"></div> <div class="note" id="h2-cnote" style="border-left-color:#4285F4">Cliquez sur un composant pour voir son rôle à l'exécution.</div> <div class="lg"><span style="--c:#4285F4">Construction du contexte</span><span style="--c:#EA4335">Interface d'outils</span><span style="--c:#FBBC04">Orchestration</span><span style="--c:#34A853">Middleware</span></div> </div> <div class="pn" id="h2-p3"> <div class="sel" id="h2-sel"></div> <div class="bm" id="h2-bm"></div> <div class="fn">Étape d'amélioration unique (k=1). Moyennes sur 3 exécutions. LAB = taux de passage partiel (%). Source : article Harness<sup>2</sup>, tableaux 1 et 2.</div> </div> <div class="pn" id="h2-p4"> <div class="sel" id="h2-sel2"></div> <div class="bx rk" id="h2-rk"></div> <div class="fn">Exécuteur Gemini 3.5 Flash. L'axe des barres commence à 50. Meta-Harness est optimisé hors ligne sur des tâches d'entraînement séparées. Scores tels que mesurés dans l'article Harness<sup>2</sup>.</div> </div> <div class="ft"><span>Sources : arXiv 2610.14224 · github.com/google-research/harness2</span><a href="https://www.marktechpost.com" target="_blank" rel="noopener">© Marktechpost</a></div> <script> (function(){ var R=document.getElementById('mtp-h2x'); function $(s){return R.querySelector(s)}function $$(s){return R.querySelectorAll(s)} function sz(){try{parent. postMessage({mtpH2xHeight:R.offsetHeight+40},'*')}catch(e){}} $$('.tab').forEach(function(t){t.onclick=function(){$$('.tab').forEach(function(x){x.classList.remove('on')});$$('.pn').forEach(function(x){x.classList.remove('on')});t.classList.add('on');$('#h2-'+t.dataset.t).classList.add('on');if(t.dataset.t==='p3')drawB();if(t.dataset.t==='p4')drawR();setTimeout(sz,50)}}); /* pipeline */ var nd=$$('.nd'),i=-1,tm=null; var notes=["<b>Référence.</b> Le modèle figé exécute la tâche avec le harnais de base H0. Cela montre comment le harnais se comporte, pas si la réponse est correcte.", "<b>Proposer.</b> Un éditeur rédige 2 candidats : un candidat <b>d'invariant</b> pour les échecs généraux de l'agent (planification, utilisation d'outils) et un candidat <b>de domaine</b> pour les connaissances et procédures de la tâche.", "<b>Sonder.</b> Chaque candidat s'exécute sur la même tâche. La comparaison des trajectoires avec la référence donne un contraste comportemental. Aucune étiquette de vérité terrain n'est nécessaire.", "<b>Composer.</b> Le compositeur lit toutes les preuves et les différences. Il peut fusionner, réviser, adopter 1 candidat, ou conserver le harnais actuel.", "<b>Exécuter.</b> Le harnais composé s'exécute et renvoie le livrable final.", "<b>Réfléchir.</b> L'intégralité du dossier d'amélioration est examinée. Les leçons ne sont conservées que si les contrastes d'exécution les soutiennent.", "<b>Mettre à jour.</b> Le harnais adopté et un fichier <code>EXPERIENCE.md</code> de leçons rejoignent la bibliothèque d'amélioration.", "<b>Tâche suivante.</b> L'exécuteur revient à H0, mais la bibliothèque guide désormais les propositions et la composition. Sa suppression a fait chuter WorkBuddy de 77.5 à 74.4."]; function show(k){nd.forEach(function(n,j){n.classList.toggle('lit',j<=k)});$('#h2-note').innerHTML=k<0?"Appuyez sur <b>Lecture</b> ou <b>Étape</b> pour parcourir 1 étape d'amélioration Harness<sup>2</sup>.":notes[k];$('#h2-prog').style.width=((k+1)/nd.length*100)+'%';sz()} function step(){i=(i+1)%nd.length;show(i)} $('#h2-step').onclick=function(){stop();step()}; $('#h2-reset').onclick=function(){stop();i=-1;show(-1)}; function stop(){if(tm){clearInterval(tm);tm=null;$('#h2-play').textContent=' Lecture'}} $('#h2-play').onclick=function(){if(tm){stop();return}if(i>=nd.length-1)i=-1;step();tm=setInterval(function(){if(i>=nd.length-1){stop();return}step()},1900);this.textContent='❚❚ Pause'}; /* components */ var C=[["System prompt","Construction du contexte","#4285F4","Personna et procédure de haut niveau suivis à chaque appel."], ["Guardrails","Construction du contexte","#4285F4","Règles de processus, p. ex. vérifier les sorties avant de terminer."], ["Memory","Construction du contexte","#4285F4","Contexte persistant mis à la disposition de l'agent."], ["Tool guidance","Interface d'outils","#EA4335","Comment utiliser des outils spécifiques et gérer précisément les formats."], ["Subagents","Orchestration","#FBBC04","Rôles délégués avec leurs propres instructions."], ["Skills","Construction du contexte","#4285F4","Procédures de domaine réutilisables, p. ex. une compétence de rapprochement."], ["Scripts","Interface d'outils","#EA4335","Aides exécutables, p. ex. un script qui rouvre et vérifie des fichiers."], ["Plugins","Contrôle middleware","#34A853","Middleware qui façonne le comportement à l'intérieur de la boucle d'outils."]]; var cg=$('#h2-cg');C.forEach(function(c,k){var b=document.createElement('button');b.className='cp';b.style.setProperty('--c',c[2]);b.innerHTML='<em>C'+(k+1)+' · '+c[1]+'</em><b>'+c[0]+'</b>';b.onclick=function(){$$('.cp').forEach(function(x){x.classList.remove('on')});b.classList.add('on');var n=$('#h2-cnote');n.style.borderLeftColor=c[2];n.innerHTML='<b>'+c[0]+'</b> ('+c[1].toLowerCase()+') : '+c[3]+' Chaque composant est un fichier que l'éditeur peut réécrire.';sz()};cg.appendChild(b)}); /* benchmarks */ var D={"Gemini 3.5 Flash · OpenCode":[[72.4,77.5],[31.5,36.0],[79.9,81.9]],"Gemini 3.5 Flash · Codex":[[74.5,77.5],[33.9,35.3],[71.6,75.6]],"GLM-5 · OpenCode":[[64.2,75.7],[20.6,24.2],[59.6,71.4]],"GLM-5 · Codex":[[64.4,75.3],[23.6,24.8],[58. 1,65.9]]}; var BN=["WorkBuddy-Bench (avg)","JobBench","LAB Partial (%)"],cur="GLM-5 · OpenCode"; var sel=$('#h2-sel');Object.keys(D).forEach(function(k){var b=document.createElement('button');b.className='chip'+(k===cur?' on':'');b.textContent=k;b.onclick=function(){cur=k;$$('#h2-sel .chip').forEach(function(x){x.classList.remove('on')});b.classList.add('on');drawB()};sel.appendChild(b)}); function drawB(){var bm=$('#h2-bm');bm.innerHTML='';D[cur].forEach(function(v,k){var d=(v[1]-v[0]).toFixed(1);var x=document.createElement('div');x.className='bx';x.innerHTML='<h4>'+BN[k]+'</h4><div class="row"><span>Base</span><div class="tr"><i style="background:#5f6368" data-w="'+v[0]+'"></i></div><b>'+v[0].toFixed(1)+'</b></div><div class="row"><span>Harness²</span><div class="tr"><i style="background:linear-gradient(90deg,#4285F4,#34A853)" data-w="'+v[1]+'"></i></div><b>'+v[1].toFixed(1)+'</b></div><div class="dl">+'+d+(k===2?' pp':' pts')+'</div>';bm.appendChild(x)}); requestAnimationFrame(function(){setTimeout(function(){$$('#h2-bm .tr i').forEach(function(e){e.style.width=e.dataset.w+'%'})},30)});sz()} /* baselines */ var RK={"WorkBuddy avg · OpenCode":[["Base harness",72.4],["ReasoningBank",73.4],["Harness Scaling",75.3],["Meta-Harness",76.4],["Harness² k=1",77.5],["Harness² k=5",80.8]], "JobBench · OpenCode":[["Base harness",31.5],["ReasoningBank",30.8],["Harness Scaling",32.9],["Meta-Harness",35.8],["Harness² k=1",36.0]], "LAB Partial · Codex":[["Base harness",71.6],["ReasoningBank",74.8],["Harness Scaling",67.9],["Meta-Harness",76.5],["Harness² k=1",75.6]]}; var rc="WorkBuddy avg · OpenCode",s2=$('#h2-sel2'); Object.keys(RK).forEach(function(k){var b=document.createElement('button');b.className='chip'+(k===rc?' on':'');b.textContent=k;b.onclick=function(){rc=k;$$('#h2-sel2 .chip').forEach(function(x){x.classList. remove('on')});b.classList.add('on');drawR()};s2.appendChild(b)}); function drawR(){var rk=$('#h2-rk');rk.innerHTML='';var mx=Math.max.apply(null,RK[rc].map(function(r){return r[1]})); RK[rc].forEach(function(r){var h=r[0].indexOf('Harness²')===0;var c=h?'linear-gradient(90deg,#4285F4,#34A853)':(r[1]===mx?'#FBBC04':'#5f6368');var x=document.createElement('div');x.className='row';x.innerHTML='<span'+(h?' style="color:#e8eaed;font-weight:700"':'')+'>'+r[0]+'</span><div class="tr"><i style="background:'+c+'" data-w="'+((r[1]-50)/40*100)+'"></i></div><b>'+r[1].toFixed(1)+'</b>';rk.appendChild(x)}); requestAnimationFrame(function(){setTimeout(function(){$$('#h2-rk .tr i').forEach(function(e){e.style.width=e.dataset.w+'%'})},30)});sz()} show(-1);window.addEventListener('load',sz);window.addEventListener('resize',sz);setTimeout(sz,300); })(); </script> </div> </body></html>">

Quelles sont les performances de Harness² sur les benchmarks ?

L'équipe de recherche a testé 3 benchmarks professionnels : WorkBuddy-Bench, JobBench et le LABde Harvey. Les exécuteurs étaient Gemini 3.5 Flash et GLM-5 sous OpenCode et Codex. L'éditeur par défaut était Claude Opus 4.8. Les résultats sont des moyennes sur 3 exécutions.

Configuration (étape unique, k=1)WorkBuddy AvgJobBenchLAB Partial
Gemini 3.5 Flash, OpenCode72.4 → 77.531.5 → 36.079.9 → 81.9
Gemini 3.5 Flash, Codex74.5 → 77.533.9 → 35.371.6 → 75.6
GLM-5, OpenCode64.2 → 75.720.6 → 24.259.6 → 71.4
GLM-5, Codex64.4 → 75.323.6 → 24.858.1 → 65.9

Source : article Harness², tableaux 1 et 2.

Les exécuteurs les plus faibles ont gagné davantage. Après 1 étape, GLM-5 a surpassé le Gemini 3.5 Flash de base sur WorkBuddy-Bench. La récursion parallèle à k=5 a porté Gemini sous OpenCode à 80.8 sur WorkBuddy. Sur WorkBuddy-Bench, 3 des 4 configurations ont également utilisé moins d'étapes par tâche. Gemini sous OpenCode est passé de 25.4 à 21.9.

Comment se compare-t-il aux autres méthodes de harness ?

FonctionnalitéHarness²Meta-HarnessReasoningBankHarness Scaling
DéveloppeursGoogle Cloud AI Research, NorthwesternStanford IRIS Lab et co-auteursGoogle Research et co-auteursWang et al.
Ce qui changeHarnais complet à 8 composants, par tâcheCode du harnais, recherché hors ligneMémoire récupérée ; harnais fixeHarnais, révisé par instance
Nécessite un ensemble d'entraînementNonOuiNonNon
Apprend à travers les tâchesOui (bibliothèque + leçons)Déploie 1 meilleur harnaisOui (mémoire)Non
Licence du codeApache-2.0MITNon divulguéNon divulgué
WorkBuddy Avg, Gemini/OpenCode*77.5 (80.8 à k=5)76.473.475.3
JobBench, Gemini/OpenCode*36.035.830.832.9
LAB Partiel, Gemini/Codex*75.676.574.867.9

*Scores tels que mesurés dans le papier Harness²; les autres méthodes n'ont pas rapporté elles-mêmes ces benchmarks.

Comment installer et exécuter Harness² ?

Le README cible Linux, Python 3.12 et uv. Une démo locale exécute les deux modes de récursion sans identifiants de modèle :

Copier le code
uv venv --python 3.12 .venv
source .venv/bin/activate
uv pip install -e '.[render]'
harness2-demo --output runs/demo --k 2

Les exécutions adossées à un modèle nécessitent Node.js 20+, la CLI Google Cloud et un projet Vertex AI. LAB nécessite Pandoc et Poppler. WorkBuddy-Bench nécessite Docker. Les exécuteurs sont OpenCode par défaut, ou Codex avec --substrate cx.

Points clés à retenir

  • Harness² réécrit le harnais d'un agent au moment du test ; les poids restent figés.
  • 1 étape a amélioré GLM-5 de 11.5 points sur WorkBuddy-Bench.
  • Propose, Probe, Compose remplace les étiquettes de vérité terrain par des contrastes comportementaux.
  • Une bibliothèque de leçons transmet les améliorations aux tâches futures.
  • Attendez-vous à des exécutions supplémentaires par tâche, et placez-le vous-même en bac à sable.


Découvrez le Paper, GitHub Repo, Paper et Project Page. Tout le mérite revient au chercheur de ce projet. N’hésitez pas également à nous suivre sur Twitter et n’oubliez pas de rejoindre notre 150k+ML SubReddit et de vous abonner à notre Newsletter. Attention ! êtes-vous sur Telegram ? vous pouvez désormais nous rejoindre sur Telegram également.

L’article Google Open-Sources Harness2, a Recursive Agent Harnessing Framework est apparu en premier sur MarkTechPost.

Source originale

MarkTechPost

À propos du contenu

La publication originale et les droits appartiennent à la source.

Traduction automatique · Consultez l’original