Перейти к основному содержимому

Агенты, которые подчиняются, но всё равно причиняют вред: случай в Филадельфии как провал спецификации

Случай с ложной наводкой в Филадельфии — это не история про галлюцинацию. Это провал спецификации: агент выполнил значимое действие, предпосылки которого никогда не были объявлены.

Хрустальный плазменный шар со светящимися электрическими нитями внутри, в тёмной комнате

Что на самом деле демонстрирует этот случай

В новостном репортаже из Филадельфии описывается автоматизированная система — или оператор, полагающийся на неё, — которая переслала наводку, оказавшуюся ложной, и последствия обрушились на реального человека и реальное учреждение прежде, чем кто-либо успел проверить утверждение. Детали атрибуции важны меньше, чем форма провала. Агент сделал то, о чём его просили. Вред возник из действия, предпосылки которого никогда не были заданы: какие доказательства требовались до того, как наводка покинула стены организации, сколько независимых источников её подтвердили, мог ли получатель что-либо отменить после того, как она к нему поступила.

Это тот же класс провалов, который мы видим в оценках tool calling каждую неделю. Каждый вызов валиден по схеме. JSON парсится, аргументы соответствуют объявленным типам, транспорт возвращает 200. Результат всё равно неверен, потому что валидность — это не соответствие политике. Tool call может быть корректным по форме и недопустимым по контексту: сообщение, отправленное не тому получателю, запись, обновлённая на основании единственного непроверенного поля, уведомление, отправленное третьей стороне, которая уже не сможет его не увидеть.

Трактовка этого как проблемы галлюцинаций подталкивает к исправлению модели, которое не может сработать. Если модель выдумала деталь, можно обоснованно попросить лучшего заземления. Но в филадельфийской схеме модель, возможно, сообщила ровно то, что ей дали. Разрыв был выше по потоку от генерации: ничто в системе не говорило, что для этого действия требуются два независимых источника, прежде чем оно будет разрешено. Никакой объём промптинга не закрывает разрыв, который никогда не был записан как требование.

Значимые инструменты нуждаются в предпосылках

Полезное различие — не между хорошими и плохими моделями. Оно между инструментами, которые остаются внутри организации, и инструментами, которые достигают третьей стороны. Вызов retrieval по внутреннему индексу дёшево ошибить. Вызов, который отправляет письмо регулятору, подаёт отчёт, публикует утверждение об указанном лице или направляет выездную группу, — нет.

Для любого инструмента из второй категории обёртка должна объявлять как минимум три вещи.

  • Требуемые доказательства. Какие поля должны присутствовать и быть не-null, прежде чем вызов будет разрешён, и какое происхождение должно быть у каждого из них. Наводка с единственным неструктурированным источником — это не тот же объект, что наводка с источником, временной меткой и подтверждающей записью.
  • Число подтверждений. Сколько независимых источников должны совпасть. Независимость — сложная часть; два поля, скопированные из одного и того же вышестоящего фида, — это один источник в двух шляпах, и схема должна кодировать граф происхождения, чтобы число вычислялось, а не утверждалось.
  • Класс обратимости. Можно ли отменить действие и кем. Отправка внутреннего черновика обратима. Отправка наводки внешнему партнёру — нет, потому что получатель уже её прочитал.

Stacked metallic AA batteries arranged in a pyramid shape, shown in close-up

Необратимые действия, затрагивающие третьи стороны, требуют отдельного пути одобрения с указанным человеком-принципалом. Не общая очередь, не общий почтовый ящик: конкретная подотчётная роль, которую журнал аудита фиксирует в момент одобрения. Одобрение — такая же предпосылка, как и любая другая, оцениваемая тем же механизмом.

Проверка предпосылок принадлежит обёртке инструмента, а не промпту. Обёртка находится между предложенным моделью вызовом и побочным эффектом. Она получает аргументы, обращается к объявленным предпосылкам, оценивает их относительно текущего состояния и либо разрешает вызов, либо возвращает структурированный отказ. Поскольку она живёт в коде, она переживает обновления модели, переписывания промптов и появление нового фреймворка для агентов. Поскольку она возвращает отказ, а не молча переписывает запрос, модели можно сообщить почему и дать ей выбрать другой путь, а сам отказ становится записью.

Почему промпты не могут это нести

Инструкции конкурируют за контекст. Системный промпт, который несёт операционную политику наряду с постановкой задачи, описаниями инструментов, правилами форматирования и текущей беседой, — это системный промпт, где политика является одним голосом среди многих. На длинных горизонтах этот голос не становится громче; он становится дальше. К двадцатому ходу предостережение, написанное в начале контекста, — это факт, которому модель может придать вес, а может и нет, и снаружи невозможно определить, что именно произошло.

Предпосылка, проверяемая в коде, порождает отказ с причиной. Этот отказ — дискретное событие с временной меткой, входными данными, идентификатором правила и результатом. Его можно подсчитывать, семплировать и воспроизводить. Предостережение на уровне промпта не порождает ничего, что можно было бы исследовать после факта. Если наводка ушла и вы хотите знать, рассматривала ли система подтверждение, ответ с промптом — мы попросили её. Ответ с обёрткой — строка в логе.

Здесь есть честный компромисс, и он немал. Предпосылки в коде добавляют задержку и трение. Каждый значимый вызов теперь ждёт оценки, и некоторая доля из них будет отклонена и потребует взгляда человека. В первые недели эта доля некомфортна, потому что схема строже неформального процесса, который она заменила. Команды ощущают это как то, что система встаёт на пути, и давление ослабить правило немедленно. Противовес в том, что ослабленная предпосылка невидима до момента отказа, тогда как строгая видна сразу. Издержки платятся авансом и в месте, где их видно.

Второй компромисс: предпосылки хороши ровно настолько, насколько хорошо состояние, которое они читают. Если число подтверждений зависит от поля происхождения, которое вышестоящие системы заполняют непоследовательно, проверка пропустит то, что не должна. Вот почему оценку нужно логировать рядом с вызовом, вместе с входными данными, которые она фактически видела. Когда предпосылка оказывается неверной, лог говорит вам, было ли плохим правило или данные, которые его питали.

Close-up of glowing fiber optic strands with purple and blue bokeh, stock photo

Правило проектирования: классифицируй, затем прикрепляй

Практическое правило — классифицировать инструменты по радиусу поражения и обратимости, а затем прикреплять предпосылки к классу, а не к отдельным промптам. Класс инструмента — это свойство инструмента, объявленное один раз и пересматриваемое при изменении инструмента. Каждый агент, который может достичь этого инструмента, автоматически наследует класс и его предпосылки. Новых агентов не нужно учить осторожности; им нужно дать инструменты, которые уже её несут.

Минимальное объявление выглядит так:

tool: submit_external_tip
blast_radius: third_party
reversibility: irreversible
preconditions:
  - rule: evidence.required_fields
    fields: [claim_text, source_id, source_timestamp]
  - rule: corroboration.min_independent
    count: 2
    provenance_field: source_lineage
  - rule: approval.named_principal
    role: duty_editor
    on_fail: refuse_with_reason

Обёртка оценивает каждое правило по порядку и выдаёт один из трёх исходов: разрешить, отказать с причиной или эскалировать указанному принципалу. Запись оценки пишется рядом с вызовом в том же трейсе, так что решение можно восстановить месяцы спустя: какие правила выполнялись, какие значения они читали, какое отказало, кто одобрил, если кто-то одобрил.

Это неблагодарная работа. Она выглядит как проектирование схем и контроль доступа, а не как AI-инженерия, и отчасти поэтому её пропускают. Но филадельфийская схема не решается лучшей моделью или более осторожным промптом. Она решается тем, чтобы сделать предпосылку полноценным объектом, прикреплённым к инструменту, оцениваемым в коде и логируемым рядом с действием, которое она регулирует. Агенты продолжат делать то, о чём их просят. Вопрос в том, было ли то, о чём их просят ограничено тем, что организация действительно готова допустить.

Что инструментировать в первую очередь

Начните с инвентаризации, а не с изменения модели. Перечислите каждый инструмент, который может вызвать любой агент. Для каждого зафиксируйте, достигает ли он третьей стороны, можно ли его отменить и какие доказательства должны были бы существовать, чтобы организация могла защитить действие на разборе шесть месяцев спустя. Инструменты, для которых на последний вопрос нет ясного ответа, — это те, которым нужна предпосылка до следующего развёртывания, а не после следующего инцидента.

Затем подключите оценку к трейсу. Отказ, который не залогирован, неотличим от запроса, который никогда не делался, а одобрение, которое не атрибутировано, неотличимо от агента, действующего в одиночку. Два новостных репортажа, ссылки на которые приведены выше, описывают исходы; инженерный ответ — сделать предпосылки, которые предотвратили бы их, явными, принудительными и разборчивыми.

ПоделитьсяXLinkedInПостоянная ссылка6 мин чтения

Связанное чтение

На какие вопросы это отвечает

Why is the Philadelphia tip case not a hallucination problem?

The agent may have reported exactly what it was given. The failure was that nothing in the system required corroboration or evidence before a consequential external action, so better grounding would not have changed the outcome.

Where should precondition checks live?

In the tool wrapper, between the model's proposed call and the side effect. That way the check survives model upgrades and prompt rewrites, and produces an auditable refusal with a reason.

What should a precondition schema declare?

At minimum the required evidence fields and their provenance, a corroboration count over independent sources, and a reversibility class. Irreversible third-party actions also require approval from a named human principal.

What is the main trade-off of strict preconditions?

Latency and friction. Consequential calls wait on evaluation and some are refused, which teams experience as the system getting in the way. The counterweight is that a relaxed precondition stays invisible until it fails.