Наблюдение за агентом с помощью модели принятия решений
Кодирующие агенты — место самого плотного использования этих моделей, и применения группируются в трёх местах. Все три делят одну структуру: забрать суждение у генеративной модели, отдать его чему-то более дешёвому и быстрому и позволить коду действовать по типизированному ответу.
1. Перед вызовом инструмента: разрешить или нет
Самое прямое место. Хук PreToolUse в Claude Code делает так:
Спросите
Noul: эта команда оболочки строго только для чтения? Автоодобрять при 0.95, иначе вернуться к обычному запросу разрешений — и никогда не отклонять.
Три проектных решения стоит назвать:
- 0.95 — это высоко. Планка для автоодобрения стоит заметно выше планки для «это выглядит рискованно». Ложное разрешение стоит машины; ложная блокировка стоит одного лишнего подтверждения. Асимметричные стоимости принадлежат асимметричным порогам.
- Оно никогда не отклоняет. Оно лишь добавляет одобрение; всё остальное возвращается к исходной системе. Шлюз, который только добавляет возможности, куда легче тестировать — его худший случай в том, что он не помог.
- Опасные команды никогда не доходят до модели. Локальный жёсткий список запретов и фильтр инъекций ловят их первыми. Это важнее порога — см. Что должно жить в коде.
Измеренный результат: 0 из 8 команд, меняющих состояние, были автоодобрены.
2. Когда агент хочет остановиться: закончил ли он?
Ещё одно частое место. Хук остановки спрашивает у модели принятия решений, не завершает ли агент слишком рано, предъявляя ей свои правила завершения на простом языке.
Более сдержанная версия работает так:
Потратить один вызов из четырёх вопросов только когда файлы изменились и с тех пор не прошло ни одной успешной проверки. Fail open при любой ошибке.
«Спрашивай только когда стоит спрашивать» — ключ для этого класса — эти хуки запускаются каждый ход, а безусловный вызов умножает стоимость на число ходов. Условие выше — «непроверенные изменения», а это ровно тот момент, когда агент вероятнее всего объявит победу, ничего не проверив.
Родственный хук не даёт агенту завершиться рано, судя по правилам завершения на простом языке, а не доверяя собственному заявлению агента.
3. Когда контекст заполняется: что ещё нужно?
Третье место — уплотнение контекста, где подходы расходятся сильнее всего.
Традиционное уплотнение суммирует: отдать отрезок разговора модели и получить обратно прозу. Исходник пропадает, а суммирование необратимо.
Подход с моделью принятия решений не переписывает — он только оценивает:
| Подход | Что сохраняется |
|---|---|
| Оценивать каждый вызов инструмента и результат на «ещё нужно» | Строки, признанные нужными, остаются дословно |
Переносить низкие оценки в хранилище, оставляя на месте указатель expand() |
Ничего не удаляется, только складывается |
| Префикс только для добавления | prompt-кэш никогда не ломается |
| Обрезать длинный вывод Bash до того, как его увидит модель | Терминальный шум никогда не входит в окно |
Общая фраза: работа модели принятия решений здесь — бинарное суждение «оставить/убрать», а не переписывание. Именно это она умеет хорошо, а генеративные модели — плохо — и «сложить вместо удаления» превращает неверное суждение из «информация потеряна навсегда» в «одно лишнее expand».
Контраргумент: шлюзы безопасности и шлюзы эффективности отказывают в противоположные стороны
Самый поучительный контраст в этой части экосистемы: на один и тот же вопрос «что происходит при ошибке» проекты выбрали противоположные ответы, и оба правы.
- Судья разрешений: отказывать при ошибке или таймауте.
- Хук остановки: разрешать при любой ошибке.
Критерий — не «что безопаснее», а охраняет ли этот шлюз риск или пропускную способность. Шлюзы, охраняющие риск (разрешения, секреты, опасные команды), лучше заблокируют хорошее, чем пропустят плохое; шлюзы, охраняющие пропускную способность (проверки завершения, проверки формата), лучше пропустят что-то, чем парализуют поток.
В одном предложении
Агенты — самое естественное место для этих моделей, потому что им нужно великое множество дешёвых суждений, результаты которых код потребляет немедленно. Но в каждой из этих точек сначала решите: в какую сторону должен упасть этот шлюз, когда сломается?