MarkTechPost

Google Open-Sources Harness2, un marco recursivo de harnessing de agentes

Google Research lanzó Harness2, un framework Apache-2.0 que reescribe el harness de un agente en tiempo de prueba. Un paso de refinamiento elevó a GLM-5 en 11.5 puntos en WorkBuddy-Bench sin actualizaciones de pesos. La…

Google Cloud AI Research ha abierto el código de Harness². Es un framework recursivo de harnessing de agentes que mejora el código y los archivos alrededor de un modelo congelado. Para los desarrolladores, la propuesta es simple. Tu agente puede mejorar sin un modelo mejor.

TL;DR

  • Tamaño: Un framework, no un modelo. 0 parámetros entrenados; 8 componentes de harness editables. Versión 0.1.0.
  • Funciona en: Linux con Python 3.12 o 3.13 y uv. Las ejecuciones del modelo llaman a los modelos a través de Vertex AI. Requisito de GPU: No revelado.
  • Rendimiento: 1 paso de refinamiento mejoró las 4 configuraciones de modelo y harness en los 3 benchmarks.
  • Mejor: GLM-5 bajo OpenCode subió de 64.2 a 75.7 en WorkBuddy-Bench (+11.5 puntos).
  • Peor: GLM-5 bajo Codex ganó solo 1.2 puntos en JobBench (23.6 a 24.8).

¿Qué es Harness²?

Harness² es un framework plug-and-play de Google Research que refina el harness de un agente durante el despliegue. Un harness es todo lo que rodea al modelo: prompts, herramientas, memoria, habilidades y orquestación. El harnessing es el proceso de optimizar ese sistema. Los pesos del modelo nunca cambian.

El entorno objetivo es el mundo abierto. Las tareas llegan sin ser vistas, y ningún verificador indica si una respuesta es correcta. El equipo de investigación argumenta que la mayoría de los métodos de auto-mejora asumen etiquetas o casos de prueba. Harness² está construido para funcionar sin ellos.

¿Cuáles son los 8 componentes del harness?

Harness² expone 8 componentes editables, cada uno montado como un archivo:

  1. System prompt
  2. Guardrails
  3. Memoria
  4. Guía de herramientas
  5. Subagentes
  6. Habilidades
  7. Scripts
  8. Plugins (middleware)

Cubren la construcción del contexto, la interfaz de herramientas, la delegación y el comportamiento dentro del bucle de herramientas. La estructura extiende la división en 7 archivos anterior Ingeniería de arneses agénticos trabajo de 1 componente.

¿Cómo funciona el aprovechamiento recursivo de agentes?

El marco ejecuta dos niveles vinculados de recursión:

  • Recursión a nivel de tarea utiliza un paso contrastivo de Propose, Probe, Compose. Primero, el agente ejecuta la tarea una vez con el harness base. Luego, un editor propone 2 candidatos. El candidato invariante apunta a fallos generales del agente, como la planificación o el uso de herramientas. El candidato de dominio apunta al conocimiento y a los procedimientos del dominio actual. Ambos candidatos se ejecutan en la misma tarea. El compositor compara sus trayectorias con la referencia y conserva solo las ediciones respaldadas por comportamiento observado.
  • Recursión a nivel de harness ocurre después de cada tarea. Un reflector almacena el harness adoptado junto con un EXPERIENCE.md archivo de lecciones. Esta biblioteca guía las propuestas futuras. Cada nueva tarea sigue comenzando desde el harness base.

El presupuesto k escala la búsqueda. El modo paralelo sondea k candidatos invariantes y k candidatos de dominio, y luego realiza k composiciones. El modo secuencial encadena k pasos de refinamiento.

Reproducir</button><button class="btn" id="h2-step">Paso →</button><button class="btn" id="h2-reset">↺ Restablecer</button><div class="prog"><i id="h2-prog"></i></div></div> <div class="fn">Con k=1: 1 referencia + 2 sondeos + 1 ejecución final por tarea. El modo paralelo sondea k invariantes y k candidatos de dominio; el modo secuencial encadena k pasos.</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">Haga clic en un componente para ver su rol en tiempo de ejecución.</div> <div class="lg"><span style="--c:#4285F4">Construcción de contexto</span><span style="--c:#EA4335">Interfaz de herramientas</span><span style="--c:#FBBC04">Orquestación</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">Un único paso de mejora (k=1). Medias sobre 3 ejecuciones. LAB = Tasa de aprobación parcial (%). Fuente: artículo de Harness<sup>2</sup>, Tablas 1 y 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">Ejecutor Gemini 3.5 Flash. El eje de barras comienza en 50. Meta-Harness se optimiza sin conexión en tareas de entrenamiento separadas. Puntuaciones tal como se midieron en el artículo de Harness<sup>2</sup>.</div> </div> <div class="ft"><span>Fuentes: 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>Referencia.</b> El modelo congelado ejecuta la tarea con el harness base H0. Esto muestra cómo se comporta el harness, no si la respuesta es correcta.", "<b>Proponer.</b> Un editor redacta 2 candidatos: uno de <b>invariante</b> para fallos generales del agente (planificación, uso de herramientas) y uno de <b>dominio</b> para conocimiento y procedimientos de la tarea.", "<b>Sondear.</b> Cada candidato se ejecuta en la misma tarea. Comparar las trayectorias con la referencia proporciona un contraste conductual. No se necesitan etiquetas de verdad terreno.", "<b>Componer.</b> El compositor lee todas las evidencias y diffs. Puede fusionar, revisar, adoptar 1 candidato o mantener el harness actual.", "<b>Ejecutar.</b> El harness compuesto se ejecuta y devuelve el entregable final.", "<b>Reflexionar.</b> Se revisa el registro completo de mejora. Las lecciones se conservan solo si los contrastes de ejecución las respaldan.", "<b>Actualizar.</b> El harness adoptado y un <code>EXPERIENCE.md</code> de lecciones se incorporan a la biblioteca de mejoras.", "<b>Siguiente tarea.</b> El ejecutor se restablece a H0, pero la biblioteca ahora guía las propuestas y la composición. Eliminarla redujo WorkBuddy de 77.5 a 74.4."]; function show(k){nd.forEach(function(n,j){n.classList.toggle('lit',j<=k)});$('#h2-note').innerHTML=k<0?"Pulse <b>Reproducir</b> o <b>Paso</b> para recorrer 1 paso de mejora de 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=' Reproducir'}} $('#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='❚❚ Pausa'}; /* components */ var C=[["Prompt de sistema","Construcción de contexto","#4285F4","Persona y procedimiento de nivel superior seguidos en cada llamada."], ["Guardarraíles","Construcción de contexto","#4285F4","Reglas de proceso, p. ej. verificar las salidas antes de terminar."], ["Memoria","Construcción de contexto","#4285F4","Contexto persistente puesto a disposición del agente."], ["Guía de herramientas","Interfaz de herramientas","#EA4335","Cómo usar herramientas específicas y manejar formatos con precisión."], ["Subagentes","Orquestación","#FBBC04","Roles delegados con sus propias instrucciones."], ["Habilidades","Construcción de contexto","#4285F4","Procedimientos de dominio reutilizables, p. ej. una habilidad de conciliación."], ["Scripts","Interfaz de herramientas","#EA4335","Ayudantes ejecutables, p. ej. un script que reabre y comprueba archivos."], ["Plugins","Control de middleware","#34A853","Middleware que moldea el comportamiento dentro del bucle de herramientas."]]; 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]+' Cada componente es un archivo que el editor puede reescribir.';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>">

¿Cómo se desempeña Harness² en los benchmarks?

El equipo de investigación probó 3 benchmarks profesionales: WorkBuddy-Bench, JobBench y el LABde Harvey. Los ejecutores fueron Gemini 3.5 Flash y GLM-5 bajo OpenCode y Codex. El editor predeterminado fue Claude Opus 4.8. Los resultados son promedios de 3 ejecuciones.

Configuración (paso único, 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

Fuente: artículo de Harness², Tablas 1 y 2.

Los ejecutores más débiles ganaron más. Tras 1 paso, GLM-5 superó al Gemini 3.5 Flash base en WorkBuddy-Bench. La recursión paralela con k=5 elevó a Gemini bajo OpenCode hasta 80.8 en WorkBuddy. En WorkBuddy-Bench, 3 de las 4 configuraciones también usaron menos pasos por tarea. Gemini bajo OpenCode bajó de 25.4 a 21.9.

¿Cómo se compara con otros métodos de harness?

CaracterísticaHarness²Meta-HarnessReasoningBankHarness Scaling
DesarrolladoresGoogle Cloud AI Research, NorthwesternStanford IRIS Lab y coautoresGoogle Research y coautoresWang et al.
Qué cambiaArnés completo de 8 componentes, por tareaCódigo del arnés, buscado sin conexiónMemoria recuperada; arnés fijoArnés, revisado por instancia
Requiere conjunto de entrenamientoNoSíNoNo
Aprende entre tareasSí (biblioteca + lecciones)Despliega 1 mejor harnessSí (memoria)No
Licencia del códigoApache-2.0MITNo divulgadoNo divulgado
WorkBuddy Promedio, Gemini/OpenCode*77.5 (80.8 en k=5)76.473.475.3
JobBench, Gemini/OpenCode*36.035.830.832.9
LAB Parcial, Gemini/Codex*75.676.574.867.9

*Puntuaciones según lo medido en el artículo de Harness²; los otros métodos no reportaron estos benchmarks por sí mismos.

¿Cómo se instala y ejecuta Harness²?

El README está dirigido a Linux, Python 3.12 y uv. Una demo local ejecuta ambos modos de recursión sin credenciales de modelo:

Copiar código
uv venv --python 3.12 .venv
source .venv/bin/activate
uv pip install -e '.[render]'
harness2-demo --output runs/demo --k 2

Las ejecuciones respaldadas por modelo necesitan Node.js 20+, la CLI de Google Cloud y un proyecto de Vertex AI. LAB necesita Pandoc y Poppler. WorkBuddy-Bench necesita Docker. Los ejecutores son OpenCode por defecto, o Codex con --substrate cx.

Conclusiones clave

  • Harness² reescribe el harness de un agente en tiempo de prueba; los pesos permanecen congelados.
  • 1 paso elevó GLM-5 en 11.5 puntos en WorkBuddy-Bench.
  • Propose, Probe, Compose reemplaza las etiquetas de verdad del terreno con contrastes conductuales.
  • Una biblioteca de lecciones lleva las mejoras a tareas futuras.
  • Espera ejecuciones adicionales por tarea, y haz tu propio sandbox.


Consulta Paper, Repositorio de GitHub, Paper y Página del Proyecto. Todo el mérito es del investigador de este proyecto. Además, no dudes en seguirnos en Twitter y no olvides unirte a nuestro SubReddit de ML con más de 150k y suscribirte a nuestro Newsletter. ¡Espera! ¿estás en telegram? ahora también puedes unirte a nosotros en telegram.

La entrada Google Open-Sources Harness2, a Recursive Agent Harnessing Framework apareció primero en MarkTechPost.

Fuente original

MarkTechPost

Notas sobre el contenido

La publicación original y los derechos pertenecen a la fuente.

Traducción automática · Consulte el original