1. Архитектура мультиагентных LLM-систем: от простых цепочек к автономным графам
Архитектура мультиагентных LLM-систем: от простых цепочек к автономным графам
В 2023 году типичный ИИ-пайплайн обработки корпоративных документов выглядел как строгий конвейер: извлечь текст из PDF, передать в LLM для суммаризации, извлечь сущности, сохранить в базу данных. Если на этапе OCR происходил сбой и вместо текста извлекался мусор, вся цепочка продолжала послушно работать, генерируя галлюцинации на основе битых данных. Проблема заключалась не в качестве LLM, а в архитектуре: линейные направленные ациклические графы (DAG) лишены механизмов рефлексии, обратной связи и права на ошибку. Переход к автономным графам и мультиагентным системам (MAS) — это отказ от парадигмы «выполни шаг и передай дальше» в пользу парадигмы «оцени состояние, выбери инструмент, проверь результат и при необходимости повтори».
Пределы детерминизма и математика ошибок
Простые цепочки (chains), популяризированные ранними версиями LangChain, строятся на жестко заданном потоке управления. Архитектурно это конвейер функций, где выход узла является входом для узла . Главный архитектурный изъян такого подхода — мультипликативное накопление ошибок.
Если пайплайн состоит из независимых шагов, общая вероятность успешного завершения задачи вычисляется как произведение вероятностей успеха каждого узла:
Где — вероятность корректной отработки -го узла. Если архитектура состоит из пяти последовательных LLM-вызовов (например: классификация, извлечение параметров, формирование SQL-запроса, генерация ответа, форматирование), и каждый вызов надежен на , общая надежность системы составит . Почти четверть всех запросов в продакшене будет завершаться некорректно.
В линейной архитектуре единственный способ повысить — бесконечно улучшать промпты и использовать более мощные (и дорогие) модели для повышения каждого . В графовой архитектуре проблема решается иначе: введением циклов (loops) и узлов-валидаторов, которые не пропускают ошибку дальше, а возвращают процесс на предыдущий шаг для исправления.
!Эволюция архитектуры: от линейной цепи к мультиагентному графу
Анатомия перехода: от ReAct к графам
Первой попыткой разорвать линейность стал паттерн ReAct (Reason + Act). В этой архитектуре LLM работает как единый оркестратор в бесконечном цикле (while loop), пока не решит, что задача выполнена. Агент получает доступ к инструментам (tools), формирует мысль (Thought), выбирает действие (Action), получает наблюдение (Observation) и снова формирует мысль.
Несмотря на кажущуюся автономность, одиночный ReAct-агент быстро деградирует в сложных корпоративных задачах. Причины кроются в ограничениях контекстного окна и внимания (attention mechanism) трансформеров:
Мультиагентные системы решают эту проблему через сепарацию контекста и специализацию. Вместо одного «суперагента» создается граф, где каждый узел — это отдельный агент (или детерминированная функция) со своим узким системным промптом, своим набором инструментов и, что критически важно, своим изолированным контекстом, в который передается только выжимка из предыдущих шагов.
Базовые топологии мультиагентных систем
Проектирование MAS в фреймворках вроде LangGraph сводится к выбору правильной топологии графа. Архитектура определяет, как агенты общаются друг с другом и кто принимает решение о переходе состояния.
1. Иерархическая топология (Supervisor)
В этой топологии существует выделенный узел-маршрутизатор (Supervisor), который не выполняет полезную работу сам, а только анализирует текущее состояние и решает, какому узлу-исполнителю (Worker) передать управление.
Механика: Пользовательский запрос поступает к Супервизору. Супервизор вызывает агента «Аналитик БД». Аналитик выполняет SQL-запрос, возвращает результат Супервизору. Супервизор анализирует результат и передает его агенту «Генератор отчета».
Плюсы:
Минусы:
2. Сетевая топология (Peer-to-Peer / Network)
Агенты общаются друг с другом напрямую. Любой узел может передать управление любому другому узлу на основе своей внутренней логики.
Механика: Агент «Кодер» пишет скрипт и напрямую передает его агенту «Тестировщик». Если тесты падают, «Тестировщик» отправляет ошибку обратно «Кодеру». Если тесты проходят, «Тестировщик» передает код агенту «Деплой».
Плюсы:
Минусы:
!Сравнение топологий Supervisor и Network
3. Паттерн «Исполнитель-Критик» (Worker-Evaluator)
Это не самостоятельная топология, а архитектурный микропаттерн, который является стандартом де-факто для production-систем, работающих с RAG (Retrieval-Augmented Generation).
Вместо того чтобы доверять ответу агента, генерирующего текст на основе данных из pgvector, в граф встраивается узел-критик.
Рабочий узел (Worker) имеет системный промпт, нацеленный на полноту ответа.
Узел-критик (Evaluator) имеет промпт, нацеленный исключительно на поиск галлюцинаций и проверку фактологии. Он не имеет права генерировать новый контент, его выход — это структурированный JSON с полями is_valid (boolean) и feedback (string).
Если is_valid == false, граф по условному ребру (conditional edge) возвращает состояние обратно к Worker, прикрепляя feedback. Этот цикл повторяется до достижения лимита итераций или получения валидного ответа.
Граф как конечный автомат: Управление состоянием
Главное отличие LangGraph от ранних цепочек LangChain — это концепция глобального состояния (State). Граф в MAS — это конечный автомат (State Machine). При каждом переходе от узла к узлу передаются не просто строки текста, а структурированный объект состояния.
В архитектуре MAS состояние выполняет роль общей памяти. Каждый узел получает копию текущего состояния, выполняет свою работу и возвращает обновление (update) для этого состояния. То, как эти обновления применяются, определяется редьюсерами (reducers).
В этом примере ключ messages использует редьюсер operator.add. Это значит, что когда узел возвращает новое сообщение, оно добавляется к существующему списку (Append-only log). Это критически важно для сохранения истории диалога.
А вот ключи current_task или validation_score не имеют редьюсера add. Когда узел возвращает новое значение для этих ключей, оно перезаписывает старое (Overwrite).
!Пошаговое обновление глобального состояния при обходе графа
Понимание того, какие данные нужно накапливать, а какие — перезаписывать, является основой проектирования MAS. Если накапливать в messages сырые результаты поиска из Qdrant на каждой итерации цикла Worker-Evaluator, контекстное окно переполнится за 3-4 шага. Правильный архитектурный подход: хранить извлеченные документы в перезаписываемом ключе retrieved_docs, а в messages передавать только финальные выводы агента.
Пограничные случаи и архитектурные ловушки
Проектирование автономных графов требует мышления в стиле "что может пойти не так". Предоставленные сами себе, LLM-агенты склонны к специфическим сбоям.
Дрейф цели (Agent Drift)
В глубоких графах с множеством циклов агенты могут «забыть», зачем их вообще вызвали. Сценарий: Пользователь просит найти и проанализировать договор аренды. Агент поиска находит договор, но замечает там упоминание штрафов за экологические нарушения. Он передает это юристу-агенту. Юрист-агент увлекается экологическим правом, запрашивает дополнительные законы из базы и в итоге выдает пользователю блестящий меморандум об экологии, полностью проигнорировав изначальный запрос об аренде. Архитектурное решение: Введение иммутабельного ключаoriginal_user_prompt в глобальное состояние графа. На каждом узле-валидаторе (или перед финальным ответом) система принудительно сверяет текущий результат с original_user_prompt, а не только с локальной задачей предыдущего шага.Бесконечные циклы и деградация контекста
В паттерне Worker-Evaluator критик может придираться к мелочам, заставляя Worker переписывать ответ. С каждой итерацией вmessages добавляется критика и новый ответ. На 5-й итерации контекст становится настолько огромным, что Worker начинает путаться в собственных предыдущих попытках и генерирует бессмыслицу.
Архитектурное решение:
messages неудачные попытки, оставляя только изначальный запрос, последнюю критику и текущую задачу.Проблема "Слепого делегирования"
В топологии Supervisor маршрутизатор может выбрать правильного агента, но передать ему пустой или нерелевантный контекст. LLM-роутеры часто выдают только имя следующего узла, забывая синтезировать для него задачу. Архитектурное решение: Роутер должен возвращать не просто строку с именем следующего узла, а структурированный объект (Pydantic модель), содержащийnext_node и task_context. Этот task_context записывается в глобальное состояние и становится системным промптом для выбранного Worker-а.Переход от простых цепочек к графам — это переход от программирования счастливого пути (happy path) к инженерии устойчивости. Архитектура MAS строится не на вере в то, что LLM сгенерирует идеальный ответ с первого раза, а на уверенности в том, что система сможет распознать ошибку, изолировать ее и исправить в рамках контролируемого циклического процесса, не исчерпав при этом вычислительные ресурсы и контекстное окно.