Почему 1% ошибок LLM может ломать продакшен и как это пытаются решить логит‑маскированием
Даже если языковая модель следует инструкциям в 99% случаев, оставшийся 1% все равно способен регулярно ломать продакшен. При нескольких миллионах вызовов в день это превращается в десятки тысяч некорректных ответов ежедневно.
В материале приводится простой пример. В JSON-объекте поле "priority" получило значение "urgent", хотя допустимы только low | medium | high. Поле "needs_human" вернулось строкой "yes" вместо булевого значения. Формально парсер работает корректно, но модель выдает почти правильный результат. Именно это "почти" и вызывает сбои. Как пишет Towards AI, такие ошибки не выглядят редкими краевыми случаями. При большом масштабе использования они проявляются вполне закономерно.
Обычно разработчики пытаются снизить риск с помощью подсказок, few-shot примеров и циклов проверки с повторной генерацией. Это действительно уменьшает вероятность ошибки, но строгой гарантии не дает. Причина проста: такие методы действуют на уровне смысла. Они пытаются подтолкнуть модель к нужному варианту, но не способны полностью исключить нежелательный вывод.
В статье описан другой подход, logit masking. На каждом шаге генерации модель вычисляет logit, то есть неограниченную оценку, для каждого токена словаря. Речь идет о более чем 100,000+ возможных вариантах следующего токена. Затем функция softmax превращает эти оценки в распределение вероятностей, из которого выбирается следующий токен. Между вычислением логитов и применением softmax есть точка, где эти оценки можно изменить напрямую.
Logit masking использует простой прием. Для запрещенных токенов логит устанавливают в −∞ перед применением softmax. Поскольку e^(-∞) = 0, вероятность такого токена становится ровно нулевой и он физически не может быть выбран. Например, при генерации значения поля "priority" можно разрешить только токены, формирующие low, medium или high. Все остальные, включая начало слова "urgent", заранее исключаются. В итоге ошибку не приходится перехватывать после генерации, она просто не может возникнуть на уровне выбора токена.
Ключевые факты
В примере сбоя модель вернула JSON с полем "priority": "urgent" при допустимых значениях enum low | medium | high и строкой "yes" в поле needs_human, которое должно быть boolean.
Даже модель, подчиняющаяся инструкциям в 99% случаев, при нескольких миллионах вызовов в день может генерировать десятки тысяч некорректных объектов из-за оставшегося 1%.
На каждом шаге генерации модель вычисляет logit для каждого токена словаря, более 100,000 значений, после чего softmax превращает их в распределение вероятностей.
Техника logit masking запрещает токены, устанавливая их logit в −∞ перед softmax; после экспоненты такой токен получает вероятность ровно 0 и не может быть выбран.