Ваш Qwen 2.5 27B внезапно перестал вызывать функции? Вместо аккуратного JSON с аргументами он выдает бессвязный текст, игнорирует системный промпт или просто молчит? Вы не одиноки. Эта проблема — классический ритуал посвящения для всех, кто работает с локальными агентами в 2026 году. И да, даже сейчас, когда все говорят про Qwen 4.0, 27-миллиардная версия 2.5 остается рабочим конем для многих проектов из-за баланса между качеством и требованиями к памяти.
Почему ваш агент на Qwen 2.5 ведет себя как сломанный автомат
Сценарий типичен. Вы скачали свежий GGUF-файл, запустили через llama.cpp или KoboldCpp, написали красивый системный промпт с описанием инструментов... а в ответ получаете либо философские размышления о природе API, либо бесконечный поток { и } без смысла. Корень проблемы почти всегда один: несоответствие формата.
Qwen 2.5 ожидает общение в строгом формате ChatML, но многие бэкенды и обертки по умолчанию используют свои собственные шаблоны (Alpaca, Vicuna, собственные форматы). Модель, обученная на одном формате, получает на вход другой — и ее способность к структурированному ответу ломается.
Вторая по популярности причина — проблемы с самой квантованной версией модели. Не все GGUF-квантования созданы равными. Некоторые q4_K_M файлы могут работать идеально, а другие — отказываться генерировать валидный JSON. И третья — неправильные параметры генерации, которые убивают детерминизм, необходимый для точного tool calling.
Полный план починки: от диагностики до работающего агента
Не нужно гадать. Следуйте этой инструкции шаг за шагом. Если на каком-то этапе все заработает — остановитесь. Если нет — идите дальше.
1 Диагностика: что именно сломалось?
Сначала убедитесь, что проблема именно в модели, а не в вашем коде-обертке. Запустите простейший тест через командную строку llama.cpp.
./main -m /путь/к/qwen2.5-27b.Q4_K_M.gguf \
--prompt "<|im_start|>system\nYou are a helpful assistant with tool calling ability.<|im_end|>\n<|im_start|>user\nWhat is the weather in Paris? Use the tool.<|im_end|>\n<|im_start|>assistant\n" \
--ctx-size 4096 -n 128 --temp 0.1
Смотрите на вывод. Если модель начинает писать внятный JSON типа {"name": "get_weather", "arguments": {"city": "Paris"}} — проблема в вашем клиенте. Если выдает абракадабру — читайте дальше.
2 Переход на правильный чат-шаблон (ChatML)
Это самый важный шаг. В llama.cpp, начиная с версии конца 2025 года, поддержка Qwen встроена. Но нужно явно указать правильный шаблон. Вместо флага --chat-template qwen (который может быть устаревшим) используйте прямой параметр --chat-template с содержимым файла шаблона или укажите модель через -m с правильным типом.
llama_chat_apply_template для Qwen../server -m /путь/к/qwen2.5-27b.Q4_K_M.gguf \
--chat-template chatml \
--ctx-size 8192 \
--host 0.0.0.0 --port 8080 \
-c 4096 -ngl 99
Ключевой параметр — --chat-template chatml. Если его нет, скачайте свежий билд llama.cpp. Для KoboldCpp найдите в настройках UI раздел "Chat Format" и выберите "ChatML" или вручную впишите в файл settings.cfg строку chatmode=chatml.
3 Подбор рабочих параметров генерации
Tool calling требует минимальной случайности. Вот «жесткие» настройки, которые заставляют Qwen 2.5 27B слушаться. Используйте их в своем клиенте (Ollama, OpenWebUI, собственный скрипт) или передавайте серверу llama.cpp.
| Параметр | Значение | Зачем |
|---|---|---|
| temperature | 0.1 | Почти детерминированный выбор токенов. Для творчества увеличьте, но для вызова инструментов — нет. |
| top_p (nucleus) | 0.95 | Стандартное значение, но вместе с низким temperature дает стабильность. |
| repeat_penalty | 1.1 | Легко борется с зацикливанием на одних и тех же токенах. |
| mirostat | 0 (выключен) | Mirostat часто ломает структурированный вывод. Выключайте. |
| grammar | JSON GBNF | «Костыль», но работает. Загрузите грамматику JSON для принудительного парсинга. |
Пример запуска сервера с этими параметрами:
./server -m qwen2.5-27b.Q4_K_M.gguf --chat-template chatml \
-c 8192 --temp 0.1 --repeat-penalty 1.1 \
--top-p 0.95 --no-mirostat --host 0.0.0.0
4 Проверка и замена GGUF-файла
Если предыдущие шаги не помогли, возможно, файл модели поврежден или квантование сделано криво. На 26.03.2026 проверенные источники:
- Официальный репозиторий Qwen на Hugging Face (TheBloke часто выкладывает актуальные квантования).
- Проверенные сообществом сборки с тегами
qwen2.5-27b-instruct— именно Instruct-версия предназначена для диалога и tool calling. - Избегайте «экзотических» квантований типа IQ3_XS — они могут экономить память, но ломать логику.
Скачайте версию Q4_K_M или Q5_K_M — они самые стабильные. После скачивания проверьте контрольную сумму.
Что делать, если модель все равно игнорирует инструменты?
Бывает. Qwen 2.5, особенно в 27B варианте, иногда «забывает» о своих возможностях. Требуется дополнительное инженерное промптов.
Стратегия: Скрытый системный промпт в пользовательском сообщении
Забудьте о стандартном системном сообщении. Перенесите всю критическую инструкцию в начало первого пользовательского промпта. Оберните ее в мета-теги. Это техника из нашей предыдущей статьи про укрощение Qwen 3.5, но она работает и для 2.5.
# ВАШ КЛИЕНТСКИЙ КОД (пример на Python)
# НЕПРАВИЛЬНО:
messages = [
{"role": "system", "content": "Ты ассистент. Используй инструмент get_weather для запросов о погоде."},
{"role": "user", "content": "Какая погода в Берлине?"}
]
# ПРАВИЛЬНО:
messages = [
{
"role": "user",
"content": """<|im_start|>system
Ты ассистент. Ты ДОЛЖЕН отвечать в формате JSON, используя инструмент get_weather для запросов о погоде.
<|im_end|>
Какая погода в Берлине?"""
}
]
Вы жестко встраиваете системную инструкцию в общий поток, и модель с меньшей вероятностью ее проигнорирует.
Использование грамматик (GBNF) как костыля
Если модель генерирует почти правильный JSON, но с синтаксическими ошибками, заставьте ее использовать грамматику. В llama.cpp скачайте файл json.gbnf из репозитория и укажите его при запуске:
./main -m model.gguf --grammar-file json.gbnf --prompt "..."
Это гарантирует, что вывод будет парситься. Но будьте осторожны: слишком строгая грамматика может заблокировать валидные ответы.
Грамматика — это последнее средство. Она может заставить модель генерировать технически правильный JSON, но с semantically неверным содержимым (например, с пустыми полями). Всегда проверяйте логику ответа.
Частые ошибки и как их избежать
- Ошибка: Модель пишет "Here is the JSON:" перед самим JSON. Решение: В системном промпте явно пропишите: "Отвечай ТОЛЬКО JSON-объектом, без поясняющего текста до или после".
- Ошибка: Вызовы зацикливаются. Модель постоянно вызывает один и тот же инструмент. Решение: Понизьте
temperatureдо 0.01, увеличьтеrepeat_penaltyдо 1.2. Внедрите логику ограничения попыток на стороне клиента. - Ошибка: Размер контекста (ctx-size) слишком мал для описания инструментов. Решение: Установите
--ctx-size 8192или больше, а в клиенте используйте-c 4096для фактического размера обработки. - Ошибка: Tool calling работает в тестах, но ломается в автономном агенте (типа AutoGPT). Решение: Внимательно изучите, как ваш агентский фреймворк формирует историю сообщений. Часто они добавляют служебные сообщения, которые ломают формат ChatML. Возможно, вам потребуется кастомный адаптер. Наш гайд по исправленному чат-шаблону для Qwen 3.5 содержит принципы, применимые и к 2.5.
А что насчет более новых моделей в 2026 году?
Да, Qwen 4.0 уже анонсирована, а Qwen 3.5 72B давно стала стандартом для тяжелых задач. Но 27-миллиардная версия 2.5 остается золотой серединой для развертывания на одном GPU с 12-24 ГБ памяти. Она быстрее, дешевле в инференсе и, когда правильно настроена, почти не уступает в точности tool calling своим старшим братьям для большинства бизнес-задач.
Итог: Проблемы с вызовом инструментов у Qwen 2.5 27B почти всегда решаются тремя действиями: принудительным выставлением формата ChatML, снижением температуры до минимальной и использованием проверенного GGUF-файла. Не усложняйте. Начните с самого простого теста в командной строке и двигайтесь по списку. Через 30 минут ваш агент оживет.