<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Opencode on DevOps Way - Практические гайды</title>
    <link>https://devopsway.ru/tags/opencode/</link>
    <description>Recent content in Opencode on DevOps Way - Практические гайды</description>
    <image>
      <title>DevOps Way - Практические гайды</title>
      <url>https://devopsway.ru/images/devopsway-og.png</url>
      <link>https://devopsway.ru/images/devopsway-og.png</link>
    </image>
    <generator>Hugo -- 0.161.1</generator>
    <language>ru</language>
    <lastBuildDate>Sat, 23 May 2026 06:48:47 -0400</lastBuildDate>
    <atom:link href="https://devopsway.ru/tags/opencode/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Локальный AI-ассистент в терминале: гайд для DevOps-инженера (2026)</title>
      <link>https://devopsway.ru/posts/local-ai-devops-ollama-2026/</link>
      <pubDate>Fri, 22 May 2026 12:00:00 +0300</pubDate>
      <guid>https://devopsway.ru/posts/local-ai-devops-ollama-2026/</guid>
      <description>Какой CLI выбрать, какую модель поставить, как настроить – без облаков, без подписок, без зависимости от вендора. Реальные тесты на CPU и GPU.</description>
      <content:encoded><![CDATA[<p>В феврале Qwen Code выглядел как бесплатная альтернатива Claude Code. 15 апреля Alibaba <a href="https://github.com/QwenLM/qwen-code/issues/3203">закрыла бесплатный доступ</a>. Инструмент устарел за два месяца.</p>
<p>Это типичная проблема: привязка к одному вендору = риск. Сегодня бесплатно, завтра – нет. Поэтому перезапускаем тему с другим фокусом: <strong>tool-agnostic + model-agnostic</strong>. Выбираем CLI отдельно, модель отдельно, и собираем рабочий стек, который не сломается от решений чужого менеджмента.</p>
<hr>
<h2 id="часть-1-выбираем-cli">Часть 1: Выбираем CLI</h2>
<p>Три рабочих варианта на май 2026. Все – open-source, все работают с локальными моделями через Ollama.</p>
<h3 id="opencode--швейцарский-нож">OpenCode – швейцарский нож</h3>
<p><a href="https://opencode.ai/">OpenCode</a> – 161K+ звёзд на GitHub, 75+ провайдеров, MIT-лицензия. TypeScript-проект от Anomaly (SST) с терминальным TUI.</p>
<p><strong>Установка:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -fsSL https://opencode.ai/install <span class="p">|</span> bash
</span></span></code></pre></div><p><strong>Подключение к Ollama</strong> (<code>~/.config/opencode/opencode.jsonc</code> или <code>opencode.json</code> в корне проекта):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;$schema&#34;</span><span class="p">:</span> <span class="s2">&#34;https://opencode.ai/config.json&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;ollama&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;npm&#34;</span><span class="p">:</span> <span class="s2">&#34;@ai-sdk/openai-compatible&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;Ollama&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;options&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;baseURL&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434/v1&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="p">},</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;models&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;qwen3:14b&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;Qwen 3 14B&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&#34;gemma4:26b&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;Gemma 4 26B MoE&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>Плюсы:</strong> установка одной командой, переключение между облачными и локальными провайдерами одной командой (<code>/models</code>), MCP-серверы, tool calling, сессии с историей.</p>
<p><strong>Минусы:</strong> конфиг многословный, кривая вхождения чуть круче, чем у Aider.</p>
<p><strong>Кому:</strong> хочешь один инструмент на все случаи – и локальные модели, и Copilot, и Claude – через единый интерфейс.</p>
<h3 id="aider--ветеран-pair-programming">Aider – ветеран pair programming</h3>
<p><a href="https://aider.chat/">Aider</a> – 30K+ звёзд, Python, заточен под работу с git-репозиториями. Строит структурную карту кодовой базы, автоматически запускает линтер и тесты после каждого изменения.</p>
<p><strong>Установка:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m pip install aider-install <span class="o">&amp;&amp;</span> aider-install
</span></span></code></pre></div><p><strong>Подключение к Ollama:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">OLLAMA_API_BASE</span><span class="o">=</span>http://127.0.0.1:11434
</span></span><span class="line"><span class="cl">aider --model ollama_chat/qwen3:14b
</span></span></code></pre></div><p><strong>Плюсы:</strong> лучшая интеграция с git (автокоммиты, диффы), repo-map для больших проектов, автозапуск тестов после правок.</p>
<p><strong>Минусы:</strong> Python-зависимость, фокус на кодинге (не на DevOps-рутине), контекстное окно Ollama по умолчанию 4K – для больших проектов нужно вручную поднимать.</p>
<p><strong>Кому:</strong> основная задача – писать и рефакторить код в репозитории с тестами.</p>
<h3 id="qwen-code--всё-ещё-жив-локально">Qwen Code – всё ещё жив (локально)</h3>
<p><a href="https://github.com/QwenLM/qwen-code">Qwen Code</a> – облако мертво, но локальный режим через Ollama работает, как и раньше.</p>
<p><strong>Установка:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm install -g @qwen-code/qwen-code@latest
</span></span></code></pre></div><p><strong>Подключение к Ollama</strong> (<code>~/.qwen/settings.json</code>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;modelProviders&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;openai&#34;</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;qwen3:8b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;Qwen3 8B (Ollama)&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;baseUrl&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434/v1&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}]</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;security&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;auth&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;selectedType&#34;</span><span class="p">:</span> <span class="s2">&#34;openai&#34;</span> <span class="p">}</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;qwen3:8b&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>Важно:</strong> Ollama не требует API-ключ, но Qwen Code всё равно его проверяет. Установите любое непустое значение:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">OPENAI_API_KEY</span><span class="o">=</span>ollama
</span></span></code></pre></div><p><strong>Плюсы:</strong> если уже настроен – продолжает работать, знакомый интерфейс.</p>
<p><strong>Минусы:</strong> зависимость от npm, будущее проекта туманно после закрытия free tier, меньше провайдеров, чем у OpenCode.</p>
<p><strong>Кому:</strong> уже пользуешься, лень мигрировать, всё работает.</p>
<h3 id="сравнительная-таблица-cli">Сравнительная таблица CLI</h3>
<table>
  <thead>
      <tr>
          <th></th>
          <th style="text-align: center">OpenCode</th>
          <th style="text-align: center">Aider</th>
          <th style="text-align: center">Qwen Code</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Язык</td>
          <td style="text-align: center">TypeScript</td>
          <td style="text-align: center">Python</td>
          <td style="text-align: center">Node.js</td>
      </tr>
      <tr>
          <td>GitHub stars</td>
          <td style="text-align: center">161K+</td>
          <td style="text-align: center">30K+</td>
          <td style="text-align: center">25K+</td>
      </tr>
      <tr>
          <td>Ollama</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">✅</td>
      </tr>
      <tr>
          <td>Tool calling</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">✅</td>
      </tr>
      <tr>
          <td>MCP-серверы</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">❌</td>
          <td style="text-align: center">✅</td>
      </tr>
      <tr>
          <td>Git-интеграция</td>
          <td style="text-align: center">базовая</td>
          <td style="text-align: center">лучшая</td>
          <td style="text-align: center">базовая</td>
      </tr>
      <tr>
          <td>Провайдеров</td>
          <td style="text-align: center">75+</td>
          <td style="text-align: center">20+</td>
          <td style="text-align: center">~10</td>
      </tr>
      <tr>
          <td>Установка</td>
          <td style="text-align: center">1 команда</td>
          <td style="text-align: center">pip</td>
          <td style="text-align: center">npm</td>
      </tr>
  </tbody>
</table>
<p><strong>Рекомендация:</strong> начинайте с <strong>OpenCode</strong> – максимальная гибкость, не привязан к экосистеме. Для code-heavy задач с git – <strong>Aider</strong>.</p>
<hr>
<h2 id="часть-2-выбираем-модель">Часть 2: Выбираем модель</h2>
<p>Критерий для DevOps-задач: tool calling + адекватное понимание bash/yaml/terraform/docker. Красивый бенчмарк на HumanEval вторичен – нам важнее, чтобы модель корректно вызывала инструменты и не галлюцинировала в командах.</p>
<h3 id="moe-модели--главный-выбор-для-cpu">MoE-модели – главный выбор для CPU</h3>
<p>MoE (Mixture of Experts) – архитектура, где из 30B параметров на каждый токен активируется только 3B. Это принципиально меняет расклад для CPU: вы получаете качество большой модели при скорости маленькой.</p>
<table>
  <thead>
      <tr>
          <th>Модель</th>
          <th style="text-align: center">Всего</th>
          <th style="text-align: center">Активных</th>
          <th style="text-align: center">RAM (Q4)</th>
          <th style="text-align: center">Tool calling</th>
          <th>Примечание</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Qwen 3.6 35B-A3B</strong></td>
          <td style="text-align: center">35B</td>
          <td style="text-align: center">3B</td>
          <td style="text-align: center">~21 GB</td>
          <td style="text-align: center">✅</td>
          <td>Свежая (апрель 2026), SWE-bench 73.4%</td>
      </tr>
      <tr>
          <td><strong>Qwen 3 30B-A3B</strong></td>
          <td style="text-align: center">30B</td>
          <td style="text-align: center">3B</td>
          <td style="text-align: center">~22 GB</td>
          <td style="text-align: center">✅</td>
          <td>Проверенная, хорошо документирована</td>
      </tr>
      <tr>
          <td><strong>Gemma 4 26B-A4B</strong></td>
          <td style="text-align: center">26B</td>
          <td style="text-align: center">4B</td>
          <td style="text-align: center">~20 GB</td>
          <td style="text-align: center">✅</td>
          <td>Google, Apache 2.0, 256K контекст</td>
      </tr>
      <tr>
          <td><strong>Qwen 3.5 397B-A17B</strong></td>
          <td style="text-align: center">397B</td>
          <td style="text-align: center">17B</td>
          <td style="text-align: center">~230 GB+</td>
          <td style="text-align: center">✅</td>
          <td>Флагман, нужна серверная машина</td>
      </tr>
  </tbody>
</table>
<p><strong>Qwen 3.6 35B-A3B</strong> – лучший выбор на сегодня для тех, у кого есть 20+ GB RAM. Специально обучена для agentic coding, tool calling из коробки, 73.4% на SWE-bench Verified – это уровень фронтирных моделей.</p>
<p><strong>Gemma 4 26B-A4B</strong> – альтернатива, если нужен длинный контекст (256K токенов) или предпочитаете Google-экосистему. Чуть больше активных параметров (4B vs 3B), но и чуть качественнее на некоторых задачах.</p>
<h3 id="dense-модели--когда-ram-ограничена">Dense-модели – когда RAM ограничена</h3>
<table>
  <thead>
      <tr>
          <th>Модель</th>
          <th style="text-align: center">Параметры</th>
          <th style="text-align: center">RAM (Q4)</th>
          <th style="text-align: center">Tool calling</th>
          <th style="text-align: center">Скорость CPU</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Qwen 3 14B</strong></td>
          <td style="text-align: center">14B</td>
          <td style="text-align: center">~10 GB</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">5–6 t/s</td>
      </tr>
      <tr>
          <td><strong>Qwen 3 8B</strong></td>
          <td style="text-align: center">8B</td>
          <td style="text-align: center">~5 GB</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">9–10 t/s</td>
      </tr>
      <tr>
          <td><strong>Gemma 4 E4B</strong></td>
          <td style="text-align: center">4.5B eff / 8B total</td>
          <td style="text-align: center">~5 GB</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">12–18 t/s</td>
      </tr>
      <tr>
          <td><strong>Qwen 3 4B</strong></td>
          <td style="text-align: center">4B</td>
          <td style="text-align: center">~3 GB</td>
          <td style="text-align: center">✅</td>
          <td style="text-align: center">16–18 t/s</td>
      </tr>
  </tbody>
</table>
<h3 id="модели-ловушки-не-работают-для-agentic-сценариев">Модели-ловушки (НЕ работают для agentic-сценариев)</h3>
<p>Грабли, чтобы не тратить вечер:</p>
<ul>
<li><strong><code>qwen3-coder:30b</code> (до ноября 2025)</strong> – шаблон Ollama был без tool calling, вызывал бесконечный retry в агентных CLI. Сейчас починено, но осадочек остался. Не путайте с <code>qwen3.6:35b-a3b</code>.</li>
<li><strong><code>phi4-mini</code></strong> – мусор вместо JSON в tool calls.</li>
<li><strong><code>qwen2.5-coder:32b</code></strong> – при tool calling возвращает JSON-строку в <code>content</code>, а не в поле <code>tool_calls</code>. CLI не парсит это как вызов инструмента.</li>
<li>Любая модель без native tool calling – просто не будет работать с агентными CLI.</li>
</ul>
<p><strong>Правило:</strong> перед установкой проверяйте на <a href="https://ollama.com/search?c=tools">ollama.com/search?c=tools</a>, есть ли у модели тег <code>tools</code> в capabilities. Но тег – необходимое, но не достаточное условие: <code>phi4-mini</code> имеет тег <code>tools</code>, а tool calls всё равно сломаны.</p>
<hr>
<h2 id="часть-3-матрица-железо--модель--cli">Часть 3: Матрица «Железо → Модель → CLI»</h2>
<h3 id="по-доступной-ram">По доступной RAM</h3>
<table>
  <thead>
      <tr>
          <th style="text-align: center">RAM</th>
          <th>Модель</th>
          <th>Команда установки</th>
          <th>Чего ожидать</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center"><strong>8 GB</strong></td>
          <td>Qwen 3 4B (Q4)</td>
          <td><code>ollama run qwen3:4b</code></td>
          <td>~17 t/s, простые задачи</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>16 GB</strong></td>
          <td>Qwen 3 8B (Q4)</td>
          <td><code>ollama run qwen3:8b</code></td>
          <td>~9 t/s, золотая середина</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>24 GB</strong></td>
          <td>Gemma 4 26B-A4B (Q4)</td>
          <td><code>ollama run gemma4:26b</code></td>
          <td>MoE, ~16 t/s, 20 GB RAM, лучшее качество</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>24 GB</strong></td>
          <td>Qwen 3 30B-A3B (Q4)</td>
          <td><code>ollama run qwen3:30b-a3b</code></td>
          <td>MoE, ~20 t/s, 22 GB RAM</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>32+ GB</strong></td>
          <td>Qwen 3.6 35B-A3B (Q4)</td>
          <td><code>ollama run qwen3.6:35b-a3b</code></td>
          <td>~21 GB RAM, лучший MoE</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>32+ GB</strong></td>
          <td>Qwen 3 14B (Q8)</td>
          <td><code>ollama run qwen3:14b</code></td>
          <td>Dense, стабильный, ~5 t/s</td>
      </tr>
  </tbody>
</table>
<h3 id="по-задаче">По задаче</h3>
<table>
  <thead>
      <tr>
          <th>Задача</th>
          <th>Модель</th>
          <th>Почему</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>«Покажи порты / диски / процессы»</td>
          <td>Qwen 3 4B–8B</td>
          <td>Скорость важнее качества</td>
      </tr>
      <tr>
          <td>Написать bash-скрипт мониторинга</td>
          <td>Gemma 4 26B-A4B</td>
          <td>Компактный код без болтовни, MoE-скорость</td>
      </tr>
      <tr>
          <td>Разобрать Dockerfile / Compose</td>
          <td>Gemma 4 26B-A4B</td>
          <td>Длинный контекст, точные исправления</td>
      </tr>
      <tr>
          <td>Отладить Terraform / Ansible</td>
          <td>Gemma 4 26B-A4B или Qwen 3 14B+</td>
          <td>Gemma точнее в CIDR/синтаксисе</td>
      </tr>
      <tr>
          <td>Анализ логов (большой файл)</td>
          <td>Gemma 4 26B-A4B</td>
          <td>256K контекст</td>
      </tr>
      <tr>
          <td>systemd / конфиги</td>
          <td>Qwen 3 8B или Gemma 4 26B-A4B</td>
          <td>Обе справляются, 8B быстрее</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="часть-4-практическая-настройка-15-минут">Часть 4: Практическая настройка (15 минут)</h2>
<h3 id="шаг-1-ollama">Шаг 1: Ollama</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -fsSL https://ollama.com/install.sh <span class="p">|</span> sh
</span></span><span class="line"><span class="cl">ollama pull qwen3:30b-a3b     <span class="c1"># MoE, 18 GB – или qwen3:8b для слабого железа</span>
</span></span></code></pre></div><h3 id="шаг-2-поднимаем-контекстное-окно">Шаг 2: Поднимаем контекстное окно</h3>
<p>По умолчанию Ollama даёт модели 4K токенов контекста (на машинах с GPU &lt; 24 GB; с 24+ GB VRAM – автоматически 32K). Для агентной работы 4K мало – CLI отправляет системный промпт + историю + tool calls, и контекст кончается на первом же запросе.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Вариант 1: через переменную окружения (для systemd – в override)</span>
</span></span><span class="line"><span class="cl"><span class="nv">OLLAMA_CONTEXT_LENGTH</span><span class="o">=</span><span class="m">16384</span> ollama serve
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Вариант 2: внутри интерактивной сессии (REPL)</span>
</span></span><span class="line"><span class="cl">ollama run qwen3:30b-a3b
</span></span><span class="line"><span class="cl">&gt;&gt;&gt; /set parameter num_ctx <span class="m">16384</span>
</span></span></code></pre></div><p><strong>Важно:</strong> <code>/set parameter</code> работает только внутри REPL (после <code>&gt;&gt;&gt;</code>), не из командной строки.</p>
<p>Минимум – 16K. Если RAM позволяет – 32K.</p>
<h3 id="шаг-3-отключаем-thinking-опционально">Шаг 3: Отключаем thinking (опционально)</h3>
<p>MoE-модели Qwen по умолчанию «думают вслух» – генерируют блок <code>&lt;think&gt;...&lt;/think&gt;</code> перед ответом. На простых DevOps-командах это +3–5 секунд бессмысленного ожидания.</p>
<p><strong>Важно:</strong> в Ollama 0.24+ thinking вынесен в отдельное поле API. Старый трюк <code>/no_think</code> в промпте <strong>больше не работает</strong> – модель всё равно думает, только в скрытое поле, расходуя токены. Правильный способ – передать <code>&quot;think&quot;: false</code> в API-запросе.</p>
<p><strong>Внимание:</strong> <code>PARAMETER think false</code> в Modelfile <strong>не поддерживается</strong> (Ollama 0.24.0 вернёт <code>unknown parameter 'think'</code>). Thinking отключается только через API-запрос (<code>&quot;think&quot;: false</code>) или через шаблон с <code>/no_think</code> в Modelfile:</p>
<p><strong>Кастомный Modelfile (Qwen 3 30B-A3B без thinking):</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-dockerfile" data-lang="dockerfile"><span class="line"><span class="cl"><span class="k">FROM</span><span class="w"> </span><span class="s">qwen3:30b-a3b</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl">TEMPLATE <span class="s2">&#34;&#34;&#34;{{- range .Messages }}</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="o">{{</span>- <span class="k">if</span> eq .Role <span class="s2">&#34;system&#34;</span> <span class="o">}}</span>&lt;<span class="p">|</span>im_start<span class="p">|</span>&gt;system<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="o">{{</span> .Content <span class="o">}}</span>&lt;<span class="p">|</span>im_end<span class="p">|</span>&gt;<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="o">{{</span>- <span class="k">else</span> <span class="k">if</span> eq .Role <span class="s2">&#34;user&#34;</span> <span class="o">}}</span>&lt;<span class="p">|</span>im_start<span class="p">|</span>&gt;user<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="o">{{</span> .Content <span class="o">}}</span> /no_think&lt;<span class="p">|</span>im_end<span class="p">|</span>&gt;<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="o">{{</span>- <span class="k">else</span> <span class="k">if</span> eq .Role <span class="s2">&#34;assistant&#34;</span> <span class="o">}}</span>&lt;<span class="p">|</span>im_start<span class="p">|</span>&gt;assistant<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="o">{{</span> .Content <span class="o">}}</span>&lt;<span class="p">|</span>im_end<span class="p">|</span>&gt;<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="o">{{</span>- end <span class="o">}}</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="o">{{</span>- end <span class="o">}}</span>&lt;<span class="p">|</span>im_start<span class="p">|</span>&gt;assistant<span class="err">
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl">PARAMETER num_ctx <span class="m">16384</span><span class="err">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ollama create qwen3:30b-nothink -f Modelfile
</span></span></code></pre></div><p>Для рутинных задач разницы в качестве нет, а скорость – вдвое выше. CLI (Aider, OpenCode) могут передавать <code>think: false</code> через API, но если используете <code>ollama run</code> напрямую – nothink-вариант через Modelfile удобнее.</p>
<p><strong>Нюанс:</strong> даже с <code>think: false</code> модели Qwen 30B-A3B иногда «рассуждают вслух» прямо в ответе (не в <code>&lt;think&gt;</code> блоке, а в тексте). Gemma 4 26B-A4B этим не страдает – отвечает компактно и по делу.</p>
<h3 id="шаг-4-cli">Шаг 4: CLI</h3>
<p><strong>OpenCode:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -fsSL https://opencode.ai/install <span class="p">|</span> bash
</span></span><span class="line"><span class="cl">opencode
</span></span><span class="line"><span class="cl"><span class="c1"># В интерфейсе: /connect → Ollama → выбираем модель</span>
</span></span></code></pre></div><p><strong>Aider:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install aider-install <span class="o">&amp;&amp;</span> aider-install
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">OLLAMA_API_BASE</span><span class="o">=</span>http://127.0.0.1:11434
</span></span><span class="line"><span class="cl">aider --model ollama_chat/qwen3.6:35b-a3b-nothink
</span></span></code></pre></div><h3 id="шаг-5-проверяем">Шаг 5: Проверяем</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&gt; покажи топ-5 процессов по RAM
</span></span><span class="line"><span class="cl">&gt; какие порты слушают на этой машине
</span></span><span class="line"><span class="cl">&gt; напиши systemd unit для бэкапа PostgreSQL
</span></span></code></pre></div><p>Если модель корректно вызывает bash-команды и возвращает отформатированный результат – всё работает.</p>
<hr>
<h2 id="часть-5-cpu-vs-gpu--реальные-замеры">Часть 5: CPU vs GPU – реальные замеры</h2>
<p>Главный вопрос: «насколько терпимо на CPU?»</p>
<p>Замеры на Ryzen 9 7950X, 128 GB DDR5, RTX 3090 24 GB, Ollama 0.24.0. CPU-тесты с ограничением потоков через <code>num_thread</code> (8t ≈ i7, 4t ≈ i3/ноутбук). Thinking отключён (<code>/no_think</code>), генерация 200 токенов.</p>
<h3 id="результаты-ts--токенов-в-секунду-генерация">Результаты (t/s – токенов в секунду, генерация)</h3>
<table>
  <thead>
      <tr>
          <th>Модель</th>
          <th style="text-align: center">Тип</th>
          <th style="text-align: center">GPU</th>
          <th style="text-align: center">CPU 8t</th>
          <th style="text-align: center">CPU 4t</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Qwen 3 30B-A3B</strong></td>
          <td style="text-align: center">MoE</td>
          <td style="text-align: center">161</td>
          <td style="text-align: center"><strong>20.5</strong></td>
          <td style="text-align: center"><strong>21.1</strong></td>
      </tr>
      <tr>
          <td><strong>Gemma 4 26B-A4B</strong></td>
          <td style="text-align: center">MoE</td>
          <td style="text-align: center">138</td>
          <td style="text-align: center">15.5</td>
          <td style="text-align: center">15.6</td>
      </tr>
      <tr>
          <td><strong>Qwen 3 4B</strong></td>
          <td style="text-align: center">Dense</td>
          <td style="text-align: center">204</td>
          <td style="text-align: center">16.6</td>
          <td style="text-align: center">17.5</td>
      </tr>
      <tr>
          <td><strong>Qwen 3 8B</strong></td>
          <td style="text-align: center">Dense</td>
          <td style="text-align: center">133</td>
          <td style="text-align: center">9.1</td>
          <td style="text-align: center">9.3</td>
      </tr>
      <tr>
          <td><strong>Qwen 3 14B</strong></td>
          <td style="text-align: center">Dense</td>
          <td style="text-align: center">82</td>
          <td style="text-align: center">5.4</td>
          <td style="text-align: center">5.3</td>
      </tr>
  </tbody>
</table>
<p>Ключевое наблюдение: <strong>MoE 30B-A3B на CPU быстрее, чем dense 4B</strong> – 20+ t/s против 17 t/s. При этом качество на уровне 30B-модели. Gemma 4 26B-A4B чуть медленнее (15.5 t/s), но всё равно быстрее dense 14B и близка к dense 8B – при значительно более высоком качестве. Это главный аргумент за MoE на CPU-only машинах.</p>
<p><strong>5–20 t/s на CPU</strong> – вполне рабочая скорость. Для простых команд ответ приходит за 3–5 секунд, для длинных скриптов – 20–30 секунд. GPU ускоряет в 8–15x, но CPU – не «мучение», а адекватный вариант.</p>
<p><strong>Почему 4 потока ≈ 8 потоков?</strong> Генерация токенов – это bandwidth-bound задача (чтение весов из RAM), а не compute-bound. Скорость определяется пропускной способностью памяти, не числом ядер. На DDR5 разница между 4 и 8 потоками минимальна.</p>
<p><strong>Вывод:</strong> MoE 30B-A3B на CPU – лучший выбор по соотношению качество/скорость. Gemma 4 26B-A4B – отличная альтернатива с 256K контекстом и 16 t/s на CPU. Dense 8B – для тех, кому не хватает RAM на MoE.</p>
<hr>
<h2 id="часть-6-качество-на-devops-задачах--тест-на-практике">Часть 6: Качество на DevOps-задачах – тест на практике</h2>
<p>Скорость – это хорошо, но генерирует ли модель рабочий код? Прогнали 5 типовых DevOps-задач через все три модели, <strong>по 3 прогона каждая</strong> (thinking отключён через API <code>think: false</code>, <code>temperature: 0.1</code>, Ollama 0.24.0, RTX 3090):</p>
<table>
  <thead>
      <tr>
          <th>Тест</th>
          <th style="text-align: center">qwen3:8b</th>
          <th style="text-align: center">qwen3:30b-a3b</th>
          <th style="text-align: center">gemma4:26b</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Bash-скрипт мониторинга диска</td>
          <td style="text-align: center">PASS 3/3 (110 tok)</td>
          <td style="text-align: center">PARTIAL 2/3, RAMBLE 3/3</td>
          <td style="text-align: center"><strong>PASS 3/3</strong> (101 tok)</td>
      </tr>
      <tr>
          <td>Починить Dockerfile (3 бага)</td>
          <td style="text-align: center"><strong>3/3</strong> fix, 3/3 consistent</td>
          <td style="text-align: center">0–2/3, RAMBLE 3/3</td>
          <td style="text-align: center"><strong>3/3</strong> fix, 3/3 consistent</td>
      </tr>
      <tr>
          <td>Объяснить K8s StatefulSet</td>
          <td style="text-align: center">4/4 3/3 consistent</td>
          <td style="text-align: center">4/4 но RAMBLE 3/3</td>
          <td style="text-align: center"><strong>4/4</strong> 3/3 consistent</td>
      </tr>
      <tr>
          <td>systemd unit (6 критериев)</td>
          <td style="text-align: center">5/6 – <strong>BUG <code>on_failure</code></strong> 3/3</td>
          <td style="text-align: center">6/6, RAMBLE 3/3</td>
          <td style="text-align: center"><strong>6/6</strong> 3/3 consistent</td>
      </tr>
      <tr>
          <td>Найти баг в Terraform CIDR</td>
          <td style="text-align: center">PASS concise 3/3</td>
          <td style="text-align: center">PASS verbose, RAMBLE 3/3</td>
          <td style="text-align: center"><strong>PASS concise</strong> 3/3</td>
      </tr>
  </tbody>
</table>
<p><strong>RAMBLE</strong> = модель «думает вслух» прямо в ответе (не в <code>&lt;think&gt;</code> блоке), тратит 500–1024 токена на рассуждения вместо кода.</p>
<p><strong>Выводы (подтверждены 3x AB):</strong></p>
<ul>
<li><strong>Gemma 4 26B-A4B</strong> – лидер: 5/5 тестов PASS, 0 ramble, компактные ответы (53–130 tok), 100% consistency. Лучший systemd (<code>network-online.target</code>), лучший Dockerfile (<code>--no-cache-dir</code>).</li>
<li><strong>Qwen 3 8B</strong> – хорошая: 5/5 PASS, 0 ramble, но стабильный баг в systemd (<code>on_failure</code> вместо <code>on-failure</code> – воспроизводится 3/3).</li>
<li><strong>Qwen 3 30B-A3B</strong> – быстрая (20 t/s на CPU), но проблемная: <strong>RAMBLE 15/15 прогонов</strong> (100%). Даже с <code>think: false</code> модель пишет рассуждения в content, расходуя токены. На Dockerfile – нестабильна (0–2/3 fix из 3 багов). Для агентных CLI это критично: CLI парсит ответ и ожидает код, а получает текст.</li>
</ul>
<hr>
<h2 id="часть-7-грабли-и-лайфхаки">Часть 7: Грабли и лайфхаки</h2>
<h3 id="контекстное-окно--враг-номер-один">Контекстное окно – враг номер один</h3>
<p>На CPU-only машинах Ollama по умолчанию ставит контекст в 4K токенов (с GPU 24+ GB – автоматически 32K). 4K – это мало. Модель просто забывает начало разговора. Симптом: на третьем вопросе в сессии ответы становятся неадекватными. Лечение: <code>OLLAMA_CONTEXT_LENGTH=16384</code> или <code>num_ctx 16384</code> в Modelfile.</p>
<h3 id="tool-calling-не-работает">Tool calling не работает?</h3>
<ol>
<li>Проверьте, что модель поддерживает tools (на странице Ollama в capabilities должен быть тег <code>tools</code>)</li>
<li>Увеличьте <code>num_ctx</code> – маленький контекст = обрезанные tool calls</li>
<li>Попробуйте без thinking mode – <code>&lt;think&gt;</code> блоки иногда ломают парсинг tool calls в CLI</li>
</ol>
<h3 id="mcp-серверы">MCP-серверы</h3>
<p>Работают в OpenCode и Qwen Code. Aider пока не поддерживает MCP. Если нужен доступ к файловой системе, GitHub, или кастомным API через MCP – выбирайте OpenCode.</p>
<h3 id="память-при-moe">Память при MoE</h3>
<p>MoE-модели загружают <strong>все</strong> параметры в RAM, хотя активируют малую часть. По данным <code>ollama ps</code>: Qwen 3 30B-A3B – 22 GB, Gemma 4 26B-A4B – 20 GB (с контекстом 32K). Если у вас 16 GB RAM – MoE не влезет, берите dense Qwen 3 8B (~5 GB).</p>
<hr>
<h2 id="итог">Итог</h2>
<table>
  <thead>
      <tr>
          <th>Что</th>
          <th>Рекомендация</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>CLI</strong></td>
          <td>OpenCode (универсал) или Aider (code + git)</td>
      </tr>
      <tr>
          <td><strong>Модель, GPU</strong></td>
          <td>Gemma 4 26B-A4B или Qwen 3.6 35B-A3B</td>
      </tr>
      <tr>
          <td><strong>Модель, CPU, 32 GB RAM</strong></td>
          <td>Gemma 4 26B-A4B (лучшее качество на DevOps-задачах) или Qwen 3.6 35B-A3B</td>
      </tr>
      <tr>
          <td><strong>Модель, CPU, 24 GB RAM</strong></td>
          <td>Qwen 3 30B-A3B (MoE) – 20 t/s, быстрее dense 8B</td>
      </tr>
      <tr>
          <td><strong>Модель, CPU, 16 GB RAM</strong></td>
          <td>Qwen 3 8B (MoE-модели требуют 20+ GB – не влезут)</td>
      </tr>
      <tr>
          <td><strong>Модель, CPU, 8 GB RAM</strong></td>
          <td>Qwen 3 4B</td>
      </tr>
      <tr>
          <td><strong>Минимальный старт</strong></td>
          <td><code>ollama pull qwen3:8b &amp;&amp; aider --model ollama_chat/qwen3:8b</code></td>
      </tr>
  </tbody>
</table>
<p>Главный принцип: <strong>CLI и модель – независимые слои</strong>. Alibaba закроет Qwen Code – переключитесь на OpenCode за 5 минут. Qwen-модель станет хуже – смените на Gemma 4. Ничего не ломается, данные не теряются.</p>
<hr>
<p>Telegram: <a href="https://t.me/DevITWay">@DevITWay</a>
Сайт: <a href="https://devopsway.ru/">devopsway.ru</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
