SkillBambooМеню

Статьи · 8 октября 2026 г.

Как создать ИИ-агента на Python: цикл, инструменты, память

Как создать ИИ-агента на Python: цикл, инструменты, память

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

Дмитрий

Вы попробовали LangChain, собрали ИИ-агента на Python по примеру – и он заработал, но непонятно почему. Стоит поменять одну деталь, и он то зависает, то отвечает пустой строкой. Где искать причину, за слоями абстракций не видно.

Разберемся, как создать ИИ-агента без фреймворков: из каких частей он состоит – инструменты, цикл, память и контекст – и где на каждой из них чаще всего ошибаются. На выходе – схема из четырёх частей, порядок сборки и список ограничений, которые стоит заложить сразу.

Что такое ИИ-агент и почему модель сама ничего не делает

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

Function calling – OpenAI API docs – как модель запрашивает вызов функций у приложения

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

Using the Messages API – Claude Docs – API без состояния и передача истории диалога

Отсюда рабочее определение, которым пользуются многие разработчики: агент – это LLM, которая работает в цикле и использует инструменты. Всё, что превращает модель в агента, – обычный код вокруг неё. Его называют обвязкой: она решает, что модель увидит, какие действия ей доступны и когда остановиться.

I think “agent” may finally have a widely enough agreed upon definition – определение агента: инструменты в цикле ради цели

В этом и главный довод за сборку без фреймворка. Цикл и вызов функций занимают немного кода. А понимание того, что модель получает на каждом шаге, пригодится при отладке любого агента – своего или чужого.

Шпаргалка: порядок сборки агента, опорные числа и выбор между MCP и своими функциями.
Шпаргалка: порядок сборки агента, опорные числа и выбор между MCP и своими функциями.

Инструменты: функция, схема и описание

Инструмент складывается из трёх частей:

  • обычная функция на Python, которая делает работу: читает файл, обращается к API, считает;
  • схема в формате JSON Schema – имя, назначение и параметры;
  • словарь, который сопоставляет имя из схемы с функцией, чтобы код нашёл её, когда модель попросит.

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

Список инструментов уходит модели при каждом вызове вместе с историей. У разных провайдеров устройство одинаковое: например, в API GigaChat пользовательские функции передаются в запросе отдельным массивом functions с именем и описанием. Пишете агента под российскую модель – механика та же.

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

Из чего состоит инструмент агента: функция, схема и словарь.
Из чего состоит инструмент агента: функция, схема и словарь.

Как работает ИИ-агент: цикл – сердце всей конструкции

Схема простая: отправить модели историю и список инструментов, посмотреть на ответ. Если в ответе есть запросы на вызов инструментов – выполнить каждый, добавить в историю сам запрос и результат и снова вызвать модель. Если запросов нет, а есть текст, это финальный ответ, и цикл заканчивается.

Число оборотов заранее неизвестно. Простой вопрос решается за один шаг, сложная задача может потребовать 20 или 50 итераций. Поэтому цикл строят на while, а не на фиксированном числе вызовов.

Один вызов инструмента вместо цикла

Частая ошибка новичков – выполнить один вызов инструмента и сразу запросить финальный ответ. Если модели нужен был ещё один шаг, ответ окажется пустым: вместо текста в нём лежит очередной запрос на инструмент, который никто не выполнил.

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

Второе обязательное дополнение – обработка ошибок. Упал инструмент – программа падать вместе с ним не должна. Ошибку превращают в обычный результат и возвращают модели, а в системном промпте просят в таком случае объяснить причину и предложить другой путь. Так агент может сам обойти проблему: попробовать другой инструмент или переспросить.

Цикл агента на Python: выход, лимит итераций и обработка ошибок.
Цикл агента на Python: выход, лимит итераций и обработка ошибок.

Память: от списка сообщений до файла и векторной базы

Память агента – не отдельная магия, а то, что вы решаете показать модели. Её удобно разложить на три уровня.

Уровень Как устроен Что даёт Ограничение
История сессии Список сообщений, который передаётся при каждом вызове Агент помнит разговор в рамках запуска После перезапуска программы всё забыто
Файл памяти Инструмент сохранения в файл; при старте содержимое подставляется в системный промпт Агент помнит факты между запусками Весь файл каждый раз занимает контекст
RAG и векторная база Нужные записи ищутся и подгружаются по запросу Подходит для больших объёмов Сложнее в реализации

Первый уровень у вас уже есть – та самая история сообщений. Но живёт она только в памяти программы: закрыли и открыли снова – и агент уже не помнит, как зовут пользователя.

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

На большом объёме записей этот подход перестаёт работать – файл разрастается и съедает контекст. Тогда переходят к RAG и векторным базам, где в контекст попадают только записи, подходящие к текущему запросу.

Контекст – главный ограниченный ресурс агента

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

Когда контекст переполняется сверх определённого предела, агент начинает работать хуже – и непредсказуемо. Он может забыть условие задачи, перепутать шаги или начать повторяться. Поэтому многие разработчики относятся к управлению контекстом как к полноценной задаче программирования, а не к подбору формулировок.

Каждый токен в контексте – ваше решение

Модель видит только то, что вы ей передали. Если агент «поглупел» в длинной сессии, первым делом посмотрите, что лежит в истории и сколько места занимают результаты инструментов.

Перечислим основные приёмы:

  • Обрезка истории. Оставлять системный промпт и последние сообщения, а старые отбрасывать. Грубо, но надёжно.
  • Субагенты. Технически это отдельный массив контекста и ещё один вызов модели. Шумную подзадачу отдают субагенту, а в основной контекст возвращают только итог.
  • Меньше инструментов. Описания тоже расходуют токены, поэтому ориентир не больше 15–20 инструментов на агента работает и здесь.
Четыре частые ошибки при сборке агента и как их избежать.
Четыре частые ошибки при сборке агента и как их избежать.

MCP: подключать или писать инструменты самому

MCP – протокол, через который агент подключает инструменты с внешних серверов. Вокруг него два заметных взгляда.

MCP Свои функции
Откуда инструменты Подключаются с серверов и находятся во время работы Прописаны в коде агента
Сильная сторона Не нужно писать интеграцию для каждого готового сервиса Полный контроль над тем, что попадает в контекст
Слабая сторона Меньше контроля над архитектурой Каждую интеграцию пишете сами

Сторонники MCP ценят то, что инструменты не нужно «хардкодить» – жёстко прописывать в коде: агент подтягивает их с серверов и узнаёт о них прямо в работе. Противники считают, что в своём агенте MCP экономит лишь пару десятков строк, но отнимает возможность улучшать архитектуру – например, давать разным подзадачам разные наборы инструментов.

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

Что добавить перед реальным использованием

Учебный агент и агент, которому можно доверить работу, отличаются несколькими вещами. Главная – права. Инструменты с побочными эффектами, например отправку писем или удаление записей, запускают только после подтверждения человеком, а чтение и вычисления можно оставить автоматическими.

  • Цикл на while с выходом, когда модель вернула текст без вызовов инструментов
  • Лимит итераций, например 10 раундов, и понятное сообщение при его достижении
  • Ошибки инструментов возвращаются модели как результат, а не роняют программу
  • В системном промпте сказано, что делать при ошибке инструмента
  • Опасные операции – только после подтверждения человека
  • У каждого инструмента – точное описание, всего их не больше 15–20
  • История обрезается или шумные подзадачи уходят субагентам
Чек-лист: семь проверок агента перед реальной работой.
Чек-лист: семь проверок агента перед реальной работой.

Ключевые термины

  • Обвязка агента (harness) – Код вокруг языковой модели – цикл, инструменты, память, управление контекстом, – который превращает её в агента.
  • Схема инструмента – Описание функции в формате JSON Schema – имя, назначение и параметры, – по которому модель понимает, как её вызвать.
  • Агентный цикл – Повторяющийся шаг «вызвать модель → выполнить запрошенные инструменты → вернуть результат», который идёт, пока модель не даст финальный ответ.
  • Окно контекста – Ограниченное число токенов, которые модель видит за один вызов: история, описания инструментов и их результаты.
  • MCP (Model Context Protocol) – Открытый протокол, по которому агент подключает инструменты с внешних серверов и находит их во время работы.
  • Субагент – Отдельный вызов модели со своим массивом контекста, которому поручают подзадачу, чтобы не засорять основной контекст.

Итог

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

Проверьте себя

1. Агент сделал один вызов инструмента, после чего вы сразу запросили финальный ответ – и он оказался пустым. В чём наиболее вероятная причина?

  • А. Инструмент вернул слишком мало данных
  • Б. Модель сломалась и надо сменить провайдера
  • В. Модель хотела вызвать ещё один инструмент, а цикла, который это позволяет, нет
Показать ответ

Ответ: В. Без цикла агент не может сделать следующий шаг, и вместо текста в ответе остаётся невыполненный вызов.

2. Как агент понимает, что задача решена и из цикла пора выйти? (Верных ответов несколько.)

  • А. Прошло 5 секунд
  • Б. Достигнут заранее заданный лимит итераций
  • В. Модель вернула текст и не запросила ни одного инструмента
  • Г. Модель вызвала инструмент ровно один раз
Показать ответ

Ответ: Б, В. Б – Лимит – страховка от бесконечного цикла, даже если модель ещё хочет продолжать. В – Это естественный сигнал финального ответа.

3. Вы перезапустили программу, и агент забыл имя пользователя. Что поможет проще всего?

  • А. Увеличить температуру модели
  • Б. Дать агенту инструмент сохранения в файл и подставлять этот файл в системный промпт при старте
  • В. Ничего: модель должна помнить пользователя сама
Показать ответ

Ответ: Б. Это простейшая постоянная память: история между запусками сама не сохраняется, а файл – да.

4. Вы дали агенту 40 инструментов, и он стал чаще выбирать не тот. Что разумно сделать?

  • А. Добавить ещё инструментов на всякий случай
  • Б. Сократить набор до 15–20 инструментов или разделить на нескольких специализированных агентов
  • В. Убрать у инструментов описания, чтобы сэкономить токены
Показать ответ

Ответ: Б. Описания инструментов занимают контекст, а при большом выборе модель ошибается чаще.

5. Какому инструменту нужно подтверждение человека перед запуском? (Верных ответов несколько.)

  • А. Запрос погоды
  • Б. Отправка письма клиенту
  • В. Подсчёт выражения калькулятором
  • Г. Удаление записи в базе
Показать ответ

Ответ: Б, Г. Б – Запись во внешний мир – действие с последствиями, его подтверждают. Г – У операции есть необратимый побочный эффект.

Об авторе
Дмитрий

В разработке 5 лет, создаю мощные системы автоматизации разной сложности. Боты для всех мессенджеров, видеоредакторы и контентные пайплайны. В свободное время рассказываю о своем опыте.