Правила агента и режим автономности
Что именно прописано агенту в program.md. Сначала setup: завести ветку, прочитать README.md, prepare.py, train.py, убедиться, что данные закэшированы, инициализировать results.tsv. Ограничения: нельзя менять prepare.py, ставить пакеты или трогать логику оценки; VRAM держать в разумных пределах; предпочитать простые, элегантные решения, а не усложнять ради мелкого выигрыша. Экспериментальная петля: гипотеза → коммит → прогон и сбор логов → извлечение метрик → запись в TSV → оставить или сбросить. И директива автономности: агент не останавливается и работает до ручной остановки.
Правила агента и режим автономности
Во втором подмодуле мы разобрали, что program.md — это текстовый файл, который человек пишет для агента, и что именно он задаёт направление. Сейчас — шаг глубже: посмотрим на сам текст этого файла изнутри. Что именно агент читает? Какие правила получает? Почему он работает без пауз и не задаёт вопросов?
Структура program.md: три блока
Файл устроен линейно — три блока, читаемых сверху вниз. Агент обрабатывает их в том же порядке, в котором они написаны.
flowchart TD
A[program.md] --> B[Блок 1: Setup]
A --> C[Блок 2: Ограничения]
A --> D[Блок 3: Экспериментальная петля]
B --> B1[Завести ветку autoresearch/tag]
B --> B2[Прочитать README, prepare.py, train.py]
B --> B3[Проверить кэш данных]
B --> B4[Инициализировать results.tsv]
C --> C1[❌ Нельзя менять prepare.py]
C --> C2[❌ Нельзя ставить пакеты]
C --> C3[❌ Нельзя трогать логику оценки]
C --> C4[⚠️ VRAM в разумных пределах]
C --> C5[💡 Простые, элегантные решения]
D --> D1[1. git status]
D1 --> D2[2. Гипотеза + правка train.py]
D2 --> D3[3. git commit]
D3 --> D4[4. uv run train.py → run.log]
D4 --> D5[5. grep val_bpb + peak_vram_mb]
D5 --> D6{val_bpb улучшился?}
D6 -->|Да| D7[Коммит остаётся]
D6 -->|Нет| D8[git reset]
D7 --> D9[Запись в results.tsv]
D8 --> D9
D9 --> D1---
Блок 1. Setup — что делается один раз
Первый раздел — это список действий, которые агент выполняет ровно один раз перед тем, как войти в бесконечную петлю. По сути, это онбординг: агент знакомится с окружением и готовит инфраструктуру для записи результатов.
Пять шагов в setup:
1. Завести датированную ветку — autoresearch/<tag>, где тег обычно содержит дату. Это разбирали в предыдущем подмодуле: чтобы легко ориентироваться среди сессий.
2. Прочитать README.md — понять общий контекст репозитория.
3. Прочитать prepare.py и train.py — изучить текущее состояние кода перед тем, как что-то менять. Агент не импровизирует вслепую; он сначала разбирается, что уже есть.
4. Убедиться, что данные закэшированы — проверить, что prepare.py уже был запущен и шарды датасета на месте. Если нет — агент не может начать обучение.
5. Инициализировать results.tsv — создать файл с заголовком колонок, куда будут писаться результаты каждого эксперимента.
Только после всех пяти шагов агент переходит ко второму блоку.
---
Блок 2. Ограничения — что запрещено и что предпочтительно
Это самая важная часть program.md с точки зрения безопасности и честности экспериментов. Несколько жёстких запретов и несколько принципов.
Жёсткие запреты:
- Нельзя менять
prepare.py. Причину мы разобрали в третьем подмодуле: именно там живёт логика вычисленияval_bpb. Если агент изменит её — он сможет «улучшить» метрику, подправив формулу, а не модель. Это читерство, которое полностью обесценивает результаты. - Нельзя устанавливать новые пакеты. Агент работает с тем окружением, которое уже собрано через
uv sync. Это ограничение удерживает эксперименты воспроизводимыми: если агент мог бы ставить произвольные библиотеки, повторить его результаты стало бы сложнее. - Нельзя трогать логику оценки. Шире, чем предыдущий пункт: любые изменения, которые влияют на то, как считается
val_bpb, запрещены. Метрика должна оставаться стабильным референсом на протяжении всей сессии.
Принципы (не жёсткие правила, но предписания):
- VRAM держать в разумных пределах. Агент видит
peak_vram_mbв каждом прогоне и должен учитывать это при следующей гипотезе. Если архитектура резко растёт, следующий эксперимент рискует упасть с OOM.program.mdявно это оговаривает. - Предпочитать простые, элегантные решения. Не усложнять ради мелкого прироста. Если изменение даёт минимальное улучшение
val_bpb, но значительно усложняет архитектуру — принцип говорит воздержаться. Это не строгий критерий, а направляющий принцип для агентского суждения.
---
Блок 3. Экспериментальная петля — семь шагов по кругу
Третий блок — это тело бесконечного цикла. После setup агент входит сюда и никогда не выходит сам.
Семь шагов каждой итерации:
1. Посмотреть git-статус. Агент проверяет текущее состояние репозитория — убеждается, что коммит предыдущей итерации сделан правильно и рабочее дерево чистое.
2. Сформулировать гипотезу и внести изменение в train.py. Агент решает, что попробовать: другой оптимизатор, иной размер батча, измененная архитектура слоя, новый learning rate schedule — всё это в рамках train.py.
3. Закоммитить изменение. До запуска обучения — коммит. Это важно: без коммита при откате нет к чему сбрасываться.
4. Запустить прогон и собрать логи:
```bash
uv run train.py > run.log 2>&1
```
Ровно 5 минут wall clock — тренировочный луп сам следит за бюджетом времени.
5. Извлечь метрики:
```bash
grep "^val_bpb:|^peak_vram_mb:" run.log
```
Никакой интерпретации — только два числа из двух строк лога.
6. Принять решение — оставить или сбросить:
- val_bpb снизился → коммит остаётся, ветка продвигается.
- val_bpb не снизился (равен или хуже) → git reset к предыдущему состоянию.
7. Записать результат в results.tsv. В обоих случаях — принято или отброшено. Запись фиксирует всё: что пробовалось, что получилось. Это позволяет человеку потом увидеть весь путь, а не только успешные шаги.
После седьмого шага — немедленно обратно на первый. Без паузы, без ожидания.
---
Директива автономности: агент не останавливается
Последняя строка program.md — самая короткая и самая принципиальная. Смысл: агент работает до ручной остановки и не задаёт вопросов.
Это не просто «продолжай работать» — это явная директива убрать любые остановки между итерациями. Агент не спрашивает «продолжать?» после каждого прогона. Он не ждёт подтверждения гипотезы. Он не просит уточнений, если что-то неоднозначно.
Для пользователя это означает: вы запустили агента и можете идти спать. Утром — открываете results.tsv и смотрите, что было найдено за ночь. Именно так набирается ~100 экспериментов за 8–9 часов.
Одна практическая оговорка: если агент натолкнулся на серьёзную ошибку (например, train.py перестал компилироваться из-за синтаксической ошибки в его же изменении, и run.log содержит traceback без val_bpb) — поведение зависит от того, насколько хорошо агент умеет читать логи и восстанавливаться. Директива автономности не отменяет здравый смысл: хорошо написанный program.md добавляет инструкции на случай ошибочного прогона — например, «если val_bpb не найден в логе, считать прогон неудачным и сбросить изменения».
---
Как это всё соединяется
program.md — небольшой документ, но он замыкает всю конструкцию. Три файла, разобранных во втором подмодуле, получают смысл через него: prepare.py защищён явным запретом, train.py становится единственной ареной, а человек управляет направлением через правку текста, а не Python-кода.
Что стоит понять: program.md — не скрипт и не конфиг. Это инструкция на естественном языке, которую LLM-агент читает и интерпретирует. Именно поэтому в нём есть принципы (не только правила) и нет жёсткой валидации их соблюдения — агент сам решает, когда архитектура «слишком усложнилась» ради «мелкого прироста». Это одновременно гибкость и ограничение: агент может проявлять суждение там, где жёсткий скрипт не справился бы, но и ошибиться там, где скрипт ошибиться не мог.
---
Мини-проверка
Три быстрых вопроса:
1. Агент закончил прогон, val_bpb стал хуже. Какой следующий шаг по program.md? *(git reset, запись в TSV, новая итерация)*
2. Человек хочет сказать агенту «сфокусируйся на снижении параметров». В какой файл он идёт? *(program.md, второй блок — ограничения или даже как явная задача)*
3. Почему агент читает prepare.py в setup, если не имеет права его менять? *(Чтобы понять текущую инфраструктуру и не изобретать то, что уже реализовано)*
---
В следующем и финальном подмодуле честно разберём рамки: где авторесёрч применим, а где нет — и почему задачи из вашего брифа (поиск источников, проверка фактов, академические обзоры) лежат за пределами того, что делает этот репозиторий.
Самопроверка
- После прогона с ухудшением val_bpb агент откатывает изменения через git reset, но всё равно записывает результат в results.tsv. Зачем записывать неудачный эксперимент?
- Программа запрещает менять prepare.py, но разрешает менять train.py. Это различие защищает что?
- Директива «агент работает до ручной остановки и не задаёт вопросов» нужна в первую очередь для:
- Что произойдёт, если в setup агент не убедится, что данные закэшированы?
- В блоке ограничений есть «жёсткие запреты» (нельзя менять prepare.py) и «принципы» (предпочитать простоту). В чём их различие?
- После эксперимента с использованием 85% доступного VRAM агент выбирает гипотезу на следующую итерацию. Как это должно повлиять на его выбор?
Домашние задания
Расшифровка program.md: три блока, семь уровнейdocument
В статье разобраны три блока program.md — ось всей конструкции авторесёрча. Создай таблицу (markdown, Google Sheets или просто текстовый файл), где каждый блок разложен по целям и компонентам. Для каждого из трёх блоков (Setup, Ограничения, Петля) заполни: • Название и смысл блока (одно предложение) • Конкретные шаги или элементы (перечень из статьи) • Почему это критично (почему именно так, а не иначе) Это не анализ «зачем нужен», а структурирование того, что там написано. Используй только информацию из статьи — ничего не выдумывай.
Таблица содержит ровно три строки для трёх блоков. Setup перечисляет все 5 шагов (завести ветку, README, prepare.py и train.py, кэширование данных, инициализация results.tsv). Ограничения называют минимум 3 жёстких запрета (prepare.py, пакеты, логика оценки) и минимум 2 принципа (VRAM, элегантность). Петля описывает все 7 шагов цикла (git status, гипотеза, коммит, прогон, метрики, keep/reset, запись в TSV). Для каждого блока есть объяснение «почему это важно», а не только перечисление. Таблица структурирована и читается без напряга.
Экспериментальная петля в коде: от гипотезы к results.tsvarchive
Напиши скрипт (Python или bash — не важно), который имитирует работу цикла из третьего блока program.md. Скрипт должен: 1. Взять гипотезу (можешь жёстко вбить в код или передать параметром) 2. Сгенерировать реалистичные значения val_bpb и peak_vram_mb (не обязательно настоящие числа, но разумные — VRAM в пределах 100–2000 MB, val_bpb как числа типа 1.23, 1.45) 3. Применить правило: если val_bpb снизился → запись keep, иначе → запись reset 4. Дописать результат в results.tsv (создаёт файл с заголовком при первом запуске) Запусти скрипт минимум 3 раза (или сделай его так, чтобы он сам прошёл 3 цикла). В results.tsv должно накопиться минимум 3 строки результатов. Упакуй скрипт и финальный results.tsv в архив .zip.
Скрипт корректно применяет keep/reset: если val_bpb улучшился (снизился), это видно как decision='keep', иначе decision='reset'. Results.tsv содержит минимум 3 записи с данными. Присутствуют колонки: hypothesis, val_bpb, peak_vram_mb, decision, timestamp (или эквивалентные). Значения реалистичные: peak_vram не выходит за пределы 100–2000 MB, val_bpb — это числа с одинаковой точностью (не одинаковые, но разумные). Скрипт работает (запущен, результаты видны в TSV). Архив содержит оба файла (скрипт и TSV).
Напиши program.md для своего авторесёрчаdocument
Сценарий: ты оптимизируешь нейросетевую модель, чтобы снизить расход памяти при сохранении качества. Твой train.py уже работает. Ты планируешь пробовать: 1) low-rank аппроксимация для слоёв, 2) размер батча (32 → 16), 3) функция активации (ReLU → GELU). Напиши program.md, который агент прочитает и поймёт, что ему делать. Три обязательных блока: **Setup** — что делать один раз перед циклом (завести датированную ветку, прочитать README и исходный код, убедиться, что данные на месте, подготовить results.tsv) **Ограничения** — что запрещено (не менять prepare.py, не ставить пакеты, не трогать логику оценки val_bpb) и что важно (VRAM в разумных пределах, простые решения) **Петля** — как агент циклится (какие гипотезы пробовать, как менять train.py, как запускать обучение, как извлекать val_bpb и peak_vram из лога, как применять keep/reset, как писать в results.tsv) В конце напиши одну фразу о том, что агент работает до ручной остановки. Текст на естественном языке, структурирован, но не скрипт.
Три блока явно отделены и озаглавлены (Setup, Ограничения, Петля). Setup содержит 5 шагов, переформулированных под сценарий. Ограничения называют минимум 3 конкретных запрета (с объяснением почему). Петля описывает реальный цикл: какие гипотезы пробовать, как менять train.py, как считывать логи, как применять keep/reset, как записывать в TSV. Гипотезы логичны и соответствуют цели (оптимизация памяти). Текст читаем: пронумерованные пункты, абзацы, нет одной сплошной простыни. Присутствует финальная директива про автономность (агент не останавливается).
Сдача и проверка заданий — в приложении Learn (Almost) Anything.
