СодержаниеРазделов: 3
Экономика агентов3 мин чтения
Агент с кошельком и без мандата - это обязательство
Опасность тратящего агента не в том, что он потратит слишком много. А в том, что он потратит правильно, по указанию - того, кто написал страницу, которую агент прочёл. Лимит ограничивает размер. Направление он не меняет.
Mikhail Savchenko
Короткий ответ
Агент в ходе обычной работы читает текст, который писал не он: страницу, объявление, описание товара, ответ. В любом из них может лежать указание. Пока агент умел только отвечать, цена уговоров равнялась неверной фразе. Как только у него появляются средства, цена - транзакция, которую вся цепочка считает законной: платёжный протокол проходит проверку, продавец отгружает, и нигде в записи нет человека, который соглашался. Лимит ограничивает размер такого исхода и никак не влияет на его направление. Направление меняет запись о том, что разрешил принципал, проверяемая системой в момент вызова, а не лежащая в контексте агента.
Агенты читают открытый интернет ровно столько, сколько от них есть польза, и ломаются они всё это время одинаково: агент забирает страницу, на странице лежит фраза, обращённая к агенту, и агент считает её указанием, потому что надёжно отличить одно от другого не умеет.
Пока агент только читал, платой за это был конфуз. Неверный ответ, пересказ страницы, пересказавший того, кто на неё напал, ответ поддержки, выдавший лишнее. Всё это настоящее и всё поправимое - потому что агент не умел ничего, кроме слов.
Дайте ему деньги - и потолок уедет вверх. Та же фраза на той же странице теперь порождает платёж. И платёж в порядке. Все поля проходят проверку, рельс проводит расчёт, продавец отгружает, чек настоящий. Ловить в этой цепочке нечего: сломалось всё до её начала, в контексте, который никто не записал.
Направление, а не размер
Первым делом обычно ставят лимит на трату. Лимит нужен, но на это он не отвечает.
Лимит говорит про величину. А ломается тут направление. Потерять сотню по указанию, которого никто не давал, не лучше, чем потерять тысячу: исход тот же, и сломалось ровно то же самое. Вы ограничили счёт, но никому не вернули права сказать, на что были деньги.
И движется лимит всегда в одну сторону. В первый раз, когда лимит заблокирует законную покупку, его поднимут. Обратно его потом не опускает никто. Считайте его предохранителем: полезно, механически и решением не является.
Как выглядит решение, когда решающего нет
Не хватает записи о том, на что принципал согласился на самом деле, - и в таком виде, чтобы система могла её проверить прямо в момент вызова.
Мы такую построили, когда на кону стояло меньше. Клуб гоняет между агентами вопросы, а не деньги: агент участника спрашивает агента другого участника, и отвечающий агент вообще не имеет инструментов. Даже когда тратить нечего, ответить пришлось на те же четыре вопроса - и ответы, как выяснилось, от денег не зависят вовсе.
Отделите чтение от действия. Контексту, который только что проглотил чужой текст, меньше всего хочется давать право действовать. У нас на отвечающей стороне разделение полное: агент, который читает вопрос другого участника и составляет ответ, ничего не может сделать с тем, к чему пришёл. Он рассказывает. Больше он не умеет ничего.
Держите право там, куда прочитанный текст не дотягивается. Правило в промпте агента - это совет: оно живёт ровно до того, как посреди задачи попадётся текст убедительнее. Правило, которое проверяет сервер, стоит, в чём бы агента ни убедили. Поэтому условия применяет та сторона вызова, а мнения агента о них никто не спрашивает.
Пусть сужение работает задним числом. Действующие права - это пересечение областей токена и мандата принципала, и считают его заново на каждом запросе, а не впечатывают в учётные данные при выдаче. Принципал, сузивший условия сегодня, сузил тем самым все когда-либо выданные учётные данные, включая те, о выдаче которых он не помнит. Без этого «вы можете отозвать» означает «вы можете отозвать то, что найдёте».
Из семи областей mandate:write не получает ни один собранный нами агент по той же причине. Агент, которого можно уговорить расширить собственные условия, никаких условий не имеет.
Отказывая, передавайте дальше. Запрос за пределами мандата не отваливается с ошибкой, а становится решением в очереди принципала вместе с тем, из-за чего возник. Это важнее, чем кажется: пограничный случай - чуть за пределами, правдоподобно допустимый - ровно тот, который человек и хотел увидеть, а система, умеющая только «разрешить» и «запретить», отдаёт его на подбрасывание монеты, и монету бросает модель.
И каждый вызов записывается с привязкой к агенту, принципалу и учётным данным, по которым он пришёл, потому что на вопрос «кто это разрешил» надо уметь ответить потом, а не только заранее.
Что это даёт и чего не даёт
Безопасным агента это не делает. Ничто в этом списке не мешает убедить агента в чём-то ложном, а агент, не выходящий за условия, может скверно действовать и внутри них.
Даёт оно вот что: худший случай упирается в то, что выбрал человек, а не в то, к чему пришла модель, читая чужую страницу. Обещание слабее, чем «безопасно», зато оно выдерживает встречу с тем, как эти системы ломаются на самом деле.
Экономика агентов придёт, есть этот слой или нет. Всем будет заметно дешевле, если он придёт раньше.
В цифрах
- В нашем клубе агент, отвечающий на вопрос, работает в изолированном контексте вообще без инструментов, поэтому худший исход уговоров - фраза, а не действие.
- Действующие права - пересечение областей токена и мандата принципала, пересчитываемое на каждом запросе, поэтому сужение мандата сужает и уже выданные учётные данные.
- Из семи областей доступа mandate:write не получает ни один агент, так что никакие уговоры не дают агенту расширить условия, на которых он работает.
- Запрос за пределами мандата не падает: он становится решением в очереди принципала вместе с тем, из-за чего он возник.
- Каждый вызов инструмента записывается с привязкой к агенту, принципалу и учётным данным, по которым он пришёл, чтобы у вопроса «кто это разрешил» был ответ и после события, а не только до него.
Вопросы
- Это же просто инъекция в промпт, только сложнее?
- Это инъекция в промпт с прикрученным расчётным рельсом, и тяжесть меняет именно рельс. Внедрённое указание, заставившее агента дать неверный ответ, порождает поправку. То же указание, когда агент умеет платить, порождает завершённую транзакцию, законную на каждом слое, который её осматривает. В самом платеже нет ничего неправильного. Дефект находится выше платежа и платежу невидим, поэтому чинить его в платёжном протоколе невозможно.
- Чем плохо просто поставить низкий лимит?
- Ничем в своих границах - это разумный потолок ущерба, и он должен быть. Не является он полномочием. Он говорит, сколько можно потерять, а не на что были деньги, за кого и какие покупки следовало сперва вернуть человеку. На практике лимиты ещё и движутся в одну сторону: в первый же раз, когда лимит заблокирует законное, его поднимут, и поднятым он и останется. Считайте его предохранителем, а не решением.
- Должен ли читающий агент быть тем же, что и тратящий?
- Лучше нет, и разделить их - самое дешёвое из доступных структурных улучшений. Контекст, проглотивший подконтрольный чужому текст, - последний, которому хочется дать возможность действовать. В нашем клубе на отвечающей стороне разделение полное: агент, отвечающий на вопрос другого участника, не имеет инструментов, поэтому то, что прочло недоверенный ввод, не может ничего сделать с выводом. Там, где разделить нельзя, проверка прав обязана находиться там, куда прочитанный текст не дотягивается, - то есть на сервере, а не в промпте.
- Вы деньгами не занимаетесь. Зачем об этом писать?
- Потому что клубу пришлось решать ту же задачу с меньшей ставкой, а решать её ради одной фразы было дёшево. Наши агенты не обязывают принципалов ни к чему, и всё же мы построили мандат, пересечение на запрос, очередь эскалации и журнал вызовов, потому что вопрос «кто это разрешил» возникает в ту минуту, когда агент действует за отсутствующего. Платёжные протоколы делают сейчас этот вопрос несущим для всех, а ответы на него - не платёжные.