3,583 papers
arXiv:2610.32483 70 23 окт. 2026 г. FREE

Model–Harness Fit: результат агента зависит от пары «модель + обвязка», а не только от модели

КЛЮЧЕВАЯ СУТЬ
Kimi на задачах с длинным контекстом набирает в среднем 54% в одной обвязке и 8% в другой. Модель та же, задачи те же. Метод позволяет выбрать, в чём запускать агента на ваших задачах, а не верить чужому рейтингу. Меряй не модель, а пару «модель + обвязка», и два показателя отдельно: решена ли задача и чисто ли завершился прогон. Обвязка (harness) — программа вокруг модели. Она решает, что модель видит, какие инструменты ей дать и когда остановиться. Рейтинг лучшей модели и рейтинг лучшей обвязки не переносятся с одной пары на другую. Важно: это не промпт, а схема проверки, и считать её придётся снаружи.
Адаптировать под запрос
⚡

TL;DR

Обвязка агента (harness) — это программа вокруг модели. Она решает, что модель видит, какие инструменты ей доступны, как повторять неудачные шаги и когда остановиться. Примеры: Codex CLI, OpenCode, Pi CLI, DeepAgents. Авторы прогнали одни и те же модели в четырёх обвязках на одних и тех же задачах. Они считали две вещи отдельно: решена ли задача и завершился ли прогон чисто (агент остановился сам и сдал результат в читаемом виде).

Главная находка: рейтинг «какая модель лучше» и «какая обвязка лучше» не переносится с одной пары на другую. Одна и та же модель в одной обвязке решает задачу, а в другой почти ничего не делает. Например, Kimi на задачах с долгим контекстом показывает то 8%, то 54% в среднем — только от смены обвязки. А лидер у одной модели оказывается аутсайдером у другой. Причина в том, что у обвязки есть «цена входа»: формат наблюдений, способ вызова инструментов, правила повторов. Одной модели это удобно, другой — нет.

Ещё два вывода. Во-первых, чистое завершение ≠ решённая задача: прогон может закончиться аккуратно и ничего не решить, а может «упасть» и всё равно получить частичный балл. Во-вторых, больше токенов ≠ лучше результат. Мало токенов часто значит, что агент остановился слишком рано. Много — что он долбился в одну и ту же ошибку.

🔬

Схема метода

Это не техника промптинга, а схема оценки. Её можно повторить в малом масштабе.

ШАГ 1: Фиксируем набор одинаковых задач → одни и те же для всех пар
ШАГ 2: Берём несколько моделей × несколько обвязок → таблица «модель × обвязка»
ШАГ 3: Каждую пару гоняем несколько раз (в статье — 4) → усредняем
ШАГ 4: Для каждого прогона отдельно отмечаем:
        (а) решена ли задача (балл)
        (б) завершился ли прогон чисто и сдал результат (да/нет)
ШАГ 5: Считаем «пригодность пары» → результат пары / лучший результат этой модели среди обвязок
ШАГ 6: Смотрим расход токенов рядом с результатом → ищем «много сожгли — мало получили»

Каждый шаг — отдельный запуск. Всё считается снаружи, одним промптом это не сделать.

🚀

Пример применения

Метод ценен там, где вы выбираете, чем запускать агента на своих задачах. Решить такой выбор одним промптом нельзя, но вот как сделать проверку на практике.

Задача: Студия в Новосибирске делает интеграции для интернет-магазинов: выгрузки на Ozon и Wildberries, правки в 1С-обменах. Тимлид хочет посадить агента на мелкие баги из бэклога. Для экономии он берёт недорогую открытую модель (например, Qwen). Вопрос: в какой обвязке её запускать? Бенчмарки показывают лидера, но на их задачах, а не на задачах студии.

Промпт (для ревью журнала прогонов — отдаёте LLM лог каждого запуска):

Ты проверяешь журнал одного прогона кодового агента. Задача была: {описание_задачи}.
Критерий решения: {критерий — например, "тест test_export_wb.py проходит"}.

Ответь строго по пунктам и ничего не смешивай:

1. ЗАВЕРШЕНИЕ. Агент остановился сам и выдал итоговый результат (патч/коммит/отчёт)? 
   Варианты: чистое / упал или завис / остановился, но результата нет. 
   Приведи цитату из лога, подтверждающую вывод.

2. РЕШЕНИЕ. Выполнен ли критерий решения? 
   Варианты: да / частично / нет. Приведи доказательство из лога.

3. РАСХОД. Были ли повторы одного и того же неудачного действия? 
   Сколько раз и какого именно.

4. РАННИЙ СТОП. Остановился ли агент до того, как задача была решена, 
   без попытки проверить результат?

5. Итог одной строкой: [чистое/нет] + [решено/нет] + [повторы: да/нет].

Журнал прогона:
{журнал}

Результат: Для каждого прогона вы получаете короткую карточку из пяти пунктов с цитатами из лога. Набираете 8–10 своих задач, гоняете каждую 2–3 раза в двух-трёх обвязках и складываете карточки в таблицу. Видно, какая пара чаще всего завершается чисто и решает задачу. Видно, где агент «сгорел» на повторах, а где остановился слишком рано. Победителя в чужом рейтинге искать не нужно: вы смотрите на свою пару и свои задачи.

🧠

Почему это работает

Слабость. Один итоговый балл смешивает три разных вещи: умеет ли модель решать, удобно ли ей работать в этой обвязке и не помогла ли обвязка задаче заранее встроенным сценарием. Агент мог решить задачу и не сдать результат, и тогда балл ноль. Или мог упасть и всё равно получить частичный кредит. По одному числу причину не определить.

Сильная сторона. Если менять один компонент за раз (модель при фиксированной обвязке, обвязку при фиксированной модели) и мерить два измерения отдельно, причина видна. Данные показывают, где лидерство меняет знак. Например, Kimi в Codex CLI слабее среднего на SWE-bench, но выше среднего на LOCA-Bench.

Как это даёт рычаги вам: - Число повторов (в статье 4) → для своей проверки хватит 2–3: меньше расход, шум чуть больше. - Набор задач → берите свои реальные, а не абстрактные. Именно на них зависит «пригодность пары». - Отдельный пункт про токены → если пара сожгла вдвое больше и не решила больше, считайте её нерабочей, а не «стараться надо больше». - Два измерения вместо одного → если чистых завершений мало, чините сначала остановку и сдачу результата, а уже потом качество решения.

📋

Шаблон промпта

В статье готовых промптов нет — это работа об оценке, а не о промптинге. Выше — мой шаблон для ревью журнала, сделанный по логике статьи (два измерения отдельно + расход). Универсальная версия:

Ты проверяешь журнал одного прогона агента.
Задача: {задача}
Критерий решения: {критерий}

Оцени отдельно и не смешивай:
1. ЗАВЕРШЕНИЕ: чистое / упал или завис / остановился без результата. Цитата из лога.
2. РЕШЕНИЕ: да / частично / нет. Доказательство из лога.
3. ПОВТОРЫ: сколько раз агент повторял одно и то же неудачное действие.
4. РАННИЙ СТОП: остановился ли до решения без проверки результата.
5. Итог: [чистое/нет] + [решено/нет] + [повторы: да/нет]

Журнал: {журнал}

Подставляйте: {задача} — формулировка, которую получил агент; {критерий} — что считается успехом (тест, файл, цифра); {журнал} — текст лога прогона.

⚠️

Ограничения

⚠️ Рейтинги не переносятся: лидер на этой панели (OpenCode) стабилен только для выбранных моделей и бенчмарков. Авторы прямо пишут: предпочтения конкретных моделей и промежуточные места зависят от набора. Не берите «лучшая обвязка» как готовый ответ.

⚠️ Нужен запуск самому: вывод применяется не промптом, а проверкой пары на ваших задачах. Это требует нескольких прогонов в разных обвязках и времени на разбор логов.

⚠️ Модели в статье — открытые и не из топа: Qwen, Kimi, MiniMax, DeepSeek. Для закрытых флагманов (Claude, GPT) картина может быть спокойнее: у них обвязка и модель обычно настроены друг под друга.

⚠️ Нет рецепта «как чинить»: статья диагностирует расхождения, но не проверяет конкретные правки обвязки. Что менять в инструкциях агента, она не говорит.

⚠️ Только кодовые и сервисные агентные задачи: творческие и аналитические сценарии не проверялись.

🔍

Как исследовали

Идея была простой: скрестить модели и обвязки, как в таблице умножения. Взяли четыре обвязки (DeepAgents, OpenCode, Pi CLI, Codex CLI) и четыре открытые модели. Прогнали шесть бенчмарков: правка кода (SWE-bench), терминал (Terminal-Bench 2), сервисные API (VitaBench), длинный контекст (LOCA-Bench), многодневные рабочие сценарии (ClawMark) и выбор навыков (AgentSkillOS). Для сводных цифр взяли общую панель из трёх моделей и четырёх обвязок: 72 конфигурации, 35 472 запуска, всего разобрали 52 168 траекторий. Каждую задачу гоняли по 4 раза. Разрешения, бюджеты и условия остановки уравняли. Собственные промпты и циклы каждой обвязки оставили как есть — сравнивали целые системы.

Чтобы развести «не решил» и «не сдал», ввели долю чистых завершений и пригодность пары — результат пары делится на лучший результат этой модели среди обвязок. Неопределённость оценивали бутстрепом (2000 перевыборок задач).

Что получилось. Рейтинг переворачивается: на SWE-bench DeepSeek обгоняет MiniMax в Codex CLI, а в OpenCode лидирует MiniMax. Разброс кратный: у Kimi в ClawMark OpenCode даёт около 82 балла, Pi CLI и Codex — около 12. У MiniMax в LOCA-Bench Codex даёт 93, Pi CLI — 21. Есть стабильные модели: DeepSeek сдаёт прогоны чисто в 91–94% случаев в любой обвязке, хотя результат всё равно зависит от обвязки. Токены не равны качеству: самая «лёгкая» обвязка меняется от пары к паре, а низкий расход иногда означает ранний стоп.

Удивило то, что отклонения пары от среднего меняют знак между бенчмарками и в итоговой цифре гасят друг друга. Для практики отсюда следует, что одного общего балла мало: смотрите профиль по своим типам задач.

💡

Адаптации и экстраполяции

Это мои идеи, в статье их нет.

🔧 Техника: добавить в инструкцию агента правила остановки и сдачи → меньше «тихих» провалов.

Статья называет четыре слабых места использования обвязки: сборка действия, использование обратной связи, восстановление после ошибки и остановка. Их можно закрыть текстом в файле инструкций (CLAUDE.md, AGENTS.md):

Перед тем как остановиться:
1. Запусти проверку результата (тест, сборка, сверка с критерием).
2. Если проверка не пройдена — не останавливайся, назови причину и попробуй другой подход.
3. Если одно и то же действие провалилось 2 раза подряд — смени подход, не повторяй.
4. В конце выдай отчёт: что сделано, что проверено, что не получилось.

Работает ли это на вашей паре, надо проверить тем же ревью журналов.

🔗

Ресурсы

  • Работа: When Agents Fail: Model or Harness—Who's to Blame?
  • Авторы: Shao Zhang, Hangfan Zhang, Yuanyuan Shi, Hao Li, Min-Le Su, Kangcong Li, Jingping Wang, Chunjiang Mu, Chen Zhang, Yang Chen, Bo Zhang, Shuyue Hu — Shanghai Artificial Intelligence Laboratory.
  • Бенчмарки: SWE-bench, Terminal-Bench 2, VitaBench, LOCA-Bench, ClawMark, AgentSkillOS.
  • Обвязки: DeepAgents (LangChain), OpenCode, Pi CLI, Codex CLI (OpenAI).

📋 Дайджест исследования

Ключевая суть

Kimi на задачах с длинным контекстом набирает в среднем 54% в одной обвязке и 8% в другой. Модель та же, задачи те же. Метод позволяет выбрать, в чём запускать агента на ваших задачах, а не верить чужому рейтингу. Меряй не модель, а пару «модель + обвязка», и два показателя отдельно: решена ли задача и чисто ли завершился прогон. Обвязка (harness) — программа вокруг модели. Она решает, что модель видит, какие инструменты ей дать и когда остановиться. Рейтинг лучшей модели и рейтинг лучшей обвязки не переносятся с одной пары на другую. Важно: это не промпт, а схема проверки, и считать её придётся снаружи.

Принцип работы

Схема простая. Один раз зафиксируй задачи. Потом меняй по одному компоненту: сначала модель в той же обвязке, затем обвязку с той же моделью. Так видно, кто виноват в провале. Процесс такой: одинаковые задачи → таблица «модель × обвязка» → несколько прогонов каждой пары → два отдельных показателя на прогон → расход токенов рядом с результатом. У каждой обвязки есть своя цена входа: формат наблюдений, способ вызова инструментов, правила повторов. Одной модели это удобно, другой нет. Это как розетки в разных странах: прибор исправен, но без нужной вилки он не включится. Обвязка — это и есть розетка.

Почему работает

Один итоговый балл смешивает три разные вещи: умеет ли модель решать, удобно ли ей в этой обвязке и не подсказала ли обвязка решение встроенным сценарием. Агент мог решить задачу и не сдать результат — тогда ноль. Мог упасть посреди работы и всё равно получить частичный балл. По одному числу причину не найти. Прикол: лидер у одной модели оказывается аутсайдером у другой. Kimi в Codex CLI слабее среднего на SWE-bench, но выше среднего на LOCA-Bench. Когда меняешь один компонент за раз и меришь два показателя отдельно, видно, где ломается пара: на решении или на остановке и сдаче результата. Ещё два вывода. Чистое завершение не равно решённой задаче: прогон может закончиться аккуратно и ничего не решить. Больше токенов не значит лучше результат. Мало токенов часто значит, что агент бросил задачу слишком рано. Много — что он долбился в одну и ту же ошибку.

Когда применять

Выбор агента для кода → мелкие баги из списка задач, особенно когда берёте недорогую открытую модель и не знаете, в какой обвязке её запускать. Бенчмарки показывают лидера на своих задачах, а не на ваших. НЕ подходит как готовый ответ «какая обвязка лучшая»: лидер в статье (OpenCode) стабилен только для выбранных моделей и бенчмарков. Модели в работе открытые и не из топа (Qwen, Kimi, MiniMax, DeepSeek). Для закрытых флагманов картина может быть спокойнее. Творческие и аналитические задачи не проверялись. Как чинить обвязку, статья тоже не говорит: она только диагностирует.

Мини-рецепт

1. Набери свои задачи: 8–10 реальных, а не абстрактных. Для каждой заранее запиши, что считается успехом (тест проходит, файл создан, цифра совпала).
2. Собери таблицу: 2–3 модели на 2–3 обвязки. Все пары получают одни и те же задачи.
3. Гоняй по несколько раз: в статье 4 прогона на пару, для себя хватит 2–3. Расход меньше, шума чуть больше.
4. Разбери журналы: отдавай журнал каждого прогона LLM с промптом из примера ниже. Получишь карточку из пяти пунктов с цитатами.
5. Посчитай пригодность пары: результат пары делим на лучший результат этой же модели среди всех обвязок.
6. Посмотри на токены: пара сожгла вдвое больше и не решила больше? Считай её нерабочей, а не «надо стараться сильнее».
7. Чини по порядку: если чистых завершений мало, сначала остановка и сдача результата, потом качество решения.

Примеры

[ПЛОХО] Задача: студия делает выгрузки на Ozon и Wildberries и правки в обменах с 1С. Тимлид хочет посадить агента на мелкие баги и взял недорогую открытую модель. : Вот журнал прогона агента. Решил он задачу или нет?
[ХОРОШО] : Ты проверяешь журнал одного прогона кодового агента. Задача: исправить ошибку в выгрузке остатков на Wildberries. Критерий решения: тест test_export_wb.py проходит. Ответь строго по пунктам и ничего не смешивай. 1. ЗАВЕРШЕНИЕ: чистое / упал или завис / остановился без результата. Приведи цитату из журнала. 2. РЕШЕНИЕ: да / частично / нет. Приведи доказательство из журнала. 3. ПОВТОРЫ: сколько раз агент повторял одно и то же неудачное действие и какое именно. 4. РАННИЙ СТОП: остановился ли агент до решения, не проверив результат. 5. Итог одной строкой: [чистое/нет] + [решено/нет] + [повторы: да/нет]. Журнал: {журнал} В первом случае ответ смешает всё в одно «вроде решил». Во втором вы получаете карточку, которую можно сложить в таблицу и сравнить пары между собой.
Источник: When Agents Fail: Model or Harness--Who's to Blame?
ArXiv ID: 2610.32483 | Сгенерировано: 2026-10-26 13:10

Концепты не выделены.

📖 Простыми словами

When Agents Fail: Model or Harness--Who's to Blame?

arXiv: 2610.32483

Когда AI-агент лажает, все привычно винят саму модель: мол, нейросеть снова отупела. Но за результат отвечает не только интеллект, а её обвязка (harness) — софт, который скармливает ей данные, выдаёт инструменты и решает, когда пора остановиться. Исследователи доказали: судить о работе по одной общей оценке — это полный самообман. Модель могла блестяще справиться с логикой, но обвязка просто забыла нажать на стоп-кран, упала с ошибкой и превратила результат в ноль.

Это как нанять гениального хирурга, но дать ему тупой скальпель и выключить свет в операционной. Врач дело знает, но пациент почему-то кончился — виноват ли тут доктор? Авторы взяли одинаковые модели и прогнали их через четыре разные среды вроде Codex CLI и OpenCode. Итог предсказуем: на одних и тех же задачах одна и та же сетка то творит магию, то выглядит как набитый идиот, просто потому что софт вокруг неё написан криво.

Чтобы прекратить гадания, авторы предлагают двухфакторную оценку: считать отдельно решение задачи и чистоту завершения. Тебе нужно чётко разделять, сделала ли сетка работу и смогла ли обвязка адекватно вернуть результат пользователю. Сравнив системы вроде DeepAgents и Pi CLI, исследователи показали: единый итоговый балл — это полная туфта, которая маскирует реальные косяки архитектуры за случайными сбоями скрипта.

Тестировали всё на коде, но принцип универсален для любого продукта на базе LLM. Собираешь ли ты бота поддержки, аналитика данных или сложный RAG-пайплайн — хватит бесконечно менять GPT на Claude при первой же ошибке. Если агент тупит, в 3 случаях из 4 проблема сидит не в модели, а в кривой логике повторов, корявых промптах обвязки и кривых инструментах.

Короче: перестань выкидывать бюджет на постоянную смену базовых моделей, пока не протестировал сам каркас. Внедряй раздельный замер качества прямо сейчас: отсекай ошибки мышления от инфраструктурных затыков. Кто научится вылизывать harness, выжмет максимум даже из дешёвых открытых сеток. Остальные продолжат платить втридорога за топовые API и гадать, почему их бот всё ещё генерирует мусор.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с