Анти-патерн Blind Tool Trust: сліпа довіра до tools

Anti-pattern, коли агент без перевірки довіряє результатам tools.
На цій сторінці
  1. Ідея за 30 секунд
  2. Приклад анти-патерну
  3. Чому виникає і що йде не так
  4. Правильний підхід
  5. Швидкий тест
  6. Чим відрізняється від інших анти-патернів
  7. Write Access Default vs Blind Tool Trust
  8. Agents Without Guardrails vs Blind Tool Trust
  9. Самоперевірка: чи немає у вас цього анти-патерну
  10. FAQ
  11. Що далі

Ідея за 30 секунд

Blind Tool Trust — це анти-патерн, коли агент приймає tool output "як є", без перевірки формату, змісту і безпечності.

У результаті помилки інструмента проходять далі в ланцюг рішень: модель "додумує" відсутні дані, а система може зробити неправильну зовнішню дію.

Просте правило: будь-який tool output перед наступним кроком має пройти валідацію або завершити run зі зрозумілим stop_reason.


Приклад анти-патерну

Команда будує support-агента, який читає профіль клієнта і одразу на його основі виконує дію.

Коли інструмент повертає невалідний або частковий output, агент усе одно йде далі.

PYTHON
tool_result = run_tool("get_customer_profile", customer_id)
# account_status missing / credit_limit None, але run іде далі
decision = agent.decide_next_action(tool_result)
execute(decision)

У такій схемі немає захисного етапу:

PYTHON
# немає strict parse
# немає schema validation
# немає invariant checks

Для цього кейсу потрібен validation-gate перед використанням tool output:

PYTHON
parsed = validate_tool_output(tool_result)
if not parsed.ok:
    return stop("invalid_tool_output")

Якщо перевірка не пройдена, run не має продовжуватись у write-крок.

У цьому випадку сліпа довіра до tool output додає:

  • ризик тихої корупції даних
  • помилкові дії на базі невалідного output
  • складні інциденти, які важко пояснити

Чому виникає і що йде не так

Цей анти-патерн часто з’являється, коли команда вважає, що "інструмент же наш, отже йому можна довіряти".

Типові причини:

  • перевіряють input, але не перевіряють output
  • валідацію схеми відкладають "на потім"
  • сприймають HTTP 200 як ознаку коректних даних
  • сподіваються, що модель "сама розбереться" з брудним output

У результаті виникають проблеми:

  • тиха корупція — невалідний output потрапляє у наступні кроки
  • неправильні рішення — агент діє на часткових або суперечливих даних
  • ризик side effects — write-дія може статись на базі зламаного payload
  • крихкий дебаг — важко довести, де саме дані стали невалідними
  • повторні інциденти — без явного stop_reason проблему відтворити складно

На відміну від Tool Calling for Everything, тут головна проблема не в кількості викликів, а в тому, що результат виклику не проходить обов’язкову перевірку.

Типові production-сигнали, що ви довіряєте tools "всліпу":

  • інструмент інколи повертає частковий або неочікуваний payload, але run іде далі
  • в логах майже немає invalid_tool_output, хоча інциденти з даними трапляються
  • частка malformed payload або tool errors помітна, але вони майже ніколи не завершуються invalid_tool_output
  • downstream-помилки проявляються пізніше в ланцюгу, а не в точці отримання tool output
  • одна і та сама помилка періодично повертається у схожих сценаріях
  • команда не має чіткого правила, коли зупиняти run через невалідний output

Важливо, що tool output — це зовнішні дані, а не істина. Без parse/schema/invariant перевірок агент приймає критичні рішення без надійної опори.

Правильний підхід

Починайте з простого validation-pipeline для кожного критичного інструмента. Якщо output не проходить перевірку, не продовжуйте run "за інерцією".

Практична рамка:

  • перевіряйте content_type і базові технічні межі (наприклад, max_chars)
  • робіть strict parse для очікуваного формату
  • валідуйте schema й бізнес-інваріанти
  • при фейлі віддавайте stop_reason="invalid_tool_output" або переходьте у safe-mode
PYTHON
def use_customer_profile(customer_id: str):
    raw = run_tool("get_customer_profile", customer_id)

    parsed = parse_json_strict(raw, max_chars=200_000)  # rejects malformed JSON
    profile = validate_schema("customer_profile", parsed)
    if not check_invariants(profile):  # required fields, ranges, business rules
        return stop("invalid_tool_output")  # or switch to safe-mode for read-only paths

    action = agent.decide_next_action(profile)
    return execute(action)

У такій схемі система або працює на валідних даних, або зупиняється прозоро і безпечніше.

Швидкий тест

Якщо на ці питання відповідь "так", у вас є ризик анти-патерну Blind Tool Trust:

  • Чи run продовжується навіть коли tool output має сумнівний формат?
  • Чи HTTP 200 інтерпретується як "дані валідні" без schema-перевірки?
  • Чи side-effect дії можуть запускатись до валідації tool output?

Чим відрізняється від інших анти-патернів

Write Access Default vs Blind Tool Trust

Write Access DefaultBlind Tool Trust
Основна проблема: write-доступ дозволений за замовчуванням.Основна проблема: tool output приймають без обов’язкової перевірки.
Коли виникає: коли deny-by-default не застосовується до дій зі зміною стану.Коли виникає: коли parse/schema/invariant перевірки пропускають або роблять формально.

Якщо коротко: Write Access Default — про зайві права, а Blind Tool Trust — про небезпечну довіру до даних, на основі яких приймається дія.

Agents Without Guardrails vs Blind Tool Trust

Agents Without GuardrailsBlind Tool Trust
Основна проблема: немає системних меж, policy і обмежень виконання.Основна проблема: немає data-boundary між "сирим output" і "даними, яким можна довіряти".
Коли виникає: коли агент може виконувати ризикові дії без runtime-контролю.Коли виникає: коли tool output потрапляє в рішення або write-крок без validation-gate.

Якщо коротко: guardrails керують тим, що агенту дозволено робити, а validation-gate — тим, на яких даних йому взагалі дозволено діяти.

Самоперевірка: чи немає у вас цього анти-патерну

Швидка перевірка на anti-pattern Blind Tool Trust.
Відмічайте пункти під вашу систему і дивіться статус нижче.

Перевірте свою систему:

Прогрес: 0/8

⚠ Є ознаки цього anti-pattern

Спробуйте винести прості кроки у workflow і залишити агента лише для складних рішень.

FAQ

Q: Якщо інструмент внутрішній, його теж треба валідовувати?
A: Так. Внутрішні сервіси теж мають schema drift, partial failures і неконсистентні відповіді. Джерело не скасовує потребу валідації.

Q: Що обрати: fail-closed чи safe-mode?
A: Для ризикових write-сценаріїв зазвичай fail-closed. Для read-only або користувацьких сценаріїв часто підходить safe-mode з явним деградованим станом.

Q: Чи достатньо лише schema validation?
A: Ні. Потрібні ще інваріанти (діапазони, required поля, бізнес-правила), інакше "формально валідні" дані можуть залишатись практично небезпечними.


Що далі

Схожі anti-patterns:

Що будувати замість цього:

  • Allowed Actions — як обмежити дії агента через явні правила доступу.
  • Tool Execution Layer — де централізувати валідацію output і політики виконання.
  • Stop Conditions — як завершувати run прозоро при невалідних даних.
⏱️ 6 хв читанняОновлено 17 березня 2026 р.Складність: ★★★
Реалізувати в OnceOnly
Safe defaults for tool permissions + write gating.
Використати в OnceOnly
# onceonly guardrails (concept)
version: 1
tools:
  default_mode: read_only
  allowlist:
    - search.read
    - kb.read
    - http.get
writes:
  enabled: false
  require_approval: true
  idempotency: true
controls:
  kill_switch: { enabled: true, mode: disable_writes }
audit:
  enabled: true
Інтегровано: продакшен-контрольOnceOnly
Додай guardrails до агентів з tool-calling
Зашип цей патерн з governance:
  • Бюджетами (кроки / ліміти витрат)
  • Дозволами на інструменти (allowlist / blocklist)
  • Kill switch та аварійна зупинка
  • Ідемпотентність і dedupe
  • Audit logs та трасування
Інтегрована згадка: OnceOnly — контрольний шар для продакшен агент-систем.

Автор

Микола — інженер, який будує інфраструктуру для продакшн AI-агентів.

Фокус: патерни агентів, режими відмов, контроль рантайму та надійність систем.

🔗 GitHub: https://github.com/mykolademyanov


Редакційна примітка

Ця документація підготовлена з допомогою AI, із людською редакторською відповідальністю за точність, ясність і продакшн-релевантність.

Контент базується на реальних відмовах, постмортемах та операційних інцидентах у розгорнутих AI-агентних системах.