Бесконечная болтовня Qwen 3.5: когда модель не знает, когда остановиться
Запускаешь Qwen 3.5 9B на своем Mac, задаешь простой вопрос, а она... думает. И думает. И продолжает думать. Токены льются рекой, заполняя контекстную память, пока не упрешься в лимит или пока не надоест смотреть на этот поток сознания. Знакомо? Это классическая проблема "infinite thinking", которая с марта 2025 года мучает владельцев Mac с Apple Silicon, использующих GGUF-версии модели.
Проблема не в том, что модель глупая. Qwen 3.5 9B — отличная небольшая модель для локального использования. Проблема в том, как она упакована для metal_unified бэкенда llama.cpp и как Hugind (или другой фронтенд) интерпретирует ее токены завершения.
Актуальность на 05.03.2026: Проблема сохраняется даже в последних GGUF-квантованиях Qwen 3.5 9B от TheBloke. Фикс требует ручной настройки, так как автоматические пресеты часто ошибаются с токенами стоп-последовательностями для этой конкретной архитектуры.
1 Почему Qwen 3.5 зацикливается на Mac?
Корень зла — в несовершенной передаче параметров генерации между слоями софта. Когда ты используешь Hugind (или LM Studio, или другую оболочку над llama.cpp), она создает конфигурационный YAML-файл. Для большинства моделей хватает стандартных пресетов. Но Qwen 3.5 использует нестандартные токены завершения, которые llama.cpp на metal_unified бэкенде иногда игнорирует.
Вот что происходит под капотом:
- Модель генерирует токен
<|endoftext|>как сигнал завершения - metal_unified бэкенд llama.cpp его не распознает как стоп-токен
- Hugind продолжает ждать новых токенов
- Модель, видя, что генерация продолжается, выдает следующий наиболее вероятный токен
- Процесс повторяется до заполнения контекста
Похожие проблемы встречались и с другими моделями — например, с Nemotron Nano 3, о чем мы уже писали. Но у Qwen своя специфика.
2 Подготовка: что нужно иметь перед началом
Не пытайся исправить это через настройки интерфейса Hugind. Они не дадут нужной глубины контроля. Тебе понадобится:
- Mac с Apple Silicon (M1, M2, M3, M4 — не важно)
- Установленный Homebrew (если нет —
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)") - Сама модель в GGUF формате. Рекомендую последнюю квантованную версию от TheBloke с Hugging Face. Например,
qwen2.5-9b-instruct-q4_K_M.gguf(на 05.03.2026 актуальна версия Qwen 2.5, но проблема та же). - Hugind установленный через brew или скачанный с официального сайта
Важно: Если у тебя уже стоит Qwen 3.5 (не 2.5) — процесс идентичен. Разница только в названии файлов. На 2026 год многие продолжают использовать Qwen 3.5 для специфических задач, где ее 9B-версия показывает лучшую производительность на ограниченном железе.
3 Шаг 1: Находим конфигурационные файлы Hugind
Hugind хранит настройки моделей в YAML-файлах. Их расположение зависит от способа установки:
# Если установлен через Homebrew
cd ~/Library/Application\ Support/Hugind/models/
# Если standalone версия
cd ~/.hugind/models/
# Или ищи через Finder
open ~/Library/Application\ Support/Hugind
В этой директории ты найдешь подпапки для каждой загруженной модели. Нас интересует папка с именем, похожим на qwen2.5-9b-instruct-q4_K_M или qwen-3.5-9b-instruct.
4 Шаг 2: Редактируем или создаем config.yaml
В папке модели должен быть файл config.yaml. Если его нет — создай. Вот как выглядит стандартный конфиг, который создает Hugind:
model: qwen2.5-9b-instruct-q4_K_M.gguf
context_length: 8192
gpu_layers: 35
batch_size: 512
threads: 0
metal: true
temperature: 0.7
top_p: 0.9
top_k: 40
repeat_penalty: 1.1
stop:
Видишь проблему? Секция stop: пустая! Hugind не знает, какие токены использовать для остановки генерации для Qwen. Вот почему модель болтает без остановки.
5 Шаг 3: Правильный config.yaml для Qwen 3.5/2.5
Замени содержимое файла на это (или отредактируй существующий):
model: qwen2.5-9b-instruct-q4_K_M.gguf
context_length: 8192
gpu_layers: 35
batch_size: 512
threads: 0
metal: true
temperature: 0.7
top_p: 0.9
top_k: 40
repeat_penalty: 1.1
stop:
- "<|im_end|>"
- "<|endoftext|>"
- "<|im_start|>user"
- "\nuser:"
- "\nUser:"
- "\nUSER:"
- "\n\n"
reverse_prompt:
- "<|im_start|>user"
auto_prompt: true
multiline_input: false
draft: 8
draft_ctx: 64
Ключевые изменения:
- stop — список токенов и последовательностей, при обнаружении которых генерация останавливается.
<|im_end|>и<|endoftext|>— основные для Qwen. - reverse_prompt — когда модель встречает эту последовательность, она останавливается и ждет пользовательского ввода. Критически важно для интерактивного режима.
- draft и draft_ctx — параметры speculative decoding, который на Apple Silicon может дать прирост скорости, но иногда мешает. Если после фикса все еще есть проблемы — попробуй уменьшить draft до 0.
6 Шаг 4: Принудительный перезапуск Hugind и кэша
Hugind кэширует конфигурацию моделей. Простое редактирование файла может не сработать сразу. Нужно:
# Закрыть Hugind полностью (не просто свернуть)
# Удалить кэш
rm -rf ~/Library/Caches/com.hugind.app
# Если используешь standalone версию
rm -rf ~/.cache/hugind
# Запустить Hugind заново
После запуска выбери модель Qwen 3.5/2.5 в интерфейсе. Hugind должен перечитать конфиг.
Если не помогло: ядерные варианты
Иногда проблема глубже — в самом GGUF-файле или версии llama.cpp, которую использует Hugind. На 05.03.2026 актуальная версия llama.cpp — 2.9.1, но Hugind может использовать собственную сборку.
Вариант A: Запуск напрямую через llama.cpp
Установи llama.cpp через brew и запусти модель вручную:
brew install llama.cpp
cd ~/Downloads # или где лежит твой GGUF файл
llama-cli -m qwen2.5-9b-instruct-q4_K_M.gguf \
--color -c 8192 -b 512 --mlock -ngl 35 \
--reverse-prompt "<|im_start|>user" \
--stop "<|im_end|>" --stop "<|endoftext|>" \
-p "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n"
Если в llama-cli модель останавливается нормально — проблема в Hugind. Если нет — проблема в GGUF-файле.
Вариант B: Переконвертация модели
Скачай оригинальную модель в формате Hugging Face и конвертируй заново с явным указанием токенов:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make -j
# Конвертация с указанием токенов
python convert-hf-to-gguf.py \
~/models/Qwen2.5-9B-Instruct \
--outtype q4_K_M \
--vocab-type bpe \
--ctx 8192 \
--add-tokens "<|im_start|>,<|im_end|>,<|endoftext|>"
Это долгий процесс, но он гарантирует, что токены правильно прописаны в GGUF-заголовке.
Частые ошибки и их решения
| Ошибка | Причина | Решение |
|---|---|---|
| Модель останавливается после 2-3 слов | Слишком агрессивные стоп-токены или низкий top_p | Убери лишние стоп-последовательности, оставь только <|im_end|> и <|endoftext|> |
| Hugind не видит конфиг | Файл в неправильной кодировке или с синтаксической ошибкой | Проверь YAML на валидность: python -m py_compile config.yaml |
| Производительность упала после фикса | Слишком много GPU layers для твоей видеопамяти | Уменьши gpu_layers до 20-25 для 8GB RAM |
Важно: Если у тебя Mac с 8GB оперативной памяти, не пытайся загружать все слои на GPU. Qwen 3.5 9B в q4_K_M занимает ~5.5GB, плюс контекст. Оставь 2-3GB для системы. Иначе получишь swapping и тормоза.
А что с другими фронтендами?
Проблема не уникальна для Hugind. В LM Studio, OpenCode, даже в llama.cpp через долгую память настройки — везде нужно явно указывать стоп-токены для Qwen. Разница только в том, где хранится конфиг.
Например, в LM Studio нужно редактировать файл ~/.cache/lm-studio/models/config.json для конкретной модели. В OpenCode — через GUI, в разделе "Generation Parameters".
Итог: почему это все еще проблема в 2026?
Потому что экосистема локальных LLM фрагментирована. TheBloke квантует модели под общие пресеты, Hugind использует стандартные настройки для большинства архитектур, а Qwen — немного особенная. И пока кто-то явно не пропатчит инструменты под эту конкретную модель, ручная настройка остается единственным надежным способом.
Хорошая новость: для более новых моделей, таких как Qwen3 Next (MoE-архитектура), сообщество быстрее адаптирует инструменты. Но для проверенной временем Qwen 3.5 9B, которая идеально вписывается в 8-16GB памяти Mac, придется повозиться с YAML.
Последний совет: после фикса не забудь протестировать модель на серии вопросов. Если она все еще иногда уходит в бесконечные размышления — добавь "\n\n" в стоп-токены. Два переноса строки часто означают, что модель закончила мысль и начинает новую.
И да, если перейдешь на Qwen3 Next, проверь, не унаследовала ли она ту же проблему. В мире локальных LLM каждая модель — маленький снежинка со своими тараканами.