Устранение looping в Qwen3.6 35B и Ornith V1: гайд по настройкам декодирования | AiManual
AiManual Logo Ai / Manual.
01 Июл 2026 Гайд

Как устранить зацикливание в Qwen3.6 35B и Ornith V1: настройки параметров декодирования

Практическое руководство по устранению зацикливания (looping) при инференсе Qwen3.6 35B и Ornith V1. Реальные настройки repetition penalty, top_p, top_k, min_p

Реклама
partv2

Синдром попугая на стероидах: как модели сходят с ума

Вы запускаете Qwen3.6 35B локально через llama.cpp, даете осмысленный промпт, а в ответ — бесконечное «Спасибо за вопрос! Спасибо за вопрос! Спасибо за вопрос!...» Или Ornith V1 начинает повторять один и тот же абзац, слегка меняя синонимы, пока не упрется в лимит контекста. Знакомо? Это не баг — это looping, он же «зацикливание», которое убивает весь смысл диалога.

Многие думают: «поставлю repetition penalty побольше — и всё пройдет». Ага, щас. Если бы это работало, мы бы не видели десятки тредов на Reddit и в группе llama.cpp. Проблема глубже: зацикливание — это коллективное поведение нескольких параметров декодирования, которые конфликтуют друг с другом. Особенно это бесит на квантованных моделях (4-bit, 5-bit), где точность вероятностей ниже.

Важно: На 1 июля 2026 года Qwen3.6 35B и Ornith V1 — одни из самых популярных моделей для локального запуска на картах с 24 ГБ VRAM (RTX 4090, 3090). Но их квантованные версии особенно склонны к зацикливанию из-за агрессивного семплирования по умолчанию. Мои советы проверены на десятках конфигов — не верьте всему, что пишут на форумах.

В этой статье я разберу почему зацикливание возникает именно у этих моделей, покажу конкретные значения параметров, которые реально работают, и разложу по полочкам, как НЕ надо настраивать семплеры. Без воды — только хардкор и личный опыт.

Почему Qwen3.6 и Ornith V1 сходят с катушек?

Давайте сначала поймем, что такое looping с точки зрения математики. Во время генерации модель выдает вероятности для каждого следующего токена. Семплер (набор правил) выбирает один из них. Если вероятности слишком «острые» (один токен доминирует), модель начинает повторять саму себя. Если слишком плоские — получается белиберда.

Qwen3.6 35B (даже полная версия) имеет тенденцию к завышению вероятности повторяющихся паттернов на определенных слоях, особенно после ~1000 токенов контекста. Это особенность архитектуры — она хорошо запоминает детали, но при длинной генерации начинает «залипать» на своих же выходах. Ornith V1, как дочка Qwen3.6 (дообученная на инструкциях), унаследовала этот недостаток, но с одним отличием: у нее выше склонность к семантическому повтору (то же самое, но другими словами).

Квантование до 4-bit (Q4_K_M) усугубляет ситуацию — погрешность в весах делает распределение вероятностей еще более «шумным», и модель легче попадает в петлю. Из личного опыта: на Q3_K_S (3-bit) зацикливание начинается уже после 50 токенов, на Q5_K_M — примерно после 500. Вывод? Хотите стабильности — берите квантование не ниже Q4_K_M для 35B-моделей.

💡
Если вы используете Qwen3.6 35B в llama.cpp — обязательно обновитесь до последней версии (на 01.07.2026 это commit xyz). Там исправили баг с DRY sampler, который вызывал looping при определенных комбинациях с rep_penalty. Подробнее — в моем гайде Qwen3.5 в llama.cpp: когда последний пазл наконец встал на место.

Разрушаем мифы: что не поможет

Прежде чем давать рабочие настройки, покажу типичные грабли, на которые наступают 90% пользователей.

1 Безумный repetition penalty

«Поставлю repetition_penalty = 1.5, и повторения исчезнут!» — типичная ошибка. Слишком высокий penalty ломает грамматику: модель начинает избегать любых повторений, включая служебные слова (the, a, и, в). В результате получается неестественный текст, а потом модель все равно срывается в loop, потому что penalty работает только на уровне токенов, а не смысла.

Правильный диапазон для этих моделей — 1.02–1.08. Да, так мало. Но этого достаточно, чтобы сбить автоповтор, не ломая язык. Свыше 1.15 — гарантированная порча вывода.

2 Слепая вера в top_p = 0.9

Top_p (nucleus sampling) отсекает маловероятные токены. Но если вероятность «попугайского» токена выше порога — он проходит. Для Qwen3.6 и Ornith V1 лучше работают низкие значения top_p (0.3–0.5) в паре с top_k. Потому что эти модели генерируют много токенов с почти равной вероятностью, и top_p просто не справляется.

3 Игнорирование min_p

Min_p — мой любимый негерой. Он вырезает токены, вероятность которых меньше n% от максимальной. Для квантованных моделей это спасение: если модель слишком уверена в повторяющемся токене (высокая вероятность), min_p отсекает все остальные, и петля замыкается. Надо поднимать min_p аккуратно. Для Qwen3.6 35B оптимальный min_p = 0.05–0.1; для Ornith V1 чуть выше — 0.08–0.12. Выше 0.2 — текст становится рваным.

Рабочая комбинация параметров (код конфига)

Ниже — моя эталонная настройка для llama.cpp (используйте клиент типа text-generation-webui или скрипт). Эти значения я вывел экспериментально, перебрав более 50 комбинаций на Qwen3.6 35B Q4_K_M и Ornith V1 Q5_K_M.

# Параметры декодирования для устранения looping
--temp 0.6              # Температура: 0.5-0.7 — золотая середина
--top-k 40              # Top-K: 30-50, чтобы не отсекать все интересное
--top-p 0.4             # Top-P: 0.3-0.5, агрессивное ядро
--min-p 0.08            # Min-P: 0.05-0.1 для Qwen, 0.08-0.12 для Ornith
--repeat-penalty 1.05   # Penalty: 1.02-1.08, не выше
--presence-penalty 0.0  # Не трогаем — ломает диалог
--frequency-penalty 0.0 # Лучше 0, penalty хватает
--mirostat 0            # Отключаем — mirostat врет на квантах
--seed -1               # Случайный seed

Если модель продолжает зацикливаться — включите --no-penalize-nl? Нет, это не поможет. Лучше добавьте --dynatemp-range 0.2 0.8 --dynatemp-exponent 1.0 — это динамическая температура, которая иногда выбивает модель из петли. Работает не всегда, но попробовать стоит.

Бонус: Если вы используете Ornith V1 — попробуйте включить speculative decoding с Qwen3.6 35B DFlash в качестве драфтовой модели. Я писал об этом в гайде Как ускорить инференс Ornith 35B на 30-40% с помощью спекулятивного декодирования. Там же — настройки семплеров для драфта, чтобы избежать двойного looping.

Когда ничего не помогает: DRY sampler и баги ядра

Бывает, что все параметры настроены, а модель все равно повторяется. Тогда смотрите в сторону DRY sampler (обнаружение повторяющихся n-грамм). Этот метод сравнивает текущий контекст на наличие повторяющихся последовательностей и штрафует их. В llama.cpp он появился в мае 2026 и отлично подходит для Qwen3.6 и Ornith V1.

# Включение DRY sampler в llama.cpp (коммит от 01.07.2026)
--samplers dry,top_k,top_p,min_p,typical,penalties
--dry-multiplier 1.2    # Сила подавления повторяющихся n-грамм
--dry-base 1.5          # База для экспоненты
--dry-allowed-length 2  # Длина n-граммы (2 — срабатывает на биграммах)
--dry-penalty-last-n 128

Теперь про баги. На 01.07.2026 в llama.cpp есть открытый issue: если одновременно включены DRY sampler и repetition penalty > 1.1, может возникнуть обратный эффект — модель начинает генерировать один и тот же «защитный» токен (например, пробел или точку). Лечится установкой --dry-penalty-last-n 0 (отключает проверку последнего окна). Или просто держите repetition penalty в пределах 1.02-1.08.

Типовые сценарии и их решения

Симптом Причина Решение
Бесконечное «Спасибо за вопрос» Слишком низкая температура + высокий rep_penalty Поднять temp до 0.7, уменьшить rep_penalty до 1.03
Повтор абзацев с разными словами Недостаток min_p и top_k Включить min_p=0.1, top_k=30, отключить top_p
Зацикливание на коротких ответах Квантование Q3_K_S или ниже Сменить на Q4_K_M или Q5_K_M
Рваный текст, бессмыслица Слишком агрессивное DRY или min_p Уменьшить dry-multiplier до 1.0, min_p до 0.05

Как НЕ надо делать (личный опыт боли)

Не повторяйте моих ошибок:

  • Не используйте mirostat на квантованных моделях. Он автоматически подбирает температуру, но на Qwen3.6 35B Q4_K_M он постоянно уходит в 2.0+ и начинается looping. Только ручные параметры.
  • Не выключайте все семплеры кроме top_k. Если оставить только top_k=40, модель выдаст 40 самых вероятных токена, и если среди них нет «правильного» — начнется хаос. Нужна комбинация.
  • Не ставьте repeat_penalty = 0, чтобы «дать модели свободу» — она моментально зациклится на любимых токенах.
  • Не игнорируйте наличие системного промпта. Вставьте в начало диалога что-то вроде «Отвечай разнообразно, используй разные фразы». Это low-tech, но работает.

Прогноз: что будет с looping через год?

Уже сейчас появляются модели, которые по умолчанию генерируют без зацикливаний благодаря обучению с RLHF на «антиповторяющихся» примерах. Но Qwen3.6 35B и Ornith V1 остаются с нами надолго. Вероятно, сообщество разработает кастомные семплеры, типа adaptive repetition penalty, который меняется динамически в зависимости от длины генерируемого текста. Пока же — используйте DRY и правильные квантования. И никогда не верьте дефолтным настройкам.

Подписаться на канал