Skip to content

Подробное руководство по стратегиям автоматической очистки ​

Чему вы научитесь ​

  • Понимать принципы работы трёх стратегий автоматической очистки
  • Знать, когда включать или отключать каждую стратегию
  • Оптимизировать эффективность стратегий через настройку

Ваша текущая проблема ​

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

  • ИИ многократно читает один и тот же файл, каждый раз добавляя полное содержимое в контекст
  • После записи файла и его чтения старое содержимое записи остаётся в контексте без дела
  • После неудачного вызова инструмента громоздкие входные параметры продолжают занимать место

Эти проблемы приводят к росту счетов за токены и могут «загрязнять» контекст, влияя на решения ИИ.

Основная идея ​

DCP предоставляет три стратегии автоматической очистки, которые выполняются незаметно перед каждым запросом, без затрат на LLM:

СтратегияПо умолчаниюНазначение
Дедупликация✅ ВключенаОбнаруживает повторяющиеся вызовы инструментов, сохраняет только последний
Перезапись❌ ОтключенаОчищает входные данные операций записи, перезаписанных чтением
Очистка ошибок✅ ВключенаОчищает входные данные ошибочных инструментов через N раундов

Все стратегии следуют этим правилам:

  • Пропуск защищённых инструментов: task, write, edit и другие ключевые инструменты не очищаются
  • Пропуск защищённых файлов: пути файлов, защищённые настроенными glob-шаблонами
  • Сохранение сообщений об ошибках: стратегия очистки ошибок удаляет только входные параметры, сообщения об ошибках сохраняются

Стратегия дедупликации ​

Принцип работы ​

Стратегия дедупликации обнаруживает повторяющиеся вызовы с одинаковым именем инструмента и параметрами, сохраняя только последний.

Механизм сопоставления сигнатур

DCP определяет дубликаты по «сигнатуре»:

  • Одинаковое имя инструмента
  • Одинаковые значения параметров (null/undefined игнорируются, порядок ключей не влияет)

Например:

json
// Первый вызов
{ "tool": "read", "path": "src/config.ts" }

// Второй вызов (сигнатура совпадает)
{ "tool": "read", "path": "src/config.ts" }

// Третий вызов (сигнатура отличается)
{ "tool": "read", "path": "src/utils.ts" }

Сценарии применения ​

Рекомендуется включить (включено по умолчанию):

  • ИИ часто читает один и тот же файл для анализа кода
  • Многократные запросы одной и той же конфигурации в ходе диалога
  • Сценарии, где нужно актуальное состояние, а исторические выводы можно отбросить

Возможно, стоит отключить:

  • Нужно сохранить контекст каждого вызова инструмента (например, для отладки вывода инструментов)

Метод настройки ​

json
// ~/.config/opencode/dcp.jsonc
{
  "$schema": "https://raw.githubusercontent.com/Opencode-DCP/opencode-dynamic-context-pruning/main/dcp.schema.json",
  "strategies": {
    "deduplication": {
      "enabled": true  // true — включить, false — отключить
    }
  }
}

Защищённые инструменты (не очищаются по умолчанию):

  • task, write, edit, batch, plan_enter, plan_exit
  • todowrite, todoread (инструменты списка задач)
  • discard, extract (собственные инструменты DCP)

Эти инструменты не могут быть очищены дедупликацией даже через конфигурацию (жёстко закодированная защита).


Стратегия перезаписи ​

Принцип работы ​

Стратегия перезаписи очищает входные данные операций записи, которые были перезаписаны последующим чтением.

Пример: запись с последующим чтением
text
Шаг 1: Запись файла
ИИ вызывает write("config.json", {...})
↓
Шаг 2: Чтение файла для подтверждения
ИИ вызывает read("config.json") → возвращает актуальное содержимое
↓
Стратегия перезаписи распознаёт
Входные данные write (возможно, большие) становятся избыточными
потому что read уже захватил текущее состояние файла
↓
Очистка
Сохраняется только вывод read, входные данные write удаляются

Сценарии применения ​

Рекомендуется включить:

  • Сценарии итеративной разработки с частым циклом «запись → проверка → изменение»
  • Операции записи содержат большие шаблоны или полное содержимое файлов

Причины отключения по умолчанию:

  • Некоторые рабочие процессы зависят от «истории записей» как контекста
  • Может влиять на некоторые вызовы инструментов, связанных с контролем версий

Когда включить вручную:

json
{
  "strategies": {
    "supersedeWrites": {
      "enabled": true
    }
  }
}

Примечания ​

Эта стратегия очищает только входные данные инструмента write, не вывод. Потому что:

  • Вывод write обычно является подтверждающим сообщением (очень маленьким)
  • Входные данные write могут содержать полное содержимое файла (очень большое)

Стратегия очистки ошибок ​

Принцип работы ​

Стратегия очистки ошибок после неудачного вызова инструмента ждёт N раундов, затем удаляет входные параметры (сохраняя сообщения об ошибках).

Что такое раунд (turn)?

В диалоге OpenCode:

  • Пользователь отправляет сообщение → ИИ отвечает = 1 раунд
  • Вызовы инструментов не считаются отдельными раундами

Порог по умолчанию — 4 раунда, что означает автоматическую очистку входных данных ошибочного инструмента через 4 раунда.

Сценарии применения ​

Рекомендуется включить (включено по умолчанию):

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

Возможно, стоит отключить:

  • Нужно сохранить полные входные данные неудачного инструмента для отладки
  • Часто возникают «периодические» ошибки, и нужно сохранить историю

Метод настройки ​

json
{
  "strategies": {
    "purgeErrors": {
      "enabled": true,   // Переключатель включения
      "turns": 4        // Порог очистки (количество раундов)
    }
  }
}

Защищённые инструменты (не очищаются по умолчанию):

  • Тот же список защищённых инструментов, что и для стратегии дедупликации

Порядок выполнения стратегий ​

Три стратегии выполняются в фиксированном порядке:

mermaid
graph LR
    A["Список сообщений"] --> B["Синхронизация кэша инструментов"]
    B --> C["Стратегия дедупликации"]
    C --> D["Стратегия перезаписи"]
    D --> E["Стратегия очистки ошибок"]
    E --> F["Замена очищенного содержимого"]

Это означает:

  1. Сначала дедупликация (уменьшение избыточности)
  2. Затем перезапись (очистка устаревших записей)
  3. Наконец очистка ошибок (очистка устаревших ошибочных входных данных)

Каждая стратегия основывается на результатах предыдущей и не очищает один и тот же инструмент повторно.


Типичные ошибки ​

❌ Заблуждение 1: Думать, что все инструменты очищаются автоматически ​

Проблема: Почему task, write и другие инструменты не очищаются?

Причина: Эти инструменты находятся в списке защищённых инструментов, жёстко закодированная защита.

Решение:

  • Если действительно нужно очистить write, рассмотрите включение стратегии перезаписи
  • Если нужно очистить task, можно косвенно контролировать через настройку защищённых путей файлов

❌ Заблуждение 2: Стратегия перезаписи приводит к неполному контексту ​

Проблема: После включения перезаписи ИИ не может найти предыдущее содержимое записи.

Причина: Стратегия очищает только операции записи, «перезаписанные чтением», но если после записи файл никогда не читался, он не будет очищен.

Решение:

  • Проверьте, был ли файл действительно прочитан (можно посмотреть через /dcp context)
  • Если действительно нужно сохранить записи, отключите эту стратегию

❌ Заблуждение 3: Стратегия очистки ошибок очищает слишком быстро ​

Проблема: Ошибочные входные данные только что очищены, а ИИ сразу же сталкивается с той же ошибкой.

Причина: Порог turns установлен слишком маленьким.

Решение:

json
{
  "strategies": {
    "purgeErrors": {
      "turns": 8  // Увеличить с 4 по умолчанию до 8
    }
  }
}

Когда использовать эти стратегии ​

СценарийРекомендуемая комбинация стратегий
Повседневная разработка (больше чтения, меньше записи)Дедупликация + Очистка ошибок (конфигурация по умолчанию)
Частая запись и проверкаВсе включены (вручную включить перезапись)
Отладка неудачных инструментовТолько дедупликация (отключить очистку ошибок)
Нужна полная история контекстаВсе отключены

Итоги урока ​

  • Стратегия дедупликации: обнаруживает повторяющиеся вызовы инструментов, сохраняет только последний (включена по умолчанию)
  • Стратегия перезаписи: очищает входные данные операций записи, перезаписанных чтением (отключена по умолчанию)
  • Стратегия очистки ошибок: очищает входные данные ошибочных инструментов через N раундов (включена по умолчанию, порог 4)
  • Все стратегии пропускают защищённые инструменты и защищённые пути файлов
  • Стратегии выполняются в фиксированном порядке: дедупликация → перезапись → очистка ошибок

Анонс следующего урока ​

В следующем уроке мы изучим Инструменты очистки на основе LLM.

Вы узнаете:

  • Как ИИ самостоятельно вызывает инструменты discard и extract
  • Способы реализации семантической оптимизации контекста
  • Лучшие практики извлечения ключевых находок

Приложение: Справочник по исходному коду ​

Нажмите, чтобы развернуть расположение исходного кода

Дата обновления: 2026-01-23

ФункцияПуть к файлуСтроки
Реализация стратегии дедупликацииlib/strategies/deduplication.ts13-83
Реализация стратегии перезаписиlib/strategies/supersede-writes.ts16-105
Реализация стратегии очистки ошибокlib/strategies/purge-errors.ts16-80
Экспорт точки входа стратегийlib/strategies/index.ts1-5
Конфигурация по умолчаниюlib/config.ts423-464
Список защищённых инструментовlib/config.ts68-79

Ключевые функции:

  • deduplicate() — главная функция стратегии дедупликации
  • supersedeWrites() — главная функция стратегии перезаписи
  • purgeErrors() — главная функция стратегии очистки ошибок
  • createToolSignature() — создание сигнатуры инструмента для сопоставления дубликатов
  • normalizeParameters() — нормализация параметров (удаление null/undefined)
  • sortObjectKeys() — сортировка ключей параметров (обеспечение согласованности сигнатур)

Значения конфигурации по умолчанию:

  • strategies.deduplication.enabled = true
  • strategies.supersedeWrites.enabled = false
  • strategies.purgeErrors.enabled = true
  • strategies.purgeErrors.turns = 4

Защищённые инструменты (не очищаются по умолчанию):

  • task, todowrite, todoread, discard, extract, batch, write, edit, plan_enter, plan_exit