Веб-сервер сообщает об ошибке через исключение. Вы получаете 500, трассировку стека, номер строки. Агент сообщает об ошибке, успешно выполняя не то, что нужно. Он зацикливается на двадцать ходов, отказывается от разумного запроса, позволяет уговорить себя нарушить системный промпт, закрывает тикет, удаляя тест. Каждый вызов возвращает 200 OK.
В этом и заключается разрыв. Ваши трассировки, логи и графики задержек следят за инфраструктурой. Ни один из них не следит за самим разговором.
Ставки растут, а видимость остается прежней. Агенты каждый месяц подключают все больше инструментов, вызывают собственные под-агенты, работают часами без участия человека и теперь используются в здравоохранении, финансах и службах поддержки, где тихая ошибка стоит реальных денег. Чем усерднее работает агент, тем меньше информации дает код 200.
Рефлекс считывает каждый ход, сортирует сбои по сигналам, таким как фрустрация и джейлбрейки, выявляет их во всех чатах и передает полученные данные обратно агенту.
Ошибки живут в тексте
Частота ошибок и задержки вызывают исключения, поэтому вы уже следите за ними. Сигналы, которые действительно говорят о том, хорош ли агент, вообще не попадают в ваши логи, потому что они семантические. Они скрыты в том, что пользователь и агент сказали друг другу. Пользователь пишет: «Я спрашиваю об этом уже в третий раз», а затем сдается. Промпт, который выманивает агента за пределы его собственных правил. Агент восемь раз обращается к одному и тому же инструменту, каждый раз получая одну и ту же ошибку, и пытается в девятый. Совершенно разумный запрос, который агент отклонил без видимой причины. Агент, выдающий ход своих мыслей в ответе.
Ничто из этого не проявляется само по себе. Кто-то должен прочитать ход диалога и поставить на него метку, и этот «кто-то» — то, что мы называем рефлексом: небольшой классификатор, который смотрит на один ход и дает вам один ответ. Не оценка от 1 до 10, которая меняется каждый раз, когда вы правите формулировки. А конкретная метка — то, что можно посчитать, отследить после релиза и получить уведомление, если показатель подскочит.
Восемь рефлексов, один вызов API
Ничего не нужно обучать заранее. Отправьте ход диалога в API, и метка вернется менее чем через 90 мс. Восемь из них готовы к работе:
Один вызов, один классификатор, одна метка:
Пропускайте через него каждый ход. «Фрустрация: 0.97» становится строкой в вашем дашборде, а не числом, затерянным в транскрипте, который никто никогда не откроет.
Показатель, по которому можно настроить алерты
Одна метка сама по себе — это просто точка данных. Направьте тот же рефлекс на весь ваш трафик, и он превратится в показатель, а показатель — это то, на основе чего вы действительно управляете продуктом. Фрустрация некоторое время держится на базовом уровне. Затем происходит деплой, и она подскакивает:
Новый системный промпт был внедрен в версии 2.4, и уровень фрустрации удвоился за несколько часов. Никому не пришлось просматривать тысячи транскриптов, чтобы заметить это. Рефлекс прочитал каждый ход, и график просто показал вам результат.
Теперь релиз становится экспериментом. Отправьте изменение промпта или модели на 5% трафика, оставьте остальное в качестве контроля и наблюдайте за изменением показателей. Если после внедрения изменений количество отказов или фрустрация растут, вы выпустили регрессию и узнали об этом в тот же день, а не неделю спустя через показатели оттока. Это A/B-тестирование того, что агент сделал на самом деле, а не того, что, по предположению вашего набора для оценки, он должен был сделать.
Если мы не выпускаем сигнал, обучите его
Восемь рефлексов покрывают типичные ошибки. У вашего продукта есть ошибки, присущие только ему: медицинский агент, который никогда не должен давать советы по дозировке; агент по написанию кода, который тихо удаляет неработающий тест; агент поддержки, отклоняющийся от политики. Опишите поведение, предоставьте несколько размеченных примеров или позвольте нам сгенерировать синтетический набор, и у вас будет собственный рефлекс менее чем за час. Он работает на том же API, с той же задержкой, что и встроенные. Публичный интерфейс совместим с OpenAI fine-tuning, поэтому, если вы обучали модель через OpenAI SDK, вы уже знаете, как это устроено.
Метки возвращаются обратно в агента
Рефлекс — это детектор, но его вывод — это сигнал для обучения. Каждая метка — это строка, которая может стать кейсом для оценки, примером для дообучения или компонентом вознаграждения в обучении с подкреплением (RL). Ход, который сегодня был помечен как «фрустрация», — это поведение, которого ваш основной агент научится избегать завтра.
Я узнал это в Tesla, создавая стек, который обрабатывал данные вождения в масштабе, чтобы находить кадры, необходимые инженерам для обучения: скрытая камера, редкое подрезание, граничные случаи, которые модель постоянно пропускала. Автопарк генерировал петабайты данных. Ничто достаточно точное, чтобы быть полезным, не было достаточно дешевым, чтобы запускать это на всех данных, поэтому вся игра заключалась в поиске фильтра, который вы могли бы позволить себе запускать на всем, потому что редкое событие, которое вам нужно, никогда не бывает в выборке.
Относитесь к своему производственному трафику как к воронке. В верхней части рефлексы работают на 100% ходов и помечают несколько процентов. Этот помеченный срез достаточно мал, чтобы передать его на дорогую проверку, которую вы никогда не смогли бы применить ко всему производству: ваша команда читает важные ходы, а ваши собственные агенты разбираются с остальными. Рефлексы не заменяют это суждение. Они решают, что стоит внимания, чтобы никто не утонул в транскриптах, которые вернули 200 и ничего не значили.
Это работает только потому, что детектор достаточно дешев, чтобы оставлять его включенным на всем. Один проход по бэкенду помечает каждый ход множеством меток, поэтому десятый рефлекс почти ничего не стоит. Прочитайте, как мы это построили.
Метка никогда не была сложной частью. Сложно было запустить ее на всем производстве. Это та проблема, которую мы решили.
Попробуйте рефлекс на своем трафике или прочитайте документацию.