- BrainTools - https://www.braintools.ru -
Дисклеймер: данная лекция подготовлена в первую очередь для непрофильных студентов магистратуры и аспирантуры, которые используют ИИ в учебной, исследовательской и профессиональной деятельности. Материал носит вводный характер и содержит намеренные упрощения. В то же время лекция может быть полезна и более широкой аудитории пользователей ИИ. Буду признателен за замечания и предложения по улучшению.
Серия «Базовый минимум» (4 части):
Базовый минимум. Часть 1: большие языковые модели [1];
Базовый минимум. Часть 2: промпт-инжиниринг [2];
Базовый минимум. Часть 3: RAG-системы [3];
Базовый минимум. Часть 4: ИИ-агенты (вы здесь).
«Что такое воля, как не мысль, переходящая в дело?» — Александр Александрович Бестужев-Марлинский
Что такое ReAct [6]
Практический пример: минимальный ИИ-агент-помощник [8]
Инструменты агента [10]
Цикл работы [12]
Пример диалога [13]
Заключение [14]
RAG хорошо решает проблему доступа к актуальной информации, но сам по себе является лишь механизмом подстановки контекста перед генерацией ответа. В базовом варианте он не контролирует процесс: не планирует, не проверяет себя и не делает повторных попыток. Если поиск вернул нерелевантные фрагменты, модель просто сгенерирует ответ на основе того, что получила.
В реальных сценариях запросы часто многошаговые: нужно собрать данные из разных источников, сравнить, переформулировать вопрос, проверить промежуточные выводы.
В такой ситуации нужен не просто доступ к базе знаний, а управляемый процесс — система, которая выбирает стратегию и действует до тех пор, пока не достигает цели. Здесь и появляется агентный подход.
Согласно официальной документации Google Cloud [15], ИИ-агент (AI agent) — это система, которая использует ИИ для достижения поставленных целей и выполнения задач от имени пользователя. Он анализирует задачу, формирует план, выбирает инструменты и выполняет последовательность шагов до достижения результата.
Агент может обращаться к внешним сервисам и выполнять операции: запускать код, изменять файлы, делать запросы к API или взаимодействовать с базами данных. То есть он влияет на окружение, а не только описывает решения текстом.
Еще одна важная особенность — это самокоррекция. Если агент видит, что информации недостаточно или результат некорректен, он может уточнить запрос, повторить поиск, пересчитать данные и только после этого сформировать итоговый ответ.
Во многих реализациях он сам предлагает следующие шаги и может выполнять их автоматически или с подтверждением пользователя для критичных действий.
Благодаря этому агент подходит для задач, которые не укладываются в один шаг генерации текста: анализ больших массивов документов, автоматизированная работа с кодом или создание презентаций.
Чтобы агент работал как автономная система, ему нужны несколько ключевых элементов.
В центре остаётся LLM. На каждом шаге она пишет инструкции и промежуточные выводы, формирует запросы к инструментам, генерирует или редактирует текст и код.
Для взаимодействия со средой он использует инструменты. Это могут быть уже упомянутые поиск в базе знаний, запрос к API, выполнение кода и любые другие.
Далее появляется память [16]. Краткосрочная хранит текущий контекст и промежуточные результаты, чтобы агент не забывал, что делал на прошлом шаге. Долгосрочная — это, например, векторные базы или корпоративные знания, которые позволяют накапливать полезную информацию и использовать ее в будущем.
Так как задачи бывают многоэтапные, нужен планировщик. Он разбивает большую задачу на шаги, выбирает инструменты и следит за тем, чтобы агент не зациклился и довел процесс до результата.
Еще один важный компонент — это контроль ошибок. Агент оценивает свои результаты, ищет несогласованности, сверяет с фактами и делает повторные попытки, если что-то пошло не так. И, наконец, окружение: все, с чем агент может взаимодействовать.
Один из ранних и практичных паттернов агентного поведения [17] для LLM — это паттерн ReAct [18]. Его идея проста: модель действует согласно определенному набору шагов.
Сначала она рассуждает, что нужно сделать, затем выполняет действие (через инструменты), получает результат и только после этого выбирает следующий шаг. В терминах цикла это думать (reason), действовать (act), наблюдать (observe).
Преимущество ReAct в том, что процесс становится более прозрачным: мы видим цепочку шагов и действий агента (план, вызовы инструментов, результаты) и можем контролировать ход работы. Это один из базовых паттернов, на котором строятся многие современные агенты.
Когда один агент уже умеет планировать и действовать, следующий шаг состоит в том, чтобы разделить работу между несколькими специализированными агентами. Мультиагентная система (MAS, Multi-Agent System) — это система из нескольких агентов, которые координируют действия и совместно решают одну задачу. Идея похожа на команду: вместо одного универсального исполнителя есть несколько ролей (например, планировщик, исследователь, исполнитель и валидатор), а результаты собираются в общий ответ.
Почему это бывает полезно? Во-первых, появляется параллелизм: разные агенты могут одновременно выполнять подзадачи. Во-вторых, повышается качество: агенты могут взаимно проверять результаты, что снижает риск ошибок. В-третьих, становится проще масштабировать сложные сценарии со множеством инструментов, источников данных и промежуточных шагов.
Обычно мультиагентность реализуют через агента-координатора (или «оркестратор»), который разбивает цель на подзадачи, назначает их другим агентам и собирает итоговый результат. В более простом варианте это может быть «конвейер ролей», а в более продвинутом динамическая схема, в которой агенты могут повторно обращаться друг к другу.
Однако с ростом числа агентов усложняется координация, возрастают шансы появления противоречий между результатами, растут затраты (больше шагов — больше токенов и времени), а также повышаются требования к безопасности: если агенты используют внешние источники и инструменты, нужно защищаться от ошибок и вредных инструкций внутри данных.
Крупные компании внедряют агентов в продукты, которыми каждый день пользуются миллионы людей. Например, в 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
Нажмите здесь для печати.