Перейти к содержимому

Навыки

chimera-carry-the-failure-forward

Цикл повторов, перезаписывающий переменную с обратной связью, показывает третьей попытке только провал второй — и она заново выводит патч, который уже пробовала первая.

ПаттернПроисхождение: cleanСостояние: activev0.1.0 · Apache-2.0

Присвоено человеком, который прочитал карточку, а не заявлено файлом о самом себе. Карточка, которую агент выводит во время запуска, поглотившего недоверенное содержимое, рождается заражённой и удерживается на разбор, прежде чем её вообще извлекут.

Когда это вспоминается

  • пишу цикл ретраев
  • агент повторяет одну и ту же правку
  • возвращаю вывод верификатора в модель
  • попытки падают одинаково
  • откатываю рабочую копию между попытками

Ценность обычно лежит в разделах «Избегать» и «Проверить». «Делать» — это раздел, который пишут все.

Текст карточки выше — перевод. Английский оригинал — это то, что импортирует командная строка, что читает агент во время работы и что подтверждает хеш ниже.

Повод

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

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

Делать

  1. Храните попытки в списке, а не в переменной, которую переприсваиваете. По одной записи на попытку: вывод верификатора, патч, который попытка реально записала, и то, какой шаг инструмента упал первым.
  2. Берите патч из снимка рабочей копии, до отката, — настоящий дифф, а не описание модели о том, что она поменяла. Именно откат делает это необходимым: как только дерево откатили, на диске не остаётся и следа неверного пути, так что следующей попытке ничто не мешает вывести тот же самый.
  3. Собирайте промпт повтора из всех записей, от самой старой, каждую с номером попытки и её вердиктом, под заголовком, где сказано, что это уже пробовали и откатили.
  4. Ограничивайте каждую запись. Chimera режет возвращаемый дифф на 2000 символах и обрезает с маркером; неограниченная история из трёх попыток забьёт собой весь промпт.
  5. Дедуплицируйте по сигнатуре сбоя. Если две попытки упали одинаково, оставьте одну и отметьте, что она повторилась, — сигнал именно в повторе, вторая копия новой информации не несёт.
  6. Когда сигнатура повторяется, прекращайте дописывать и меняйте что-то структурное: перепланируйте, отдав накопленные причины планировщику как контекст (TaskLedger.context() выводит их под заголовком «Why earlier attempts failed (do NOT repeat these):»), либо эскалируйте на более сильную модель. Ещё больше обратной связи об одном и том же тупике из тупика не выводит.
  7. Выдавайте считаемое событие при каждой подстановке истории, чтобы плечо бенчмарка могло доказать, что подстановка вообще срабатывала.

Избегать

Перезапись. В chimera/core/autonomous.py обратная связь цикла пересобирается каждый раунд:

feedback = "\n\n".join(p for p in (fb, _verify_fb) if p) or "The attempt did not pass verification."

и потому попытка 3 составляется из провала попытки 2 и ничего из попытки 1. Тащить вперёд — значит дописывать в структуру; ниже набросок, а не цитата, потому что накапливающая версия — это то, за что агитирует эта карточка, а не то, что сейчас делает файл:

records.append(record_for(index, verdict, patch))   # one entry per attempt
feedback = render(records)                          # every attempt, oldest first

Будьте точны в том, какая половина уже есть, когда читаете это в Chimera: содержание обратной связи покрыто хорошо — --diff-feedback показывает повтору тот патч, который он реально записал (chimera/core/autonomous.py, ограничение _DIFF_FEEDBACK_MAX_CHARS = 2000), а TaskLedger копит причины для планировщика. Не покрыто именно накопление между попытками из строки выше. Карточка, представляющая всё это как отсутствующее, спорила бы с уже сделанной работой.

Также не сообщайте повтору, что он провалился, не показав, что он написал. «The attempt did not pass verification» плюс падающий тест — этого достаточно, чтобы модель попробовала снова, и недостаточно, чтобы она попробовала иначе: неверный патч для неё невидим, а рабочая копия его больше не содержит, так что вывести его заново — путь наименьшего сопротивления.

И не тащите одну лишь прозу менеджера, выбрасывая вывод верификатора. Падающий assert — самая пригодная к действию строка во всём цикле; абзац рецензента о нём — пересказ строго меньшего объёма информации.

Проверить

Инструментируйте сборщик промпта, запустите задачу, которая заведомо падает трижды, и прогрепайте промпт третьей попытки на строку, существующую только в первой, — имя файла, которого она касалась, идентификатор из её диффа. Есть или нет; частичного зачёта не бывает.

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

Риск

Якорение — зарегистрированная контргипотеза, а не умозрительная: показав модели неверный патч, можно приковать её внимание к этому патчу и получить вариации мёртвого подхода вместо другого подхода. Именно поэтому в Chimera это поведение включается явно и измеряется (--diff-feedback), а не работает по умолчанию. Считайте это утверждением, которое надо проверить на своих задачах, а не решённым улучшением.

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

Как применить

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

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/chimera-carry-the-failure-forward/SKILL.md

Целостность

SHA-256 файла в опубликованном виде. Импортёр может проверить, что полученное совпадает с показанным на этой странице.

62dcc2aa830e5eb35c554bebf2c1a24454a054bf17bf152ccd59f3497b5e043d

Читать карточку в репозитории