3,583 papers
arXiv:2610.33636 70 24 окт. 2026 г. FREE

Готовый агент вместо самописного: Claude Code и OpenCode сравнялись с in-house обвязкой Volvo, а на открытых задачах её обошли

КЛЮЧЕВАЯ СУТЬ
После неверного шага самописный агент Volvo доводит задачу до конца в 24–53% случаев. Готовый агент (Claude Code, OpenCode) делает это в 78–83%. Метод позволяет собрать агента для работы в интерфейсе без собственного цикла «посмотри → подумай → проверь → сделай»: хватает файла инструкций, описаний инструментов и субагентов. Фишка: самописный агент каждый шаг собирает промпт заново из короткого журнала, где «нажал кнопку, успешно» выглядит как победа, даже если экран не изменился. Готовый агент хранит весь диалог и замечает сбой, поэтому на открытых задачах он выигрывает 9–28 процентных пунктов.
Адаптировать под запрос
⚡

TL;DR

Исследование Volvo сравнивает два способа собрать агента. Первый: обвязка (harness, то есть код вокруг модели) жёстко прописывает цикл «посмотри → подумай → проверь → сделай». Второй: готовый агент вроде Claude Code или OpenCode, который сам решает, что делать дальше. Его настраивают тремя вещами: файлом инструкций, описаниями инструментов (через MCP, стандарт подключения инструментов к агенту) и субагентами. Модели и инструменты в обоих случаях одинаковые, меняется только обвязка.

Главная находка: на строго пошаговых сценариях готовый агент даёт тот же успех, что самописный, но чаще выдаёт разный результат на повторных прогонах. На открытых задачах («найди отель с такими фильтрами») он выигрывает на 9–28 процентных пунктов. Он не ошибается реже, а лучше исправляет ошибки: после неверного действия доводит задачу до конца в 78–83% случаев против 24–53% у самописного. Самописный агент каждый шаг собирает промпт заново из короткого журнала действий. Поэтому он «не помнит», что нажатие ничего не дало. Готовый агент хранит весь диалог и замечает сбой.

Цена такая: готовый агент тратит в 2,6–10,7 раза больше токенов на задачу. Но экономия на разработке и поддержке перевешивает. По оценке авторов, общие месячные затраты ниже на 3–66%. Работа поддержки смещается с «чинить цикл агента» на «поддерживать инструкции и описания инструментов». Это то, что читатель делает словами.

🔬

Схема метода

СЕТАП A (самописный, в проде у Volvo):
  Код фиксирует цикл из 4 шагов на КАЖДУЮ итерацию:
  1. Наблюдать  → скриншот + упрощённая структура экрана (XML)
  2. Думать     → один вызов модели: чек-лист, "цель достигнута?", следующий инструмент
  3. Проверить  → существует ли инструмент, верны ли аргументы
  4. Действовать → выполнить, записать в журнал
  Промпт пересобирается с нуля; из истории — только журнал шагов и последние скриншоты

СЕТАП B (готовый агент: Claude Code / OpenCode):
  Один общий цикл, модель сама решает, что делать и когда остановиться
  Настройка — только снаружи:
  • файл инструкций (одинаковый для всех тестов)
  • MCP-сервер с теми же инструментами
  • субагенты для подзадач (скролл до пункта, ввод текста, ожидание)
  Контекст = весь накопленный диалог (обвязка сжимает его, когда он разрастается)

Всё это работает как настройка агента, отдельных запросов не требуется.

🚀

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

Вывод статьи прямой: если задача открытая и путь к цели не один, дай общему агенту короткую инструкцию с правилом «наблюдай → действуй → проверяй» и не прописывай каждый шаг жёстким циклом. Сильная зона метода — открытые цели. Поэтому берём не «нажми кнопки в таком порядке», а «добейся результата».

Задача: Вы — QA в команде маркетплейса (условно, как Ozon или Wildberries). Нужно регулярно проверять в Android-приложении сценарий: «найти товар, применить промокод, дойти до экрана оплаты, не оплачивая». Интерфейс меняется каждую неделю, и скриптовые тесты постоянно ломаются. Вы подключаете Claude Code к эмулятору через любой MCP-сервер управления Android.

Промпт (файл инструкций CLAUDE.md для агента-тестировщика):

Ты тестируешь Android-приложение маркетплейса на эмуляторе через доступные инструменты.

Правила окружения:
- Работай только на эмуляторе Pixel_7_API_34.
- Все действия выполняй внутри установленного приложения "Маркет", не открывай браузер.
- Платёж не подтверждай: остановись на экране оплаты.

Порядок работы:
1. Перед любым действием посмотри на экран: получи скриншот и структуру элементов.
2. Координаты берёшь из границ элемента в структуре экрана, а не угадываешь.
3. Делай одно действие за раз и после каждого проверяй, что экран изменился так, как ожидалось.
4. Если действие не дало эффекта или дало не тот эффект — признай это и исправь, прежде чем идти дальше.
5. Когда считаешь, что цель достигнута, назови, по какому признаку на экране это видно.

Цель: найти "беспроводные наушники", добавить первый товар с рейтингом от 4.5 в корзину, применить промокод TEST500 и дойти до экрана оплаты.

Результат: Агент будет работать циклами «посмотрел экран → выполнил одно действие → проверил результат». Если нажатие не сработало (например, элемент перекрыт всплывающим окном), он должен заметить это и попробовать другой путь, а не слепо продолжать. В финале придёт заявление о достижении цели с указанием признака на экране. Прогоны могут отличаться маршрутом и числом шагов: готовый агент вариативнее жёсткого цикла.

🧠

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

Слабость в лоб. Жёсткий цикл с пересборкой промпта на каждом шаге хранит прошлое только в виде сжатого журнала («тапнул кнопку X, успешно»). Если действие формально прошло, но ничего не изменило, в журнале это выглядит как успех. Модель не видит расхождения. Авторы объясняют этим низкое восстановление после ошибок: самописный агент реже возвращается и исправляет неверный шаг.

Сильная сторона модели. Современные модели умеют сами планировать, замечать несоответствие между ожиданием и результатом и корректировать курс, если весь ход работы остаётся перед глазами. Общий агент накапливает вызовы и их результаты в диалоге, поэтому это видит.

Как метод использует это. Решения передаются модели, а код только кормит её инструментами и инструкциями. Каждый инструмент возвращает состояние экрана до и после действия, поэтому проверка встроена в сам вызов. Субагенты забирают на себя многошаговые мелочи (скролл до пункта, ввод текста) и возвращают только итог. Так промежуточные экраны не засоряют основной контекст.

Рычаги управления: - Жёсткость инструкции. Для открытых целей оставляй общий порядок работы. Для строгих сценариев добавь «не отклоняйся от шагов» (см. адаптации). - Правило «одно действие + проверка». Сними его, и агент пойдёт быстрее и дешевле, но чаще будет терять ошибки. - Что возвращает инструмент. Если инструмент отдаёт экран до и после, отдельный вызов «посмотри» не нужен: меньше шагов. - Вынос подзадач. Чем больше рутины в субагентах, тем чище контекст основного агента.

📋

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

Так выглядит инструкция Setup B из исследования: общие правила окружения плюс общий рабочий порядок. Авторы используют одну и ту же инструкцию для всех тестов.

Ты работаешь как агент для {тип_задачи} в {среда}.

Правила окружения:
- Используй только {устройство_или_система}.
- {ограничение_1: например, работай только в установленном приложении, не в браузере}
- {ограничение_2: что нельзя делать / где остановиться}

Порядок работы:
1. Перед любым действием посмотри на текущее состояние: {что_наблюдать}.
2. Данные для действия бери из {источник_точных_данных}, а не угадывай.
3. Делай одно действие за раз и после каждого проверяй результат.
4. Если результат не тот, что ожидался, разберись и исправь, прежде чем идти дальше.
5. Закончи, когда цель достигнута, и назови признак, по которому это видно.

Цель: {цель}

Что подставлять: - {тип_задачи} и {среда}: что делает агент и где (тестирование приложения, заполнение форм в CRM и т. п.). - {что_наблюдать}: что агент видит перед шагом (скриншот, структура страницы, вывод команды). - {источник_точных_данных}: откуда берутся точные значения (границы элемента, ID, поле API). - {цель}: желаемый результат. Лучше формулировать как цель, а не как последовательность кликов.

🚀 Быстрый старт: вставь в чат:

Вот шаблон инструкции для агента, который работает в интерфейсе. Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит, в какой среде работает агент, что он видит перед каждым шагом, какие действия ему запрещены и по какому признаку понять, что цель достигнута. Эти ответы нужны, чтобы правила не остались общими словами и агент мог проверять результат каждого шага.

⚠️

Ограничения

⚠️ Цена токенов: готовый агент тратит в 2,6–10,7 раза больше токенов на задачу. Экономия получилась только потому, что учитывали стоимость разработки и поддержки. Если разработка уже оплачена или задач очень много, расчёт может поменяться.

⚠️ Нет выигрыша на жёстких сценариях: когда тест расписан по шагам («открой, включи, выключи»), успех у готового агента такой же, как у самописного. Бонус по восстановлению там не работает: ошибка уводит от предписанной процедуры, а исправить её нельзя.

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

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

⚠️ Низкая абсолютная успешность: на самой сложной задаче (бронирование) успех 10–42%, и разница между сетапами статистически не подтвердилась на 16 задачах. Это не «агенты уже всё умеют».

⚠️ Причина — гипотеза: объяснение про накопленный контекст авторы предполагают, но не проверяли отдельным экспериментом. Экономические выкладки привязаны к цифрам трудозатрат конкретной команды.

🔍

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

Идея простая: изменить только обвязку, а всё остальное оставить одинаковым. Команда взяла боевого тестового агента Volvo для информационно-развлекательных систем автомобиля и вынула из него решение «что делать дальше». Инструменты (скриншот, дамп экрана, тап, свайп и т. д.) оставили теми же и подключили к Claude Code и OpenCode через MCP-сервер. Модели тоже запускали одни и те же: GPT-5.1 (как в проде), GPT-5.4, Claude Sonnet 4.6 и Opus 4.6.

Проверяли на двух наборах. Первый: 66 задач из реальных тест-кейсов Volvo (климат, свет, настройки), записанных по шагам. Второй: 56 открытых задач из датасета AMEX в Google Maps и Booking.com. Каждый прогон повторяли два или три раза, чтобы измерить нестабильность. Прогоны оценивал LLM-судья. Его сверили со вторым судьёй (согласие 93,4%, κ = 0,85) и с ручной разметкой. Ещё провели интервью с десятью людьми: разработчиками, владельцем продукта и тестировщиками.

Неожиданность: на пошаговых тестах никто не выиграл, а на открытых готовый агент выиграл заметно, хотя делал больше ошибочных действий (точность вызовов даже ниже). Выигрыш дало восстановление после ошибок, а не безошибочность. Из интервью вышел ещё один инсайт: собственная обвязка может превратиться в технический долг, даже если сама не ухудшилась, просто потому что экосистема вокруг идёт быстрее.

💡

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

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

Для регрессионных проверок, где важно именно прописанное поведение, добавь в инструкцию:

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

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

Экстраполяция: вынос длинных подзадач из основного контекста

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

Если подзадача требует нескольких однотипных действий (прокрутить список до нужного пункта,
заполнить длинную форму), делегируй её субагенту с описанием цели на естественном языке.
Из результата тебе нужен только итог: получилось или нет, и что именно сделано.

Это перенос идеи на свои задачи: в статье проверен именно такой вынос в тестовом агенте, а не эта формулировка.

🔗

Ресурсы

  • Название работы: Build or Adopt? Custom-Built vs. General-Purpose LLM Agent Harnesses for Automotive GUI Testing
  • Авторы: Arsham Gholamzadeh Khoee, Ruyu Fu, Jiaqi Wei, Ruikun Deng, Robert Feldt, Dhasarathy Parthasarathy, Yinan Yu
  • Организации: Chalmers University of Technology (Гётеборг), Volvo Group
  • Упоминаются: Claude Code, OpenCode, Model Context Protocol (MCP), датасет AMEX, библиотека uiautomator2

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

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

После неверного шага самописный агент Volvo доводит задачу до конца в 24–53% случаев. Готовый агент (Claude Code, OpenCode) делает это в 78–83%. Метод позволяет собрать агента для работы в интерфейсе без собственного цикла «посмотри → подумай → проверь → сделай»: хватает файла инструкций, описаний инструментов и субагентов. Фишка: самописный агент каждый шаг собирает промпт заново из короткого журнала, где «нажал кнопку, успешно» выглядит как победа, даже если экран не изменился. Готовый агент хранит весь диалог и замечает сбой, поэтому на открытых задачах он выигрывает 9–28 процентных пунктов.

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

Решения отдаёшь модели. Код только кормит её инструментами и инструкциями. Что настраиваешь снаружи: 1. Файл инструкций. Один на все тесты, с правилом «смотри → одно действие → проверяй». 2. Описания инструментов через MCP (стандарт подключения инструментов к агенту). Каждый инструмент возвращает экран до и после действия, так проверка встроена в вызов. 3. Субагенты для рутины: скролл до пункта, ввод текста, ожидание. Они возвращают только итог, и основной контекст не забивается промежуточными экранами. Код не прописывает порядок шагов, а только задаёт правила и даёт инструменты. Самописный цикл похож на сотрудника, которому каждое утро стирают память и оставляют записку «вчера нажал кнопку, ок». Готовый агент как коллега, который помнит всю вчерашнюю переписку. Есть и рычаги. Уберёшь правило «одно действие + проверка»: агент станет быстрее и дешевле, но чаще будет пропускать ошибки. Больше рутины отдашь субагентам: контекст основного агента станет чище.

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

Журнал шагов не показывает разницу между «нажатие сработало» и «нажатие ничего не дало». Модель видит запись об успехе и идёт дальше. Когда перед глазами весь ход работы, модель сама замечает, что ожидание не сошлось с результатом. Современные модели это умеют, им нужно только не терять нить. Цифры: - Восстановление после ошибки: 78–83% против 24–53%. - Открытые задачи вроде «найди отель с такими фильтрами»: +9–28 пунктов успеха. - Строгие пошаговые сценарии: успех такой же, как у самописного, разброс между прогонами выше. Цена: в 2,6–10,7 раза больше токенов на задачу. Но разработка и поддержка своего цикла стоят дороже. По оценке авторов, общие месячные затраты ниже на 3–66%. Поддержка превращается из «чиним цикл» в «правим инструкции и описания инструментов», а это делается словами. Честная оговорка: причину про накопленный контекст авторы предполагают, но отдельным экспериментом не проверяли.

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

Автоматизация работы в интерфейсах → тестирование мобильных и веб-приложений, где цель одна, а путей к ней несколько. Особенно когда интерфейс часто меняется и скриптовые тесты постоянно ломаются. НЕ подходит для строгих сценариев «открой, включи, выключи»: выигрыша нет, ошибка уводит от процедуры. Не подходит и для регрессионных тестов, где нужна повторяемость: готовый агент от прогона к прогону идёт разными маршрутами. Если разработка цикла уже оплачена или задач очень много, расчёт по токенам может перевесить. На самой сложной задаче (бронирование) успех всего 10–42%, а разница между подходами на 16 задачах не подтвердилась. Это не «агенты уже всё умеют».

Мини-рецепт

1. Определи тип задачи: цель открытая («добейся результата») или строгая (шаги по списку). Для открытой этот метод, для строгой оставь жёсткий сценарий.
2. Подключи инструменты: возьми любой MCP-сервер управления вашей средой (например, эмулятором Android). Пусть инструмент возвращает экран до и после действия.
3. Напиши файл инструкций (для Claude Code это CLAUDE.md): правила окружения плюс порядок «смотри → одно действие → проверяй».
4. Задай границы: где работать, что нельзя делать, где остановиться. Например: <правило>платёж не подтверждай, остановись на экране оплаты.
5. Формулируй цель, а не клики: результат, который нужно получить, а не список нажатий.
6. Потребуй признак: в конце агент называет, по какому признаку на экране видно, что цель достигнута.
7. Вынеси рутину в субагентов: скролл, ввод текста, ожидание.
8. Посчитай оба счёта: токены на задачу и часы на разработку и поддержку. Решай по сумме.
9. Наблюдай за прогонами: тестировщики хотят видеть действия агента и убеждаться, что он следует сценарию.

Примеры

[ПЛОХО] : Нажми «Каталог», потом тапни поиск, введи «наушники», тапни первый товар, тапни «В корзину», тапни «Оплата». Интерфейс сдвинулся, нажатие ушло в пустоту, а жёсткий цикл пишет «успешно» и едет дальше.
[ХОРОШО] : Ты тестируешь Android-приложение маркетплейса на эмуляторе. Работай только в приложении «Маркет», платёж не подтверждай. Перед действием смотри экран и структуру элементов. Координаты бери из границ элемента, не угадывай. Делай одно действие и проверяй, что экран изменился как ожидалось. Если нет, признай и исправь. Цель: найти «беспроводные наушники», добавить в корзину первый товар с рейтингом от 4.5, применить промокод TEST500 и дойти до экрана оплаты. В конце назови признак, по которому видно, что цель достигнута. Если всплывающее окно перекрыло кнопку, агент заметит, что экран не изменился, и пойдёт другим путём. Маршрут и число шагов могут отличаться от прогона к прогону. Быстрый старт под свою задачу: Вот шаблон инструкции для агента, который работает в интерфейсе. Адаптируй под мою задачу: [твоя задача]. Задавай вопросы, чтобы заполнить поля.
Источник: Build or Adopt? Custom-Built vs. General-Purpose LLM Agent Harnesses for Automotive GUI Testing
ArXiv ID: 2610.33636 | Сгенерировано: 2026-10-27 23:30

Проблемы LLM

ПроблемаСутьКак обойти
Агент не замечает, что шаг не сработал, если история сжата до коротких записейАгент собирает запрос заново на каждом шаге. Из прошлого берёт только короткий журнал: «нажал кнопку, успешно». Иногда действие формально прошло, но ничего не изменилось. В журнале это всё равно «успех». Модель не видит расхождения и идёт дальше. Ошибка копится. Это касается любых агентов, которые что-то делают по шагам: интерфейс, формы, терминал. Причина — гипотеза авторов, отдельно её не проверялиХрани в истории не статус вызова, а итог: что было до действия и что стало после. Либо оставляй модели весь диалог целиком. В инструкции добавь правило: «После каждого действия сверь, что результат совпал с ожидаемым. Если нет — признай это и исправь, прежде чем идти дальше»
📖 Простыми словами

Build or Adopt? Custom-Built vs. General-Purpose LLM Agent Harnesses for Automotive GUI Testing

arXiv: 2610.33636

Когда инженеры пытаются автоматизировать клики по экранам, у них чешутся руки загнать модель в жёсткий алгоритмический цикл: посмотри, подумай, нажми, проверь. Исследование Volvo показало, что это полная фигня. Модели лажают не от нехватки ума, а от удушающей обвязки вокруг них. Самописный custom harness с пересборкой промпта на каждом шаге начисто сливает готовым агентским решениям вроде Claude Code или OpenCode, которым просто не мешают работать.

Это как нанять толкового джуна, но заставить его отчитываться по бумажке на каждый чих. Если на третьем шаге кнопка в интерфейсе заела, модель по скрипту ставит галочку «действие выполнено» и радостно отчитывается об успехе. Жёсткий цикл ослепляет LLM: клик в коде прошёл, значит, всё пучком, хотя на реальном дисплее ничего не поменялось и система уже зашла в тупик.

Что реально работает: переход на универсальных агентов через протокол MCP. Ты выкидываешь сотни строк контролирующего кода и оставляешь три вещи: нормальные описания инструментов, субагентов и короткое правило «наблюдай → действуй → проверяй». Самодельный цикл тупо жмёт историю в сухой лог и слепнет, а нормальный агент видит весь контекст и понимает, когда надо откатиться назад и переделать.

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

Короче: хватит писать свои велосипедные обвязки для агентов. Готовые harness-системы уделывают самопал просто потому, что умеют исправлять собственные косяки. Формулируй агенту цель, подключай инструменты через MCP и не лезь под руку с микроменеджментом. Иначе построишь дорогого робота, который уверенно шагает прямо со скалы.

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

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

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