Deep Agents: как LangChain переосмысливает архитектуру AI-агентов
Deep Agents: почему простые AI-агенты ломаются и как это исправить
Большие языковые модели научились вызывать инструменты, и казалось бы — вот рецепт автономного агента. Но на практике цикл «LLM решает → вызывает инструмент → получает результат» ломается, как только задача становится по-настоящему сложной. LangChain предложил решение — архитектурный паттерн Deep Agents.
Проблема: почему ReAct-агенты не масштабируются
Средний запуск агента Manus делает около 50 вызовов инструментов. Исследования METR показывают: длина задач, которые агент способен выполнить, удваивается каждые 7 месяцев.
На длинных траекториях возникают четыре проблемы:
- Agent drift — на 30-м шаге агент забывает, что должен был сделать на 5-м
- Context overflow — результаты поиска и промежуточные данные забивают контекстное окно
- Context clash — разные задачи конфликтуют друг с другом в одном пространстве рассуждений
- Непредсказуемость — инструкции слишком общие, и агент ведёт себя хаотично
Эволюция: от генерации текста к Deep Agents
1. Генерация текста → LLM генерирует текст (RAG, чат)
2. Структурированный вывод → LLM генерирует tool calls
3. ReAct-агенты → LLM → Tools → LLM → ... (3-10 шагов)
4. Deep Agents → LLM с планированием, файловой системой, субагентами (50-100+ шагов)
Deep Agents не отменяют ReAct, а надстраивают над ним четыре механизма для длинных дистанций.
Четыре принципа Deep Agents
1. Планирование через TODO-списки
Структурированный TODO-список в состоянии агента. Каждый элемент содержит описание задачи и статус (pending, in_progress, completed). Список полностью перезаписывается при каждом обновлении — это заставляет агента заново формулировать свои цели.
class Todo(TypedDict):
content: str
status: Literal["pending", "in_progress", "completed"]
class DeepAgentState(AgentState):
todos: NotRequired[list[Todo]]
Этот паттерн используют Claude Code (plan mode), Manus (TodoWrite) и Open Deep Research.
2. Контекстная выгрузка в файловую систему
Виртуальная файловая система — словарь в состоянии агента, доступный через инструменты ls, read_file, write_file. Полный контент сохраняется в файлы, а в контекст LLM возвращается только краткая сводка.
# Агент вызывает поиск
result = tavily_search("MCP protocol overview")
# Инструмент возвращает LLM только сводку:
# "Found 3 results. Files: mcp_overview.md, mcp_details.md"
# Полный контент — в файлах, доступных по запросу
Паттерн «ленивой загрузки»: данные подгружаются только тогда, когда действительно нужны. Это похоже на то, как ОС работает с диском и RAM.
3. Субагенты с изоляцией контекста
Супервизор делегирует задачи субагентам, каждый из которых работает в собственном изолированном контекстном окне. Субагент получает только описание задачи — без истории супервизора.
research_sub_agent = {
"name": "research-agent",
"description": "Research a specific topic",
"prompt": RESEARCHER_INSTRUCTIONS,
"tools": ["tavily_search", "think_tool"],
}
task("Research topic A", "research-agent") # изолированный контекст
task("Research topic B", "research-agent") # другой изолированный контекст
Изоляция означает, что субагент не видит историю супервизора, а супервизор получает только финальный ответ и файлы.
4. Детальные промпты для каждого компонента
Каждый компонент системы — супервизор, субагент, инструмент — получает собственный детальный промпт с чёткими правилами, ограничениями и примерами. Это не «промпт-инжиниринг» в бытовом смысле, а архитектура инструкций: каждый уровень системы имеет свой контракт.
RESEARCHER_INSTRUCTIONS = """
<Task>
Your job is to use tools to gather information about the user's input topic.
</Task>
<Instructions>
1. Read the question carefully
2. Start with broader searches
3. After each search, pause and assess
4. Execute narrower searches to fill gaps
5. Stop when you can answer confidently
</Instructions>
<Hard Limits>
- Simple queries: 1-2 search tool calls maximum
- Normal queries: 2-3 search tool calls maximum
- Very Complex queries: up to 5 search tool calls maximum
</Hard Limits>
"""
Архитектура Deep Agent
┌─────────────────────────────────────────────────────────┐
│ Deep Research Agent Architecture │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ TODO │ │ Files │ │
│ │ Management │ │ Storage │ │
│ └──────────────┘ └──────────────┘ │
│ │ │ │
│ └─────────┬─────────┘ │
│ │ │
│ ┌───────▼───────┐ │
│ │ Supervisor │ │
│ │ (main LLM) │ │
│ └───────┬───────┘ │
│ │ │
│ ┌─────────┼─────────┐ │
│ │ │ │ │
│ ┌────▼───┐ ┌──▼───┐ ┌──▼─────┐ │
│ │task() │ │tavily│ │think │ │
│ │ │ │search│ │_tool │ │
│ └────┬───┘ └──┬───┘ └────────┘ │
│ │ │ │
│ ┌────▼───┐ │ │
│ │Subagent│ │ │
│ │research│ │ │
│ └────────┘ │ │
│ │ │
│ Files ◄─────┘ │
│ (context offloading) │
└─────────────────────────────────────────────────────────┘
Пример работы для запроса «Дай обзор Model Context Protocol»:
- Супервизор получает запрос, создаёт TODO-список
- Сохраняет запрос в файл через
write_file() - Делегирует исследование субагенту через
task() - Субагент в изолированном контексте выполняет поиск через Tavily
- Результаты суммаризируются — полный текст в файлы, сводка в контекст
- Субагент использует
think_toolдля рефлексии - Возвращает сводку супервизору
- Супервизор обновляет TODO, читает файлы, формирует финальный ответ
Экосистема LangChain
| Компонент | Назначение | Когда использовать |
|---|---|---|
| LangChain | Линейные цепочки (RAG, pipeline) | Прототип, 1-3 шага |
| LangGraph | Stateful-графы с циклами и ветвлением | Агенты, multi-agent, production |
| LangSmith | Observability — трассировка, мониторинг | Всегда, с первого дня |
Deep Agents строятся поверх LangGraph. Именно StateGraph даёт необходимые примитивы: узлы, рёбра, reducers для параллельных обновлений, checkpointers для персистентности, interrupt() для human-in-the-loop.
Когда использовать Deep Agents
Используйте, когда:
- Задача требует 10+ вызовов инструментов
- Нужна многошаговая координация с планированием
- Есть риск потери фокуса на длинной траектории
- Разные подзадачи требуют изолированного контекста
- Агент работает в production и нужен observability
Не используйте, когда:
- Простая одношаговая задача — достаточно голого API или Pydantic AI
- Линейная цепочка без циклов — достаточно LangChain
- Быстрый прототип важнее надёжности — CrewAI быстрее стартует
- Задача описывается через роли — CrewAI подходит лучше
LangGraph — наиболее зрелый фреймворк для задач с циклами, условными переходами и production-деплоем, но для простых задач он избыточен.
Практический путь
LangChain Academy предлагает два курса:
LangGraph Academy (6 модулей) — фундамент: StateGraph, reducers, breakpoints, параллелизация, Memory Store, production-деплой.
Deep Agents from Scratch (5 уроков) — практика: ReAct-агент, планирование через TODO, контекстная выгрузка, субагенты, сборка полного агента-исследователя.
Готовая абстракция — пакет deepagents:
from deepagents import create_deep_agent
agent = create_deep_agent(
tools=[tavily_search, think_tool],
system_prompt=INSTRUCTIONS,
subagents=[research_sub_agent],
model=model,
)
result = agent.invoke({
"messages": [{"role": "user", "content": "Research MCP"}]
})
Итоги
Тенденция ясна: METR-бенчмарк показывает удвоение длины задач каждые 7 месяцев. Паттерны Deep Agents — планирование, контекстная выгрузка, изоляция, структурированные промпты — из «продвинутых» становятся базовыми. Продакшн-системы уже используют их: Manus, Claude Code, Anthropic Research, Open Deep Research.
Если вы строите агента, который должен работать автономно дольше нескольких минут — вам понадобятся эти техники.
Пусктех помогает бизнесу внедрять ИИ-агентов и автоматизировать процессы.