Ваша локальная LLM 495 раз подряд написала I will not use any tool. I will just reply?
Ваша локальная LLM 495 раз подряд написала I will not use any tool. I will just reply? У автора neuraldeep каждый десятый токен — фрагмент генерируемого текста — уходил на зацикленные ответы локальной LLM, большой языковой модели. Остановить повторы удалось небольшим гейтом на Go: прослойкой между шлюзом и движком vLLM, без изменений в самом движке. На лейне с контекстом 256 тысяч токенов запросы отваливались по таймауту, хотя GPU — графические процессоры — продолжали работать. В логах нашлись повторы до max_tokens, заданного предела генерации. За сутки набралось 250 ответов длиннее 20 тысяч токенов: в среднем 37 тысяч токенов и 9 минут на запрос. Мусор всё равно приходил клиенту — просто через десять минут. Идею помогли собрать сон и разговор о похожем вопросе на собеседовании с Серёгой. Условие было принципиальным: не трогать vLLM/sglang, движки запуска моделей. Как ловили циклы Защиту на уровне семплера, механизма выбора следующего токена, уже пробовали. Она сочла восемь одинаковых JSON-объектов — структурированных блоков данных — зацикливанием и испортила клиенту ответ. Гейт работает с потоком: даже запросы с stream=false отправляет движку со stream=true, то есть получает ответ частями, а клиенту собирает обычный ответ целиком. Это может ломать вызовы инструментов у клиентов с stream=false. По оценке автора, на момент публикации такие поломки составляли 0,002% от 238 тысяч запросов в сутки. После первых 3000 слов гейт начинает считать повторы фрагментов по 32 слова. Первые полтора дня, в начале месяца публикации, он только наблюдал. Что показали логи За сутки циклы суммарно занимали слоты обработки 25 часов. Уже после момента обнаружения модель успевала выдать ещё 5,8 млн токенов в сутки — около 10% всей генерации лейна. Из 587 пойманных циклов 482 дошли до max_tokens. В нормальных ответах фрагменты по 32 слова почти не повторялись, в циклах повторов было 16 и больше. Порог выбрали в пустом промежутке между этими группами. При обнаружении цикла гейт обрывает генерацию и незаметно перезапускает её с другим seed — начальным значением случайности — и presence_penalty, штрафом за повторное появление уже использованного содержания. До трёх попыток. За 16 дней объём мусора после обнаружения цикла снизился с 5,8 млн до десятков тысяч токенов в сутки. Перезапуск помог 3094 запросам, в 92% случаев — с первой попытки. Ещё 202 запроса получили обрезанный ответ. Вручную прочитали 510 оборванных гейтом ответов по JSON-схеме, заданной структуре данных: ложных срабатываний не нашли. Цена решения Обрезанный ответ получает причину завершения length, хотя лимит клиента не исчерпан. Как исправить это без поломок, автор ещё решает. В потоковом ответе среди рассуждений остаётся мусор от первой попытки. Подмена seed и presence_penalty лишает воспроизводимости по seed. Цикл обнаруживается в среднем на 30-й секунде, поэтому ответ задерживается; более ранняя остановка повышает риск ошибки. Отдельная серая зона — длинные ревью, которые ходят по кругу: начало полезное, хвост зациклен. Сейчас гейт учат сохранять начало без этого хвоста. Несмотря на компромиссы, автор оставил гейт: без него было хуже по всем перечисленным пунктам. Автор также собрал скилл для Claude Code и Codex — набор инструкций, по которому агент реализует гейт и подбирает порог по вашим логам. Материалы: — https://t.me/sergeinotevskii — GitHub — vakovalskii/loop-gate-skill: https://github.com/vakovalskii/loop-gate-skill Источник: https://t.me/neuraldeep/2370 #RealVibe #AI #AI_Инструменты