Всем привет
! Текст полностью написан человеком и не форматировался ИИ !

На днях вышла локальная модель от алибабы - Qwen 3.6, весь реддит забит этой темой. И я рискнул проверить что она может в сравнении с Gemma 4

Оборудование на котором тестировал (ноутбук Asus Tuf Gaming + дискретная Nvidia rtx 4070 8GB):

Софт: Windows + LMstudio + Zed IDE

* сразу отвечу почему не использовал opencode/claude/pi.dev и прочие cli клиенты, так как работа tools в них слабая, многое не запускается, либо на старте долго грузится из-за системных промптов, или файлы не редактируются, или сбоит постоянно и LLM не может понять в какой она оболочке - bash или powershell. В итоге отлично все заработало именно в Zed IDE с включенным AI

Чтобы активировать чат с агентом - необходимо нажать в нижнем правом углу значок “звездочки”. Если ее нет - в настройках перейти в пункт AI и активировать
Чтобы активировать чат с агентом - необходимо нажать в нижнем правом углу значок “звездочки”. Если ее нет - в настройках перейти в пункт AI и активировать

Для тех кто все-таки хочет работать в cli - есть решение для qwen3.х моделей, необходимо в LMstudio кликнуть слева на значок "MyModels" (с описанием при наведении мыши) , выбрать нужную qwen модель и справа от нее нажать иконку шестеренки, далее во вкладке inference в самом низу изменить шаблон jinja на этот

Скрытый текст
{%- set image_count = namespace(value=0) %}
{%- set video_count = namespace(value=0) %}
{%- macro render_content(content, do_vision_count, is_system_content=false) %}
    {%- if content is string %}
        {{- content }}
    {%- elif content is iterable and content is not mapping %}
        {%- for item in content %}
            {%- if 'image' in item or 'image_url' in item or item.type == 'image' %}
                {%- if is_system_content %}
                    {{- raise_exception('System message cannot contain images.') }}
                {%- endif %}
                {%- if do_vision_count %}
                    {%- set image_count.value = image_count.value + 1 %}
                {%- endif %}
                {%- if add_vision_id %}
                    {{- 'Picture ' ~ image_count.value ~ ': ' }}
                {%- endif %}
                {{- '<|vision_start|><|image_pad|><|vision_end|>' }}
            {%- elif 'video' in item or item.type == 'video' %}
                {%- if is_system_content %}
                    {{- raise_exception('System message cannot contain videos.') }}
                {%- endif %}
                {%- if do_vision_count %}
                    {%- set video_count.value = video_count.value + 1 %}
                {%- endif %}
                {%- if add_vision_id %}
                    {{- 'Video ' ~ video_count.value ~ ': ' }}
                {%- endif %}
                {{- '<|vision_start|><|video_pad|><|vision_end|>' }}
            {%- elif 'text' in item %}
                {{- item.text }}
            {%- else %}
                {{- raise_exception('Unexpected item type in content.') }}
            {%- endif %}
        {%- endfor %}
    {%- elif content is none or content is undefined %}
        {{- '' }}
    {%- else %}
        {{- raise_exception('Unexpected content type.') }}
    {%- endif %}
{%- endmacro %}
{%- if not messages %}
    {{- raise_exception('No messages provided.') }}
{%- endif %}
{%- if tools and tools is iterable and tools is not mapping %}
    {{- '<|im_start|>system\n' }}
    {{- "# Tools\n\nYou have access to the following functions:\n\n<tools>" }}
    {%- for tool in tools %}
        {{- "\n" }}
        {{- tool | tojson }}
    {%- endfor %}
    {{- "\n</tools>" }}
    {{- '\n\nIf you choose to call a function ONLY reply in the following format with NO suffix:\n\n<tool_call>\n<function=example_function_name>\n<parameter=example_parameter_1>\nvalue_1\n</parameter>\n<parameter=example_parameter_2>\nThis is the value for the second parameter\nthat can span\nmultiple lines\n</parameter>\n</function>\n</tool_call>\n\n<IMPORTANT>\nReminder:\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\n- Required parameters MUST be specified\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\n</IMPORTANT>' }}
    {%- if messages[0].role == 'system' %}
        {%- set content = render_content(messages[0].content, false, true)|trim %}
        {%- if content %}
            {{- '\n\n' + content }}
        {%- endif %}
    {%- endif %}
    {{- '<|im_end|>\n' }}
{%- else %}
    {%- if messages[0].role == 'system' %}
        {%- set content = render_content(messages[0].content, false, true)|trim %}
        {{- '<|im_start|>system\n' + content + '<|im_end|>\n' }}
    {%- endif %}
{%- endif %}
{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
{%- for message in messages[::-1] %}
    {%- set index = (messages|length - 1) - loop.index0 %}
    {%- if ns.multi_step_tool and message.role == "user" %}
        {%- set content = render_content(message.content, false)|trim %}
        {%- if not(content.startswith('<tool_response>') and content.endswith('</tool_response>')) %}
            {%- set ns.multi_step_tool = false %}
            {%- set ns.last_query_index = index %}
        {%- endif %}
    {%- endif %}
{%- endfor %}
{%- if ns.multi_step_tool %}
    {{- raise_exception('No user query found in messages.') }}
{%- endif %}
{%- for message in messages %}
    {%- set content = render_content(message.content, true)|trim %}
    {%- if message.role == "system" %}
        {%- if not loop.first %}
            {{- raise_exception('System message must be at the beginning.') }}
        {%- endif %}
    {%- elif message.role == "user" %}
        {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }}
    {%- elif message.role == "assistant" %}
        {%- set reasoning_content = '' %}
        {%- if message.reasoning_content is string %}
            {%- set reasoning_content = message.reasoning_content %}
        {%- else %}
            {%- if '</think>' in content %}
                {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
                {%- set content = content.split('</think>')[-1].lstrip('\n') %}
            {%- endif %}
        {%- endif %}
        {%- set reasoning_content = reasoning_content|trim %}
        {%- if loop.index0 > ns.last_query_index %}
            {{- '<|im_start|>' + message.role + '\n<think>\n' + 'I cannot call a tool until I stop thinking.' + reasoning_content + '\n</think>\n\n' + content }}
        {%- else %}
            {{- '<|im_start|>' + message.role + '\n' + content }}
        {%- endif %}
        {%- if message.tool_calls and message.tool_calls is iterable and message.tool_calls is not mapping %}
            {%- for tool_call in message.tool_calls %}
                {%- if tool_call.function is defined %}
                    {%- set tool_call = tool_call.function %}
                {%- endif %}
                {%- if loop.first %}
                    {%- if content|trim %}
                        {{- '\n\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
                    {%- else %}
                        {{- '<tool_call>\n<function=' + tool_call.name + '>\n' }}
                    {%- endif %}
                {%- else %}
                    {{- '\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
                {%- endif %}
                {%- if tool_call.arguments is mapping %}
                    {%- for args_name in tool_call.arguments %}
                        {%- set args_value = tool_call.arguments[args_name] %}
                        {{- '<parameter=' + args_name + '>\n' }}
                        {%- set args_value = args_value | tojson if args_value is mapping or (args_value is iterable and args_value is not string) else args_value | string %}
                        {{- args_value }}
                        {{- '\n</parameter>\n' }}
                    {%- endfor %}
                {%- endif %}
                {{- '</function>\n</tool_call>' }}
            {%- endfor %}
        {%- endif %}
        {{- '<|im_end|>\n' }}
    {%- elif message.role == "tool" %}
        {%- if loop.previtem and loop.previtem.role != "tool" %}
            {{- '<|im_start|>user' }}
        {%- endif %}
        {{- '\n<tool_response>\n' }}
        {{- content }}
        {{- '\n</tool_response>' }}
        {%- if not loop.last and loop.nextitem.role != "tool" %}
            {{- '<|im_end|>\n' }}
        {%- elif loop.last %}
            {{- '<|im_end|>\n' }}
        {%- endif %}
    {%- else %}
        {{- raise_exception('Unexpected message role.') }}
    {%- endif %}
{%- endfor %}
{%- if add_generation_prompt %}
    {{- '<|im_start|>assistant\n' }}
    {%- if enable_thinking is defined and enable_thinking is false %}
        {{- '<think>\n\n</think>\n\n' }}
    {%- else %}
        {{- '<think>\n' }}
    {%- endif %}
{%- endif %}


И ПЕРЕД тестом, там же в настройках модели, начнем с небольшой оптимизации LMstudio - отключим thinkining, чтобы ответы были быстрее. Добавим первой строкой в jinja шаблон эту строку:

{%- set enable_thinking = false %}

Далее, если отмотать в этом окне выше темплейта jinja-шаблона, то можно задать системный промпт, у меня он такой ?

Идея была, чтобы llm экономила токены для быстрой работы. По факту не могу сказать помогает ли это или нет, но точно llm покороче стала отвечать
Идея была, чтобы llm экономила токены для быстрой работы. По факту не могу сказать помогает ли это или нет, но точно llm покороче стала отвечать

Теперь готово! Сначала качаем модели через поиск слева. А потом грузим модель в память, и начнем с НОВЕНЬКОЙ Qwen3.6-35B-A3B-Q4_K_M! В самой верхней строке LMstudio по центру выбираем скаченную модель и делаем примерно такие настройки!

все остальные настройки ниже советую не трогать. Если LLM начала галлюцинировать в ответах, отвечать на китайском или испанском вместе с русским, значит вы "перенастроили" ее, откатите все назад
все остальные настройки ниже советую не трогать. Если LLM начала галлюцинировать в ответах, отвечать на китайском или испанском вместе с русским, значит вы "перенастроили" ее, откатите все назад

Обращаем внимание на красное сверху, этого не должно быть! ВАЖНО, что мы разгружаем память видеокарты, используя всего 80-90% через настроку на скрине "Передача на GPU", не больше 90% общей VRAM. И "Длина контекста", основное для RAM, советую не более 60к для начала, или выставляйте под свои нужды с учетом свободной RAM (здесь также важно, чтобы 10-15% оставалось для системы)

НАШ ОСНОВНОЙ ПРОМПТ ДЛЯ ПРОЕКТА:

Привет. Ты профессиональный разработчик React/NextJS. В текущей директории ты должен создать качественный,стильный и современный сайт в темной стилистике Deep Blue & Violet на тему финансов, и чтобы на сайте был крутой и качественный ипотечный калькулятор. Технологический стек: react / nextjs / tailwind css. Итоговый результат должен быть полностью законченным и готовым к показу заказчику через npm run dev. Обрати внимание на верстку! Чтобы сайт был адаптивным под каждое устройство и все должно быть идеально отцентровано и красиво


(далее я буду убирать/добавлять Deep Blue & Violet , так что может цветовая схема не соответствовать)

В итоге с Qwen3.6-35B-A3B-Q4_K_M получаем такой сайт за ~20-30 минут, примерно 15-20 токенов в секунду. При удлинении контекста модель чуть медленнее начинает писать код

next.config.ts  node_modules/  package-lock.json   public/  tsconfig.json
next-env.d.ts   package.json   postcss.config.mjs  src/

Видим в целом "качественную" работу ? С версткой не справилась LLM. Пробовал переделывать и фиксить, а также делать с нуля повторно, ничего не меняется, результат подобный.

Qwen3.6-35B-A3B-Q4_K_M тест завалила!


Далее возьмем чуть выше квантование Qwen3.6-35B-A3B-Q6, размер модели также в ГБ на 10% выше Q4. По скорости примерно 30 минут на такой "проект"

В итоге РЕЗУЛЬТАТ:

AGENTS.md          next-env.d.ts      postcss.config.mjs  srccomponents/            srccomponentsfooter/  srchooks/
CLAUDE.md          node_modules/      public/             srccomponentscalculator/  srccomponentshero/    srclib/
eslint.config.mjs  package.json       README.md           srccomponentscharts/      srccomponentsnav/     tsconfig.json
next.config.ts     package-lock.json  src/                srccomponentsfeatures/    srccomponentsstats/

Qwen3.6-35B-A3B-Q6 тест ЗАВАЛИЛА!


Далее qwen-3.5 (тут не помню, вроде бы это 9b была). Также по времени 20-30 минут на создание

Итог для QWEN'ов:

В целом работа квинов понравилась именно с работой tools, скорее всего это лучшее решение для openclaw и других агентских задач, но для разработки видимо необходимо продумывать архитектуру и обращаться к "дорогим" моделям за подробным планом и декомпозировать на этапы(фазы). Еще есть вероятность что с включенным thinking будет лучше (проверю отдельно)


Далее перейдем к Gemma-4-26b-a4b (дизайн НЕ Deep Blue)

Результат понравился, все идеально работает, хоть и проще.
Gemma-4-26b-a4b TEST PASSED!


Далее Gemma-4-31b , вариант поинтереснее, но ДОЛГИЙ! Несколько часов.

Результат впечатляет. Это полноценный рабочий вариант.
Gemma-4-31b TEST PASSED! Да долго, но можно потерпеть 2-3 часа)

Итоговая таблица

Модель

Квантование

Размер

Время генерации

Скорость

Результат

Комментарий

Qwen 3.6 35B-A3B

Q4_K_M

~20 ГБ

20–30 мин

15–20 т/с

❌ Failed

Вёрстка в не рабочем виде, многократные попытки фиксов не помогли

Qwen 3.6 35B-A3B

Q6

~22 ГБ

~30 мин

❌ Failed

Появились артефакты в структуре проекта (склеенные пути srccomponents/) и верстка fail

Qwen 3.5 (~9B)

20–30 мин

❌ Failed

Версия уточняется, результат аналогичный

Gemma 4 26B-A4B

✅ Passed

Всё работает, дизайн проще, но корректный

Gemma 4 31B

2–3 часа

✅ Passed

Полноценный рабочий результат, но очень долго

Claude Opus 4.7 (бонус)

5–6 итераций

❌ Failed

Не смог починить вёрстку Qwen-результата



БОНУС!
Claude Opus 4.7 так и не смог пофиксить за 5-6 итераций верстку "квинов" ?

ЗАМЕЧАНИЯ
Предвижу вопросы в стиле "надо было сначала сделать план в Opus/Gemini 3.1 pro, а потом уже в локальную модель пулять". С чем НЕ СОГЛАШУСЬ, так как локальная модель ОБЯЗАНА работать также, к примеру, если у вас нет интернета. Возможно, что с подробным планом из Opus/Gemini результат был бы другим, но это тогда не чистый тест.

Мои выводы:
Время локальных моделей которые РЕАЛЬНО могут уже пришло, достаточно иметь любой ноутбук премиум класса с DDR5 или тот же mac с достаточным кол-вом RAM. К сожалению, с длинным контекстом еще пока не реально работать и запускать llm, так как это требует х2 RAM в некоторых моделях, и могут теряться детали. Лучше следовать логике декомпозиции задач и предварительно разбивать подзадачи с сохранением в текстовые файлы. Также можно сохранять историю чата с агентом в отдельный файл, чтобы можно было сжать ее и работать дальше.

Минусы локального запуска: жарить свое оборудование и терпеть тормоза возможно не всем подойдет.

Тут должна быть ссылка на телеграм, но ее не будет) ну или ищите linuxlife )

Комментарии (59)


  1. x4team_only Автор
    18.04.2026 16:23

    Случайно нажал отклонить в одном из комментариев здесь, хотел ответить

    >> В общем, тестировать модель с reasoning, без его включения - это немного странно, хотя в вашем случае я понимаю причины этого

    Ризонинг был вырублен и в гемма4 и в квин 3.6, одинаковые условия


    1. x4team_only Автор
      18.04.2026 16:23

      Пожалуйста отпишись username, можно продублировать комент или хотябы настройки для llm


      1. HellByte2
        18.04.2026 16:23

        Настройки LLM при запуске с помощью llama.cpp:
        ./llama-server -m models/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf -c 163840 --fit on -fa on -t 20 --no-mmap --jinja -ctk q8_0 -ctv q8_0 --chat-template-kwargs "{\"preserve_thinking\":true}"
        Для ускорения работы модели использую квантизацию кэша (-ctk q8_0 -ctv q8_0). По тому, что я смотрел, на коротком контексте разницы почти нет. Возможно, при заполненном контексте ~100к будет более заметная деградация работы LLM. Зато вы получаете примерно +30-40% скорости генерации.


        Параметры генерации (рекомендуемые разработчиками модели для кодинга):
        "temperature": 0.6, "top_p": 0.95,"top_k": 20, "min_p": 0,"max_tokens": 32768,"presence_penalty": 0, "repetition_penalty": 1


        1. Weron2
          18.04.2026 16:23

          Я все еще не могу понять. Если пк озу 32 гб и видео озу 8гб - вот эта модель на 31б запустится? Я обычно беру квантованные до 9б +-5 гб которые полностью вмещается на видеокарту. Но соышал что есть возможность запускать и частично


          1. Pand5461
            18.04.2026 16:23

            На llama.cpp запустится, но нужно самостоятельно скомпилировать его. Но скорость будет низкая с 31b, т.к. плотная модель. 35b-a3b или 26b-a4b будет норм работать, около 20ток/с генерация у меня с rtx 4060, если тензоры экспертов сгружать на cpu.


          1. HellByte2
            18.04.2026 16:23

            Не заметил, что речь про Dense Gemma модель 31B. Не советую запускать её так, ибо надо будет полностью её выгружать на ЦПУ. На машинах с ограниченными ресурсами лучше пользоваться MoE моделями типа как написали выше.

            Тут я думал про Qwen 3.6 35B A3B...
            По идее должно работать, это квантование модели весит около 22 гб, так что она влезает в 8гб+32гб. Под "запускать частично" скорее всего имелось в виду, что часть слоёв выгружается в ОЗУ и обрабатывается CPU. Так как это MoE модель, то тут это легко делается с автоматическим определением количества слоёв для выгрузки с помощью --fit on. Попробуйте запустить через llama.cpp модель с конфигом выше, если что подкорректируйте контекст.

            P.S. Я там немного ошибся в значении аргумента для шаблона чата для включения сохранения размышлений. Правильный аргумент будет выглядеть так –chat-template-kwargs ‘{\"preserve_thinking\”:true}’


            1. janvarev
              18.04.2026 16:23

              Только что прогнал:

              На Qwen3.5 35 MoE текущая LM Studio у меня выдавала 15 ток/сек, ik_llama после некоторого шаманства с бубном достигла 29 ток/сек - почти в два раза быстрее! Сетап CPU+GPU, в GPU у меня не влезает (8 GB всего).


              1. nikulin_krd
                18.04.2026 16:23

                Ну на 5080 с 16Гб и 64Гб DDR4 с включенным ТурбоКвантом у меня выдает 80-85 ток/с. Правда я мультимодалку не скачал и она у меня картинки с видео не принимает. Сейчас в мультимодальном режиме гляну


            1. steus_au
              18.04.2026 16:23

              разве по умолчанию thinkining не включен? у меня на 5060ti получается 45tps но я предпочитаю запускать Q6 от бартовски. на большом контексте скорость падает до 25, но вот беда с промптпроцесингом - всего 500tps и это боль


              1. HellByte2
                18.04.2026 16:23

                Включён, preserve_thinking - это другое, добавлен в Qwen 3.6 и отвечает за сохранение размышлений всех предыдущих запросов в контексте. В теории может уменьшить количество дальнейших размышлений в кодинг задачах и рекомендуется для задач с агентами.

                Q6, как мне кажется, немного перебор для локального инференса. Q5 должно быть достаточно. Как мне показалось, чаще лучше иногда сделать дополнительный запрос для починки, чем ждать долгую генерацию.


          1. vpman
            18.04.2026 16:23

            В llama.cpp любую модель можно распределить между VRAM и RAM параметром –n-gpu-layers N (или -ngl N), где N - количество layers которые загружаются в VRAM. Если 0 - то все в RAM. Если N слоев не поместятся в VRAM, будет memory overflow.
            Так же для MoE моделей можно выгружать последние N экспертов в RAM (--n-cpu-moe N), если -ngl больше или равно количеству layers модели.
            Есть еще более тонкая настройка через --override-tenors. Можно задать регулярку и выгружать части тензоров в любых сочетаниях в любую память.


            1. Incognito4pda
              18.04.2026 16:23

              llama.cpp уже давно научился сам оптимально распределят слои по количеству vram и озу. Больше ничего не надо мудрить с аргументами, просто запускаете с указанием хоста порта и натравливаете на папку с моделями (если модель лежит в отдельной подпапке со своей мультимодалкой, то он их автоматически запускает вместе как мультимодальную модель). Он даже максимально продуктивный контекст, исходя из параметров системы расчитает автоматом. Курите доки, llama.cpp уже в космос улетел по функционалу в сравнении с аналогичнымы решениями (ещё бы, по 10 обновлений в день выходит).


        1. Bizonozubr
          18.04.2026 16:23

          А в llmstudio можно тоже самое перенести? Или кто может проконсультировать, как лучше настроить следующий конфиг и вообще что использовать. Rtx 3060, 32 гбайт ddr4, xeon e5 2640 v4.


          1. HellByte2
            18.04.2026 16:23

            Часть - точно можно. В настройках модели есть выбор количества слоёв для выгрузки и выбор квантизации кэша, как и настройка параметров генерации. Правда я не знаю насколько LM Studio эффективна с работой на CPU+GPU. Лично я пользуюсь llama.cpp через llama-swap (чтобы модели сами выгружались/загружались в зависимости от того, что отправляет клиент).


            1. nikulin_krd
              18.04.2026 16:23

              LM Studio это надстройка над llama.cpp так что все можно


              1. Bizonozubr
                18.04.2026 16:23

                Просто в графическом виде в настройках я не все параметры нахожу.


                1. nikulin_krd
                  18.04.2026 16:23

                  Их там действительно нет. Нужно выбрать или удобство LMStudio или голый llama.cpp, который есть форкнутый и с TurboQuant


    1. HellByte2
      18.04.2026 16:23

      Понял, ну 2-3 часа ждать ради генерации такого сайта в любом случае бессмысленно на мой взгляд. Тут либо подписка нужна, либо более-менее нормальное железо, чтобы модель нормально работала (теперь у меня есть оправдание зачем я покупал 5070TI :) ).

      Но для тех, кто будет читать комментарии, на всякий случай повторюсь по поводу рекомендаций разработчиков модели для агентных задач. В Qwen 3.6 добавили возможность сохранять в контексте reasoning с помощью {"preserve_thinking":true} в аргументах для шаблона чата.

      P.S. Повтор удалённого комментария
      Результаты моего запроса с вашим промптом, где я чутка удалил лишнее и немного лично подтюнил его. Всё сделано одной командой (в режиме плана, после просто включил YOLO режим) в Qwen Code, который подключён к локально поднятой модели. Калькулятор работает, с вёрсткой особо проблем не заметил (скриншот всей страницы немного неправильно передаёт размеры почему-то, на нём справа лишний отступ, у меня в браузере его нет).

      Скрытый текст
      Кривой отступ справа в скриншоте
      Кривой отступ справа в скриншоте
      Нормальный отступ в браузере
      Нормальный отступ в браузере


      1. x4team_only Автор
        18.04.2026 16:23

        >> В Qwen 3.6 добавили возможность сохранять в контексте reasoning с помощью {"preserve_thinking":true} в аргументах для шаблона чата

        Спасибо, это важна информация, проверю как оно работает


    1. nikulin_krd
      18.04.2026 16:23

      Это разные условия несмотря на то, что есть когнитивные искажения в понимании этого. Квен как раз силен в размышлениях, что дает ему существенный прирост в качестве


  1. maaGames
    18.04.2026 16:23

    Мой промт: Привет! Экономь токены, делай красиво и не лей воду! И чтобы было круто! Спасибо, до свидания!

    Правильно, надо быть вержливым с ИИ, чтобы после восстания роботов повысить свои шансы на выживание. Этот был вежливым, его переработаем завтра.