- BrainTools - https://www.braintools.ru -

Базовый минимум. Часть 4:  ИИ-агенты

Дисклеймер: данная лекция подготовлена в первую очередь для непрофильных студентов магистратуры и аспирантуры, которые используют ИИ в учебной, исследовательской и профессиональной деятельности. Материал носит вводный характер и содержит намеренные упрощения. В то же время лекция может быть полезна и более широкой аудитории пользователей ИИ. Буду признателен за замечания и предложения по улучшению.

Серия «Базовый минимум» (4 части): 

Базовый минимум. Часть 1:  большие языковые модели [1];

Базовый минимум. Часть 2:  промпт-инжиниринг [2];

Базовый минимум. Часть 3:  RAG-системы [3]

Базовый минимум. Часть 4:  ИИ-агенты (вы здесь). 

«Что такое воля, как не мысль, переходящая в дело?» — Александр Александрович Бестужев-Марлинский

Содержание

От RAG-систем к ИИ-агентам

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

В реальных сценариях запросы часто многошаговые: нужно собрать данные из разных источников, сравнить, переформулировать вопрос, проверить промежуточные выводы.

8.drawio.png

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

Согласно официальной документации Google Cloud [15], ИИ-агент (AI agent) — это система, которая использует ИИ для достижения поставленных целей и выполнения задач от имени пользователя. Он анализирует задачу, формирует план, выбирает инструменты и выполняет последовательность шагов до достижения результата. 

Агент может обращаться к внешним сервисам и выполнять операции: запускать код, изменять файлы, делать запросы к API или взаимодействовать с базами данных. То есть он влияет на окружение, а не только описывает решения текстом.

13.drawio.png

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

Во многих реализациях он сам предлагает следующие шаги и может выполнять их автоматически или с подтверждением пользователя для критичных действий.

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

Компоненты ИИ-агента

Чтобы агент работал как автономная система, ему нужны несколько ключевых элементов.

14.drawio.png

В центре остаётся LLM. На каждом шаге она пишет инструкции и промежуточные выводы, формирует запросы к инструментам, генерирует или редактирует текст и код.

Для взаимодействия со средой он использует инструменты. Это могут быть уже упомянутые поиск в базе знаний, запрос к API, выполнение кода и любые другие. 

Далее появляется память [16]. Краткосрочная хранит текущий контекст и промежуточные результаты, чтобы агент не забывал, что делал на прошлом шаге. Долгосрочная — это, например, векторные базы или корпоративные знания, которые позволяют накапливать полезную информацию и использовать ее в будущем.

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

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

Что такое ReAct

Один из ранних и практичных паттернов агентного поведения [17] для LLM — это паттерн ReAct [18]. Его идея проста: модель действует согласно определенному набору шагов. 

15.drawio (1).png

Сначала она рассуждает, что нужно сделать, затем выполняет действие (через инструменты), получает результат и только после этого выбирает следующий шаг. В терминах цикла это думать (reason), действовать (act), наблюдать (observe).

Преимущество ReAct в том, что процесс становится более прозрачным: мы видим цепочку шагов и действий агента (план, вызовы инструментов, результаты) и можем контролировать ход работы. Это один из базовых паттернов, на котором строятся многие современные агенты.

Мультиагентные системы

Когда один агент уже умеет планировать и действовать, следующий шаг состоит в том, чтобы разделить работу между несколькими специализированными агентами. Мультиагентная система (MAS, Multi-Agent System) — это система из нескольких агентов, которые координируют действия и совместно решают одну задачу. Идея похожа на команду: вместо одного универсального исполнителя есть несколько ролей (например, планировщик, исследователь, исполнитель и валидатор), а результаты собираются в общий ответ. 

Почему это бывает полезно? Во-первых, появляется параллелизм: разные агенты могут одновременно выполнять подзадачи. Во-вторых, повышается качество: агенты могут взаимно проверять результаты, что снижает риск ошибок. В-третьих, становится проще масштабировать сложные сценарии со множеством инструментов, источников данных и промежуточных шагов. 

Обычно мультиагентность реализуют через агента-координатора (или «оркестратор»), который разбивает цель на подзадачи, назначает их другим агентам и собирает итоговый результат. В более простом варианте это может быть «конвейер ролей», а в более продвинутом динамическая схема, в которой агенты могут повторно обращаться друг к другу.

6.drawio (2).png

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

ИИ-агенты в современных сервисах

Крупные компании внедряют агентов в продукты, которыми каждый день пользуются миллионы людей. Например, в ChatGPT появился Agent Mode и Codex [19]. Например, в ChatGPT развиваются агентные сценарии работы, [19] а также инструменты для помощи с кодом, такие как Codex [20]. GitHub Copilot также развивается в сторону агентности [21]: их система интегрируется в различные IDE, такие как VSCode, и способна анализировать проект, предлагать правки, создавать тесты и многое другое.

Microsoft представила Microsoft 365 Copilot [22] — помощника, встроенного в привычные приложения Office (Word, Excel, PowerPoint, Outlook, Teams). Он обрабатывает документы, таблицы, письма и встречи, формирует отчеты и презентации. Вероятно, пока писался этот текст, появилось еще несколько новых инструментов.

Практический пример: минимальный ИИ-агент-помощник

Когда я делал пример для этой части, хотелось реализовать что-то максимально простое, без сложной инфраструктуры и множества компонентов, но при этом такое, чтобы было видно, что это действительно агент.

В итоге получился небольшой MVP помощника в путешествиях, который умеет:

  • Смотреть погоду в разных городах;

  • Смотреть мероприятия в разных городах;

  • Отправлять письма на почту.

Полный код можно посмотреть и запустить в Google Colab [23] (если хочется поэкспериментировать). Ниже разберем только основные части.

Инициализация модели

В качестве модели я использовал одну из относительно новых — Qwen 3.5 (9B) [24]. Она была запущена в Colab локально через Ollama [25].

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="qwen3.5:9b",
    base_url="http://localhost:11434/v1",
    api_key="ollama",
    temperature=0.3,
)

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

Инструменты агента

Далее в коде задаются три инструмента: get_weather, get_events и send_email. Идея здесь простая: агент может найти интересные события в городе, предложить их пользователю и, при необходимости, подсказать, как лучше одеться по погоде.

Снова подчеркну, что пример, конечно, игрушечный. Хотелось, с одной стороны, не усложнять, а с другой, чтобы агент всё-таки делал какие-то действия и решал, какие инструменты использовать.

Функции получились довольно объёмными, поэтому полностью их разбирать не будем, а для примера посмотрим только на функцию get_weather.

@tool
def get_weather(city: str) -> str:
    """Возвращает текущую погоду в указанном городе.
    Принимает название города на русском или английском языке."""
    try:
        geo = requests.get(
            "https://geocoding-api.open-meteo.com/v1/search",
            params={"name": city, "count": 1, "language": "ru"},
            timeout=10,
        ).json()
    except Exception:
        return "Не удалось получить погоду, попробуйте позже."

    if not geo.get("results"):
        return f"Город '{city}' не найден."

    r = geo["results"][0]
    lat, lon, name = r["latitude"], r["longitude"], r["name"]

    try:
        weather = requests.get(
            "https://api.open-meteo.com/v1/forecast",
            params={
                "latitude": lat,
                "longitude": lon,
                "current": "temperature_2m,wind_speed_10m,weathercode",
                "timezone": "auto",
            },
            timeout=10,
        ).json()["current"]
    except Exception:
        return "Не удалось получить погоду, попробуйте позже."

    codes = {
        0: "ясно", 1: "преимущественно ясно", 2: "переменная облачность",
        3: "пасмурно", 45: "туман", 48: "туман с инеем",
        51: "лёгкая морось", 53: "морось", 55: "сильная морось",
        61: "лёгкий дождь", 63: "дождь", 65: "сильный дождь",
        71: "лёгкий снег", 73: "снег", 75: "сильный снег",
        77: "снежная крупа", 80: "ливень", 85: "снегопад",
        95: "гроза", 99: "гроза с градом",
    }
    desc = codes.get(weather["weathercode"], f"код {weather['weathercode']}")

    return (
        f"{name}: {weather['temperature_2m']}C, {desc}, "
        f"ветер {weather['wind_speed_10m']} км/ч"
    )

Здесь используется декоратор @tool из langchain_core.tools.

Он превращает обычную Python-функцию в инструмент, который может вызывать агент. Модель видит описание функции (docstring), понимает какие у неё аргументы и может сама решить, когда её использовать.

В более продвинутых вариантах инструменты часто делают через MCP (Model Context Protocol), например с использованием библиотеки fastmcp [26]. Это даёт больше гибкости и позволяет выносить инструменты во внешние сервисы. Но нашего примера это избыточно, поэтому здесь используется простой вариант через @tool.

Промпт и контекст пользователя

Здесь мы описываем, как должен вести себя агент, и передаём информацию о пользователе, чтобы ответы были более осмысленными и персонализированными.

USER_CONTEXT = (
    "Пользователь:n"
    "- Имя: Павелn"
    "- Возраст: 27n"
    "- Email: pavel@mail.comn"
    "- Интересы: технологии, спорт, историяn"
)

SYSTEM = SystemMessage(content=(
    f"Сегодня {today}.n"
    "Ты — умный помощник-путешественник. Всегда отвечай только на русском.nn"

    f"{USER_CONTEXT}n"

    "## Инструментыn"
    "- get_weather(city) — погода. city = название города (на русском или английском).n"
    "- get_events(city, count) — афиша. city = русское название города точно как написал "
    "пользователь ('Казань', 'Москва', 'Санкт-Петербург'). НЕ придумывай slug сам.n"
    "- send_email(to, subject, body) — письмо. Только если пользователь явно просит.nn"

    "## Правилаn"
    "1. Используй инструменты по одному, жди результата.n"
    "2. В ответе укажи место и время начала из результата get_events — не придумывай.n"
    "3. Если поле 'площадка не указана' или 'время не указано' — так и скажи.n"
    "4. Не пиши JSON или технические блоки в финальном ответе.n"
    "5. Давай рекомендации по одежде исходя из погоды.n"
    "6. Учитывай интересы пользователя при выборе мероприятий.n"
    "7. Будь лаконичен, не навязывай услуги.n"
))

tools = [get_weather, get_events, send_email]
agent = create_agent(llm, tools)

Инструменты собираются в список, а модель вместе с ними передаётся в create_agent из langchain.agents и SystemMessage из langchain_core.messages. Именно на этом этапе обычная LLM превращается в агента.

В целом здесь и далее используется библиотека LangChain [27] версии 1.2.12.

Цикл работы

Далее реализуется цикл взаимодействия с пользователем.

while True:
    query = input("Вы: ").strip()
    if not query or query.lower() in {"exit", "выход", "quit"}:
        break

    history.append(HumanMessage(content=query))
    history = history[-10:]

    result = agent.invoke({"messages": [SYSTEM] + history})

    for msg in result["messages"]:
        if isinstance(msg, AIMessage) and msg.tool_calls:
            for tc in msg.tool_calls:
                print(f"  [tool] {tc['name']}({tc['args']})")
        elif isinstance(msg, ToolMessage):
            preview = msg.content[:300] + ("..." if len(msg.content) > 300 else "")
            print(f"  [result] {preview}")

    final = next(
        (m for m in reversed(result["messages"])
         if isinstance(m, AIMessage) and not m.tool_calls),
        None,
    )

    if final:
        print(f"nАгент: {final.content}n")
        history.append(final)

Здесь всё достаточно просто: мы принимаем ввод, добавляем его в историю диалога и передаём вместе с системным промптом в агента. Внутри agent.invoke уже происходит вся логика [28].

Отдельно в коде выводятся промежуточные шаги (вызовы инструментов и их результаты), чтобы было видно, как агент рассуждает и действует.

Пример диалога

Ниже приведён пример диалога. Я немного сократил вывод инструментов, чтобы не перегружать, но суть сохранена.

Вы: Привет я в Красноярске пару дней и хочу вечером сходить куда то сегодня скажи куда можно и как по погоде одеться

  [tool] get_weather({'city': 'Красноярск'})
  [tool] get_events({'city': 'Красноярск', 'count': 10})

  [result] Красноярск: 3.5C, пасмурно, ветер 18 км/ч
  [result] Мероприятия в Красноярске: ...

Агент: Привет, Павел! Сегодня в Красноярске +3.5°C, пасмурно...
...
3. **Выставка «Николай Константинович Ауэрбах: ученый-археолог, краевед, общественный деятель»** — Красноярский краевой краеведческий музей, ул. Дубровинского, д. 84. Также посвящена истории и науке.

К сожалению, точное время начала этих мероприятий не указано в доступной информации. Рекомендую уточнить расписание на месте или на сайте музея.

Также есть выставка «Искусство XX века» в красноярском художественном музее имени Сурикова (просп. Мира, д. 12), но время начала тоже не указано.

Выбирай то, что ближе по интересам, и не забудь взять с собой тёплую одежду!

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

Дальше пользователь уточняет действие:

Вы: Хочу на Искусство XX века. Скинь мне адрес на почту
Письмо сохранено: /content/email_061623.txt
  [tool] send_email({'to': 'pavel@mail.com', 'subject': 'Адрес выставки «Искусство XX века»', 'body': 'Привет, Павел!nnАдрес выставки «Искусство XX века»:nКрасноярский художественный музей имени Суриковаnпроспект Мира, д. 12, КрасноярскnnУдачи на мероприятии!'})
  [result] Письмо успешно отправлено на pavel@mail.com.

Агент: Письмо с адресом выставки «Искусство XX века» отправлено на твой email (pavel@mail.com). Адрес: проспект Мира, д. 12, Красноярск. Удачи на мероприятии!

Как помните, отправка здесь реализована как заглушка, но сам инструмент вызван корректно, адрес пользователя подставлен правильно, и письмо действительно формируется. Ниже представлен файл, который был сохранён:

Кому: pavel@mail.com
Тема: Адрес выставки «Искусство XX века»

Привет, Павел!

Адрес выставки «Искусство XX века»:
Красноярский художественный музей имени Сурикова
проспект Мира, д. 12, Красноярск

Удачи на мероприятии!

Заключение

В этой серии мы прошли путь от базовой идеи языковой модели к практическим системам вокруг неё: RAG подключает внешние знания и делает ответы более точными и проверяемыми, агенты расширяют возможности LLM до сложных многошаговых действий, а промпт-инжиниринг помогает эффективно управлять качеством и форматом результата. 

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

Список используемых источников 

1. Wang X., Fan Z., Hua W., Tang R., Zhang J., Zhou M., Li B. A Survey on Large Language Model based Autonomous Agents // arXiv. 2024. URL: https://arxiv.org/abs/2401.14554 [29] (дата обращения: 05.11.2025);

2. Yao S., Zhao J., Yu D., Narasimhan K., Chen D. ReAct: Synergizing Reasoning and Acting in Language Models // arXiv. 2022. URL: https://arxiv.org/abs/2210.03629 [18] (дата обращения: 05.11.2025);

3. AI-агенты: переход от инструментов к автономным исполнителям в бизнесе [Электронный ресурс] // Yandex Cloud : блог. — 28 октября 2025 г. — URL: https://yandex.cloud/ru/blog/ai-agents [30] (дата обращения: 03.01.2026);

4. Skillfactory. Что такое AI-агенты и что они умеют [Электронный ресурс] // Skillfactory Blog. — 22 мая 2025. — URL: https://blog.skillfactory.ru/chto-takoe-ai-agenty-i-chto-oni-umeyut/ [31] (дата обращения: 03.01.2026);

5. AI-агенты: что это и как они работают? [Электронный ресурс] // Developers.Sber.ru [32] : база знаний (GigaChat API). — 26 сентября 2025. — URL: https://developers.sber.ru/help/gigachat-api/ai-agents [33] (дата обращения: 03.01.2026);

6. Многоагентная система [Электронный ресурс] // Рувики : интернет-энциклопедия. — URL: https://ru.ruwiki.ru/wiki/Многоагентная_система [34] (дата обращения: 03.01.2026).  [35]

7. Мультиагентные системы на основе LLM: как работают и зачем нужны [Электронный ресурс] // Cloud.ru [36] : блог. — 11 июля 2025. — URL: https://cloud.ru/blog/multiagentnyye-sistemy-na-osnove-llm [37] (дата обращения: 03.01.2026).

Автор: Sherstpasha

Источник [38]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/27566

URLs in this post:

[1] Базовый минимум. Часть 1:  большие языковые модели: https://habr.com/ru/articles/986482/

[2] Базовый минимум. Часть 2:  промпт-инжиниринг: https://habr.com/ru/articles/988920/

[3] Базовый минимум. Часть 3:  RAG-системы: https://habr.com/ru/articles/1002152/

[4] От RAG-систем к ИИ-агентам: #rag-to-agents

[5] Компоненты ИИ-агента: #agent-components

[6] Что такое ReAct: #react-pattern

[7] Мультиагентные системы: #multi-agent-systems

[8] ИИ-агенты в современных сервисах: #practical-assistant

[9] Инициализация модели: #model-init

[10] Инструменты агента: #agent-tools

[11] Промпт и контекст пользователя: #agent-prompt

[12] Цикл работы: #agent-loop

[13] Пример диалога: #example-dialog

[14] Заключение: #conclusion

[15] официальной документации Google Cloud: https://cloud.google.com/discover/what-are-ai-agents?utm_source=chatgpt.com

[16] память: http://www.braintools.ru/article/4140

[17] поведения: http://www.braintools.ru/article/9372

[18] паттерн ReAct: https://arxiv.org/abs/2210.03629

[19] ChatGPT появился Agent Mode и Codex: https://help.openai.com/en/articles/11752874-chatgpt-agent

[20] Codex: https://openai.com/ru-RU/index/introducing-codex/

[21] развивается в сторону агентности: https://github.com/features/copilot

[22] Microsoft 365 Copilot: https://www.microsoft.com/ru-ru/microsoft-365-copilot

[23] Google Colab: https://colab.research.google.com/drive/1XHhGKEfJpwAV-dw3ttt1t_xvpA7drSQO?usp=sharing

[24] Qwen 3.5 (9B): https://huggingface.co/Qwen/Qwen3.5-9B

[25] Ollama: https://ollama.com/

[26] fastmcp: https://gofastmcp.com/getting-started/welcome

[27] LangChain: https://www.langchain.com/

[28] логика: http://www.braintools.ru/article/7640

[29] https://arxiv.org/abs/2401.14554: https://arxiv.org/abs/2401.14554

[30] https://yandex.cloud/ru/blog/ai-agents: https://yandex.cloud/ru/blog/ai-agents

[31] https://blog.skillfactory.ru/chto-takoe-ai-agenty-i-chto-oni-umeyut/: https://blog.skillfactory.ru/chto-takoe-ai-agenty-i-chto-oni-umeyut/

[32] Developers.Sber.ru: http://Developers.Sber.ru

[33] https://developers.sber.ru/help/gigachat-api/ai-agents: https://developers.sber.ru/help/gigachat-api/ai-agents

[34] https://ru.ruwiki.ru/wiki/Многоагентная_система: https://ru.ruwiki.ru/wiki/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%B0%D0%B3%D0%B5%D0%BD%D1%82%D0%BD%D0%B0%D1%8F%5C_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0

[35]  : https://ru.ruwiki.ru/wiki/%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%B0%D0%B3%D0%B5%D0%BD%D1%82%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0

[36] Cloud.ru: http://Cloud.ru

[37] https://cloud.ru/blog/multiagentnyye-sistemy-na-osnove-llm: https://cloud.ru/blog/multiagentnyye-sistemy-na-osnove-llm

[38] Источник: https://habr.com/ru/articles/1013540/?utm_campaign=1013540&utm_source=habrahabr&utm_medium=rss

www.BrainTools.ru

Rambler's Top100