MarkTechPost

Google Open-Sources Harness2, ein rekursives Agent-Harnessing-Framework

Google Research hat Harness2 veröffentlicht, ein Apache-2.0-Framework, das den Harness eines Agents zur Laufzeit des Tests neu schreibt. Ein einzelner Verfeinerungsschritt hob GLM-5 um 11,5 Punkte auf WorkBuddy-Bench…

Google Cloud AI Research hat als Open Source veröffentlicht Harness². Es ist ein rekursives Agent-Harnessing-Framework, das den Code und die Dateien um ein eingefrorenes Modell verbessert. Für Entwickler ist das Versprechen einfach. Ihr Agent kann besser werden, ohne ein besseres Modell.

TL;DR

  • Größe: Ein Framework, kein Modell. 0 trainierte Parameter; 8 bearbeitbare Harness-Komponenten. Version 0.1.0.
  • Läuft auf: Linux mit Python 3.12 oder 3.13 und uv. Modellausführungen rufen Modelle über Vertex AI auf. GPU-Anforderung: Nicht angegeben.
  • Leistung: 1 Verfeinerungsschritt verbesserte alle 4 Modell- und Harness-Konfigurationen auf allen 3 Benchmarks.
  • Bestes Ergebnis: GLM-5 unter OpenCode stieg auf WorkBuddy-Bench von 64,2 auf 75,7 (+11,5 Punkte).
  • Schlechtestes Ergebnis: GLM-5 unter Codex gewann auf JobBench nur 1,2 Punkte (23,6 auf 24,8).

Was ist Harness²?

Harness² ist ein Plug-and-Play-Framework von Google Research, das den Harness eines Agents während des Einsatzes verfeinert. Ein Harness ist alles um das Modell herum: Prompts, Tools, Speicher, Skills und Orchestrierung. Harnessing ist der Prozess der Optimierung dieses Systems. Die Modellgewichte ändern sich nie.

Die Zielumgebung ist die offene Welt. Aufgaben treffen unerwartet ein, und kein Verifizierer sagt, ob eine Antwort richtig ist. Das Forschungsteam argumentiert, dass die meisten Self-Improvement-Methoden Labels oder Testfälle voraussetzen. Harness² ist darauf ausgelegt, ohne sie zu funktionieren.

Was sind die 8 Harness-Komponenten?

Harness² legt 8 bearbeitbare Komponentenoffen, jeweils als Datei eingebunden:

  1. Systemprompt
  2. Guardrails
  3. Memory
  4. Tool-Anleitung
  5. Subagenten
  6. Skills
  7. Skripte
  8. Plugins (Middleware)

Sie decken die Kontextkonstruktion, die Werkzeugschnittstelle, die Delegation und das Verhalten innerhalb der Werkzeugschleife ab. Das Layout erweitert die 7-Datei-Aufteilung aus früheren Agentic Harness Engineering Arbeiten um 1 Komponente.

Wie funktioniert rekursives Agent-Harnessing?

Das Framework betreibt zwei verknüpfte Rekursionsebenen:

  • Rekursion auf Aufgabenebene verwendet einen kontrastiven Propose-, Probe-, Compose-Schritt. Zunächst führt der Agent die Aufgabe einmal mit dem Basis-Harness aus. Ein Editor schlägt dann 2 Kandidaten vor. Der Invariant-Kandidat zielt auf allgemeine Agentenfehler wie Planung oder Werkzeugnutzung ab. Der Domain-Kandidat zielt auf Wissen und Verfahren für die aktuelle Domäne ab. Beide Kandidaten laufen auf derselben Aufgabe. Der Composer vergleicht ihre Trajektorien mit der Referenz und behält nur Änderungen bei, die durch beobachtetes Verhalten gestützt werden.
  • Rekursion auf Harnessing-Ebene findet nach jeder Aufgabe statt. Ein Reflektor speichert den übernommenen Harness plus eine EXPERIENCE.md Datei mit Erkenntnissen. Diese Bibliothek leitet zukünftige Vorschläge an. Jede neue Aufgabe beginnt weiterhin mit dem Basis-Harness.

Das Budget k skaliert die Suche. Der Parallelmodus prüft k Invariant- und k Domain-Kandidaten und erstellt dann k Kompositionen. Der sequentielle Modus verkettet k Verfeinerungsschritte.

Abspielen</button><button class="btn" id="h2-step">Schritt →</button><button class="btn" id="h2-reset">↺ Zurücksetzen</button><div class="prog"><i id="h2-prog"></i></div></div> <div class="fn">Bei k=1: 1 Referenz + 2 Sonden + 1 endgültiger Lauf pro Aufgabe. Der Parallelmodus prüft k Invarianten- und k Domänen-Kandidaten; der sequentielle Modus verkettet k Schritte.</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">Klicken Sie auf eine Komponente, um ihre Laufzeitrolle zu sehen.</div> <div class="lg"><span style="--c:#4285F4">Kontextkonstruktion</span><span style="--c:#EA4335">Werkzeugschnittstelle</span><span style="--c:#FBBC04">Orchestrierung</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">Einzelner Verbesserungsschritt (k=1). Mittelwerte über 3 Läufe. LAB = Partielle Bestehensquote (%). Quelle: Harness<sup>2</sup>-Paper, Tabellen 1 und 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">Gemini 3.5 Flash als Ausführer. Die Balkenachse beginnt bei 50. Das Meta-Harness wird offline auf separaten Trainingsaufgaben optimiert. Werte wie im Harness<sup>2</sup>-Paper gemessen.</div> </div> <div class="ft"><span>Quellen: 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>Referenz.</b> Das eingefrorene Modell führt die Aufgabe mit dem Basis-Harness H0 aus. Dies zeigt, wie sich der Harness verhält, nicht ob die Antwort korrekt ist.", "<b>Vorschlagen.</b> Ein Editor entwirft 2 Kandidaten: einen <b>Invarianten</b> für allgemeine Agentenfehler (Planung, Werkzeugnutzung) und einen <b>Domänen</b>-Kandidaten für Aufgabenwissen und Abläufe.", "<b>Prüfen.</b> Jeder Kandidat läuft auf derselben Aufgabe. Der Vergleich der Trajektorien mit der Referenz ergibt einen Verhaltenskontrast. Keine Ground-Truth-Labels nötig.", "<b>Komponieren.</b> Der Composer liest alle Evidenzen und Diffs. Er kann zusammenführen, überarbeiten, 1 Kandidaten übernehmen oder den aktuellen Harness behalten.", "<b>Ausführen.</b> Der komponierte Harness läuft und liefert das Endergebnis.", "<b>Reflektieren.</b> Der gesamte Verbesserungsverlauf wird überprüft. Erkenntnisse werden nur beibehalten, wenn Ausführungskontraste sie stützen.", "<b>Aktualisieren.</b> Der übernommene Harness und eine <code>EXPERIENCE.md</code> mit Erkenntnissen kommen in die Verbesserungsbibliothek.", "<b>Nächste Aufgabe.</b> Der Ausführer setzt auf H0 zurück, aber die Bibliothek leitet nun Vorschläge und Komposition. Sie zu entfernen senkte WorkBuddy von 77.5 auf 74.4."]; function show(k){nd.forEach(function(n,j){n.classList.toggle('lit',j<=k)});$('#h2-note').innerHTML=k<0?"Drücken Sie <b>Abspielen</b> oder <b>Schritt</b>, um 1 Harness<sup>2</sup>-Verbesserungsschritt durchzugehen.":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=' Abspielen'}} $('#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","Kontextkonstruktion","#4285F4","Persona und oberste Prozedur, die bei jedem Aufruf befolgt wird."], ["Guardrails","Kontextkonstruktion","#4285F4","Prozessregeln, z. B. Ausgaben vor dem Abschluss überprüfen."], ["Memory","Kontextkonstruktion","#4285F4","Dauerhafter Kontext, der dem Agenten zur Verfügung gestellt wird."], ["Tool guidance","Werkzeugschnittstelle","#EA4335","Wie man bestimmte Werkzeuge verwendet und Formate präzise handhabt."], ["Subagents","Orchestrierung","#FBBC04","Delegierte Rollen mit eigenen Anweisungen."], ["Skills","Kontextkonstruktion","#4285F4","Wiederverwendbare Domänenprozeduren, z. B. eine Abstimmungs-Skill."], ["Scripts","Werkzeugschnittstelle","#EA4335","Ausführbare Helfer, z. B. ein Skript, das Dateien erneut öffnet und prüft."], ["Plugins","Middleware-Steuerung","#34A853","Middleware, die das Verhalten innerhalb der Werkzeugschleife formt."]]; 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]+' Jede Komponente ist eine Datei, die der Editor umschreiben kann.';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>">

Wie schneidet Harness² bei Benchmarks ab?

Das Forschungsteam hat 3 professionelle Benchmarks getestet: WorkBuddy-Bench, JobBench und Harveys LAB. Executors waren Gemini 3.5 Flash und GLM-5 unter OpenCode und Codex. Der Standard-Editor war Claude Opus 4.8. Die Ergebnisse sind Mittelwerte über 3 Läufe.

Setup (einzelner Schritt, 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

Quelle: Harness²-Papier, Tabellen 1 und 2.

Schwächere Executors profitierten mehr. Nach 1 Schritt übertraf GLM-5 das basis Gemini 3.5 Flash bei WorkBuddy-Bench. Parallele Rekursion bei k=5 hob Gemini unter OpenCode auf 80.8 bei WorkBuddy. Bei WorkBuddy-Bench benötigten 3 von 4 Setups zudem weniger Schritte pro Aufgabe. Gemini unter OpenCode sank von 25.4 auf 21.9.

Wie vergleicht es sich mit anderen Harness-Methoden?

FeatureHarness²Meta-HarnessReasoningBankHarness Scaling
EntwicklerGoogle Cloud AI Research, NorthwesternStanford IRIS Lab und Co-AutorenGoogle Research und Co-AutorenWang et al.
Was sich ändertVollständiger Harness mit 8 Komponenten, pro AufgabeHarness-Code, offline gesuchtAbrufbarer Speicher; Harness festHarness, pro Instanz überarbeitet
Benötigt Trainings-SplitNeinJaNeinNein
Lernt über Aufgaben hinwegJa (Bibliothek + Lektionen)Setzt 1 bestes Harness einJa (Gedächtnis)Nein
Code-LizenzApache-2.0MITNicht offengelegtNicht offengelegt
WorkBuddy Avg, Gemini/OpenCode*77.5 (80.8 bei k=5)76.473.475.3
JobBench, Gemini/OpenCode*36.035.830.832.9
LAB Partial, Gemini/Codex*75.676.574.867.9

*Werte wie in der Harness²-Papergemessen; die anderen Methoden haben diese Benchmarks selbst nicht berichtet.

Wie installiert und führt man Harness² aus?

Die README zielt auf Linux, Python 3.12 und uv. Eine lokale Demo läuft ohne Modell-Zugangsdaten in beiden Rekursionsmodi:

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

Läufe mit Modell-Backend benötigen Node.js 20+, die Google Cloud CLI und ein Vertex AI-Projekt. LAB benötigt Pandoc und Poppler. WorkBuddy-Bench benötigt Docker. Executors sind standardmäßig OpenCode, oder Codex mit --substrate cx.

Kernpunkte

  • Harness² schreibt den Harness eines Agenten zur Laufzeit um; die Gewichte bleiben eingefroren.
  • 1 Schritt hob GLM-5 auf WorkBuddy-Bench um 11.5 Punkte.
  • Propose, Probe, Compose ersetzt Ground-Truth-Labels durch behaviorale Kontraste.
  • Eine Lektionen-Bibliothek trägt Verbesserungen in zukünftige Aufgaben.
  • Rechne mit zusätzlichen Läufen pro Aufgabe und sandboxe es selbst.


Schauen Sie sich das Paper, GitHub Repo, Paper und die Projektseitean. Ganzes Lob gilt den Forschern dieses Projekts. Folgen Sie uns gerne auch auf Twitter und vergessen Sie nicht, unserem 150k+ML SubReddit beizutreten und unseren Newsletterzu abonnieren. Moment! Sind Sie auf Telegram? jetzt können Sie uns auch auf Telegram beitreten.

Der Beitrag Google Open-Sources Harness2, a Recursive Agent Harnessing Framework erschien zuerst auf MarkTechPost.

Originalquelle

MarkTechPost

Hinweise zum Inhalt

Originalveröffentlichung und Rechte liegen bei der Quelle.

Maschinelle Übersetzung · Original beachten