Агентное программирование

Агенты для программирования – это диалоговые ИИ-модели с доступом к инструментам вроде чтения и записи файлов, веб-поиска и запуска команд оболочки (shell). Они живут либо в IDE, либо в отдельных инструментах – с интерфейсом командной строки или графическим. Агенты для программирования – мощные и весьма автономные инструменты, открывающие широкий спектр сценариев использования.

Эта лекция опирается на материал о разработке с помощью ИИ из лекции Среда разработки и инструменты. В качестве быстрой демонстрации продолжим пример из раздела Разработка с помощью ИИ:

from urllib.request import urlopen

def download_contents(url: str) -> str:
    with urlopen(url) as response:
        return response.read().decode('utf-8')

def extract(content: str) -> list[str]:
    import re
    pattern = r'\[.*?\]\((.*?)\)'
    return re.findall(pattern, content)

print(extract(download_contents("https://raw.githubusercontent.com/missing-semester/missing-semester/refs/heads/master/_2026/development-environment.md")))

Попробуем дать агенту для программирования следующую задачу:

Turn this into a proper command-line program, with argparse for argument parsing. Add type annotations, and make sure the program passes type checking.

Агент прочитает файл, чтобы разобраться в нём, затем внесёт правки и напоследок запустит проверку типов, чтобы убедиться, что аннотации типов корректны. Если он ошибётся так, что проверка типов не пройдёт, он, скорее всего, сделает ещё одну итерацию, хотя задача простая, так что это маловероятно. Поскольку у агентов для программирования есть доступ к инструментам, способным навредить, по умолчанию обвязка агента (agent harness) просит пользователя подтверждать вызовы инструментов.

Если агент ошибается – например, у вас бинарник mypy доступен прямо в $PATH, а агент пытается вызвать python -m mypy, – вы можете дать ему обратную связь текстом, чтобы он скорректировал курс.

Агенты для программирования поддерживают многоходовое взаимодействие, так что работу можно итеративно дорабатывать в диалоге с агентом. Агента можно даже прервать, если он свернул не туда. Полезная ментальная модель – руководитель и стажёр: стажёр возьмёт на себя всю кропотливую работу, но ему нужны указания, а время от времени он будет делать что-то не то – и его придётся поправлять.

Для более наглядной демонстрации попробуйте следующим сообщением попросить агента запустить получившийся скрипт. Посмотрите на вывод и попросите его внести изменение (например, оставить только абсолютные URL).

Как работают ИИ-модели и агенты

Полное объяснение внутреннего устройства современных больших языковых моделей (LLM) и инфраструктуры вроде агентных обвязок выходит за рамки этого курса. Однако общее представление о нескольких ключевых идеях помогает эффективно использовать эту новейшую технологию и понимать её ограничения.

LLM можно рассматривать как модель распределения вероятностей строк-дополнений (выходов) при условии строк-промптов (входов). Инференс (inference) LLM – то, что происходит, когда вы, например, отправляете запрос в диалоговое чат-приложение, – сэмплирует из этого распределения вероятностей. У LLM фиксированное контекстное окно – максимальная длина входной и выходной строк.

Инструменты ИИ, такие как диалоговый чат и агенты для программирования, строятся поверх этого примитива. Для многоходового взаимодействия чат-приложения и агенты используют маркеры реплик и при каждом новом промпте пользователя передают в качестве строки-промпта всю историю диалога, запуская инференс LLM по одному разу на каждый промпт пользователя. В агентах с вызовом инструментов обвязка интерпретирует определённые выходы LLM как запросы на вызов инструмента и передаёт результаты вызова обратно модели как часть строки-промпта (так что инференс LLM запускается заново при каждом вызове инструмента и ответе на него). Ключевые концепции агентов с вызовом инструментов можно реализовать в 200 строк кода.

Приватность

Большинство ИИ-инструментов для программирования в стандартной конфигурации отправляют в облако немало ваших данных. Иногда обвязка агента работает локально, а инференс LLM выполняется в облаке; в других случаях в облако вынесена ещё большая часть софта (и тогда, например, провайдер сервиса фактически получает копию всего вашего репозитория, а заодно и всех ваших взаимодействий с ИИ-инструментом).

Существуют вполне неплохие ИИ-инструменты для программирования с открытым исходным кодом и открытые LLM (хотя они всё же не так хороши, как проприетарные модели), но на данный момент для большинства пользователей запускать передовые открытые LLM локально нереально из-за аппаратных ограничений.

Сценарии использования

Агенты для программирования могут быть полезны в самых разных задачах. Несколько примеров:

Продвинутые агенты

Здесь мы кратко рассмотрим несколько более продвинутых паттернов использования и возможностей агентов для программирования.

Для многих продвинутых возможностей, требующих написания промптов (например, навыков или субагентов), первый набросок можно получить с помощью LLM. В некоторых агентах для программирования это даже поддерживается «из коробки». Например, Claude Code может сгенерировать субагента из короткого промпта (вызовите /agents и создайте нового агента). Попробуйте создать субагента с таким промптом:

A Python code checking agent that uses `mypy` and `ruff` to type-check, lint, and format *check* any files that have been modified from the last git commit.

Затем субагента можно явно вызвать через агента верхнего уровня сообщением вроде «use the code checker subagent». Возможно, вам также удастся добиться, чтобы агент верхнего уровня вызывал субагента автоматически, когда это уместно, – например, после изменения любых Python-файлов.

На что обращать внимание

Инструменты ИИ могут ошибаться. Они построены на LLM – всего лишь вероятностных моделях предсказания следующего токена. Они не «интеллектуальны» в том смысле, в каком интеллектуальны люди. Проверяйте вывод ИИ на корректность и на уязвимости. Иногда проверить код бывает труднее, чем написать его самому; критически важный код, возможно, стоит писать вручную. ИИ может уходить в кроличьи норы и пытаться вас газлайтить; помните о спиралях отладки (debugging spirals). Не используйте ИИ как костыль и остерегайтесь чрезмерной зависимости и поверхностного понимания. По-прежнему существует огромный класс задач программирования, которые ИИ не способен решить. Вычислительное мышление всё ещё ценно.

Рекомендуемое ПО

Многие IDE и ИИ-расширения для программирования включают в себя агентов для программирования (см. рекомендации из лекции о среде разработки). Среди других популярных агентов для программирования – Claude Code от Anthropic, Codex от OpenAI и open-source-агенты вроде opencode.

Упражнения

  1. Сравните опыт программирования вручную, с ИИ-автодополнением, со встроенным чатом (inline chat) и с агентами, выполнив одну и ту же задачу по программированию четыре раза. Лучший кандидат – небольшая фича в проекте, над которым вы уже работаете. Если нужны другие идеи, можно взять задачи в духе «good first issue» в open-source-проектах на GitHub либо задачи с Advent of Code или LeetCode.
  2. Используйте ИИ-агента для программирования, чтобы сориентироваться в незнакомой кодовой базе. Лучше всего делать это, когда вы хотите что-то отладить или добавить новую фичу в проект, который вам действительно небезразличен. Если ничего подходящего не приходит в голову, попробуйте с помощью ИИ-агента разобраться, как устроены связанные с безопасностью функции в агенте opencode.
  3. Навайбкодьте небольшое приложение с нуля. Не пишите ни одной строчки кода вручную.
  4. Для выбранного вами агента для программирования создайте и протестируйте AGENTS.md (или аналог для вашего агента, например CLAUDE.md), навык (skill; например, навык в Claude Code или навык в Codex) и субагента (например, субагент в Claude Code). Подумайте, в каких случаях вы бы предпочли один из этих механизмов другому. Учтите, что ваш агент может не поддерживать какие-то из этих возможностей; в таком случае либо пропустите эти пункты, либо попробуйте другого агента для программирования, где поддержка есть.
  5. С помощью агента для программирования решите ту же задачу, что и в упражнении с регулярными выражениями про маркеры списков в Markdown из лекции «Качество кода». Выполняет ли он эти задачи прямым редактированием файла? Каковы недостатки и ограничения подхода, при котором агент для такой задачи правит файл напрямую? Придумайте, как сформулировать промпт, чтобы агент не решал задачу прямым редактированием файлов. Подсказка: попросите агента использовать один из инструментов командной строки, упомянутых в первой лекции.
  6. Большинство агентов для программирования поддерживают своего рода «yolo-режим» (например, в Claude Code это --dangerously-skip-permissions). Использовать этот режим напрямую небезопасно, но запустить агента для программирования в изолированном окружении вроде виртуальной машины или контейнера и уже там включить автономную работу может быть вполне приемлемо. Настройте такую схему у себя на машине. Может пригодиться документация вроде devcontainer’ов в Claude Code или Docker Sandboxes / Claude Code. Настроить это можно не одним способом.

Редактировать страницу.

Лицензия CC BY-NC-SA.