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 компонент.

Как работает рекурсивное управление агентом?

Фреймворк запускает два связанных уровня рекурсии:

  • Рекурсия на уровне задачи использует контрастивный этап «Предложить, проверить, объединить». Сначала агент один раз выполняет задачу с базовой обвязкой. Затем редактор предлагает 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 avg · 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 Partial · Codex":[["Базовая обвязка",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>">

Как Harness² показывает себя на бенчмарках?

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

Конфигурация (один шаг, k=1)Среднее WorkBuddyJobBenchLAB, частичное выполнение
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 на 11,5 пункта на WorkBuddy-Bench.
  • «Предложить, проверить, объединить» заменяет эталонные метки поведенческими контрастами.
  • Библиотека выводов переносит улучшения на будущие задачи.
  • Ожидайте дополнительных запусков для каждой задачи и самостоятельно изолируйте систему в песочнице.

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

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

Впервые опубликовано изданием MarkTechPost

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

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

← К новостям

Ещё новости

Все последние новости