chimera-carry-the-failure-forward
Цикл повторов, перезаписывающий переменную с обратной связью, показывает третьей попытке только провал второй — и она заново выводит патч, который уже пробовала первая.
Присвоено человеком, который прочитал карточку, а не заявлено файлом о самом себе. Карточка, которую агент выводит во время запуска, поглотившего недоверенное содержимое, рождается заражённой и удерживается на разбор, прежде чем её вообще извлекут.
Когда это вспоминается
- пишу цикл ретраев
- агент повторяет одну и ту же правку
- возвращаю вывод верификатора в модель
- попытки падают одинаково
- откатываю рабочую копию между попытками
Ценность обычно лежит в разделах «Избегать» и «Проверить». «Делать» — это раздел, который пишут все.
Текст карточки выше — перевод. Английский оригинал — это то, что импортирует командная строка, что читает агент во время работы и что подтверждает хеш ниже.
Повод
У вас есть цикл, который делает попытку, оценивает её и запускает следующую с обратной связью: агент с верификатором, чинилка кода против набора тестов, конвейер «сгенерируй и проверь». Бюджет — больше двух попыток, а рабочая копия откатывается между ними, так что каждая попытка стартует с чистого места.
Это не относится к идемпотентному повтору поверх нестабильного транспорта — к сетевому вызову, который упал по причинам, не связанным с тем, что вы отправили. Учиться у попытки 1 там нечему, и тащить её вперёд — просто лишний груз.
Делать
- Храните попытки в списке, а не в переменной, которую переприсваиваете. По одной записи на попытку: вывод верификатора, патч, который попытка реально записала, и то, какой шаг инструмента упал первым.
- Берите патч из снимка рабочей копии, до отката, — настоящий дифф, а не описание модели о том, что она поменяла. Именно откат делает это необходимым: как только дерево откатили, на диске не остаётся и следа неверного пути, так что следующей попытке ничто не мешает вывести тот же самый.
- Собирайте промпт повтора из всех записей, от самой старой, каждую с номером попытки и её вердиктом, под заголовком, где сказано, что это уже пробовали и откатили.
- Ограничивайте каждую запись. Chimera режет возвращаемый дифф на 2000 символах и обрезает с маркером; неограниченная история из трёх попыток забьёт собой весь промпт.
- Дедуплицируйте по сигнатуре сбоя. Если две попытки упали одинаково, оставьте одну и отметьте, что она повторилась, — сигнал именно в повторе, вторая копия новой информации не несёт.
- Когда сигнатура повторяется, прекращайте дописывать и меняйте что-то структурное:
перепланируйте, отдав накопленные причины планировщику как контекст (
TaskLedger.context()выводит их под заголовком «Why earlier attempts failed (do NOT repeat these):»), либо эскалируйте на более сильную модель. Ещё больше обратной связи об одном и том же тупике из тупика не выводит. - Выдавайте считаемое событие при каждой подстановке истории, чтобы плечо бенчмарка могло доказать, что подстановка вообще срабатывала.
Избегать
Перезапись. В 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.gitchimera skills-import chimera-agent/skills/chimera-carry-the-failure-forward/SKILL.mdЦелостность
SHA-256 файла в опубликованном виде. Импортёр может проверить, что полученное совпадает с показанным на этой странице.
62dcc2aa830e5eb35c554bebf2c1a24454a054bf17bf152ccd59f3497b5e043d