В мире разработки ИИ-агентов долгое время доминировал Python: богатая экосистема библиотек для машинного обучения и работы с моделями делала его естественным выбором. Однако на практике агенты проводят большую часть времени не в вычислениях, а в ожидании ответов от LLM или инструментов. Именно поэтому команды всё чаще обращают внимание на Go — язык, изначально спроектированный для параллельных сетевых сервисов.
Илья Данилкин, тимлид в Авито Авто, в своей статье на Habr разбирает пять сценариев, где Go оказывается особенно полезен. Первый и ключевой — агентная нагрузка. В продакшене ИИ-агент живёт куда дольше обычного запроса: от нескольких секунд до нескольких часов. За это время он успевает поработать в среде разработки, поуправлять браузером, разобрать документы. При этом агент почти не занят вычислениями — он ждёт ответа модели или результата инструмента. Такая нагрузка — это параллельный сетевой сервис, только отдельные единицы работы живут дольше. Go проектировали именно для таких систем.
Второй сценарий — возможность написать базового агента без фреймворка. В Go уже есть агентные фреймворки: ADK Go, Genkit Go, Eino, LangChainGo. Но многие команды предпочитают стандартную библиотеку и небольшие зависимости. Опыт Anthropic показывает, что самые эффективные агенты используют простые компонуемые шаблоны. Цикл, который управляет моделью, называется agent harness — это код, который вызывает модель, запускает инструменты, форматирует результаты и решает, когда завершить. Вручную такой harness пишется примерно за 40 строк. Официальные SDK, такие как anthropic-sdk-go и openai-go, берут на себя работу с API, но сам harness не запускают.
Третий сценарий — локальные агентные инструменты. Go компилируется в один бинарник, что упрощает доставку приложения пользователю. Это особенно важно для инструментов, которые должны работать локально, без сложной настройки окружения. Четвёртый сценарий — агенту недостаточно просто читать файлы: ему нужно взаимодействовать с окружением, управлять процессами, работать с сетью. Go предоставляет богатую стандартную библиотеку для этих задач. Наконец, пятый сценарий — сборка локального LLM-приложения: Go позволяет собрать всё в один исполняемый файл, который легко развернуть.
Ключевое преимущество Go — горутины. Каждая горутина стартует с примерно 2 КБ стека, и планировщик распределяет их по всем ядрам процессора. Поскольку запуски агентов преимущественно ожидают ввода-вывода, одна горутина на запуск обходится недорого. Пределом становятся rate limits внешних LLM-провайдеров и объём памяти, а не количество горутин. Всплеск CPU-нагрузки, например при десериализации большого результата, не останавливает весь процесс, как это происходит в однопоточных средах вроде Node или Python.
Единая отмена операций через context.Context — ещё одна важная возможность. Когда пользователь останавливает задачу, которая уже обошлась в десять долларов, отмена одного контекста останавливает текущий запрос и все последующие вызовы инструментов. За уже сгенерированные токены платить придётся, но дорогая работа на следующих этапах прекращается. В Go соглашение об отмене более единообразное, чем в Python или Node, а если библиотека его игнорирует, это можно выявить с помощью goleak.
Каналы в Go моделируют координацию между субагентами: агент передаёт пользователю частичный вывод, пока ждёт следующего вызова модели, или передаёт управление между субагентами. Запуск можно представить как шаг без собственного состояния, который принимает входящие сообщения и возвращает исходящие, так что любой воркер может перейти к следующему этапу.
Таким образом, Go предлагает практичные решения для разработки ИИ-агентов, особенно когда важны параллелизм, отмена операций и простота доставки. Для команд, которые уже работают на Go, это возможность использовать привычный стек без необходимости переходить на Python. А для тех, кто только выбирает язык, Go может стать достойной альтернативой, особенно в сценариях с длительными запусками и высокой конкурентностью.

