Что такое harness engineering: как сделать AI-агента рабочим инструментом
Harness engineering (харнес-инжиниринг) — проектирование всего, что окружает модель в AI-агенте: инструкций, инструментов, среды выполнения, состояния между сессиями и петель обратной связи. Формула простая: Агент = Модель + Харнес; одна и та же модель работает надёжно или ломается в зависимости от того, насколько хорошо собран харнес вокруг неё.
Harness engineering простыми словами
Harness engineering — это инженерная дисциплина о том, как построить вокруг языковой модели окружение, в котором она надёжно выполняет реальную работу. Слово harness переводится как «упряжь»: модель — сильная, но сама по себе она не знает, куда идти, чем пользоваться и когда остановиться. Харнес направляет эту силу.
Самая короткая формулировка звучит так:
Агент = Модель + Харнес
Модель — это веса и способность рассуждать и писать текст или код. Харнес — всё остальное: системные инструкции и файлы вроде CLAUDE.md или AGENTS.md, набор инструментов (shell, редактирование файлов, MCP-серверы), песочница, в которой агент запускает команды, файлы состояния между сессиями, тесты, линтеры и хуки, которые сообщают агенту об ошибках. Если убрать харнес, останется чат, который умеет только отвечать текстом.
Почему агент «то сеньор, то джун»
Знакомая картина: в одном репозитории агент работает как опытный разработчик, в другом — путается, забывает вчерашние решения и рапортует «готово» про фичу, которая не работает. Первая реакция — сменить модель на более новую. Обычно это не помогает, потому что модель в обоих случаях одна и та же. Разница — в окружении.
Отсюда главный сдвиг мышления, с которого начинается harness engineering: агент не сломан — сломано то, что вокруг него. Агент не может запустить тесты, если у него нет к ним доступа. Он не вспомнит, что уже пробовал, если это нигде не записано. Он не узнает, что фича сломана, если ни одна проверка ему об этом не скажет. Это не «характер» модели, а дефекты конструкции, и их можно системно чинить.
Типичные симптомы плохого харнеса
- Каждая новая сессия начинается с починки окружения: не те зависимости, не запускается база, нет переменных.
- Агент повторяет уже отвергнутые решения, потому что не помнит прошлую сессию.
- Правило прямо написано в инструкциях, но агент его игнорирует.
- «Тесты зелёные» — а фича сломана, потому что тесты проверяли не то.
- Агент берётся за три задачи сразу и ни одну не доводит до конца.
Из чего состоит харнес: пять подсистем
Частая ошибка — считать харнесом один файл с промптом. На деле это пять механизмов, и каждый ломается по-своему.
| Подсистема | Что даёт агенту | Примеры |
|---|---|---|
| Инструкции | Знание правил проекта и того, где что лежит | CLAUDE.md, AGENTS.md, тематические документы, skills |
| Инструменты | Возможность действовать, а не только писать текст | shell, редактор файлов, браузер, MCP-серверы |
| Среда | Воспроизводимое и безопасное место для работы | контейнер, песочница, отдельная рабочая копия, скрипт сброса |
| Состояние | Память между сессиями | файл плана, журнал прогресса, git-история, BACKLOG.md |
| Обратная связь | Сигнал «ты ошибся» до того, как ошибку увидит человек | тесты, линтеры, типизация, хуки, E2E-проверки |
Инструкции
Инструкции отвечают на вопрос «найдёт ли агент нужное правило». Хороший входной файл — это карта, а не учебник: короткое оглавление с командами проверки и жёсткими ограничениями, а детали — в отдельных документах, которые агент открывает по необходимости. Хорошие инструкции задают инварианты («все SQL-запросы параметризованы»), а не диктуют реализацию построчно.
Инструменты
Агент может проверить только то, к чему у него есть доступ. Если он не может запустить линтер, никакое правило «запускай линтер перед коммитом» не сработает. Инструменты подключают через встроенные возможности агента (чтение и правка файлов, выполнение команд) и через MCP — протокол, по которому агенту дают доступ к базам данных, браузеру, трекерам задач.
Среда
Среда — то, где агент запускает команды. Она должна подниматься одной командой, быть одинаковой от сессии к сессии и ограничивать ущерб от ошибки: песочница без доступа к продакшену, отдельная ветка или рабочая копия, возможность за минуту вернуть всё в исходное состояние.
Состояние
У модели нет памяти между сессиями: всё, что не записано в репозиторий, исчезает вместе с окном контекста. Поэтому цель, сделанное, принятые решения, тупики и следующий шаг должны жить в файлах. Проверка простая: откройте новую сессию, скажите агенту «продолжай» — и посмотрите, начнёт ли он работать или начнёт спрашивать, что делать.
Обратная связь
Петли обратной связи — самая важная подсистема. Без них агент — сам себе единственный судья и честно считает задачу выполненной. Тесты, проверка типов, линтер, хук, который запускается после каждой правки, E2E-сценарий в браузере — всё это возвращает агенту красный сигнал, пока ошибку ещё дёшево исправить.
Харнес — это контур, а не список
Пять подсистем работают как замкнутый контур. Модель получает инструкции, через инструменты действует в среде, вносит изменения в репозиторий, верификация проверяет результат. Красный ответ возвращается к модели на исправление, зелёный — фиксируется в состоянии. Состояние, в свою очередь, обновляет инструкции для следующей сессии.
инструкции → модель → инструменты → среда → изменения
↑ ↓
└──── красный ── верификация ──┘
↓ зелёный
состояние → (следующая сессия)
Уберите любую стрелку — и контур размыкается именно в этом месте. Нет верификации — агент не узнает об ошибке. Нет состояния — следующая сессия начнётся с археологии вместо работы. Поэтому вложения в одну подсистему не компенсируют дыру в другой: пятистраничный AGENTS.md не заменит отсутствующие тесты.
Чем harness engineering отличается от промпт- и контекст-инжиниринга
Эти понятия вложены друг в друга, а не конкурируют.
| Промпт-инжиниринг | Контекст-инжиниринг | Harness engineering | |
|---|---|---|---|
| Единица работы | Один запрос | Окно контекста модели | Вся система вокруг модели |
| Главный вопрос | Как сформулировать задачу | Что положить в окно и что оставить снаружи | Как агенту надёжно доводить работу до проверенного результата |
| Инструменты | Текст промпта, примеры | Отбор документов, сжатие истории, подгрузка по требованию | Инструкции, инструменты, среда, состояние, обратная связь |
| Горизонт | Один ответ | Одна сессия | Много сессий и часы автономной работы |
Промпт-инжиниринг — часть подсистемы инструкций. Контекст-инжиниринг охватывает инструкции и состояние: что агент видит в каждый момент. Harness engineering добавляет то, что в окно контекста не помещается вовсе: доступы, песочницу, тесты, хуки, процесс работы. Хорошо написанный промпт не поможет, если агент физически не может запустить тесты.
Зачем нужен харнес: математика длинных задач
Интуитивно кажется, что модель, которая правильно делает 95% шагов, — почти идеальна. Но задача агента состоит из многих шагов, и ошибки накапливаются. Если шаги независимы, вероятность пройти их все без ошибки — произведение вероятностей:
0.95 ^ 10 ≈ 0.60
0.95 ^ 20 ≈ 0.36
0.95 ^ 50 ≈ 0.08
На десятом шаге без единой ошибки доходит лишь около 60% прогонов, на пятидесятом — меньше одного из десяти. Улучшить модель до 97% — дорого и не в ваших руках. А вот поймать ошибку на том же шаге, где она случилась, и вернуть её агенту — задача харнеса. Петля обратной связи превращает цепочку «ошибка тянет за собой следующую» в цепочку коротких исправимых шагов.
Пример: один и тот же агент в двух репозиториях
Задача: добавить в платёжный бэкенд на FastAPI скидку по промокоду.
Без харнеса
Агент читает пару файлов, пишет функцию расчёта скидки и юнит-тест, который проверяет эту функцию в изоляции. Тест зелёный, агент пишет «готово». Он не знал, что расчёт итоговой суммы идёт в другом модуле, не мог поднять базу и прогнать сценарий оформления заказа целиком. Через день выясняется, что скидка в корзине не применяется.
С харнесом
В корне лежит AGENTS.md на несколько десятков строк: как поднять окружение, какие команды проверки обязательны, где описана архитектура платежей. Окружение поднимается командой docker compose up -d. В репозитории есть файл плана с критерием готовности: «E2E-сценарий оформления заказа с промокодом проходит». После каждой правки хук запускает линтер и типизацию, перед завершением агент обязан прогнать E2E-тест.
# AGENTS.md (фрагмент)
## Проверка — обязательно перед словом «готово»
make lint # ruff + mypy
make test # pytest, юнит и интеграционные
make e2e # сценарий оформления заказа
## MUST
- Деньги считаются в копейках (int), никогда во float
- Все SQL-запросы параметризованы
- Не трогать миграции, уже применённые в проде
Модель та же. Но теперь агент находит модуль итоговой суммы через карту проекта, E2E-тест падает на первой попытке, агент видит, что скидка не дошла до корзины, исправляет и только после зелёного прогона отчитывается. Разница в результате — целиком заслуга харнеса.
С чего начать
- Опишите, как агент проверяет свою работу: одна-три команды, которые он обязан запускать. Обратная связь даёт наибольший эффект, начинать стоит с неё.
- Сделайте среду воспроизводимой: окружение поднимается одной командой, есть способ быстро откатиться.
- Заведите файл состояния: цель, сделанное, решения и тупики, следующий шаг.
- Сократите инструкции до карты: команды проверки, жёсткие ограничения, ссылки на подробные документы.
- Ведите журнал провалов агента: на каждый сбой записывайте, какая подсистема его допустила. Журнал покажет, что чинить дальше.
Полезная практика — оценить каждую из пяти подсистем по шкале от 1 до 5, потратить полчаса на самую слабую и прогнать тот же набор из нескольких типовых задач до и после. Так улучшения харнеса становятся измеримыми, а не делаются «по ощущениям».
Итог
Harness engineering — это работа не над моделью, а над всем, что её окружает: инструкциями, инструментами, средой, состоянием и петлями обратной связи. Надёжность агента определяется самым слабым звеном этого контура, поэтому смена модели редко лечит нестабильность, а добавленный тест или файл плана — часто. Все пять подсистем и сборка харнеса целиком разобраны на практике в курсе по харнес-инжинирингу.
Частые вопросы
Как переводится harness engineering на русский?
Дословно — «инженерия упряжи». В русскоязычной среде чаще говорят «харнес-инжиниринг» или «проектирование харнеса агента», оставляя английский термин.
Нужен ли харнес, если я пользуюсь готовым агентом вроде Claude Code?
Да. Готовый агент даёт базовые инструменты и цикл работы, но инструкции проекта, команды проверки, среду и файлы состояния за вас никто не настроит — это и есть ваша часть харнеса.
Можно ли заменить харнес более сильной моделью?
Нет. Сильная модель лучше рассуждает, но не может запустить тесты, к которым нет доступа, или вспомнить решение, которое нигде не записано. Без харнеса её ошибки так же накапливаются на длинных задачах.
Сколько времени занимает настройка харнеса?
Минимальный работающий вариант — команды проверки, файл инструкций и файл плана — собирается за день. Дальше харнес развивают постепенно, по журналу провалов агента, и регулярно чистят от устаревших правил.
Харнес нужен только программистам?
Чаще всего его строят для агентов-программистов, но принцип общий: любой агент, который выполняет многошаговые задачи, нуждается в инструкциях, инструментах, среде, памяти и проверке результата.
Эта тема подробно разобрана с практикой в курсе «Harness Engineering: инженерия надёжности AI-агентов».
- Что такое harness engineering: почему AI-агент ломается из-за среды, а не модели
- Из чего состоит harness AI-агента: инструкции, инструменты, среда, состояние, обратная связь
- Харнес AI-агента с нуля: AGENTS.md, feature_list.json, verify.sh и автономный цикл