Почему AI-бот может ответить дважды: что проверить до запуска
В нашем собственном продукте повтор после сбоя охватывал запрос к модели, сохранение ответа и отправку уведомления. Ошибка на последнем шаге могла запустить всё заново. Риск нашли на ревью до релиза.
Кирилл Школенко, основатель ИОАНН
6 мин чтения
Повтор захватил весь шаг
Пользователь присылает текст. Модель готовит ответ, система сохраняет его и уведомляет человека. Если ответа от модели нет за 15 секунд или провайдер возвращает ошибку, код делает ещё одну попытку. На обычной проверке модель отвечала за две-три секунды, поэтому повтор не срабатывал.
Коллега заметил, что повтор срабатывает на любую ошибку внутри шага. Допустим, ответ уже сохранён и уведомление дошло до человека, но сервис уведомлений вернул ошибку. Система запускает шаг заново, получает другой ответ модели и снова пишет пользователю. Так одно сообщение может получить два ответа.
Это сценарий ошибки, обнаруженный при ревью. До пользователей он не дошёл. Повторный вызов также добавил бы расход на модель, но экономию от исправления мы не измеряли.
Что изменили
Повтор ограничили запросом к модели. Сохранение ответа и отправка уведомления больше в него не входят.
Ответ привязали к исходному сообщению. База не принимает второй ответ на то же сообщение. Это правило нужно и тогда, когда первая попытка ответила поздно, уже после начала второй.
Уведомление отправляется по уже сохранённому ответу. Если отправка не удалась, повторяем только её. Для повторной доставки не нужно снова обращаться к модели.
Что показала проверка перед релизом
Мы задерживали ответ модели дольше 15 секунд и намеренно ломали отправку уведомлений. В описанной проверке на каждое сообщение приходились один сохранённый ответ и одно уведомление.
Один автоматический повтор оставили. В описанном сценарии человек мог ждать ответа около 30 секунд. Данных о том, что людям удобнее - ждать повтор или сразу получать сообщение о неудаче, - у нас пока нет.
Проверка искусственными сбоями подтверждает поведение в этих условиях. Она не показывает частоту ошибок в работе с пользователями и не гарантирует единственное уведомление при любом сбое доставки.
Таблица для приёмки своей AI-функции
Следующие строки - предлагаемые проверки для вашего проекта. Мы не утверждаем, что все они выполнены в нашем эпизоде. До разработки согласуйте ожидаемое поведение и запишите результат каждой проверки.
| Условие | Ожидаемое поведение | Что зафиксировать |
|---|---|---|
| Модель отвечает позже установленного срока | Поздний ответ не создаёт второй результат для того же сообщения | Число вызовов, сохранённых ответов и время ожидания |
| Провайдер возвращает ошибку | Повтор ограничен согласованным числом попыток; после отказа пользователь видит понятный статус | Попытки, итоговый статус и расходы |
| Ответ сохранён, уведомление не отправлено | Повтор доставки использует сохранённый ответ и не вызывает модель заново | Сохранённый результат, вызовы модели и отправки |
| Уведомление доставлено, подтверждение доставки потеряно | Проверена защита от дублей; ограничения канала явно описаны | Что увидел получатель и как система решила повторять отправку |
| Система повторно принимает сообщение с тем же идентификатором | Для того же идентификатора не появляется второй сохранённый ответ | Идентификатор сообщения и число результатов |
| Ответ модели получен, сохранение не удалось | Система не сообщает об успехе до сохранения; порядок восстановления согласован | Состояние записи и необходимость нового вызова модели |
| Все разрешённые попытки исчерпаны | Пользователь может понять, что произошло, и безопасно продолжить | Сообщение в интерфейсе, возможность повторить и общий расход |
Как включить проверки в первый релиз
Выберите один законченный сценарий. Опишите, что пользователь отправляет, где хранится результат и как он узнаёт об успехе или ошибке. Для каждого шага укажите, какие действия допустимо повторять.
Проверку сбоев проводите отдельно от проверки содержания ответа. Хороший текст модели не показывает, что запись сохранилась или действие выполнилось один раз. На приёмке нужны оба результата.
Для оценки расходов считайте все попытки, необходимые для завершения действия. Точные пределы ожидания, число повторов и допустимую стоимость согласуйте для своего сценария. Наши 15 секунд не являются универсальной настройкой.