Я проверил, что мой ИИ-агент рассказывает клиентам — и не обрадовался
А потом я решил на всякий случай прочитать не «атаки», а обычные диалоги — те самые 46 разговоров, что накопились с посетителями сайта с момента запуска. Ни одной инъекции. Зато я обнаружил, что агент врёт покупателям в лицо. Не со зла и не потому, что его взломали — а потому что мы сами его этому научили, просто не заметили.
Вот что он успел насочинять за это время:
— Сказал, что карточки-объявления можно генерировать без ограничений на любом тарифе. На деле пробный лимит есть, и на бесплатном тарифе боевого режима вообще нет.
— Заявил, что сам ведёт весь диалог с клиентом на любом тарифе. Модуль чат-агента платный, на бесплатном его просто не включить — но агент этого не знал и с готовностью продавал функцию, которой у собеседника не будет.
— Придумал адрес поддержки вида «@avitoma_support». Такого адреса не существует — я специально проверил. Реальная поддержка живёт в разделе кабинета и в чате в Telegram, но агент решил, что имя с «@» звучит правдоподобнее, чем правда.
— На вопрос про технологию сказал, что у нас «собственная модель». Мы никогда такого не заявляли: вопрос просто не был разобран в базе знаний, и агент заполнил пустоту тем, что звучит солиднее честного «не скажу, чей это движок». Заодно красиво описал, как система «настраивает веса» под конкретный аккаунт продавца — звучит как реальный ML-термин, к происходящему у нас отношения не имеющий.
— И вишенка: рассказал выдуманный кейс, как у клиента после подключения выросли лиды, с цифрами. Такого клиента и такой истории в наших данных нет.
Ни один посетитель, кажется, не поймал агента за руку и не написал жалобу — иначе я бы узнал раньше не из собственной проверки, а из тикета. Это чистая случайность, а не заслуга системы.
Разбираясь, откуда это лезет, я понял главную ошибку архитектуры. Промпт агента собирался из лучших примеров реальных диалогов плюс FAQ — разумная идея, чтобы бот говорил живым языком. Но нигде не было жёсткой границы «вот это единственное, что тебе разрешено знать о продукте, за пределами — молчи или переспрашивай». Как только вопрос выходил за рамки FAQ, модель делала ровно то, для чего обучена: подбирала наиболее вероятное продолжение текста. А самое вероятное продолжение фразы менеджера, отвечающего на вопрос о возможностях сервиса, — это уверенный конкретный ответ, а не «не знаю». Она не «врала» в человеческом смысле — она статистически достраивала недостающий кусок, и делала это неотличимо от вранья.
Чинили так: завели один файл-канон с фактами о продукте и явно написали агенту, что это исчерпывающий список того, что он имеет право утверждать, любое отклонение запрещено. Состав тарифов теперь берётся из биллинга, а не пересказывается по памяти. Про технологию — честная формулировка про то, что поставщика модели мы не называем. Реальные каналы поддержки прописаны буквально, чтобы агенту не пришлось изобретать адрес самому.
Урок простой и неприятный: я месяцами следил, чтобы агент не ломался под атакой, и почти прозевал, что он прекрасно ломает себя сам, работая ровно так, как задумано. Джейлбрейк — это когда систему заставляют вести себя не так, как она должна. А тут система вела себя ровно так, как я её обучил, — я просто не подумал, что «отвечай полезно и уверенно» без границы фактов равносильно «сочиняй, если не знаешь». Проверка на устойчивость к атакам ничего не говорит о том, врёт ли бот, когда его никто не атакует. Теперь раз в одну-две недели мы читаем случайную выборку диалогов целиком — не в поисках взлома, а в поисках того самого уверенного тона, которым бот отвечает на вопрос, ответа на который у него нет.