Теория создания ИИ-агентов с помощью LangGraph

Курс охватывает фундаментальные основы разработки умных ИИ-агентов с использованием фреймворка LangGraph. Вы изучите архитектуру графов состояний [habr.com](https://habr.com/ru/companies/amvera/articles/933460/), паттерн ReAct [habr.com](https://habr.com/ru/companies/sberbank/articles/934938), работу с памятью, инструментами [braintools.ru](https://www.braintools.ru/article/20012) и продвинутые концепции, такие как персистентность и Human-in-the-loop [itinai.ru](https://itinai.ru/%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B-%D0%BD%D0%B0-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5-%D0%B0%D0%B3%D0%B5%D0%BD%D1%82%D0%BE%D0%B2-%D0%B8%D0%B8/?cst=&query-24-page=8).

1. Введение в LangGraph: архитектура, графы, узлы и состояния

Введение в LangGraph: архитектура, графы, узлы и состояния

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

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

> LangGraph — это фреймворк, предназначенный для разработки сложных AI-агентов на базе больших языковых моделей (LLM). В отличие от последовательных цепочек, LangGraph позволяет определять циклические и многошаговые рабочие процессы. > > External Software

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

Архитектура на основе графов

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

В теории графов направленный граф описывается следующей формулой:

Где — это сам граф (наш ИИ-агент), — множество вершин или узлов (шаги выполнения), а — множество направленных рёбер (пути перехода между узлами). Направленность означает, что процесс движется строго по заданным стрелкам, но эти стрелки могут образовывать замкнутые циклы.

Представим агента-исследователя, который ищет информацию о компаниях. Его граф может состоять из узлов (Старт, Анализ, Поиск в сети, Формирование отчета) и возможных рёбер. Если на этапе «Анализ» агент понимает, что нашел только 2 факта из требуемых 10, он по ребру возвращается в узел «Поиск в сети». Этот цикл может повториться 3-4 раза, пока не будет собрано достаточно данных.

Состояние: общая память агента

Чтобы узлы могли обмениваться информацией и понимать контекст происходящего, им нужна общая память. В LangGraph эта концепция называется состоянием (State). Состояние — это структура данных, которая передается от узла к узлу на протяжении всего жизненного цикла графа.

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

Где — это новое состояние графа на следующем шаге, — текущее состояние, — порция новых данных, сгенерированная узлом, а — операция объединения.

В программировании на Python состояние часто описывается с помощью типизированных словарей (TypedDict). Это позволяет четко задать, какие именно данные должен хранить агент.

Допустим, исходное состояние содержит массив из 5 сообщений. Узел поиска находит новую статью и генерирует обновление в виде 1 нового сообщения. После объединения новое состояние будет содержать уже 6 сообщений, при этом старый контекст не потеряется.

Узлы: исполнители задач

Узлы (Nodes) — это рабочие лошадки нашего графа. Каждый узел представляет собой конкретную функцию на Python или JavaScript, которая принимает текущее состояние, выполняет какую-либо полезную работу и возвращает обновление для этого состояния.

В архитектуре ИИ-агентов принято выделять несколько основных типов узлов, каждый из которых несет свою зону ответственности.

| Тип узла | Основная функция | Пример использования в реальной задаче | |---|---|---| | Узел LLM | Принятие решений, анализ текста и генерация ответов | Изучение запроса пользователя и выбор нужного инструмента | | Узел инструмента | Взаимодействие с внешним миром и API | Выполнение SQL-запроса к базе данных или парсинг веб-страницы | | Узел обработки | Трансформация данных и служебная логика | Конвертация полученного JSON-файла в читаемый текстовый формат |

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

Рёбра: маршрутизация и логика

Если узлы выполняют работу, то рёбра (Edges) определяют, в каком порядке эта работа будет выполняться. Рёбра связывают узлы между собой и управляют потоком выполнения графа.

В LangGraph существует два основных типа рёбер: * Безусловные рёбра: жестко заданные пути. Если узел А завершил работу, процесс всегда и со 100% вероятностью переходит к узлу Б. * Условные рёбра: динамические пути. Переход зависит от текущего состояния графа и логики, прописанной в специальной функции-маршрутизаторе.

Условные рёбра — это то, что делает агента по-настоящему умным. Маршрутизатор анализирует состояние и принимает решение на основе заданных пороговых значений.

Например, агент оценивает релевантность найденного документа. Если уверенность модели , где — вероятность того, что документ содержит точный ответ, а — порог в 85%, условное ребро направит процесс к узлу «Формирование ответа». Если же , ребро вернет агента обратно в узел «Поиск в сети» для уточнения запроса.

Паттерн ReAct в графовой логике

Все эти компоненты — графы, состояния, узлы и рёбра — идеально подходят для реализации популярного архитектурного паттерна ReAct (Reasoning and Acting). Этот паттерн заставляет агента чередовать этапы размышления и выполнения действий.

  • Пользователь отправляет запрос, который попадает в начальное состояние.
  • Узел LLM анализирует состояние и решает, нужно ли использовать инструмент (Размышление).
  • Условное ребро направляет процесс либо к узлу инструмента, либо к завершению.
  • Узел инструмента выполняет запрос к API (Действие) и записывает результат в состояние (Наблюдение).
  • Безусловное ребро возвращает процесс обратно к узлу LLM для оценки новых данных.
  • При использовании паттерна ReAct для анализа финансового отчета на 100 страниц, агент может совершить 15 циклов между узлом LLM и узлом чтения PDF, последовательно извлекая данные о выручке, расходах и налогах, прежде чем сформирует итоговый ответ из 500 слов.

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