Инструменты обрезки на базе 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>. ИИ видит такой контент:
<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 на уровне проекта):
{
"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: Тестирование функции обрезки
- Проведите достаточно длинный диалог, вызывающий несколько инструментов
- Наблюдайте, вызывает ли ИИ discard или extract в подходящий момент
- Используйте
/dcp statsдля просмотра статистики обрезки
Вы должны увидеть:
- После накопления определённого количества вызовов инструментов ИИ начинает активно обрезать
/dcp statsпоказывает количество сэкономленных токенов- Контекст диалога более сфокусирован на текущей задаче
Контрольная точка ✅
Нажмите, чтобы развернуть и проверить вашу конфигурацию
Проверка действия конфигурации
# Просмотр конфигурации 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: ИИ не обрезает инструменты
Возможные причины:
- Инструменты обрезки не включены
- Конфигурация защиты слишком строгая, нет инструментов для обрезки
Решение:
{
"tools": {
"discard": {
"enabled": true // Убедитесь, что включено
},
"extract": {
"enabled": true // Убедитесь, что включено
}
}
}Распространённая ошибка 2: Ошибочная обрезка критического контента
Возможные причины:
- Критические файлы не добавлены в режим защиты
- Список защищённых инструментов неполный
Решение:
{
"protectedFilePatterns": [
"src/auth/*", // Защита файлов, связанных с аутентификацией
"config/*" // Защита файлов конфигурации
],
"tools": {
"settings": {
"protectedTools": [
"read", // Добавить read в список защиты
"write"
]
}
}
}Распространённая ошибка 3: Не видно извлечённое содержимое
Возможная причина:
showDistillationнастроено как false
Решение:
{
"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
| Функция | Путь к файлу | Строки |
|---|---|---|
| Определение инструмента discard | lib/strategies/tools.ts | 155-180 |
| Определение инструмента extract | lib/strategies/tools.ts | 183-220 |
| Выполнение операции обрезки | lib/strategies/tools.ts | 26-153 |
| --- | --- | --- |
| Внедрение контекста обрезки | lib/messages/inject.ts | 102-156 |
| Спецификация инструмента discard | lib/prompts/discard-tool-spec.ts | 1-41 |
| Спецификация инструмента extract | lib/prompts/extract-tool-spec.ts | 1-48 |
| Системный промпт (оба) | lib/prompts/system/both.ts | 1-60 |
| Промпт напоминания | lib/prompts/nudge/both.ts | 1-10 |
| Определение конфигурации | lib/config.ts | 436-449 |
| Защищённые инструменты по умолчанию | lib/config.ts | 438-441 |
Ключевые константы:
DISCARD_TOOL_DESCRIPTION: Описание промпта для инструмента discardEXTRACT_TOOL_DESCRIPTION: Описание промпта для инструмента extractDEFAULT_PROTECTED_TOOLS: Список защищённых инструментов по умолчанию
Ключевые функции:
createDiscardTool(ctx): Создание инструмента discardcreateExtractTool(ctx): Создание инструмента extractexecutePruneOperation(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-шаблоны защищённых файлов