Управление контекстом в LangChain Deep Agents: техники сжатия и оффлоуд | AiManual
AiManual Logo Ai / Manual.
28 Янв 2026 Гайд

Контекстная амнезия в LangChain Deep Agents: как не дать AI-агенту забыть всё через 20 минут работы

Практическое руководство по сжатию контекста AI-агентов и работе с файловой системой в LangChain Deep Agents SDK. Техники для длительных задач.

Проблема: ваш агент становится тупее с каждым шагом

Представьте картину: ваш Deep Agent работает уже полчаса. Он анализирует документацию, генерирует код, тестирует его. А потом внезапно спрашивает: "А что такое функция main()?" Или начинает повторять уже выполненные шаги. Это не баг - это контекстное окно модели переполнилось.

На 28 января 2026 года даже самые продвинутые модели вроде Claude 3.7 Sonnet или GPT-4.5 Turbo имеют ограничения. 128K токенов звучит много, но когда агент работает над сложной задачей час-два, этого хватит минут на 20-30 активной работы. Потом начинается деградация.

Контекстное окно - не банка с печеньем. Когда оно заполняется, старые токены не просто "выпадают". Модель начинает хуже понимать контекст, теряет логические связи. Это как пытаться вспомнить начало книги, читая последнюю главу.

Три техники сжатия, которые работают прямо сейчас

Deep Agents SDK на 2026 год предлагает несколько встроенных механизмов. Но большинство разработчиков используют их неправильно или вообще не используют.

1Токен-компрессор: не просто обрезать, а пересказать

Самая тупая ошибка - просто обрезать контекст по токен-лимиту. Вы теряете всю историю. В Deep Agents есть TokenCompressor - он не просто режет, а пытается сохранить смысл.

from langchain_deep_agents.compressors import TokenCompressor
from langchain_deep_agents.memory import ConversationBufferMemory

# НЕ ТАК:
memory = ConversationBufferMemory(max_token_limit=4000)
# Когда лимит превышен - всё теряется

# ТАК:
compressor = TokenCompressor(
    target_token_count=3000,
    compression_ratio=0.7,  # Насколько агрессивно сжимать
    preserve_key_points=True  # Сохранять ключевые моменты
)

memory = ConversationBufferMemory(
    max_token_limit=10000,  # Большой лимит
    compressor=compressor,  # Компрессор сработает ДО достижения лимита
    compression_strategy="proactive"  # Сжимать заранее
)

Почему compression_strategy="proactive" важен? Потому что если ждать, пока контекст достигнет лимита, агент уже успеет деградировать. Компрессор должен работать постоянно, как сборщик мусора.

💡
TokenCompressor в Deep Agents использует ту же LLM для сжатия. Это дорого в токенах, но дешевле, чем потерять контекст и начать задачу заново.

2Иерархическое сжатие: важное оставляем, детали - в архив

В длительных задачах есть критически важная информация (цель задачи, архитектурные решения) и временная (результаты промежуточных тестов, отладочный вывод).

from langchain_deep_agents.compressors import HierarchicalCompressor
from langchain_deep_agents.memory import TieredMemory

memory = TieredMemory(
    tiers=[
        {
            "name": "core",
            "max_tokens": 2000,
            "priority": "high",  # Никогда не сжимается агрессивно
            "content_types": ["goal", "architecture", "decisions"]
        },
        {
            "name": "working",
            "max_tokens": 5000,
            "priority": "medium",
            "content_types": ["code", "test_results", "research"]
        },
        {
            "name": "transient",
            "max_tokens": 3000,
            "priority": "low",
            "content_types": ["debug", "intermediate", "logs"]
        }
    ],
    compressor=HierarchicalCompressor(
        compression_strategy="tier_based",
        aggressive_compression_tiers=["transient"],  # Сначала жертвуем временными данными
        preserve_cross_references=True  # Сохранять ссылки между уровнями
    )
)

Этот подход похож на кэш процессора: L1 (core) - маленький, но быстрый и важный, L3 (transient) - большой, но им можно пожертвовать.

3Семантическое сжатие: AI понимает, что забыть

Самая продвинутая техника в Deep Agents на 2026 год. Вместо того чтобы слепо сжимать по токенам, модель анализирует содержание и решает, что можно "забыть", а что нужно сохранить любой ценой.

from langchain_deep_agents.compressors import SemanticCompressor
from langchain_deep_agents.context_managers import DeepAgentContext

context_manager = DeepAgentContext(
    memory_config={
        "compressor": SemanticCompressor(
            importance_scorer="llm_based",  # Использует LLM для оценки важности
            redundancy_detector=True,  # Находит повторяющуюся информацию
            temporal_relevance_decay=0.95,  # Старая информация теряет важность
            goal_alignment_weight=2.0  # Информация, связанная с целью, важнее
        ),
        "auto_compress_threshold": 0.8,  # Сжимать при заполнении на 80%
        "min_context_preservation": 0.3  # Всегда сохранять 30% оригинального контекста
    }
)

SemanticCompressor дорогой - каждый раз вызывает LLM для анализа важности. Но для дорогих долгих задач (вроде автономного исследования или разработки сложного кода) это окупается.

Файловая система как расширенная память: оффлоуд по-умному

Сжатие помогает, но иногда нужно просто выгрузить данные из оперативной памяти на диск. Проблема в том, что файловая система - тупая. Она не понимает семантику. Выгрузили контекст - как потом найти нужный кусок?

В Deep Agents есть FileSystemOffloader. Он не просто пишет в файл, а индексирует контент для быстрого поиска.

from langchain_deep_agents.offloaders import FileSystemOffloader
from langchain_deep_agents.retrievers import ContextRetriever

# Настройка оффлоудера
offloader = FileSystemOffloader(
    base_path="./agent_context",
    indexing_strategy="semantic_chunks",  # Разбивает на смысловые куски
    metadata_extractor=["timestamp", "step_id", "content_type"],
    compression="zstd",  # Сжатие на диске
    max_memory_preservation=0.2  # В памяти остаётся 20% оффлоуднутых данных
)

# Ретривер для поиска в оффлоуднутых данных
retriever = ContextRetriever(
    offloader=offloader,
    search_strategy="hybrid",  # И семантический поиск, и по ключевым словам
    relevance_threshold=0.7,
    max_retrieved_chunks=5
)

# Интеграция с агентом
agent = DeepAgent(
    context_manager=DeepAgentContext(
        offloader=offloader,
        retriever=retriever,
        auto_offload_threshold=0.75  # Автоматически выгружать при 75% заполнения
    )
)

Не используйте простой JSON dump для оффлоуда. Без индексации найти что-то в 100 МБ контекста будет невозможно. FileSystemOffloader создаёт векторные индексы для семантического поиска.

Паттерн "Контекстный свитч" для очень долгих задач

Когда задача длится часами (например, автономный research agent), одного оффлоуда недостаточно. Нужно уметь переключаться между контекстами.

from langchain_deep_agents.context_managers import ContextSwitcher

switcher = ContextSwitcher(
    contexts={
        "main_goal": {
            "storage": "memory",
            "max_tokens": 3000,
            "priority": "highest"
        },
        "current_subtask": {
            "storage": "memory",
            "max_tokens": 5000,
            "priority": "high"
        },
        "completed_subtasks": {
            "storage": "offloaded",
            "offloader": offloader,
            "index_key": "subtask_results"
        },
        "research_materials": {
            "storage": "offloaded",
            "offloader": offloader,
            "index_key": "research_data",
            "retrieval_mode": "on_demand"  # Загружать только по запросу
        }
    },
    switch_triggers={
        "subtask_complete": "move_to_offloaded",
        "context_bloat": "compress_then_offload",
        "goal_change": "switch_main_context"
    }
)

Это похоже на то, как работает ваша собственная память при работе над большим проектом: текущая задача - в фокусе, вчерашняя работа - в архиве, общая цель - всегда под рукой.

Реальная ошибка, которая стоила $5000 в токенах

Один мой клиент запустил Deep Agent для анализа кодовой базы в 50 000 строк. Через 40 минут агент "забыл", что уже проанализировал модуль А, и начал анализировать его снова. И снова. И снова.

Проблема была в неправильной настройке компрессии:

# КАК НЕ НАДО ДЕЛАТЬ:
memory = ConversationBufferMemory(
    max_token_limit=8000,
    compressor=TokenCompressor(
        target_token_count=6000,
        compression_ratio=0.9  # СЛИШКОМ АГРЕССИВНО!
    ),
    compression_strategy="reactive"  # Ждать переполнения
)

Агент работал, контекст рос. При достижении 8000 токенов компрессор срезал 20% (compression_ratio=0.9 значит сохранить 90%, но от 8000 это 7200, а target_token_count=6000 значит сжать до 6000). Фактически выкинули 2000 токенов - и агент потерял целый аналитический модуль.

Правильное решение:

# КАК НАДО:
memory = TieredMemory(
    tiers=[
        {"name": "analysis_results", "max_tokens": 4000, "priority": "high"},
        {"name": "current_analysis", "max_tokens": 3000, "priority": "medium"},
        {"name": "debug_logs", "max_tokens": 1000, "priority": "low"}
    ],
    compressor=HierarchicalCompressor(
        compression_strategy="continuous",  # Постоянное фоновое сжатие
        min_preservation_ratio={
            "high": 0.9,    # Важные данные почти не трогать
            "medium": 0.7,  # Средние можно немного сжать
            "low": 0.3      # Отладочную информацию сильно сжимать
        }
    ),
    offloader=FileSystemOffloader(
        base_path="./analysis_cache",
        auto_offload=["low", "medium"],  # Автоматически выгружать низкоприоритетное
        keep_memory_reference=True  # Оставлять в памяти ссылки на оффлоуднутое
    )
)

Интеграция с другими подходами из LangChain экосистемы

Deep Agents - не остров. Его техники управления контекстом можно комбинировать с другими подходами.

Например, middleware из LangChain 1.0 может добавить PII-защиту перед оффлоудом:

from langchain.middleware import PIIAnonymizationMiddleware
from langchain_deep_agents.integrations import LangChainMiddlewareAdapter

# Добавляем middleware для анонимизации перед записью на диск
pii_middleware = PIIAnonymizationMiddleware(
    entities=["email", "phone", "credit_card"],
    replacement_strategy="mask"
)

offloader = FileSystemOffloader(
    base_path="./secure_context",
    pre_offload_hooks=[
        LangChainMiddlewareAdapter(pii_middleware)
    ],
    encryption="aes256"  # Шифрование на диске
)

Или использовать архитектуру subagents для распределения контекста между специализированными агентами, как в статье "Как победить контекстный блот и 'зону тупости' в агентах".

Практический чеклист для продакшена

  1. Всегда включайте proactive compression - не ждите переполнения
  2. Используйте TieredMemory для разделения по важности
  3. Настройте auto_offload для низкоприоритетных данных
  4. Тестируйте с реальными длительными задачами - не доверяйте unit-тестам на 5 минут
  5. Мониторьте токен-использование и качество ответов агента во времени
  6. Добавьте семантический поиск для оффлоуднутых данных
  7. Шифруйте чувствительные данные перед записью на диск
💡
На 28 января 2026 года Deep Agents SDK продолжает развиваться. Следите за обновлениями в их документации - появляются новые методы компрессии, основанные на attention-механизмах самих LLM.

Управление контекстом в долгих задачах - это не просто "оптимизация". Это вопрос выживания агента. Без правильных техник сжатия и оффлоуда ваш AI-агент превратится в золотую рыбку с памятью на 3 секунды. Только дороже.

Начните с TieredMemory и FileSystemOffloader. Добавьте SemanticCompressor, когда поймёте паттерны использования вашего агента. И никогда не используйте голый ConversationBufferMemory для задач длиннее 30 минут.

(Особенно если платите за токены из своего кармана. Поверьте, я видел счета.)