Паттерны мультиагентных систем | Курс LangChain Agents урок 10
Цель урока: понять когда один агент перестаёт справляться, изучить пять архитектурных паттернов и выбрать подходящий для конкретной задачи.
Теория
Когда один агент не справляется
Один агент с набором инструментов покрывает большинство задач. Мультиагентность нужна в трёх конкретных случаях:
Управление контекстом. Если агент работает с несколькими специализированными областями, каждая из которых требует большого контекста (документации, памяти, промптов), контекстное окно быстро переполняется. Разделение на специализированных агентов позволяет каждому видеть только нужную ему часть.
Раздельная разработка. Несколько команд развивают систему параллельно. Каждая команда отвечает за своего агента, не затрагивая работу других.
Параллельное выполнение. Задачи, которые можно решать одновременно: исследовать три темы за время одного запроса, а не трёх последовательных.
Пять паттернов
Subagents
Главный агент координирует специализированных как инструменты. Всё управление проходит через него: он решает когда и какого субагента вызвать, собирает результаты.
Пользователь → Главный агент → субагент A
→ субагент B (параллельно)
→ субагент C (параллельно)
← результат
Субагенты stateless: каждый вызов начинается с чистого контекста. Это даёт изоляцию, но означает повторный overhead при каждом обращении.
Когда подходит: параллельное выполнение независимых задач, изоляция контекста между доменами, раздельная разработка командами.
Handoffs
Агенты передают управление друг другу через вызов инструментов. Каждый агент может ответить пользователю напрямую или передать управление другому.
Пользователь ↔ Агент A → (handoff) → Агент B ↔ Пользователь
Паттерн stateful: агент, получивший управление, остаётся активным. При следующем обращении пользователя по той же теме дополнительный вызов на маршрутизацию не нужен.
Когда подходит: мультиходовые диалоги с пользователем, задачи где агент должен разговаривать напрямую (поддержка, onboarding).
Skills
Один агент загружает специализированный контекст (промпты, знания) по требованию. Агент остаётся один, но динамически меняет свои возможности.
Пользователь ↔ Агент → загружает skill "SQL" → работает как эксперт в SQL
→ загружает skill "Python" → работает как эксперт в Python
Контекст накапливается: после загрузки нескольких скилов агент несёт весь их объём. При повторных обращениях скил уже загружен и дополнительных вызовов не нужно.
Когда подходит: один агент с переключаемой специализацией, простые сфокусированные задачи, когда не нужна полная изоляция контекста.
Router
Роутер классифицирует входящий запрос и направляет его в нужный специализированный агент. Результаты собираются и возвращаются пользователю.
Пользователь → Роутер → агент A
→ агент B (параллельно)
← объединённый результат
Роутер stateless: каждый запрос проходит через классификацию заново. Эффективен при параллельном выполнении нескольких независимых агентов.
Когда подходит: однократные запросы к нескольким доменам, параллельное выполнение, когда не нужна история диалога между агентами.
Custom workflow
Произвольный граф на LangGraph: детерминированная логика чередуется с агентными узлами. Другие паттерны встраиваются как узлы графа.
Когда подходит: сложные pipeline с условиями, проверками и разными ветками выполнения, где нет готового паттерна.
Сравнение паттернов
Таблица по возможностям:
| Паттерн | Раздельная разработка | Параллельность | Multi-hop | Прямой диалог |
|---|---|---|---|---|
| Subagents | +++++ | +++++ | +++++ | + |
| Handoffs | - | - | +++++ | +++++ |
| Skills | +++++ | +++ | +++++ | +++++ |
| Router | +++ | +++++ | - | +++ |
Производительность на трёх сценариях:
| Паттерн | Один запрос | Повторный запрос | Несколько доменов |
|---|---|---|---|
| Subagents | 4 вызова | 8 (4+4) | 5 вызовов, 9K токенов |
| Handoffs | 3 вызова | 5 (3+2) | 7+ вызовов, 14K+ токенов |
| Skills | 3 вызова | 5 (3+2) | 3 вызова, 15K токенов |
| Router | 3 вызова | 6 (3+3) | 5 вызовов, 9K токенов |
Ключевые выводы из таблицы:
- Handoffs и Skills экономят 40-50% вызовов на повторных запросах: контекст уже загружен
- Subagents и Router лучше при работе с несколькими доменами за счёт параллельности
- Skills дешевле по вызовам, но дороже по токенам при множестве доменов
- Handoffs неэффективен для задач с несколькими доменами: выполнение только последовательное
Антипаттерны
Мультиагентность ради мультиагентности. Если задачу решает один агент с правильными инструментами и промптом, не усложняйте. Каждый дополнительный агент добавляет latency, токены и точку отказа.
Слишком много субагентов. Главный агент с десятью субагентами не знает кого выбрать, принимает плохие решения. Ограничивайте до 3-5 специализаций.
Handoffs для batch задач. Handoffs создан для диалога с пользователем. Для параллельной обработки независимых задач используйте Subagents или Router.
Сквозной проект: выбор паттерна для агента-аналитика
Агент-аналитик из предыдущих уроков в финальном варианте должен:
- искать информацию по теме
- анализировать найденные документы
- составлять отчёт
Разберём какой паттерн подходит.
Subagents, главный агент координирует трёх специализированных: поисковика, аналитика документов, редактора отчётов. Они работают с изолированным контекстом и могут запускаться параллельно для разных аспектов темы.
Handoffs не подходит для этой задачи, нет необходимости в прямом диалоге субагентов с пользователем, и задача лучше параллелизуется.
Skills подходит для более простого варианта, один агент загружает скил "поиск" или "анализ" по мере необходимости. Меньше overhead, но нет параллельности.
Вывод: для полноценного агента-аналитика подходит паттерн Subagents, параллельное выполнение трёх специализаций при изоляции контекста каждой. В следующем уроке реализуем именно этот паттерн.
Демонстрация минимального Router для знакомства с синтаксисом:
import os
from dotenv import load_dotenv
from langchain.agents import create_agent
from langchain.tools import tool
from langchain_openai import ChatOpenAI
load_dotenv()
model = ChatOpenAI(model=os.getenv("MODEL_NAME", "gpt-4o-mini"))
# Специализированный агент для вопросов по Python
python_agent = create_agent(
model=model,
tools=[],
system_prompt="Ты эксперт по Python. Отвечай коротко и по делу.",
)
# Специализированный агент для общих вопросов
general_agent = create_agent(
model=model,
tools=[],
system_prompt="Ты универсальный помощник.",
)
# Роутер: классифицирует запрос и выбирает агента
@tool
def route_to_python(question: str) -> str:
"""Направить вопрос о Python к специализированному агенту."""
result = python_agent.invoke({
"messages": [{"role": "user", "content": question}]
})
return result["messages"][-1].content
@tool
def route_to_general(question: str) -> str:
"""Направить общий вопрос к универсальному агенту."""
result = general_agent.invoke({
"messages": [{"role": "user", "content": question}]
})
return result["messages"][-1].content
router = create_agent(
model=model,
tools=[route_to_python, route_to_general],
system_prompt=(
"Ты роутер. Для вопросов о Python используй route_to_python. "
"Для остальных вопросов используй route_to_general."
),
)
response = router.invoke({
"messages": [{"role": "user", "content": "Что такое list comprehension в Python?"}]
})
print(response["messages"][-1].content[:120])
Задание
Изучите три задачи ниже. Для каждой выберите паттерн и обоснуйте выбор, опираясь на таблицу из урока:
-
Чат-бот поддержки: принимает обращения пользователей, переключается между специалистами по продукту, биллингу и техническим вопросам
-
Отчётная система: каждую ночь собирает данные из трёх источников, объединяет в один отчёт
-
Ассистент разработчика: знает Python, SQL и архитектурные паттерны, помогает в многоходовых диалогах по одной задаче
Подписывайтесь на мой Telegram канал
Если вам нужен ментор и вы хотите научиться разрабатывать AI агентов, пишите, обсудим условия
Авторизуйтесь, чтобы оставить комментарий.
Нет комментариев.
Тут может быть ваша реклама
Пишите info@aisferaic.ru