Skip to content

Инструменты обрезки на базе LLM: Интеллектуальная оптимизация контекста с помощью ИИ

Что вы сможете делать после изучения

  • Понимать различия и сценарии использования инструментов discard и extract
  • Знать, как ИИ выбирает контент для обрезки через список <prunable-tools>
  • Настраивать переключатели инструментов обрезки, частоту напоминаний и параметры отображения
  • Понимать, как механизмы защиты предотвращают ошибочную обрезку критических файлов

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

По мере углубления диалога накапливаются вызовы инструментов, и контекст становится всё больше. Вы можете столкнуться с:

  • Резким ростом использования токенов и увеличением затрат
  • Необходимостью ИИ обрабатывать большое количество неактуальных старых выводов инструментов
  • Незнанием, как заставить ИИ активно очищать контекст

Традиционное решение — ручная очистка, но это прерывает поток диалога. DCP предлагает лучший способ: позволить ИИ самостоятельно решать, когда очищать контекст.

Когда использовать этот подход

Когда вы:

  • Часто ведёте длинные диалоги с накоплением множества вызовов инструментов
  • Обнаруживаете, что ИИ нужно обрабатывать большое количество исторических выводов инструментов
  • Хотите оптимизировать затраты на токены без прерывания диалога
  • Желаете выбирать между сохранением и удалением контента в зависимости от конкретного сценария

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

DCP предоставляет два инструмента, позволяющих ИИ активно оптимизировать контекст в диалоге:

ИнструментНазначениеСохраняется ли контент
discardУдаление завершённых задач или шума❌ Не сохраняется
extractИзвлечение ключевых находок с последующим удалением исходного контента✅ Сохраняется сжатая информация

Механизм работы

Перед каждой отправкой сообщения ИИ DCP выполняет:

1. Сканирование вызовов инструментов в текущей сессии

2. Фильтрация уже обрезанных и защищённых инструментов

3. Генерация списка <prunable-tools>
   Формат: ID: tool, parameter

4. Внедрение списка в контекст

5. ИИ выбирает инструменты из списка и вызывает discard/extract

6. DCP заменяет обрезанный контент заполнителем

Логика принятия решения о выборе инструмента

ИИ выбирает инструмент по следующему алгоритму:

"Нужно ли сохранить информацию из этого вывода инструмента?"

  ├─ Нет → discard (способ очистки по умолчанию)
  │   - Задача завершена, контент не имеет ценности
  │   - Шум, нерелевантная информация

  ├─ Да → extract (сохранение знаний)
  │   - Ключевая информация, необходимая для последующих ссылок
  │   - Сигнатуры функций, значения конфигурации и т.д.

  └─ Не уверен → extract (более безопасный вариант)

INFO

ИИ выполняет пакетную обрезку, а не обрезает отдельные небольшие выводы инструментов. Это более эффективно.

Механизмы защиты

DCP имеет многоуровневую защиту для предотвращения ошибочной обрезки критического контента ИИ:

Уровень защитыОписаниеПараметр конфигурации
Защищённые инструментыОсновные инструменты, такие как task, write, edit, не могут быть обрезаныtools.settings.protectedTools
Защищённые файлыПути файлов, соответствующие glob-шаблонам, не могут быть обрезаныprotectedFilePatterns
Защита по раундамНовые инструменты не попадают в список обрезки в течение N раундовturnProtection.turns

TIP

По умолчанию защищённые инструменты включают: task, todowrite, todoread, discard, extract, batch, write, edit, plan_enter, plan_exit

Следуйте инструкциям

Шаг 1: Понимание списка <prunable-tools>

В диалоге DCP автоматически внедряет список <prunable-tools>. ИИ видит такой контент:

xml
<prunable-tools>
The following tools have been invoked and are available for pruning.
This list does not mandate immediate action.
Consider your current goals and resources you need before discarding valuable tool inputs or outputs.
Consolidate your prunes for efficiency; it is rarely worth pruning a single tiny tool output.
Keep your context free of noise.

5: read, /path/to/auth.ts
12: bash, npm test
18: grep, "function login"
</prunable-tools>

Вы должны увидеть:

  • Каждая строка — один инструмент в формате ID: tool, parameter
  • ID — числовой индекс (начиная с 0)
  • Отображаются только инструменты, доступные для обрезки (уже обрезанные, защищённые, защищённые файлы не отображаются)

Шаг 2: Просмотр сценариев использования discard ИИ

Когда ИИ завершает задачу и определяет, что информацию сохранять не нужно:

Ввод пользователя: Протестировать функцию аутентификации

Вывод ИИ:
Тесты пройдены. Логика аутентификации работает нормально, сохранять логи тестов не нужно.
[Вызов discard(ids: ["completion", "5", "12"])]

Вы должны увидеть:

  • ИИ использовал инструмент discard
  • Формат параметров: ["причина", "ID1", "ID2", ...]
  • Причина может быть только двух типов: "completion" (задача завершена) или "noise" (шум)

Шаг 3: Просмотр сценариев использования extract ИИ

Когда ИИ завершает задачу и нужно сохранить ключевую информацию:

Ввод пользователя: Проанализировать реализацию сервиса аутентификации

Вывод ИИ:
Я обнаружил несколько ключевых деталей, извлекаю следующее:
[Вызов extract(ids: ["5", "12"], distillation: [
  "auth.ts: validateToken проверяет кэш (TTL 5 мин) перед вызовом OIDC",
  "bash: npm test результат - все тесты пройдены"
])]

Вы должны увидеть:

  • ИИ использовал инструмент extract
  • Массив distillation соответствует по длине массиву ids
  • Каждое извлечённое содержимое соответствует сжатой информации из одного вывода инструмента

Шаг 4: Настройка параметров инструментов обрезки

Отредактируйте файл конфигурации DCP (~/.config/opencode/dcp.jsonc или .opencode/dcp.jsonc на уровне проекта):

jsonc
{
  "tools": {
    "discard": {
      "enabled": true
    },
    "extract": {
      "enabled": true,
      "showDistillation": false
    },
    "settings": {
      "nudgeEnabled": true,
      "nudgeFrequency": 10,
      "protectedTools": [
        "task",
        "todowrite",
        "todoread",
        "discard",
        "extract",
        "batch",
        "write",
        "edit",
        "plan_enter",
        "plan_exit"
      ]
    }
  }
}

Вы должны увидеть:

  • discard.enabled: Включить инструмент discard (по умолчанию true)
  • extract.enabled: Включить инструмент extract (по умолчанию true)
  • extract.showDistillation: Отображать ли извлечённое содержимое (по умолчанию false)
  • nudgeEnabled: Включить ли напоминания об обрезке (по умолчанию true)
  • nudgeFrequency: Частота напоминаний (по умолчанию 10, т.е. каждые 10 вызовов инструментов)

Вы должны увидеть:

  • Если showDistillation равно false, извлечённое содержимое не отображается в диалоге
  • Если showDistillation равно true, извлечённое содержимое отображается в виде игнорируемого сообщения

Шаг 5: Тестирование функции обрезки

  1. Проведите достаточно длинный диалог, вызывающий несколько инструментов
  2. Наблюдайте, вызывает ли ИИ discard или extract в подходящий момент
  3. Используйте /dcp stats для просмотра статистики обрезки

Вы должны увидеть:

  • После накопления определённого количества вызовов инструментов ИИ начинает активно обрезать
  • /dcp stats показывает количество сэкономленных токенов
  • Контекст диалога более сфокусирован на текущей задаче

Контрольная точка ✅

Нажмите, чтобы развернуть и проверить вашу конфигурацию

Проверка действия конфигурации

bash
# Просмотр конфигурации DCP
cat ~/.config/opencode/dcp.jsonc

# Или конфигурация на уровне проекта
cat .opencode/dcp.jsonc

Вы должны увидеть:

  • tools.discard.enabled равно true (включён discard)
  • tools.extract.enabled равно true (включён extract)
  • tools.settings.nudgeEnabled равно true (включены напоминания)

Проверка работы обрезки

В диалоге после вызова нескольких инструментов:

Вы должны увидеть:

  • ИИ вызывает discard или extract в подходящий момент
  • Получено уведомление об обрезке (отображаются обрезанные инструменты и сэкономленные токены)
  • /dcp stats показывает накопленные сэкономленные токены

Предупреждения о подводных камнях

Распространённая ошибка 1: ИИ не обрезает инструменты

Возможные причины:

  • Инструменты обрезки не включены
  • Конфигурация защиты слишком строгая, нет инструментов для обрезки

Решение:

jsonc
{
  "tools": {
    "discard": {
      "enabled": true  // Убедитесь, что включено
    },
    "extract": {
      "enabled": true  // Убедитесь, что включено
    }
  }
}

Распространённая ошибка 2: Ошибочная обрезка критического контента

Возможные причины:

  • Критические файлы не добавлены в режим защиты
  • Список защищённых инструментов неполный

Решение:

jsonc
{
  "protectedFilePatterns": [
    "src/auth/*",  // Защита файлов, связанных с аутентификацией
    "config/*"     // Защита файлов конфигурации
  ],
  "tools": {
    "settings": {
      "protectedTools": [
        "read",  // Добавить read в список защиты
        "write"
      ]
    }
  }
}

Распространённая ошибка 3: Не видно извлечённое содержимое

Возможная причина:

  • showDistillation настроено как false

Решение:

jsonc
{
  "tools": {
    "extract": {
      "showDistillation": true  // Включить отображение
    }
  }
}

WARNING

Извлечённое содержимое отображается в виде игнорируемого сообщения и не влияет на контекст диалога.

Краткое содержание урока

DCP предоставляет два инструмента, позволяющих ИИ самостоятельно оптимизировать контекст:

  • discard: Удаление завершённых задач или шума, информацию сохранять не нужно
  • extract: Извлечение ключевых находок с последующим удалением исходного контента, сохранение сжатой информации

ИИ узнаёт о доступных для обрезки инструментах через список <prunable-tools> и выбирает подходящий инструмент в зависимости от сценария. Механизмы защиты гарантируют, что критический контент не будет ошибочно обрезан.

Ключевые моменты конфигурации:

  • Включение инструментов: tools.discard.enabled и tools.extract.enabled
  • Отображение извлечённого содержимого: tools.extract.showDistillation
  • Настройка частоты напоминаний: tools.settings.nudgeFrequency
  • Защита критических инструментов и файлов: protectedTools и protectedFilePatterns

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

В следующем уроке мы изучим Использование Slash-команд

Вы узнаете:

  • Как использовать /dcp context для просмотра распределения токенов в текущей сессии
  • Как использовать /dcp stats для просмотра накопленной статистики обрезки
  • Как использовать /dcp sweep для ручного запуска обрезки

Приложение: Ссылки на исходный код

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

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

ФункцияПуть к файлуСтроки
Определение инструмента discardlib/strategies/tools.ts155-180
Определение инструмента extractlib/strategies/tools.ts183-220
Выполнение операции обрезкиlib/strategies/tools.ts26-153
---------
Внедрение контекста обрезкиlib/messages/inject.ts102-156
Спецификация инструмента discardlib/prompts/discard-tool-spec.ts1-41
Спецификация инструмента extractlib/prompts/extract-tool-spec.ts1-48
Системный промпт (оба)lib/prompts/system/both.ts1-60
Промпт напоминанияlib/prompts/nudge/both.ts1-10
Определение конфигурацииlib/config.ts436-449
Защищённые инструменты по умолчаниюlib/config.ts438-441

Ключевые константы:

  • DISCARD_TOOL_DESCRIPTION: Описание промпта для инструмента discard
  • EXTRACT_TOOL_DESCRIPTION: Описание промпта для инструмента extract
  • DEFAULT_PROTECTED_TOOLS: Список защищённых инструментов по умолчанию

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

  • createDiscardTool(ctx): Создание инструмента discard
  • createExtractTool(ctx): Создание инструмента extract
  • executePruneOperation(ctx, toolCtx, ids, reason, toolName, distillation): Выполнение операции обрезки
  • buildPrunableToolsList(state, config, logger, messages): Генерация списка инструментов для обрезки
  • insertPruneToolContext(state, config, logger, messages): Внедрение контекста обрезки

Параметры конфигурации:

  • tools.discard.enabled: Включить ли инструмент discard (по умолчанию true)
  • tools.extract.enabled: Включить ли инструмент extract (по умолчанию true)
  • tools.extract.showDistillation: Отображать ли извлечённое содержимое (по умолчанию false)
  • tools.settings.nudgeEnabled: Включить ли напоминания (по умолчанию true)
  • tools.settings.nudgeFrequency: Частота напоминаний (по умолчанию 10)
  • tools.settings.protectedTools: Список защищённых инструментов
  • protectedFilePatterns: Glob-шаблоны защищённых файлов