Журнал · Rit.work

Octopus хранит ветвящихся ИИ-агентов в одном KV-кэше

Octopus объединяет ветвление агентов, обмен скрытым контекстом и обучение с подкреплением в одном серверном графе на GPU.

Rit.work
Студия разработки
6 ноября 2026 г.3 мин чтения

Материал подготовлен автоматически по первоисточникам: ссылки на них — в конце статьи.

Одну языковую модель научили параллельно исследовать несколько направлений, откатывать неудачные ветки и обмениваться найденным без пересказа текста. В работе Tianming Sha, которая не рецензирована и где все числа получили сами авторы, Octopus набрал 49,6% на BrowseComp-Plus — на 17,5 процентного пункта выше однопоточного агента с длинным контекстом. Для команд это не новый шаблон промпта, а вариант архитектуры сервера и обучения для задач с долгим поиском.

Ветки разделяют префикс, но не рабочую память

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

Octopus хранит эпизод как направленный ациклический граф на GPU. Его узлы — неизменяемые курсоры, которые ссылаются на KV-кэш (сохранённые ключи и значения механизма внимания) и состояние рекуррентных слоёв. Ветка получает собственный курсор, но физически использует те же страницы общего префикса, пока не начнёт дописывать свою историю.

Система даёт модели пять операций. fork создаёт дочерние ветки, read_thread открывает им состояние соседней ветки, wait ждёт завершения работы, rewind возвращает курсор и рекуррентное состояние к прежнему шагу, а done фиксирует ответ. Каждая ветка может добавить до 32 тыс. токенов независимо от унаследованного префикса.

Такой откат отличается от удаления текста из диалога. Сервер восстанавливает не только позицию в KV-кэше, но и снимок внутреннего состояния гибридной модели. Страницы тупиковой ветки можно освободить, а её путь сохранить в графе для последующего обучения.

Соседний контекст подключается только к слоям внимания

Qwen3.5 сочетает слои полного внимания с линейно-рекуррентными слоями. Если провести чужую историю через всю модель, рекуррентное состояние читателя смещается к задаче соседней ветки. В экспериментах такой перенос заставлял ветку переключаться на чужую цель в 57,9% случаев.

Octopus подключает чужие KV-страницы только к слоям полного внимания. Рекуррентные слои пропускают этот фрагмент и продолжают обновлять собственную рабочую память. Позиции подключённого фрагмента сдвигаются только вперёд, поэтому ветка может читать более длинного соседа без перестановки уже сохранённых страниц.

После такого разделения доля переключений на чужую задачу упала до 2,7%, при этом модель сохранила 92,2% информации об ответе, которую получала при передаче полного текста. Новые KV-страницы для чтения соседней ветки не выделяются: сервер временно подключает уже существующие блоки.

Для обучения автор собрал все ветки эпизода в один проход с разреженным вниманием. Общий префикс учитывается в функции потерь один раз, а вклад ветки оценивается по тому, как изменился бы итог без неё. Связи между читающей и производящей ветками остаются дифференцируемыми, поэтому ошибка проходит через подключённый KV-кэш, а не обрывается на текстовой сводке.

Упаковка графа увеличила пропускную способность обучения в 3,3 раза и сократила пиковую память KV-кэша в 2,8 раза. Здесь выигрыш даёт совместная конструкция: сервер, управление памятью и алгоритм обучения используют один и тот же граф эпизода.

Работа оправдывает отдельный прототип, а не замену всего стека

Octopus обучали на Qwen3.5-4B с бинарной наградой за конечный ответ и разреженным поиском BM25. Проверка охватывает BrowseComp-Plus и OpenResearcher. В одном эпизоде работает один общий экземпляр модели, курсоры живут только до конца эпизода, а GPU размещены в пределах одного узла.

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

Встроить эту схему поверх обычного внешнего API не получится. Основные механизмы требуют доступа к физическим страницам KV-кэша, снимкам рекуррентного состояния, планировщику GPU и графу обратного распространения ошибки. Команде понадобится собственный контур вывода и обучения либо сервер, который предоставляет аналогичные примитивы.

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

Источники

Иллюстрация: рисунок из статьи «Octopus: One Brain, Many Branches for Latent-KV Multi-Agent Reinforcement Learning», Tianming Sha, CC BY 4.0

Пауза в чтении

Похоже на вашу задачу?

Расскажите, что собираете. За полчаса разложим на этапы и назовём сроки — это бесплатно и ни к чему не обязывает.

Rit.work

Студия разработки

Собираем мобильные приложения и помогаем командам получать от AI реальную пользу. Основатель и команда, работаем удалённо — с клиентами в России и за рубежом.

← Ко всем материалам
Понравилось? Обсудим вашу задачу