Почему Qwen 3.5 молча игнорирует ваши картинки
Вы скачали свежую Qwen 3.5, запустили через llama.cpp, отправили скриншот с просьбой «опиши что тут» – и получили ответ в духе «я текстовый ассистент». Знакомая история? Она бесит каждого второго, кто пытается заставить эту штуку видеть. А причина проста: по умолчанию конвейер обработки мультимодальных данных выключен. Модель загружена, но «глаза» у неё закрыты.
В феврале 2026 года ситуация стала проще, но неочевиднее. OpenCode – это по сути стандартизированный способ упаковки моделей и их конфигов для llama.cpp. Если брать модель с Hugging Face, там будет папка opencode с парой JSON-файлов. Именно они решают, будет ли модель принимать картинки или нет. Проблема в том, что эти файлы часто или криво сгенерированы, или отсутствуют для конкретной версии GGUF. Итог – вы часами ищете волшебный флаг, а его нет в CLI.
Не путайте: Qwen 3.5 – это семейство моделей. Для работы с изображениями вам нужна Qwen 3.5 VL (Vision Language) или её производные. Базовая Qwen 3.5 – только текст.
Готовое решение: JSON, который зажигает «лампочку» зрения
Всё сводится к одному файлу – config.json в папке OpenCode. Его структура обновилась к 2026 году, добавились поля для контроля препроцессинга и распределения слоёв. Ниже – рабочая конфигурация, которую я отладил на комбинации llama.cpp версии b3560 (актуально на 28.02.2026) и модели Qwen3.5-VL-7B-Instruct-Q4_K_M.gguf.
{
"opencode_schema_version": "2.1",
"model": {
"type": "gguf",
"path": "./models/Qwen3.5-VL-7B-Instruct-Q4_K_M.gguf",
"family": "qwen3.5_vl"
},
"vision": {
"enabled": true,
"mmproj": {
"required": true,
"path": "./models/qwen3.5-vl-7b-mmproj-q4_0.gguf"
},
"image_preprocess": {
"type": "clip",
"size": 448,
"mean": [0.48145466, 0.4578275, 0.40821073],
"std": [0.26862954, 0.26130258, 0.27577711]
},
"max_image_pixels": 1024 * 1024
},
"llama_cpp": {
"n_gpu_layers": 40,
"main_gpu": 0,
"tensor_split": null,
"flash_attn": true,
"cache_type": "f16",
"offload_kqv": true
},
"generation": {
"image_token": " ",
"prefix": "<|im_start|>user\n",
"suffix": "<|im_end|>\n<|im_start|>assistant\n"
}
}
Этот файл делает три ключевые вещи: включает vision-модуль, прописывает путь к проекционной матрице (mmproj) и задаёт параметры препроцессинга изображений под Qwen. Без mmproj модель не сконвертирует картинку в эмбеддинги, которые поймёт текстовый энкодер. Ошибка «Failed to load vision model» – как раз оттуда.
1 Качаем правильные файлы (не только модель)
Первая и главная ошибка – скачать только файл модели GGUF. Для многомодальной работы нужен второй файл: проекционная матрица (mmproj). Ищите её в том же репозитории на Hugging Face, где брали модель. Часто она называется *-mmproj-*.gguf. Без неё – как монитор без видеокарты.
# Пример скачивания полного комплекта для версии 7B
wget https://huggingface.co/user/Qwen3.5-VL-7B-Instruct-GGUF/resolve/main/Qwen3.5-VL-7B-Instruct-Q4_K_M.gguf
wget https://huggingface.co/user/Qwen3.5-VL-7B-Instruct-GGUF/resolve/main/qwen3.5-vl-7b-mmproj-q4_0.gguf
# Создаём структуру папок
mkdir -p ./models
mv *.gguf ./models/
2 Собираем или обновляем llama.cpp с vision-поддержкой
Ваш llama.cpp должен быть скомпилирован с поддержкой CLIP (это библиотека для обработки изображений). Если вы просто скачали бинарник год назад, велик шанс, что vision-функции отключены. Собираем из исходников.
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# На февраль 2026 актуальна ветка master с полной поддержкой Qwen 3.5 VL
make -j8 \
LLAMA_CLIP=1 \
LLAMA_CUBLAS=1 # Если у вас NVIDIA GPU
# Проверяем, что в помощи есть флаги для изображений
./bin/main --help | grep -i image
# Должно показать опции --image, --mmproj и т.д.
Если сборка вызывает проблемы (особенно с Intel Arc), есть детальный гайд по сборке llama.cpp с SYCL. Для облачных энтузиастов – инструкция по запуску в LXC-контейнере Proxmox.
3 Упаковываем конфиг и модель в OpenCode-структуру
OpenCode не требует установки. Это просто соглашение о расположении файлов. Создаём папку my_qwen_vision и кладём в неё наш config.json, поправив пути к моделям относительно этой папки.
mkdir my_qwen_vision
cd my_qwen_vision
# Копируем config.json сюда
# Копируем папку models с GGUF-файлами сюда же
# Структура должна получиться такой:
# my_qwen_vision/
# config.json
# models/
# Qwen3.5-VL-7B-Instruct-Q4_K_M.gguf
# qwen3.5-vl-7b-mmproj-q4_0.gguf
4 Запускаем с правильными флагами (ключевой момент)
Теперь запускаем llama.cpp, указав и модель, и mmproj, и изображение. Флаги важнее конфига, потому что конфиг – это для OpenCode-обёрток, а мы запускаем напрямую. Вот команда, которая точно работает:
cd path/to/llama.cpp
./bin/main -m ../my_qwen_vision/models/Qwen3.5-VL-7B-Instruct-Q4_K_M.gguf \
--mmproj ../my_qwen_vision/models/qwen3.5-vl-7b-mmproj-q4_0.gguf \
--image ../path/to/your/image.jpg \
-p "<|im_start|>user\nОпиши эту картинку<|im_end|>\n<|im_start|>assistant\n" \
-n 512 \
--temp 0.7 \
-ngl 40
Обратите внимание на промпт: он использует специфичные для Qwen тэги <|im_start|> и <|im_end|>. Если их нарушить, модель может запутаться. Флаг -ngl 40 загружает 40 слоёв на GPU (подбирайте под свой объём памяти).
Где спрятаны грабли: ошибки и как их обойти
Теория гладкая, практика – ухабистая. Вот что сломается в первую очередь и как починить.
| Ошибка | Причина | Решение |
|---|---|---|
error: failed to load vision model |
Не найден или не загружен mmproj файл. Или llama.cpp собран без LLAMA_CLIP. | Проверьте путь в --mmproj. Пересоберите llama.cpp с LLAMA_CLIP=1. |
error: tensor split does not match |
Конфликт настроек распределения слоёв между JSON и флагами CLI. | Уберите tensor_split из JSON или используйте только флаг --tensor-split в командной строке. Читайте про обновление llama.cpp для multi-GPU. |
| Модель отвечает, но не видит изображение | Неправильный промпт. Модель не получила токен или он не обработан. |
Используйте точный формат промпта из примера выше. В llama.cpp токен |
| Краш при загрузке с ошибкой CUDA | Не хватает VRAM для загрузки модели и проекционной матрицы. | Уменьшите -ngl (например, до 20). Или используйте квантованную модель (Q3_K_S). Гайд по квантованию здесь. |
Вопросы, которые вы зададите (и мои ответы)
Можно ли использовать эту настройку с другими многомодальными моделями, например, с Llama 4 16x17B?
Да, принцип тот же: нужна модель GGUF с поддержкой зрения и соответствующий mmproj файл. Но JSON-конфигурация будет отличаться (другие токены, параметры препроцессинга). Если решитесь на гиганта, вот инструкция для Llama 4 16x17B.
Какие форматы изображений поддерживаются?
На февраль 2026: JPEG, PNG, WEBP, BMP. Через библиотеку stb_image. Анимации (GIF) не поддерживаются – будет взят только первый кадр.
Почему бы не использовать Ollama? Там вроде проще.
Ollama – это удобно, но чёрный ящик. Когда что-то ломается (а с Qwen VL оно ломается, см. про галлюцинации tool-calls), вы не полезете в логи C++ кода. llama.cpp даёт полный контроль. И он быстрее на низкоуровневых оптимизациях.
Модель отвечает очень медленно. Что делать?
- Увеличьте
-ngl, чтобы больше слоёв было на GPU. - Используйте флаг
--flash-attnпри сборке (уже есть в конфиге). - Поэкспериментируйте с
--cache-type f16илиf8(новая фича 2026 года). - Если память ограничена, посмотрите в сторону Qwen-Image-Layered – это специализированная модель для работы с изображениями, может быть эффективнее.
Что делать, если всё равно не работает
Сначала упростите задачу. Запустите тестовую команду из папки llama.cpp на маленькой картинке и простейшем промпте. Отключите GPU (-ngl 0), чтобы исключить проблемы с видеопамятью. Если заработало – значит, проблема в конфигурации окружения, а не в модели.
Самый надёжный способ – собрать минимальный воспроизводимый пример на Python с использованием llama-cpp-python. Вот кусок кода, который точно скажет, видит ли модель картинку:
from llama_cpp import Llama
llm = Llama(
model_path="./models/Qwen3.5-VL-7B-Instruct-Q4_K_M.gguf",
n_gpu_layers=40,
vision_model_path="./models/qwen3.5-vl-7b-mmproj-q4_0.gguf"
)
response = llm.create_chat_completion(
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Опиши эту картинку"},
{"type": "image_url", "image_url": {"url": "file://./test.jpg"}}
]
}
]
)
print(response['choices'][0]['message']['content'])
Если и это падает – проблема в файлах модели. Скачайте их заново, проверьте контрольные суммы. И да, иногда помогает банальное обновление драйверов CUDA до версии, актуальной на февраль 2026 (подсказка: 12.6).
А если захотите не просто описывать, а генерировать изображения – это уже совсем другая история. Придётся смотреть в сторону Qwen-Image-2512. Но это уже для отдельного вечера с мощной видеокартой.