Наткнулся на их работу Hogwild! Inference. Идея простая и немного безумная: зачем заставлять одну LLM последовательно думать 10 тысяч токенов, если можно запустить несколько копий модели параллельно и дать им общую рабочую память, чтобы они видели, что остальные уже успели надумать?
Причём это не обычный «консилиум агентов», где каждый независимо пишет длинный ответ, а потом результаты склеиваются. Здесь несколько копий одной и той же модели с одинаковыми весами генерируют одновременно, а их K/V-кэши связываются между собой.
Один агент написал полпредложения — другой уже может обратить внимание на его промежуточное состояние и поменять собственный план. Не нужно ждать, пока коллега закончит доклад и нажмёт Enter.
У каждого агента при этом своя версия общей истории. Например, есть два параллельных агента — Алиса и Боб.
Алиса видит:
общий промпт → мысль Боба → своя мысльА Боб:
общий промпт → мысль Алисы → своя мысльИ тут возникает техническая проблема. Один и тот же кусок чужого рассуждения у разных агентов оказывается в разных местах текста. А для механизма внимания важно не только содержание токена, но и его положение относительно остальных.
В современных моделях это положение часто кодируется через RoPE — вращательное кодирование позиции. На пальцах: вектор токена математически немного «поворачивается» в зависимости от того, на какой позиции он находится. Поэтому токен под номером 500 и такой же токен под номером 700 для внимания выглядят по-разному, и модель понимает расстояние между ними.
Обычно, если мы хотим переставить готовый кусок текста на другое место, пришлось бы снова прогнать его через модель и пересчитать K/V-кэш. В Hogwild делают хитрее: содержание уже посчитанной памяти оставляют, а её позиционную часть через RoPE пересчитывают так, как будто этот кусок изначально находился в новом месте.
То есть чужую незавершённую мысль можно практически взять готовой, переставить в контекст другого агента и поменять ей только “координаты на странице”, не заставляя модель перечитывать весь этот текст заново.
Получается почти
memcpy() чужой мысли в своё внимание — только с поправкой координат. Ещё понравилась организация памяти. Когда агент заканчивает абзац рассуждения, его кусок отправляется в общую историю. Но текущие незаконченные абзацы остальных агентов всегда лежат рядом, чтобы свежие мысли не затерялись где-то за пятью тысячами токенов.
По сути KV-кэш превращается в групповой чат, только вместо сообщений участники видят уже подготовленные внутренние представления текста.
И самое интересное: модели не обучали этому отдельно. QwQ, Qwen3, Phi-4 Reasoning Plus и даже DeepSeek-R1 уже умеют более-менее самоорганизовываться: делить задачу, замечать ошибки друг друга, менять план и бросать работу, если другой поток её уже сделал.
Иногда, правда, reasoning-модель настолько увлекается собственной великой мыслью, что перестаёт замечать коллег. Поэтому раз в тысячу токенов ей буквально подсовывают вопрос: «Погоди, а я сейчас случайно не делаю работу, которую уже сделал кто-то другой?» И внезапно это помогает.
Причём обмен прямо по токенам оказался полезнее, чем вариант, где агенты видят друг друга только после завершения очередного шага рассуждения. То есть ценность именно в том, чтобы видеть чужую мысль пока она ещё формируется, а не читать готовый отчёт постфактум.
По скорости это как почти 2× для двух потоков и 3.2–3.6× для четырёх. При этом задача не просто генерировать больше текста, а быстрее прийти к хорошему решению за счёт совместного рассуждения.
Мне здесь нравится более общая идея: KV-кэш начинает превращаться в программируемую память вычислительного процесса.
Можно иметь несколько параллельных веток рассуждения, позволять им видеть состояния друг друга, переставлять блоки памяти, продолжать чужую ветку, менять план на лету — и всё это без изменения весов модели.
Надо попробовать подобный подход в поиске уязвимостей в коде - может синергия кэша даст прирост по точности и охвату.