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). Этот паттерн заставляет агента чередовать этапы размышления и выполнения действий.
При использовании паттерна ReAct для анализа финансового отчета на 100 страниц, агент может совершить 15 циклов между узлом LLM и узлом чтения PDF, последовательно извлекая данные о выручке, расходах и налогах, прежде чем сформирует итоговый ответ из 500 слов.
Понимание того, как узлы обмениваются состоянием через рёбра, является ключом к созданию надежных ИИ-агентов. В следующих статьях мы углубимся в практические аспекты работы с памятью и контекстом.