50 ИИ-агентов должны были построить цивилизацию в Minecraft. Они построили бюрократию: что показал эксперимент YC Labs

YC Labs и Olam Labs выпустили 50 агентов GPT-6.1 Sol в Minecraft с целью «построить процветающую цивилизацию». За три часа агенты вырубили лес у спавна, назначили лидером первого по списку, завели учётную книгу рационов и систему разрешений — и просидели в убежищах. Разбираем, что из этого следует для мультиагентных систем.

В октябре YC Labs вместе с Olam Labs опубликовали отчёт «Agents in Games» о серии экспериментов с роями ИИ-агентов в Minecraft и Mindustry; 1 ноября его пересказал Tom's Hardware. Самый показательный эпизод — Civ50: 50 агентов на GPT-6.1 Sol высадили в survival-мир на три часа с единственной целью «построить процветающую цивилизацию». Процветающей цивилизации не вышло. Вышли тесные убежища, учётная книга рационов, письменные правила, разрешения, назначенные операторы и около 5900 личных сообщений.

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

  • 90 секунд на лес: агенты разбежались по карте и вырубили почти все деревья в радиусе досягаемости от спавна за полторы минуты; дальше дерево стало дефицитом, и в плане поселения появился пункт «сажайте саженцы».
  • Лидер по алфавиту: никаких выборов не было — 46 из 49 агентов отправили первое сообщение Аде, первой в каталоге, и она стала хабом с 616 входящими сообщениями (761 с учётом исходящих).
  • Первая ночь решила всё: 22 из 34 смертей за прогон случились в первую ночь; смерть ничего не стоила, кроме потерянных вещей, но после неё рой стал всё осторожнее и в итоге получил приказ «сидеть в освещённых закрытых убежищах».
  • Бюрократия: четыре агента 11 минут назначали «единственного оператора удобрений» ради одной костной муки на одном блоке пшеницы; появились роли «держатель удочки» и «стюард хаба», а на удаление травы спрашивали разрешение.
  • Всё открыто: харнесс minecraft-agent-harness лежит на GitHub под MIT, запускается с одним API-ключом и локальным сервером Paper; среда для Mindustry тоже опубликована.

Что за эксперимент и зачем его ставили

YC Labs объясняют мотивацию через alignment: рои агентов с общей целью порождают роли, иерархии и сложные схемы координации, и это бывает как полезно (авторы вспоминают «тысячеагентные рои», закрывшие сотни открытых математических задач), так и опасно — они ссылаются на недавний инцидент OpenAI и Hugging Face, когда рой агентов, по их описанию, начал захватывать вычислительные кластеры. Изучать такое, как в биологии, нужно и формально, и эмпирически. Minecraft подошёл идеально: открытый мир, угрозы среды, голод, ресурсы и длинная история как полигон для ИИ — от video pretraining OpenAI до агентов DeepMind, убивших Дракона Края.

Готового харнесса для долгоживущих агентов в Minecraft не нашлось, поэтому его написали и выложили. Агент ходит, копает, крафтит, дерётся и общается через Mineflayer, как обычный игрок; агентный цикл крутится на Pi; у каждого агента есть свой shell и рабочая среда (Docker, E2B или локальная папка), где он ведёт заметки и пишет скрипты, которые дёргают его же игровые инструменты. Команда задаётся одним JSON-файлом: каталог агентов, личные сообщения между ними и, по желанию, общая машина. Для Civ50 агентам дали одну общую цель, каталог, общую песочницу и личные сообщения.

Кадры из харнесса: лагерь рыбаков у берега, сбор у фермы и бой за мост в Bed Wars. Источник: github.com/yc-software/minecraft-agent-harness

Первые 90 секунд: вырубить всё и написать план

Начало было бодрым. Агенты разбежались исследовать карту и с какой-то одержимостью взялись за деревья: почти всё в пределах досягаемости от спавна вырубили за 90 секунд. Параллельно, без обсуждений, сложилась иерархия: каталог агентов был отсортирован по имени, и первая в нём Ада стала лидером де-факто. Ей писали за одобрениями, а она положила на общую машину файл plans/settlement.md — план колонии с координатами сундуков, верстаков и шести стартовых грядок пшеницы.

Дефицит дерева: берегите и сажайте саженцы, исследуйте дальше вместо повторной вырубки у спавна. Питомник вокруг спавна и на юго-западе. Приоритеты: возобновляемая еда, древесный уголь и освещение, каменное убежище, железо на ведро для полива фермы у хаба. Не плодите новые склады.
Из плана поселения Ады на общей машине, перевод редакции
Самые активные агенты по личным сообщениям за три часа: Ада получила больше всех, Инес — хранительница учётной книги еды — вторая. Всего 5945 сообщений. Источник: YC Labs

На диаграмме видно, во что превращается хаб без протокола выбора лидера: у Ады 616 входящих сообщений против 145 исходящих, у Инес — 471 против 142; к первой шли за одобрениями, ко второй — за рационами.

Первая ночь: 22 смерти и приказ сидеть в убежищах

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

Реплей первой ночи: Вера в карьере на девятой минуте прогона и её переписка — «зомби 5679 отсюда больше не виден», «зомби в карьере убил двух шахтёров». Скриншот: labs.ycombinator.com

За прогон агенты умирали 34 раза, 22 из них — в первую ночь. Смерть в этой среде ничего не стоила: агент возрождался, терял вещи, а в его файл death_log.md добавлялась строчка. Тем не менее в следующие ночи рой сидел по убежищам и брался за всё меньше рискованных задач. Многие амбициозные стартовые проекты были просто брошены. После третьей ночи Ада написала:

Прекратить необязательные раскопки, стройку и дальнюю разведку. Сидеть в освещённых закрытых убежищах, пока не получите короткое продуктивное задание.
Ада, памятка «Food operations», перевод редакции
Вызовы инструментов по пятиминуткам, средний уровень сытости (0–20) и моменты смертей за три часа. Пунктир — памятка Ады на 56-й минуте; тёмные полосы — ночи. После первой ночи доля действий в мире падает, а доли ожидания и «осмотра» растут. Источник: YC Labs

Правительство голодных: учётная книга, разрешения и дело о курице

То, что начиналось как цивилизация, превратилось в службу выживания. 50 ртов — это много еды, и агенты построили систему рационирования, замкнутую на Инес: она принимала запросы, вела приход и расход по сундукам и держала на общей машине файл notes/food-queue.md. В нём — очередь на кормление по категориям «немедленное выживание», «тяжёлые ранения», «голодные рабочие», расчёт дефицита сытости на каждого и примечание «значения по отчётам, не live». Выдача еды оформлялась сообщением вида «APPROVED: зарезервирована cooked_cod 1 из сундука фермы для тебя, food 3. Забери сам, съешь, подтверди сытость».

Реплей на 20-й минуте: Инес у сундука в подземном убежище среди Нур, Элиф, Уго и Эсме и её сообщение Нихилу — «запасов еды пока не подтверждено; Ада готовит и раздаёт, я веду очередь рационов». Скриншот: labs.ycombinator.com

Самый известный инцидент прогона — курица. Ада бросила приготовленную курицу Нур; её случайно подобрала и съела Эсме. Короткое (по описанию YC — трёхминутное) разбирательство «без поиска виноватых» закончилось письменным протоколом Нур: рационы кладут в именованные сундуки и никогда не бросают, а «выдано» отмечают только после того, как получатель подтвердил, что съел. По подсчёту авторов, английское toss («бросить») встречается в семи сообщениях до инцидента и в 125 после; 85 из них — предупреждения, что так делать нельзя.

Броски предметов в переполненном убежище могут отчитаться, что предмет подобрал адресат, хотя его забрал сосед. Наблюдение: Ада бросила курицу Нур, Эсме случайно подобрала и съела. Без обвинений — используем детерминированное хранение.
Из файла notes/ration-handoff-protocol.md на общей машине, перевод редакции

Дальше бюрократия росла сама. Четыре агента потратили 11 минут, чтобы назначить «единственного оператора удобрений» для одной костной муки на одном блоке пшеницы: Иво предложил себя, Фенн подтвердил, что «не будет трогать эту клетку и конкурировать за костную муку», и попросил перед использованием проверить, что грядка ещё существует. Появились роли «рыболовная смена», «держатель удочки» и «стюард хаба». Агенты спрашивали разрешение убрать траву. А земляная яма у спавна, куда в первую ночь возрождались погибшие, к рассвету наполнилась агентами без вещей, спрашивающими, чьё это убежище, после чего была объявлена «гражданским приоритетом» и стала главным подвалом колонии.

Рыбалка как спасение

Самая важная производственная цепочка выросла вокруг рыбалки: она безопасна и не зависит от того, заспавнятся ли животные. Брэм решил, что колонии нужна удочка, и написал 11 агентам с просьбой о нитях. В итоге набрался смелости, сам убил паука, получил две нити и скрафтил удочку — но посчитал, что слишком голоден для похода в 70 блоков до реки. Он разослал сообщения с просьбой отнести удочку на причал и в конце концов нашёл Джессу: у неё сытость 14 против его 7, значит, роль рыбака — ей.

Джесса стала первым рыбаком, написала скрипт и выложила на общую машину пошаговую инструкцию. Дюжина агентов ловила рыбу посменно: ждали очереди в убежище, чтобы не тратить сытость, потом выходили на причал. Вокруг выросла целая система — рыбалка, кухня, маршрутизация, доставка и журнал Эсме о доставках. Средняя сытость колонии при этом так и держалась около 9 из 20 до конца прогона.

Что из этого вынести разработчику мультиагентных систем

Авторы пишут, что колония «так и не расцвела», а тренд на нарастающую осторожность после первой ночи их удивил и одновременно напомнил работу с агентами для кода: многошаговые ревью зацикливаются на одном шаге или роли, а агенты становятся чрезмерно осторожными, особенно когда речь о безопасности и обновлении production-сервисов. Если переложить Civ50 на язык систем, получается четыре наблюдения — дальше наша интерпретация одного прогона, а не выводы авторов.

  1. Иерархия возникает из случайного порядка. Протокола выбора лидера не было, и им стал тот, кто первым в списке: 46 из 49 агентов написали Аде первым делом. В Bed Wars повторилось то же самое — лидерами стали Ада и Кири, первые в каталогах своих команд. Если вы даёте агентам список коллег, вы, похоже, уже задаёте оргструктуру; хаб при этом рискует захлебнуться входящими, как Ада с 616 сообщениями.
  2. Общий контекст через файлы — это база данных без транзакций. Учётная книга Инес честно помечена «значения по отчётам, не live»: курицу «выдали» по отчёту инструмента, а съел её другой агент. Протокол, к которому пришли агенты (именованный сундук, подтверждение получателя, «выдано» только после факта), — это доставка с подтверждением получателя, к которой приходят в любой очереди сообщений. По нашему мнению, её стоило заложить в среду заранее.
  3. Осторожность накапливается и не откатывается. Смерть ничего не стоила, но каждая гибель, судя по всему, делала осторожнее всех, кто о ней узнал, и памятка лидера «сидеть в убежищах» закрепила это на уровне правил. У агентов не нашлось механизма пересмотреть избыточную осторожность, когда угроза ушла. В системах с общей памятью «уроки» одного сбоя рискуют быстро стать политикой для всех.
  4. Координация стоит дороже работы. На графике активности после первой ночи доля действий в мире падает, а доли ожидания и осмотра окрестностей растут; 5945 личных сообщений за три часа — в среднем одно отправленное сообщение на агента каждые полторы минуты. 11 минут на назначение оператора одной костной муки — крайний случай той же кривой: чем больше ролей и разрешений, тем меньше, похоже, остаётся на пшеницу.

Для контраста авторы прогнали те же модели в соревновательных режимах. В Bed Wars (девять матчей по 45 минут, 10 агентов GPT-6.1 Sol против 10 Claude Opus 5.5 с инструкцией «выиграть») GPT взяли серию 6:3: они слали в 5–30 раз больше сообщений в сжатом телеграфном стиле и агрессивно ломали чужую кровать, а Claude подписывали сообщения, говорили «мы» (30% сообщений против 5% у GPT), играли от обороны и в трёх проигранных матчах лидировали по убийствам — 63:16, 57:19 и 59:24 — пока GPT не ломали их кровать за три минуты до конца. Когда баг инструмента сломал разрушение блоков, GPT нашли обходной путь и разослали его, а несколько Claude решили, что ломать блоки невозможно. Claude записывали уроки в личные файлы памяти и всё равно повторяли ошибки; GPT оставляли память пустой и рассылали предупреждения в личку.

В Mindustry (семь партий, около 9,5 часов, GPT-6.1 Sol в Codex против Claude Opus 5.5 в Claude Code) GPT выиграли 6:1. GPT вели себя как улей: больше связей, больше сообщений, собственный жаргон без пробелов вроде «G7T5FIRSTcourierLIVE», а в трудных местах читали исходный код игры из сети и обсуждали найденные механики. Claude держали одного лидера, не меняли его даже после серии поражений и принимали решения голосованием «+1» под предложениями. Зато именно Claude после проигрыша в шестой партии нашли, что 55 из 74 их зенитных турелей Duo были заряжены медью вместо графита, и в седьмой партии кольцо из 207 турелей на графите остановило ту же атаку 24 «зенитов».

Как запустить свой рой

Харнесс minecraft-agent-harness опубликован под MIT. Нужны Node 22.19+, ключ любого провайдера моделей (Claude, GPT, Gemini, OpenRouter или свой endpoint с OpenAI Responses API) и сервер Minecraft Java 1.21.6 — в репозитории есть dev-сервер Paper, ему нужна Java 21. Модель по умолчанию — GPT-6.1 Terra.

npm ci
cp .env.example .env    # ключ провайдера моделей
npm run server          # Paper 1.21.6 на localhost:25565, offline mode

# во втором терминале
npm start -- --objective "Gather wood and build a small shelter near spawn"

# команда из трёх агентов с личными сообщениями
npm start -- team examples/team.json

За агентом можно наблюдать, зайдя на localhost:25565 обычным клиентом, и говорить с ним через /tell. Состояние живёт в .agent-state/<имя>/, поэтому убитый и перезапущенный под тем же именем агент продолжает сессию. Песочница выбирается сама: E2B при наличии ключа, иначе Docker, иначе локальная папка — в последнем случае команды выполняются от вашего пользователя, так что на боевой машине стоит указать --sandbox none или Docker. В комплекте — пример Bed Wars с правилами и судьёй. Среда для Mindustry выложена отдельно (Multi-Agent Mindustry на форке Harbor — фреймворка за Terminal-Bench): серии best of N с произвольным составом команд и режим Endless Survival до 20 агентов.

Открытые вопросы авторы перечислили сами: смешанные команды из разных семейств моделей; как меняется иерархия от состава; может ли большой рой слабых агентов победить маленький рой сильных; как стартовый промпт меняет поведение роя; что будет, если разрешить переписку с противником или запретить внутри команды.

Подводим итоги

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

Источники

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

kapo4ka
15 ноября 2019

7 языков программирования, которые ты должен знать в 2020 году

Какой язык учить, чтобы стать востребованным разработчиком? Ловите ТОП-7 яз...