Sakhanda Wire
NVDA $214.13 -1.43% MSFT $529.05 -1.93% GOOGL $340.59 -2.47% META $709.33 -3.72% AMZN $250.00 -1.87%
← До новин

Google відкрила вихідний код Harness2 — фреймворку для рекурсивного керування агентами

Google Cloud AI Research оприлюднив у відкритому доступі Harness². Це рекурсивний фреймворк для роботи з агентами, який покращує код і файли навколо замороженої моделі. Для розробників ідея проста: ваш агент може стати кращим без покращення самої моделі.

Коротко

  • Розмір: Фреймворк, а не модель. Навчено 0 параметрів; 8 редагованих компонентів оболонки. Версія 0.1.0.
  • Працює на: Linux із Python 3.12 або 3.13 та uv. Виклики моделей здійснюються через Vertex AI. Вимоги до GPU: не розкрито.
  • Продуктивність: 1 крок уточнення покращив усі 4 конфігурації моделей і оболонки на всіх 3 бенчмарках.
  • Найкращий результат: GLM-5 під OpenCode зросла з 64.2 до 75.7 на WorkBuddy-Bench (+11.5 бала).
  • Найгірший результат: GLM-5 під Codex додала лише 1.2 бала на JobBench (з 23.6 до 24.8).

Що таке Harness²?

Harness² — це модульний фреймворк від Google Research, який уточнює оболонку агента під час розгортання. Оболонка — це все, що оточує модель: підказки, інструменти, пам’ять, навички та оркестрація. Робота з оболонкою — це процес оптимізації цієї системи. Ваги моделі ніколи не змінюються.

Цільовий сценарій — відкритий світ. Завдання надходять без попереднього ознайомлення, і жоден верифікатор не повідомляє, чи є відповідь правильною. Дослідницька команда стверджує, що більшість методів самовдосконалення передбачають наявність міток або тестових випадків. Harness² створено для роботи без них.

Які існують 8 компонентів оболонки?

Harness² надає 8 редагованих компонентів, кожен із яких представлено окремим файлом:

  1. Системна підказка
  2. Захисні обмеження
  3. Пам’ять
  4. Інструкції щодо інструментів
  5. Субагенти
  6. Навички
  7. Скрипти
  8. Плагіни (проміжне програмне забезпечення)

Вони охоплюють формування контексту, інтерфейс інструментів, делегування та поведінку всередині циклу роботи з інструментами. Ця структура розширює поділ на 7 файлів із попередньої роботи Agentic Harness Engineering на 1 компонент.

Як працює рекурсивна робота агента з оболонкою?

Фреймворк запускає два пов’язані рівні рекурсії:

  • Рекурсія на рівні завдання використовує контрастивний етап Propose, Probe, Compose. Спочатку агент один раз виконує завдання з базовою оболонкою. Потім редактор пропонує 2 варіанти. Інваріантний варіант спрямований на загальні проблеми агентів, як-от планування або використання інструментів. Доменний варіант націлений на знання та процедури для поточного домену. Обидва варіанти запускаються на тому самому завданні. Компоновник порівнює їхні траєкторії з еталонною та залишає лише ті зміни, які підтверджені спостережуваною поведінкою.
  • Рекурсія на рівні оболонки відбувається після кожного завдання. Рефлектор зберігає прийняту оболонку та файл EXPERIENCE.md із висновками. Ця бібліотека спрямовує майбутні пропозиції. Кожне нове завдання все одно починається з базової оболонки.

Бюджет k масштабує пошук. У паралельному режимі перевіряються k інваріантних і k доменних варіантів, після чого створюються k композицій. У послідовному режимі ланцюжком виконуються k кроків уточнення.

Play</button><button class="btn" id="h2-step">Крок →</button><button class="btn" id="h2-reset">↺ Скинути</button><div class="prog"><i id="h2-prog"></i></div></div> <div class="fn">За k=1: 1 еталонний запуск + 2 перевірки + 1 фінальний запуск для кожного завдання. У паралельному режимі перевіряються k інваріантних і k доменних варіантів; у послідовному режимі ланцюжком виконуються k кроків.</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">Натисніть компонент, щоб переглянути його роль під час виконання.</div> <div class="lg"><span style="--c:#4285F4">Формування контексту</span><span style="--c:#EA4335">Інтерфейс інструментів</span><span style="--c:#FBBC04">Оркестрація</span><span style="--c:#34A853">Проміжне програмне забезпечення</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">Один крок покращення (k=1). Середні значення за 3 запуски. LAB = частка частково успішних результатів (%). Джерело: стаття Harness<sup>2</sup>, таблиці 1 і 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. Вісь діаграми починається з 50. Meta-Harness оптимізовано офлайн на окремих навчальних завданнях. Оцінки наведено за результатами вимірювань у статті Harness<sup>2</sup>.</div> </div> <div class="ft"><span>Джерела: 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)}}); /* конвеєр */ var nd=$$('.nd'),i=-1,tm=null; var notes=["<b>Еталон.</b> Заморожена модель виконує завдання з базовою оболонкою H0. Це показує, як поводиться оболонка, але не те, чи є відповідь правильною.", "<b>Пропозиція.</b> Редактор створює 2 варіанти: <b>інваріантний</b> — для загальних проблем агента (планування, використання інструментів), і <b>доменний</b> — для знань і процедур завдання.", "<b>Перевірка.</b> Кожен варіант запускається на тому самому завданні. Порівняння траєкторій з еталонною дає поведінковий контраст. Еталонні мітки не потрібні.", "<b>Компонування.</b> Компоновник читає всі докази та відмінності. Він може об’єднати, переглянути, прийняти 1 варіант або залишити поточну оболонку.", "<b>Виконання.</b> Скомпонована оболонка запускається та повертає фінальний результат.", "<b>Рефлексія.</b> Переглядається повний запис покращення. Висновки зберігаються лише за умови, що їх підтверджують поведінкові відмінності під час виконання.", "<b>Оновлення.</b> Прийнята оболонка та файл <code>EXPERIENCE.md</code> із висновками додаються до бібліотеки покращень.", "<b>Наступне завдання.</b> Виконавець повертається до H0, але тепер бібліотека спрямовує пропозиції та компонування. Її вилучення знизило результат WorkBuddy з 77.5 до 74.4."]; function show(k){nd.forEach(function(n,j){n.classList.toggle('lit',j<=k)});$('#h2-note').innerHTML=k<0?"Натисніть <b>Відтворити</b> або <b>Крок</b>, щоб пройти 1 крок покращення 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=' Відтворити'}} $('#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='❚❚ Пауза'}; /* компоненти */ var C=[["Системна підказка","Формування контексту","#4285F4","Персона та процедура верхнього рівня, яких дотримуються під час кожного виклику."], ["Захисні обмеження","Формування контексту","#4285F4","Правила процесу, наприклад перевірка результатів перед завершенням."], ["Пам’ять","Формування контексту","#4285F4","Постійний контекст, доступний агенту."], ["Інструкції щодо інструментів","Інтерфейс інструментів","#EA4335","Як використовувати конкретні інструменти та точно обробляти формати."], ["Субагенти","Оркестрація","#FBBC04","Делеговані ролі з власними інструкціями."], ["Навички","Формування контексту","#4285F4","Повторно використовувані доменні процедури, наприклад навичка узгодження."], ["Скрипти","Інтерфейс інструментів","#EA4335","Виконувані допоміжні засоби, наприклад скрипт, який повторно відкриває та перевіряє файли."], ["Плагіни","Керування проміжним програмним забезпеченням","#34A853","Проміжне програмне забезпечення, яке формує поведінку всередині циклу роботи з інструментами."]]; 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]+' Кожен компонент є файлом, який редактор може переписати.';sz()};cg.appendChild(b)}); /* бенчмарки */ 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 (середнє)","JobBench","LAB Частково (%)"],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>Базова</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?' в.п.':' бал.')+'</div>';bm.appendChild(x)}); requestAnimationFrame(function(){setTimeout(function(){$$('#h2-bm .tr i').forEach(function(e){e.style.width=e.dataset.w+'%'})},30)});sz()} /* базові показники */ var RK={"WorkBuddy середнє · OpenCode":[["Базова оболонка",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":[["Базова оболонка",31.5],["ReasoningBank",30.8],["Harness Scaling",32.9],["Meta-Harness",35.8],["Harness² k=1",36.0]], "LAB Частково · Codex":[["Базова оболонка",71.6],["ReasoningBank",74.8],["Harness Scaling",67.9],["Meta-Harness",76.5],["Harness² k=1",75.6]]}; var rc="WorkBuddy середнє · 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>">

Як Harness² працює на бенчмарках?

Дослідницька команда протестувала 3 професійні бенчмарки: WorkBuddy-Bench, JobBench і LAB від Harvey. Виконавцями були Gemini 3.5 Flash і GLM-5 під OpenCode та Codex. Типовим редактором був Claude Opus 4.8. Результати є середніми значеннями за 3 запуски.

Конфігурація (один крок, k=1)WorkBuddy, середнєJobBenchLAB, частково
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

Джерело: стаття Harness², таблиці 1 і 2.

Більше виграли слабші виконавці. Після 1 кроку GLM-5 випередила базову Gemini 3.5 Flash на WorkBuddy-Bench. Паралельна рекурсія за k=5 підняла результат Gemini під OpenCode до 80.8 на WorkBuddy. На WorkBuddy-Bench у 3 із 4 конфігурацій також використовувалося менше кроків на завдання. У Gemini під OpenCode цей показник знизився з 25.4 до 21.9.

Як це порівнюється з іншими методами роботи з оболонкою?

ХарактеристикаHarness²Meta-HarnessReasoningBankHarness Scaling
РозробникиGoogle Cloud AI Research, NorthwesternStanford IRIS Lab і співавториGoogle Research і співавториWang та ін.
Що змінюєтьсяПовна оболонка з 8 компонентів, для кожного завданняКод оболонки, шукається офлайнОтримана пам’ять; оболонка незміннаОболонка, переглядається для кожного екземпляра
Потрібен розподіл для навчанняНіТакНіНі
Навчається між завданнямиТак (бібліотека + висновки)Розгортає 1 найкращу оболонкуТак (пам’ять)Ні
Ліцензія кодуApache-2.0MITНе розкритоНе розкрито
WorkBuddy, середнє, Gemini/OpenCode*77.5 (80.8 за k=5)76.473.475.3
JobBench, Gemini/OpenCode*36.035.830.832.9
LAB, частково, Gemini/Codex*75.676.574.867.9

*Оцінки за результатами вимірювань у статті Harness²; інші методи самостійно не наводили результати на цих бенчмарках.

Як встановити та запустити Harness²?

README орієнтований на Linux, Python 3.12 та uv. Локальна демонстрація запускає обидва режими рекурсії без облікових даних моделі:

Копіювати кодСкопійованоВикористати інший браузер
uv venv --python 3.12 .venv
source .venv/bin/activate
uv pip install -e '.[render]'
harness2-demo --output runs/demo --k 2

Для запусків із моделлю потрібні Node.js 20+, Google Cloud CLI та проєкт Vertex AI. Для LAB потрібні Pandoc і Poppler. Для WorkBuddy-Bench потрібен Docker. За замовчуванням виконавцями є OpenCode або Codex із --substrate cx.

Основні висновки

  • Harness² переписує оболонку агента під час тестування; ваги залишаються замороженими.
  • 1 крок підвищив результат GLM-5 на WorkBuddy-Bench на 11.5 бала.
  • Propose, Probe, Compose замінює еталонні мітки поведінковими контрастами.
  • Бібліотека висновків переносить покращення на майбутні завдання.
  • Очікуйте додаткових запусків для кожного завдання та самостійно ізолюйте систему в пісочниці.

Ознайомтеся зі статтею, репозиторієм GitHub, статтею та сторінкою проєкту. Уся подяка належить дослідникам цього проєкту. Також підписуйтеся на нас у Twitter і не забудьте приєднатися до нашого субреддіту про машинне навчання зі 150 тис.+ учасників та підписатися на нашу розсилку. Стривайте! Ви є в Telegram? тепер ви також можете приєднатися до нас у Telegram.

Перекладено автоматично з англійської. Оригінал статті — за посиланням нижче.

Вперше опубліковано виданням MarkTechPost

Читати оригінал на MarkTechPost ↗

Текст і зображення належать MarkTechPost і наводяться тут із зазначенням авторства та посиланням на оригінальну публікацію.

← До новин

Ще новини

Усі останні новини