ИИ-агенты 12.11.2025 2,763 просмотров

LangGraph: создание многошаговых агентов с памятью на Python

#LangGraph #LangChain #Python #память #агент #автоматизация
Статья на тему: LangGraph: создание многошаговых агентов с памятью на Python

Введение

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

Здесь на сцену выходит LangGraph — специализированное расширение экосистемы LangChain, созданное на языке Python. Оно позволяет описать логику работы агента не как прямую линию, а как граф (циклическую диаграмму). Если вы хотите, чтобы ваш ИИ-помощник мог искать информацию, анализировать её, понимать, что данных не хватает, и делать повторный запрос — вам нужен LangGraph. В этой статье мы разберем, как устроен этот инструмент, как в нем реализована память, и почему он стал стандартом де-факто для автоматизации сложных бизнес-запроцессов.

От цепочек к графам: почему LangGraph?

Представьте, что вы создаете агента для написания кода. Линейный агент получит задачу, напишет код и выдаст результат. А что, если в коде ошибка? Линейный агент об этом не узнает. В парадигме графов (cyclic graphs) мы можем создать цикличный процесс:

  • Узел 1: Генерация кода.
  • Узел 2: Запуск тестов.
  • Условие: Если тесты пройдены — идём в Узел 3 (Финал). Если тесты упали — идём обратно в Узел 1 с логом ошибки.

Именно эту логику реализует LangGraph. Он строится на понятиях узлов (Nodes) и рёбер (Edges). Узлы — это функции на Python, которые выполняют полезную работу (вызывают LLM, обращаются к API, исполняют код). Рёбра определяют, куда процесс пойдет дальше, в том числе с использованием условной логики (Conditional Edges), которая позволяет LLM самой решать, закончена ли работа или требуется еще один цикл.

Управление состоянием (State) и память

Главная магия LangGraph кроется в том, как он управляет состоянием агента. В основе графа лежит объект State — обычно это TypedDict в Python, который содержит все переменные, нужные для работы графа. Это могут быть: список сообщений чата (сохраняющий историю общения), промежуточные переменные, скачанные файлы или логи ошибок.

Каждый узел в графе принимает это состояние, изменяет его (например, добавляет новое сообщение от AI в список) и передает дальше. Благодаря механизму редьюсеров (reducers), LangGraph знает, как правильно склеивать старое состояние с новым.

Но что делает LangGraph по-настоящему мощным — это его встроенная система памяти (Persistence/Checkpointer). Работая с LangGraph, вы можете сохранять состояние графа на диск или в базу данных (например, PostgreSQL или SQLite) после каждого шага. Это дает два критически важных преимущества:

1. Долгосрочная память (Long-term Memory): Вы можете остановить графового агента, выключить сервер, а через неделю запустить его снова, передав thread_id (идентификатор сессии). Агент загрузит из базы данных всё состояние и продолжит работу с того места, где остановился, помня весь контекст общения с пользователем.

2. Human-in-the-Loop (Вмешательство человека): Поскольку состояние сохраняется на каждом шаге, вы можете настроить граф так, чтобы он ставил паузу перед важным действием (например, перед отправкой email клиенту или перед списанием средств). Состояние замрется. Человек проверит логику агента, и при необходимости вручную поправит данные в объекте State, после чего даст команду на продолжение (resume). Это кардинально повышает безопасность ИИ-автоматизации в продакшене.

Архитектура многошагового агента: как это работает на Python?

Давайте разберем типичную архитектуру агента-исследователя на базе LangGraph. Написание такого агента на Python включает несколько основных шагов:

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

Затем вы определяете узлы (Nodes). Первый узел — это вызов LLM (например, OpenAI GPT-4o). Модель получает список сообщений и доступные ей инструменты (tools). Если модель решает, что ответить напрямую нельзя и нужно поискать в интернете, она генерирует вызов инструмента (ToolCall). Второй узел — это исполнитель инструментов (ToolNode), функция Питон, которая делает запрос в Google или читает Wikipedia, и возвращает результат.

Самое интересное происходит на этапе маршрутизации (Routing). Создается условное ребро от узла LLM. Если LLM выдала финальный текстовый ответ — маршрутизатор направляет граф в конец (узел END). Если модель выдала запрос на вызов инструмента — граф идет в ToolNode. А после ToolNode стрелка графа всегда возвращается обратно к LLM! Модель получает результат поиска, анализирует его и решает: ответить пользователю или вызвать инструмент ещё раз? Это порождает бесконечный цикл (цикл агента), который прерывается только тогда, когда задача полностью выполнена.

Интеграция с n8n и внешний мир

Хотя LangGraph пишется на Python, агенты на его основе не должны жить в вакууме. Сегодня стандартом автоматизации является связка Python-агентов с low-code платформами уровня n8n.

Вы можете обернуть вашего LangGraph-агента в простой FastAPI сервер. n8n будет принимать триггеры (например, новое письмо в Gmail или заявка в CRM), распаковывать данные и отправлять их по API в вашего Python-агента. Агент, обладая памятью и способностью искать информацию, будет анализировать ситуацию, принимать решения и возвращать ответ в n8n, который, в свою очередь, уже обновит статус в CRM или отправит клиенту уведомление в Telegram.

Заключение

LangGraph изменил правила игры в разработке искусственного интеллекта. Переход от линейного программирования промптов к циклическим графам состояний с долговременной памятью — это то, что отличает игрушечных чат-ботов от настоящих ИИ-агентов уровня Enterprise. Использование Python делает этот фреймворк доступным для огромного числа разработчиков, а встроенные механизмы сохранения состояния (checkpointers) решают главную боль — потерю контекста.

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

Полезные материалы по теме