Deep Agents: как LangChain переосмысливает архитектуру AI-агентов

Пусктех5 мин чтения
deep-agentslangchainlanggraphai-агентыархитектура

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»:

  1. Супервизор получает запрос, создаёт TODO-список
  2. Сохраняет запрос в файл через write_file()
  3. Делегирует исследование субагенту через task()
  4. Субагент в изолированном контексте выполняет поиск через Tavily
  5. Результаты суммаризируются — полный текст в файлы, сводка в контекст
  6. Субагент использует think_tool для рефлексии
  7. Возвращает сводку супервизору
  8. Супервизор обновляет 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.

Если вы строите агента, который должен работать автономно дольше нескольких минут — вам понадобятся эти техники.


Пусктех помогает бизнесу внедрять ИИ-агентов и автоматизировать процессы.