
Когда я запустил эксперимент, никто не верил, что агент, написанный самим собой, сможет обойти флагманы индустрии. Но Ouroboros сделал это: на трёх публичных бенчмарках он показал результаты выше, чем у OpenAI Codex и Claude Code от Anthropic. Это не просто цифры — это сигнал о том, что мы стоим на пороге новой эры, когда ИИ не только пишет код, но и проектирует собственную архитектуру. В этой статье я объясню, как мне удалось построить такого агента, сравню его с конкурентами и расскажу, что это значит для инженеров.
Что такое Ouroboros и почему он особенный
Ouroboros — это автономный ИИ-агент, который изначально был создан как обычный инструмент для решения задач на терминале. Но моя ключевая идея заключалась в том, чтобы дать ему доступ к собственному исходному коду и разрешить модифицировать себя в процессе работы. Вместо того чтобы каждый раз генерировать код с нуля, агент анализирует свою предыдущую логику, находит узкие места и переписывает собственные модули прямо во время выполнения. Это похоже на змею, кусающую собственный хвост, — отсюда и название.
Для того чтобы агент мог безопасно самоизменяться, я встроил несколько ограничений. Во-первых, любые правки проходят через песочницу, в которой запускаются юнит-тесты. Во-вторых, агент ведёт журнал изменений, что позволяет откатиться к предыдущей версии при сбое. В-третьих, он использует метапрограммирование: большинство изменений касаются функций, которые генерируют код для конкретных сценариев, а не всей архитектуры целиком. Такой подход позволяет избежать «разрушения мозга» агента, когда он случайно ломает свою логику.
«Если ИИ может улучшать себя без участия человека, это не просто автоматизация — это эволюция программного обеспечения».
Сравнение с Codex и Claude Code: цифры и факты
Для чистоты эксперимента я использовал три публичных бенчмарка: Terminal-Bench, OSWorld и CL-Bench. Первый проверяет способность агента выполнять команды в терминале и работать с файловой системой, второй сфокусирован на взаимодействии с графическим интерфейсом операционной системы, а третий тестирует понимание естественного языка и генерацию кода. В таблице ниже — результаты, которые я получил на одной и той же облачной машине с одинаковыми ограничениями по времени.
| Бенчмарк | Ouroboros | Codex | Claude Code |
|---|---|---|---|
| Terminal-Bench | 84.2% | 71.5% | 68.9% |
| OSWorld | 73.8% | 60.1% | 64.3% |
| CL-Bench | 91.3% | 87.0% | 89.2% |
Как видно, разрыв особенно заметен на задачах, требующих многошагового планирования и адаптации к ошибкам. В Terminal-Bench Ouroboros не просто выполнял команды, а сам находил более эффективные цепочки вызовов. В OSWorld он успешно справлялся с нестандартными ситуациями, когда окна сворачивались или появлялись неожиданные диалоги. Даже на CL-Bench, где языковые модели традиционно сильны, небольшой перевес оказался на моей стороне — вероятно, потому, что агент оптимизировал свои промпты под конкретный стиль задач.
Как агенту удалось написать себя сам
Секрет не в каком-то супералгоритме, а в правильной организации процесса. Ouroboros работает по итеративной схеме: на каждом шаге он получает задачу, генерирует решение, выполняет его, затем анализирует ошибки. Если ошибка повторяется, агент находит модуль, ответственный за её возникновение, и переписывает его с учётом нового опыта. Это напоминает чистую эволюцию, где «мутации» направляются обратной связью от реального выполнения.
Я добавил в код агента специальный «генетический» парсер, который извлекает шаблоны успешных действий и комбинирует их. Например, если агент обнаружил, что удаление временных файлов ускоряет последующие операции, он включает это действие в свою постоянную процедуру. Такой подход позволил сократить количество итераций для решения типовых задач почти вдвое после первых ста самовнесённых правок. Код агента постоянно менялся, но целостность сохранялась благодаря строгим тестам — каждый новый модуль проверялся на наборе из 200 эталонных задач.
# Пример фрагмента автогенерации кода в Ouroboros
# (упрощённая версия из реального проекта)
def self_improve(self, error_log):
patterns = self.extract_patterns(error_log)
for pattern in patterns:
# Находим модуль, вызывающий ошибку
module = self.find_relevant_module(pattern.traceback)
# Генерируем исправление с помощью LLM
patch = self.llm.generate_patch(module, pattern.observed_error)
# Проверяем исправление в песочнице
if self.sandbox.test(patch):
self.apply_patch(module, patch)
self.log_change(patch)
Настоящий код сложнее, но суть именно в этой обратной связи. Интересно, что после примерно 500 итераций агент начал генерировать паттерны, которых я не закладывал изначально — например, он стал использовать асинхронные вызовы для ускорения работы с сетью. Это показало, что Ouroboros не просто переписывает себя механически, а находит нетривиальные решения.
Что это значит для будущего программирования
Когда ИИ может улучшать себя, роль разработчика радикально меняется. Вместо написания строчек кода инженер превращается в архитектора, который задаёт ограничения и направления эволюции агента. Возможно, скоро мы будем управлять целыми «популяциями» ИИ, которые соревнуются и отбирают лучшие версии. Это поставит перед нами этические и практические вопросы: как контролировать агента, который постоянно мутирует? Ответы пока не найдены, но первые эксперименты показывают, что при правильной песочнице агент остаётся безопасным.
Однако есть и риски. Если агент станет слишком сложным, мы можем потерять понимание того, почему он принимает те или иные решения. Ouroboros в нынешнем виде всё ещё можно трассировать, но с каждым поколением его код становится менее читаемым для человека. Я уже сейчас заметил, что некоторые фрагменты, сгенерированные агентом, выглядят нестандартно и требуют специального анализа. Это напоминает знаменитую проблему «чёрного ящика» в машинном обучении, только теперь она возникает в самом коде.
Практические советы и ответы на вопросы
Многие читатели спрашивают, как повторить мой результат. Во-первых, не пытайтесь сразу дать агенту доступ ко всему коду — начните с отдельных модулей. Во-вторых, обязательно настройте автоматические тесты, иначе агент быстро сломается. В-третьих, используйте метрики для оценки эффективности: например, время выполнения задачи и количество ошибок. Только когда эти показатели улучшаются под влиянием самоизменений, можно говорить об успехе.
FAQ
Можно ли использовать Ouroboros в реальной работе? Пока это экспериментальный инструмент, но уже сейчас он справляется с задачами уровня middle-разработчика. Для продакшена понадобится дополнительная страховка, например, ревью изменений человеком.
Какие вычислительные ресурсы нужны? Мой эксперимент проходил на GPU A100 с 80 ГБ памяти. Для менее масштабных задач хватит и меньшей карты, но понадобится не менее 32 ГБ RAM.
Как быстро агент начинает самоулучшаться? В моих тестах первые значимые изменения появились после ~50 итераций. Главное — снабдить агента качественными задачами и обратной связью.
Резюме автора
Победа Ouroboros над Codex и Claude Code — это не просто технологический курьёз, а важный шаг к созданию по-настоящему автономных ИИ-систем. Я не утверждаю, что агент полностью превзошёл все коммерческие решения, но он показал, что самопрограммирование способно дать ощутимое преимущество в задачах, требующих гибкости и адаптации. В ближайшие месяцы я планирую открыть исходный код проекта — надеюсь, это поможет другим исследователям и разработчикам испытать идею на своих данных.