<?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>Server on Tarragon</title><link>https://tarrragon.github.io/blog/tags/server/</link><description>Recent content in Server on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 11 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/server/index.xml" rel="self" type="application/rss+xml"/><item><title>1.1 LM Studio：GUI 探索模型</title><link>https://tarrragon.github.io/blog/llm/01-local-llm-services/lm-studio/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/01-local-llm-services/lm-studio/</guid><description>&lt;p>LM Studio 跟 Ollama 一樣屬於&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/three-layer-architecture/" data-link-title="0.2 介面 / 伺服器 / 模型三層架構" data-link-desc="把任何本地 LLM 工具放回正確的層級，用三層心智模型看懂工具關係">本地推論伺服器層&lt;/a>、但定位完全不同：Ollama 是 CLI-first、LM Studio 是 GUI-first。它的核心承諾是「不打開終端機也能玩本地 LLM」、特別適合對 Hugging Face model hub（社群最大的開源模型 registry、提供權重檔下載與比較）、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a>等級、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding&lt;/a> 還在摸索階段的使用者。&lt;/p>
&lt;p>對寫 code 場景來說，LM Studio 不一定是日常主力（Ollama 通常更穩、生態更成熟），但它在「探索新模型」「視覺化看推論參數」「拿來教其他人本地 LLM」這幾個情境上明顯佔優勢。本章說明它的安裝、模型瀏覽器、server 模式啟用，以及跟 Ollama 並存的配置。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後，你應該能：&lt;/p>
&lt;ol>
&lt;li>安裝 LM Studio 並下載第一個模型。&lt;/li>
&lt;li>在 GUI 跟模型對話、調整參數。&lt;/li>
&lt;li>啟用 LM Studio 的 OpenAI 相容 server 模式。&lt;/li>
&lt;li>判斷你的工作流適不適合用 LM Studio 當主力。&lt;/li>
&lt;li>讓 LM Studio 與 Ollama 並存。&lt;/li>
&lt;/ol>
&lt;h2 id="安裝">安裝&lt;/h2>
&lt;p>LM Studio 是商業軟體（個人使用免費），不在 Homebrew core repo 裡。直接從官網下載：&lt;/p>
&lt;ol>
&lt;li>開 &lt;a href="https://lmstudio.ai">lmstudio.ai&lt;/a>&lt;/li>
&lt;li>下載 macOS（Apple Silicon）版本&lt;/li>
&lt;li>把 LM Studio.app 拖到 Applications&lt;/li>
&lt;li>第一次開啟會被 macOS 安全提示擋，到「系統設定 &amp;gt; 隱私權與安全性」放行&lt;/li>
&lt;/ol>
&lt;p>裝完開啟 app，會看到三個主要分頁：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Discover&lt;/strong>：搜尋 Hugging Face model hub、下載模型&lt;/li>
&lt;li>&lt;strong>My Models&lt;/strong>：管理已下載模型&lt;/li>
&lt;li>&lt;strong>Chat / Developer&lt;/strong>：跟模型對話、啟用 server&lt;/li>
&lt;/ul>
&lt;h2 id="下載第一個模型">下載第一個模型&lt;/h2>
&lt;p>Discover 分頁把 Hugging Face 模型搜尋、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化等級&lt;/a>挑選、記憶體適配判讀集中在同一個面板。在 Discover 分頁搜尋模型名（例如 &lt;code>gemma-4&lt;/code>）、會列出 Hugging Face 上的對應 repo：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>顯示資訊&lt;/th>
 &lt;th>解讀&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Repo 名稱&lt;/td>
 &lt;td>例如 &lt;code>bartowski/gemma-4-31b-it-GGUF&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>量化等級&lt;/td>
 &lt;td>Q4_K_M、Q5_K_M、Q8 等，列在每個檔案旁邊&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>檔案大小&lt;/td>
 &lt;td>直接顯示 GB 數，方便判斷是否塞得進記憶體&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>適配建議&lt;/td>
 &lt;td>LM Studio 會根據你 Mac 記憶體標「Recommended / Too Large」&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>選一個合適量化等級點下載。Q4_K_M 在多數場景是甜蜜點；32GB Mac 跑 31B Q5_K_M 也順暢。下載中可以繼續操作其他功能。&lt;/p>
&lt;p>陷阱：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Repo 來源要看&lt;/strong>。Hugging Face 上同一個模型有多個社群重新封裝的 repo。&lt;code>google/gemma-4-...&lt;/code> 是官方 repo；&lt;code>bartowski/...&lt;/code> 等是社群常見的高品質 quant 提供者。挑下載量高、最近更新的 repo 較安全。完整的供應鏈信任判讀（量化版本污染、權重完整性、registry 信任）見 &lt;a href="https://tarrragon.github.io/blog/llm/06-security/model-supply-chain-trust/" data-link-title="6.0 模型供應鏈與信任邊界" data-link-desc="個人 dev 用本地 LLM 時的模型權重來源信任：GGUF 完整性、Hugging Face / Ollama registry 信任、量化版本污染、檔案完整性檢查">6.0 模型供應鏈與信任邊界&lt;/a>。&lt;/li>
&lt;li>&lt;strong>不是所有檔案都要下載&lt;/strong>。一個 repo 可能有 5 ~ 10 個量化檔案，下載你選的那個就好。LM Studio UI 有時讓人誤以為要全選。&lt;/li>
&lt;li>&lt;strong>下載完成後檢查路徑&lt;/strong>：預設下載到 &lt;code>~/.cache/lm-studio/models/&lt;/code>、跟 Ollama 的 &lt;code>~/.ollama/models/&lt;/code> 分開。兩邊 model storage 各自獨立、想在兩個伺服器都用同一個模型要分別下載。&lt;/li>
&lt;/ol>
&lt;h2 id="chat-分頁與推論參數調整">Chat 分頁與推論參數調整&lt;/h2>
&lt;p>下載完到 Chat 分頁、左上角 model selector 選剛下載的模型。LM Studio 會把模型載入記憶體（30 ~ 60 秒）、然後就能對話。&lt;/p></description><content:encoded><![CDATA[<p>LM Studio 跟 Ollama 一樣屬於<a href="/blog/llm/00-foundations/three-layer-architecture/" data-link-title="0.2 介面 / 伺服器 / 模型三層架構" data-link-desc="把任何本地 LLM 工具放回正確的層級，用三層心智模型看懂工具關係">本地推論伺服器層</a>、但定位完全不同：Ollama 是 CLI-first、LM Studio 是 GUI-first。它的核心承諾是「不打開終端機也能玩本地 LLM」、特別適合對 Hugging Face model hub（社群最大的開源模型 registry、提供權重檔下載與比較）、<a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a>等級、<a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding</a> 還在摸索階段的使用者。</p>
<p>對寫 code 場景來說，LM Studio 不一定是日常主力（Ollama 通常更穩、生態更成熟），但它在「探索新模型」「視覺化看推論參數」「拿來教其他人本地 LLM」這幾個情境上明顯佔優勢。本章說明它的安裝、模型瀏覽器、server 模式啟用，以及跟 Ollama 並存的配置。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後，你應該能：</p>
<ol>
<li>安裝 LM Studio 並下載第一個模型。</li>
<li>在 GUI 跟模型對話、調整參數。</li>
<li>啟用 LM Studio 的 OpenAI 相容 server 模式。</li>
<li>判斷你的工作流適不適合用 LM Studio 當主力。</li>
<li>讓 LM Studio 與 Ollama 並存。</li>
</ol>
<h2 id="安裝">安裝</h2>
<p>LM Studio 是商業軟體（個人使用免費），不在 Homebrew core repo 裡。直接從官網下載：</p>
<ol>
<li>開 <a href="https://lmstudio.ai">lmstudio.ai</a></li>
<li>下載 macOS（Apple Silicon）版本</li>
<li>把 LM Studio.app 拖到 Applications</li>
<li>第一次開啟會被 macOS 安全提示擋，到「系統設定 &gt; 隱私權與安全性」放行</li>
</ol>
<p>裝完開啟 app，會看到三個主要分頁：</p>
<ul>
<li><strong>Discover</strong>：搜尋 Hugging Face model hub、下載模型</li>
<li><strong>My Models</strong>：管理已下載模型</li>
<li><strong>Chat / Developer</strong>：跟模型對話、啟用 server</li>
</ul>
<h2 id="下載第一個模型">下載第一個模型</h2>
<p>Discover 分頁把 Hugging Face 模型搜尋、<a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化等級</a>挑選、記憶體適配判讀集中在同一個面板。在 Discover 分頁搜尋模型名（例如 <code>gemma-4</code>）、會列出 Hugging Face 上的對應 repo：</p>
<table>
  <thead>
      <tr>
          <th>顯示資訊</th>
          <th>解讀</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Repo 名稱</td>
          <td>例如 <code>bartowski/gemma-4-31b-it-GGUF</code></td>
      </tr>
      <tr>
          <td>量化等級</td>
          <td>Q4_K_M、Q5_K_M、Q8 等，列在每個檔案旁邊</td>
      </tr>
      <tr>
          <td>檔案大小</td>
          <td>直接顯示 GB 數，方便判斷是否塞得進記憶體</td>
      </tr>
      <tr>
          <td>適配建議</td>
          <td>LM Studio 會根據你 Mac 記憶體標「Recommended / Too Large」</td>
      </tr>
  </tbody>
</table>
<p>選一個合適量化等級點下載。Q4_K_M 在多數場景是甜蜜點；32GB Mac 跑 31B Q5_K_M 也順暢。下載中可以繼續操作其他功能。</p>
<p>陷阱：</p>
<ol>
<li><strong>Repo 來源要看</strong>。Hugging Face 上同一個模型有多個社群重新封裝的 repo。<code>google/gemma-4-...</code> 是官方 repo；<code>bartowski/...</code> 等是社群常見的高品質 quant 提供者。挑下載量高、最近更新的 repo 較安全。完整的供應鏈信任判讀（量化版本污染、權重完整性、registry 信任）見 <a href="/blog/llm/06-security/model-supply-chain-trust/" data-link-title="6.0 模型供應鏈與信任邊界" data-link-desc="個人 dev 用本地 LLM 時的模型權重來源信任：GGUF 完整性、Hugging Face / Ollama registry 信任、量化版本污染、檔案完整性檢查">6.0 模型供應鏈與信任邊界</a>。</li>
<li><strong>不是所有檔案都要下載</strong>。一個 repo 可能有 5 ~ 10 個量化檔案，下載你選的那個就好。LM Studio UI 有時讓人誤以為要全選。</li>
<li><strong>下載完成後檢查路徑</strong>：預設下載到 <code>~/.cache/lm-studio/models/</code>、跟 Ollama 的 <code>~/.ollama/models/</code> 分開。兩邊 model storage 各自獨立、想在兩個伺服器都用同一個模型要分別下載。</li>
</ol>
<h2 id="chat-分頁與推論參數調整">Chat 分頁與推論參數調整</h2>
<p>下載完到 Chat 分頁、左上角 model selector 選剛下載的模型。LM Studio 會把模型載入記憶體（30 ~ 60 秒）、然後就能對話。</p>
<p>右側面板提供推論參數調整：</p>
<table>
  <thead>
      <tr>
          <th>參數</th>
          <th>預設</th>
          <th>何時調整</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Temperature</td>
          <td>0.7</td>
          <td>寫 code 建議 0.2 ~ 0.4 增加確定性</td>
      </tr>
      <tr>
          <td>Top-K</td>
          <td>40</td>
          <td>通常不動</td>
      </tr>
      <tr>
          <td>Top-P</td>
          <td>0.95</td>
          <td>通常不動</td>
      </tr>
      <tr>
          <td>Repeat Penalty</td>
          <td>1.1</td>
          <td>模型一直重複時微調</td>
      </tr>
      <tr>
          <td>Context Length</td>
          <td>模型支援的最大值</td>
          <td>短 context 任務可以調小省記憶體</td>
      </tr>
      <tr>
          <td>GPU Offload Layers</td>
          <td>Auto</td>
          <td>M-series Mac 留 Auto，Apple Silicon 是統一記憶體</td>
      </tr>
  </tbody>
</table>
<p>對寫 code 場景的關鍵調整是 <strong>Temperature 降到 0.2 ~ 0.4</strong>，可以讓回答更穩定、減少幻覺。預設 0.7 是給創意寫作的設定。</p>
<h2 id="speculative-decoding-設定面板">Speculative decoding 設定面板</h2>
<p>LM Studio 內建 <a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding</a> 的 UI 設定。在 model 載入頁面下方有 <strong>Draft Model</strong> 設定區：</p>
<ol>
<li>選 target model（主力，例如 Gemma 4 31B）</li>
<li>選 draft model（小模型，例如 Gemma 4 E4B）</li>
<li>啟用 speculative decoding</li>
</ol>
<p><a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">Speculative decoding</a> 真的加速需要 target 與 <a href="/blog/llm/knowledge-cards/drafter-model/" data-link-title="Drafter Model" data-link-desc="speculative decoding 中用來快速猜未來 token 的小模型">drafter</a> 用同一個 tokenizer。Gemma 4 31B 配 Gemma 4 E4B 可以工作；Gemma 4 配 Llama 因 tokenizer 不同無法配對。LM Studio UI 會自動過濾相容的 draft 候選。</p>
<p>跟 Ollama 比，LM Studio 的優勢是「能看到並調整每個推論細節」。劣勢是「Gemma 4 的官方 MTP drafter 整合不是一鍵」，要自己挑 draft model。多數使用者用 Ollama 的 <code>gemma4:31b-coding-mtp-bf16</code> 一行解決就好；想自己組合 target + drafter 的進階使用者選 LM Studio。</p>
<h2 id="啟用-server-模式">啟用 Server 模式</h2>
<p>Server 模式是 LM Studio 暴露 OpenAI 相容 API 的開關、預設關閉以避免 GUI 使用者誤開網路 port。讓 VS Code 等介面層接 LM Studio、要開 <strong>Local Server</strong> 模式：</p>
<ol>
<li>切到 Developer 分頁（左側 icon 像 <code>&lt;/&gt;</code>）</li>
<li>在頂部 model selector 選要 serve 的模型</li>
<li>點 <strong>Start Server</strong></li>
</ol>
<p>預設聽 <code>localhost:1234</code>，提供 OpenAI 相容 API。</p>
<p>驗證：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">curl http://localhost:1234/v1/chat/completions <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="s1">    &#34;model&#34;: &#34;gemma-4-31b-it&#34;,
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="s1">    &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;Hello&#34;}],
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="s1">    &#34;stream&#34;: false
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="s1">  }&#39;</span></span></span></code></pre></div><p>回應的 JSON 應該包含 <code>choices[0].message.content</code>。</p>
<p>陷阱：</p>
<ol>
<li><strong>Server 跟 GUI 同生命週期</strong>。關閉 LM Studio 視窗或登出 macOS 會停止 server、IDE 連不上。修法：日常常駐改用 <a href="/blog/llm/01-local-llm-services/ollama/#%e8%83%8c%e6%99%af%e5%b8%b8%e9%a7%90launchd-service" data-link-title="1.0 Ollama：主流推論伺服器" data-link-desc="一行 brew 裝完、ollama run 一鍵跑 Gemma 4 MTP、OpenAI 相容 API on localhost:11434">Ollama 的 launchd service 模式</a>、LM Studio 只在桌面 session 啟動探索。</li>
<li><strong>CORS 預設關</strong>。要從瀏覽器（如 Open WebUI 跑在不同 port）連，要去 Server 設定打開 CORS。</li>
<li><strong>Model name 不是 tag</strong>。LM Studio 在 API 用的 model name 是檔名（如 <code>gemma-4-31b-it</code>），跟 Ollama 的 tag 格式不同。</li>
</ol>
<h2 id="與-ollama-並存">與 Ollama 並存</h2>
<p>LM Studio（port 1234）跟 Ollama（port 11434）port 不同，可以同時跑。在 Continue.dev 的 <code>config.json</code> 可以同時列：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><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="ln"> 3</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Ollama: Gemma 4 31B MTP&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;ollama&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gemma4:31b-coding-mtp-bf16&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;LM Studio: Qwen3-Coder 30B&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;openai&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;qwen3-coder-30b&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:1234/v1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">      <span class="nt">&#34;apiKey&#34;</span><span class="p">:</span> <span class="s2">&#34;not-needed&#34;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>UI 上可以下拉切換 model。這個設計讓你「Ollama 跑主力、LM Studio 跑實驗模型」，兩條工作流不互相干擾。</p>
<h2 id="lm-studio-適合誰">LM Studio 適合誰</h2>
<table>
  <thead>
      <tr>
          <th>你是這樣的人</th>
          <th>LM Studio 適合度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GUI 派、不愛打 CLI</td>
          <td>高</td>
      </tr>
      <tr>
          <td>想看推論參數細節並調整</td>
          <td>高</td>
      </tr>
      <tr>
          <td>想頻繁探索 Hugging Face 上新模型</td>
          <td>高</td>
      </tr>
      <tr>
          <td>想自己組合 target + drafter</td>
          <td>高</td>
      </tr>
      <tr>
          <td>想 server 隨開機常駐</td>
          <td>低（GUI app 不適合 daemon）</td>
      </tr>
      <tr>
          <td>想跟 Anthropic Claude Code 等工具整合</td>
          <td>中（API 相容但 model name 規則不同）</td>
      </tr>
      <tr>
          <td>已經習慣 Ollama CLI</td>
          <td>低（除非有探索需求）</td>
      </tr>
  </tbody>
</table>
<p>簡單的建議：<strong>LM Studio 適合當「副廚」、Ollama 適合當「主廚」</strong>。日常工作流用 Ollama 跑主力模型、需要探索新東西時開 LM Studio。</p>
<h2 id="何時改回-ollama-或-llamacpp">何時改回 Ollama 或 llama.cpp</h2>
<p>LM Studio 的 GUI 定位在以下情境會變成阻礙、建議改用其他伺服器：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>建議路由</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Headless 環境（無 GUI 桌機 / 遠端 SSH）</td>
          <td><a href="/blog/llm/01-local-llm-services/ollama/" data-link-title="1.0 Ollama：主流推論伺服器" data-link-desc="一行 brew 裝完、ollama run 一鍵跑 Gemma 4 MTP、OpenAI 相容 API on localhost:11434">Ollama</a> — CLI-first、能用 launchd / systemd 跑</td>
      </tr>
      <tr>
          <td>CI / 自動化跑 batch 推論</td>
          <td>Ollama 或 llama-server — 可用 systemd / Docker 起、不依賴 GUI session</td>
      </tr>
      <tr>
          <td>需要 daemon 24/7 常駐</td>
          <td>Ollama 配 <a href="/blog/llm/knowledge-cards/launchd-service/" data-link-title="launchd Service" data-link-desc="macOS 原生的服務管理機制、把 process 註冊成自動啟動的 daemon 或 agent">launchd service</a> — LM Studio 視窗關閉 server 就停</td>
      </tr>
      <tr>
          <td>自己量化模型 / 跑特殊冷門模型</td>
          <td><a href="/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">llama.cpp</a> — 直接面對 GGUF / quantize 工具</td>
      </tr>
      <tr>
          <td>想用 Ollama Library 的 1-tag 即裝</td>
          <td>Ollama — <code>ollama run gemma4:31b-coding-mtp-bf16</code> 已內含 MTP drafter、LM Studio 需手動挑 draft model</td>
      </tr>
  </tbody>
</table>
<p>LM Studio 的最佳定位是「需要 GUI、桌面 session 內探索、有人在電腦前操作」的場景；任何「沒人看著 / 後台跑 / 跨機器 daemon」的需求、Ollama 通常更穩。</p>
<h2 id="跟-anthropic-claude-api-的對比">跟 Anthropic Claude API 的對比</h2>
<p>如果你習慣 Claude 的工具用法（Anthropic Console、Claude Code）、LM Studio 的 GUI 體驗比較像 Anthropic Console：可以調 system prompt、看 token 計數、儲存對話。兩者都用 <a href="/blog/llm/00-foundations/openai-compatible-api/" data-link-title="0.3 OpenAI 相容 API" data-link-desc="為什麼幾乎所有本地 LLM 工具不用改就能切到本地：背後是同一套 API 形狀">OpenAI 相容 API</a> 形狀（Anthropic 自有 messages API 是另一條路徑、LM Studio 不接 Anthropic 格式）。差別是：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>Anthropic Console</th>
          <th>LM Studio</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>模型</td>
          <td>Claude Sonnet、Opus、Haiku（雲端）</td>
          <td>自己下載的本地模型</td>
      </tr>
      <tr>
          <td>隱私</td>
          <td>走 Anthropic 雲端</td>
          <td>完全本地</td>
      </tr>
      <tr>
          <td>計費</td>
          <td>按 token 計費</td>
          <td>一次性硬體</td>
      </tr>
      <tr>
          <td>進階功能</td>
          <td>Tools、Vision、Computer Use 完整</td>
          <td>視模型而定，多半較陽春</td>
      </tr>
      <tr>
          <td>Streaming UI</td>
          <td>流暢</td>
          <td>流暢</td>
      </tr>
      <tr>
          <td>Prompt 偵錯</td>
          <td>Workbench 完整</td>
          <td>Chat / Developer 分頁可調參數</td>
      </tr>
  </tbody>
</table>
<p>LM Studio 對寫 code 場景不是 Anthropic Console 的替代品，但作為「本地版 console」的體驗很完整。</p>
<h2 id="下一章">下一章</h2>
<p>下一章：<a href="/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">1.2 llama.cpp 底層引擎</a>，澄清網路上「llama.cpp 才是真本地」這類迷思。</p>
]]></content:encoded></item><item><title>1.2 llama.cpp：底層推論引擎</title><link>https://tarrragon.github.io/blog/llm/01-local-llm-services/llama-cpp/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/01-local-llm-services/llama-cpp/</guid><description>&lt;p>llama.cpp 是本地 LLM 生態的&lt;strong>底層推論引擎&lt;/strong>、2023 年由 ggerganov 釋出、後來成為 Ollama、LM Studio 等高層工具的內部 backend。它的核心承諾是「用純 C++ 寫一個高效能的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF&lt;/a> 模型推論器、跨平台、CPU/GPU/Apple Metal 都能跑」。&lt;/p>
&lt;p>對寫 code 場景的多數讀者來說、&lt;strong>Ollama 已涵蓋 llama.cpp 的直接使用情境&lt;/strong>。Ollama 已經把它包好、使用者看到的是 model tag 跟 CLI；llama.cpp 自己的編譯、量化、參數設定都被抽象掉。本章的目的是澄清網路上「llama.cpp 才是真本地、Ollama 是壓榨版」這類迷思、並給少數需要直接用 llama.cpp 的場景一條路。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後，你應該能：&lt;/p>
&lt;ol>
&lt;li>理解 llama.cpp 在三層架構中的位置。&lt;/li>
&lt;li>知道 Ollama 與 llama.cpp 的關係（包含 / 上游）。&lt;/li>
&lt;li>判斷自己什麼情境下需要直接用 llama.cpp、什麼情境不用。&lt;/li>
&lt;li>看懂 GGUF 格式與量化標籤（Q4_K_M、Q5_K_S 等）。&lt;/li>
&lt;li>對「llama.cpp 整合 Gemma 4 MTP」這類消息建立判讀反射。&lt;/li>
&lt;/ol>
&lt;h2 id="llamacpp-在哪一層">llama.cpp 在哪一層&lt;/h2>
&lt;p>llama.cpp 同時跨&lt;a href="https://tarrragon.github.io/blog/llm/00-foundations/three-layer-architecture/" data-link-title="0.2 介面 / 伺服器 / 模型三層架構" data-link-desc="把任何本地 LLM 工具放回正確的層級，用三層心智模型看懂工具關係">三層架構&lt;/a>的兩層：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>推論引擎&lt;/strong>（library、可被其他程式呼叫的程式碼集合）：核心 C++ library、把 GGUF 權重載入、跑 forward pass（神經網路把輸入算到最後一層產出 token 的單次計算）。Ollama、LM Studio、許多其他工具的 backend 就是這個 library。&lt;/li>
&lt;li>&lt;strong>CLI 工具與 server&lt;/strong>（&lt;code>llama-cli&lt;/code>、&lt;code>llama-server&lt;/code>）：附帶的命令列工具與 HTTP server、可以直接拿來用、但需要自己編譯與配置。&lt;/li>
&lt;/ol>
&lt;p>當你看到「我用 Ollama 跑 Gemma 4」，實際發生的事是：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">你的指令
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">Ollama CLI / server（包裝層、模型管理）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">llama.cpp library（推論核心）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">Metal API（Apple Silicon GPU）
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">9&lt;/span>&lt;span class="cl">Apple Silicon 硬體&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以「Ollama vs llama.cpp」不是兩個競爭品，是「上層包裝」跟「底層引擎」的關係。&lt;/p>
&lt;h2 id="ollama-跟-llamacpp-的關係">Ollama 跟 llama.cpp 的關係&lt;/h2>
&lt;p>Ollama 是 llama.cpp 的下游 wrapper、但 fork 跟 upstream 不是即時同步的關係。Ollama 在自己的 repo 裡放一份 vendored（複製進來、跟隨 Ollama 自家發版節奏管理）的 llama.cpp source、加上他們自己的 patches（補丁修改）；新功能進入 Ollama 的順序通常是：&lt;/p>
&lt;ol>
&lt;li>llama.cpp 上游加新功能或修 bug&lt;/li>
&lt;li>Ollama 把該 commit cherry-pick（從另一個 branch 單獨挑出一個 commit 套用）進來&lt;/li>
&lt;li>Ollama 發新版&lt;/li>
&lt;/ol>
&lt;p>但反過來也成立：&lt;strong>Ollama 有時搶先在 fork 裡加上游還沒接受的功能&lt;/strong>，例如 Gemma 4 MTP 在 2026/5/7 的 Ollama v0.23.1 一鍵支援，當時 llama.cpp 上游的 Gemma 4 MTP 整合還是 feature request。&lt;/p>
&lt;p>這個關係的啟示：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>「llama.cpp vs Ollama 誰先進」視功能而定&lt;/strong>：具體功能要實際對照 release notes、「上游 / 下游」直覺只是初步參考、未必符合實際版本狀態。&lt;/li>
&lt;li>&lt;strong>判讀支援度看 release notes&lt;/strong>：主版本號只是命名、實際功能列表要看具體版本的 changelog。&lt;/li>
&lt;li>&lt;strong>直接用 llama.cpp 跟靠近上游是兩件事&lt;/strong>：Ollama 的 patches 有時是「上游還沒接受、但已經實用的功能」。&lt;/li>
&lt;/ol>
&lt;h2 id="什麼情境真的需要直接用-llamacpp">什麼情境真的需要直接用 llama.cpp&lt;/h2>
&lt;p>絕大多數寫 code 場景，Ollama 完全夠用。直接用 llama.cpp 的合理情境只有少數：&lt;/p></description><content:encoded><![CDATA[<p>llama.cpp 是本地 LLM 生態的<strong>底層推論引擎</strong>、2023 年由 ggerganov 釋出、後來成為 Ollama、LM Studio 等高層工具的內部 backend。它的核心承諾是「用純 C++ 寫一個高效能的 <a href="/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF</a> 模型推論器、跨平台、CPU/GPU/Apple Metal 都能跑」。</p>
<p>對寫 code 場景的多數讀者來說、<strong>Ollama 已涵蓋 llama.cpp 的直接使用情境</strong>。Ollama 已經把它包好、使用者看到的是 model tag 跟 CLI；llama.cpp 自己的編譯、量化、參數設定都被抽象掉。本章的目的是澄清網路上「llama.cpp 才是真本地、Ollama 是壓榨版」這類迷思、並給少數需要直接用 llama.cpp 的場景一條路。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後，你應該能：</p>
<ol>
<li>理解 llama.cpp 在三層架構中的位置。</li>
<li>知道 Ollama 與 llama.cpp 的關係（包含 / 上游）。</li>
<li>判斷自己什麼情境下需要直接用 llama.cpp、什麼情境不用。</li>
<li>看懂 GGUF 格式與量化標籤（Q4_K_M、Q5_K_S 等）。</li>
<li>對「llama.cpp 整合 Gemma 4 MTP」這類消息建立判讀反射。</li>
</ol>
<h2 id="llamacpp-在哪一層">llama.cpp 在哪一層</h2>
<p>llama.cpp 同時跨<a href="/blog/llm/00-foundations/three-layer-architecture/" data-link-title="0.2 介面 / 伺服器 / 模型三層架構" data-link-desc="把任何本地 LLM 工具放回正確的層級，用三層心智模型看懂工具關係">三層架構</a>的兩層：</p>
<ol>
<li><strong>推論引擎</strong>（library、可被其他程式呼叫的程式碼集合）：核心 C++ library、把 GGUF 權重載入、跑 forward pass（神經網路把輸入算到最後一層產出 token 的單次計算）。Ollama、LM Studio、許多其他工具的 backend 就是這個 library。</li>
<li><strong>CLI 工具與 server</strong>（<code>llama-cli</code>、<code>llama-server</code>）：附帶的命令列工具與 HTTP server、可以直接拿來用、但需要自己編譯與配置。</li>
</ol>
<p>當你看到「我用 Ollama 跑 Gemma 4」，實際發生的事是：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">你的指令
</span></span><span class="line"><span class="ln">2</span><span class="cl">  ↓
</span></span><span class="line"><span class="ln">3</span><span class="cl">Ollama CLI / server（包裝層、模型管理）
</span></span><span class="line"><span class="ln">4</span><span class="cl">  ↓
</span></span><span class="line"><span class="ln">5</span><span class="cl">llama.cpp library（推論核心）
</span></span><span class="line"><span class="ln">6</span><span class="cl">  ↓
</span></span><span class="line"><span class="ln">7</span><span class="cl">Metal API（Apple Silicon GPU）
</span></span><span class="line"><span class="ln">8</span><span class="cl">  ↓
</span></span><span class="line"><span class="ln">9</span><span class="cl">Apple Silicon 硬體</span></span></code></pre></div><p>所以「Ollama vs llama.cpp」不是兩個競爭品，是「上層包裝」跟「底層引擎」的關係。</p>
<h2 id="ollama-跟-llamacpp-的關係">Ollama 跟 llama.cpp 的關係</h2>
<p>Ollama 是 llama.cpp 的下游 wrapper、但 fork 跟 upstream 不是即時同步的關係。Ollama 在自己的 repo 裡放一份 vendored（複製進來、跟隨 Ollama 自家發版節奏管理）的 llama.cpp source、加上他們自己的 patches（補丁修改）；新功能進入 Ollama 的順序通常是：</p>
<ol>
<li>llama.cpp 上游加新功能或修 bug</li>
<li>Ollama 把該 commit cherry-pick（從另一個 branch 單獨挑出一個 commit 套用）進來</li>
<li>Ollama 發新版</li>
</ol>
<p>但反過來也成立：<strong>Ollama 有時搶先在 fork 裡加上游還沒接受的功能</strong>，例如 Gemma 4 MTP 在 2026/5/7 的 Ollama v0.23.1 一鍵支援，當時 llama.cpp 上游的 Gemma 4 MTP 整合還是 feature request。</p>
<p>這個關係的啟示：</p>
<ol>
<li><strong>「llama.cpp vs Ollama 誰先進」視功能而定</strong>：具體功能要實際對照 release notes、「上游 / 下游」直覺只是初步參考、未必符合實際版本狀態。</li>
<li><strong>判讀支援度看 release notes</strong>：主版本號只是命名、實際功能列表要看具體版本的 changelog。</li>
<li><strong>直接用 llama.cpp 跟靠近上游是兩件事</strong>：Ollama 的 patches 有時是「上游還沒接受、但已經實用的功能」。</li>
</ol>
<h2 id="什麼情境真的需要直接用-llamacpp">什麼情境真的需要直接用 llama.cpp</h2>
<p>絕大多數寫 code 場景，Ollama 完全夠用。直接用 llama.cpp 的合理情境只有少數：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>為什麼 Ollama 不夠</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>想自己量化模型（從 Safetensors 轉 GGUF）</td>
          <td>Ollama 不提供量化工具，要用 llama.cpp 的 <code>quantize</code></td>
      </tr>
      <tr>
          <td>想跑 Ollama registry 沒收的特殊模型</td>
          <td>要自己下載 GGUF、自己編譯 server</td>
      </tr>
      <tr>
          <td>想用 llama.cpp 最新 commit 的新功能</td>
          <td>Ollama 還沒 cherry-pick</td>
      </tr>
      <tr>
          <td>嵌入式 / 受限環境，要把 llama.cpp 編譯進別的 app</td>
          <td>Ollama 是獨立 daemon、適合作為 server；要 embed 改用 llama.cpp library</td>
      </tr>
      <tr>
          <td>純研究、想看推論程式碼</td>
          <td>llama.cpp 是 open source、可讀</td>
      </tr>
  </tbody>
</table>
<p>寫 code 場景的讀者通常不命中以上任何一條。</p>
<h2 id="安裝如果你真要試">安裝（如果你真要試）</h2>
<p>從原始碼編譯：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">git clone https://github.com/ggerganov/llama.cpp.git
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nb">cd</span> llama.cpp
</span></span><span class="line"><span class="ln">3</span><span class="cl">make</span></span></code></pre></div><p>或用 Homebrew（社群維護，版本可能稍舊）：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">brew install llama.cpp</span></span></code></pre></div><p>裝完後常用命令：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># CLI 對話</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">llama-cli -m /path/to/model.gguf -p <span class="s2">&#34;Hello&#34;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># HTTP server</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">llama-server -m /path/to/model.gguf --port <span class="m">8080</span> --host 127.0.0.1</span></span></code></pre></div><p><code>llama-server</code> 啟動後在 <code>localhost:8080</code> 提供 OpenAI 相容 API：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">curl http://localhost:8080/v1/chat/completions <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="s1">    &#34;model&#34;: &#34;any-name&#34;,
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="s1">    &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;Hi&#34;}],
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="s1">    &#34;stream&#34;: false
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="s1">  }&#39;</span></span></span></code></pre></div><p><code>model</code> 欄位 llama-server 忽略，因為它一次只 serve 一個模型（不像 Ollama 可以動態切換）。</p>
<p><code>--host 127.0.0.1</code> 是 loopback 預設、只接受本機連線。改 <code>0.0.0.0</code> 會把伺服器暴露到整個 LAN、跟 Ollama 改 <code>OLLAMA_HOST</code> 同類別的決定；完整的綁定模式跟誤開放後果見 <a href="/blog/llm/06-security/inference-server-binding/" data-link-title="6.1 推論伺服器的綁定與暴露範圍" data-link-desc="個人 dev 場景下 llama-server / Ollama / LM Studio 的 bind address 判讀：127.0.0.1 vs LAN vs 反代、預設安全、誤開放給內網的後果">6.1 推論伺服器的綁定與暴露範圍</a>。</p>
<h2 id="gguf-格式與量化標籤">GGUF 格式與量化標籤</h2>
<p>量化標籤是看 GGUF 檔名選模型的唯一線索、影響「記憶體 / 品質 / 速度」三軸的取捨。GGUF（GGML Unified Format）是 llama.cpp 定義的模型權重格式、把模型權重、tokenizer、metadata 打包成單一檔案。Ollama 內部存的就是 GGUF。</p>
<p>常見量化標籤：</p>
<table>
  <thead>
      <tr>
          <th>標籤</th>
          <th>bits/權重</th>
          <th>品質</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>F32</td>
          <td>32</td>
          <td>原始</td>
          <td>訓練、研究、極端品質</td>
      </tr>
      <tr>
          <td>F16 / BF16</td>
          <td>16</td>
          <td>幾乎無損</td>
          <td>評估、有大量記憶體</td>
      </tr>
      <tr>
          <td>Q8_0</td>
          <td>8</td>
          <td>幾乎無損</td>
          <td>32GB+ Mac、品質敏感</td>
      </tr>
      <tr>
          <td>Q6_K</td>
          <td>6.56</td>
          <td>接近無損</td>
          <td>平衡</td>
      </tr>
      <tr>
          <td>Q5_K_M</td>
          <td>5.5</td>
          <td>輕微衰減</td>
          <td>24GB Mac 甜蜜點</td>
      </tr>
      <tr>
          <td>Q4_K_M</td>
          <td>4.5</td>
          <td>可察覺但實用</td>
          <td>最主流</td>
      </tr>
      <tr>
          <td>Q4_K_S</td>
          <td>4.25</td>
          <td>略遜 Q4_K_M</td>
          <td>記憶體吃緊時退一步</td>
      </tr>
      <tr>
          <td>Q3_K_M</td>
          <td>3.5</td>
          <td>明顯衰減</td>
          <td>coding 任務 hallucination 顯著上升</td>
      </tr>
      <tr>
          <td>Q2_K</td>
          <td>2.5</td>
          <td>嚴重衰減</td>
          <td>實驗用</td>
      </tr>
  </tbody>
</table>
<p><code>_K_M</code>、<code>_K_S</code> 的 K 指 K-quants（更先進的量化方法）、M / S 指 mixed-medium / mixed-small（不同層用不同量化）。實務上選 <code>Q4_K_M</code> 或 <code>Q5_K_M</code> 是寫 code 場景的甜蜜點；極端記憶體緊張才往 <code>Q3</code> 走、但通常會發現換較小模型的 <code>Q5</code> 比強塞大模型的 <code>Q3</code> 好。</p>
<p><strong>為何 coding 任務對 Q3 以下特別敏感</strong>：寫 code 的回應要在 token 層保持高精度（變數名拼字、API 呼叫格式、括號配對都不容錯）、低 bit 量化會放大 token 分布失真、體感是 hallucination 上升、編造的 API 變多、長 context 累積誤差更明顯。一般對話容忍幾個錯字、code 一個錯字就跑不過。所以同 24GB Mac 上 Q5 14B 通常比 Q3 31B 適合寫 code、雖然參數量名義上少了一半。</p>
<h2 id="gemma-4-mtp-在-llamacpp-的狀態20265">Gemma 4 MTP 在 llama.cpp 的狀態（2026/5）</h2>
<p>2026 年 5 月時：</p>
<ul>
<li><strong>speculative decoding 框架</strong>：llama.cpp 已有 <code>--draft-model</code> 參數，整體 speculative decoding 功能 beta 階段。</li>
<li><strong>Gemma 4 官方 drafter 整合</strong>：feature request 開著（GitHub issue 上有討論），但尚未合進主分支。</li>
<li><strong>Ollama 對應狀態</strong>：v0.23.1 已一鍵支援 <code>gemma4:31b-coding-mtp-bf16</code>。</li>
</ul>
<p>這是少見的「Ollama 領先 llama.cpp 上游」情境，原因是 Ollama 團隊接到 Google 的合作後直接做 patch、不等上游 review 流程。</p>
<p>實務啟示：</p>
<ol>
<li>想用 Gemma 4 MTP，<strong>直接用 Ollama 是最快路徑</strong>。</li>
<li>想在 llama.cpp 直接跑 Gemma 4 MTP，要自己編譯帶上 Ollama 的 patches，或等上游合進來。</li>
<li>看到「llama.cpp 已整合 Gemma 4 MTP」的網路文章，先去 <a href="https://github.com/ggerganov/llama.cpp/pulls">llama.cpp 的 PR 列表</a> 確認時間點。</li>
</ol>
<h2 id="llamacpp-對-apple-silicon-的優化">llama.cpp 對 Apple Silicon 的優化</h2>
<p>llama.cpp 對 Apple Silicon 有針對性優化：</p>
<ol>
<li><strong>Metal backend</strong>：在 macOS 上自動啟用 Metal（Apple 的 GPU 加速 API）、把 GPU 算力吃滿。</li>
<li><strong>NEON / AMX</strong>：CPU 上用 ARM 向量指令集（NEON 是基本 SIMD、AMX 是 Apple 的矩陣加速器）加速 dequantization（把量化權重還原為計算精度的過程）。</li>
<li><strong>Unified Memory aware</strong>：不像 NVIDIA GPU 要透過 PCIe（連接 GPU 與系統其他元件的高速匯流排）把資料搬進 VRAM、Apple Silicon 直接共用記憶體、省下這趟搬移。</li>
</ol>
<p>這些優化都「免費」，不用使用者特別設定。但跟 <a href="/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">MLX</a> 比，llama.cpp 用的是 Metal 而不是 MLX framework；兩者效能各有勝負，差距通常 10 ~ 30%，不是「天差地遠」。</p>
<p>陷阱是看到「MLX 比 llama.cpp 快 N 倍」這類說法時，要追問：</p>
<ol>
<li>哪個模型？</li>
<li>哪個量化？</li>
<li>哪台 Mac？</li>
<li>llama.cpp 哪個版本？</li>
<li>量測腳本是什麼？</li>
</ol>
<p>多數網路 benchmark 沒有完整變數控制，差距常被誇大。對寫 code 場景的使用者，這個差距不值得糾結。</p>
<h2 id="直接用-llamacpp-跟-ollama-並存">直接用 llama.cpp 跟 Ollama 並存</h2>
<p>如果你真的想試 llama.cpp，可以跟 Ollama 並存（port 不同）：</p>
<table>
  <thead>
      <tr>
          <th>伺服器</th>
          <th>預設 port</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Ollama</td>
          <td>11434</td>
      </tr>
      <tr>
          <td>llama-server</td>
          <td>8080</td>
      </tr>
      <tr>
          <td>LM Studio</td>
          <td>1234</td>
      </tr>
  </tbody>
</table>
<p>Continue.dev 可以同時連兩個：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 2</span><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="ln"> 3</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Ollama default&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;ollama&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;gemma4:31b-coding-mtp-bf16&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:11434&#34;</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">      <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;llama.cpp experimental&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl">      <span class="nt">&#34;provider&#34;</span><span class="p">:</span> <span class="s2">&#34;openai&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">      <span class="nt">&#34;model&#34;</span><span class="p">:</span> <span class="s2">&#34;any&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">      <span class="nt">&#34;apiBase&#34;</span><span class="p">:</span> <span class="s2">&#34;http://localhost:8080/v1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">      <span class="nt">&#34;apiKey&#34;</span><span class="p">:</span> <span class="s2">&#34;not-needed&#34;</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><h2 id="給多數讀者的建議">給多數讀者的建議</h2>
<p>直接用 llama.cpp 的學習成本比 Ollama 高、換來的好處對寫 code 場景的使用者通常不命中需求。在「自己量化模型 / 跑特殊冷門模型 / 需要 llama.cpp 最新 commit」三個條件都不命中時、Ollama 是低成本的預設選擇。</p>
<p>把 llama.cpp 當成「Ollama 背後的引擎、值得知道存在、但不必直接面對」。這個定位足夠應付網路上 95% 的相關討論。</p>
<h2 id="何時不適用本章--該往哪去">何時不適用本章 / 該往哪去</h2>
<p>本章的「以 Ollama 為主、llama.cpp 作為底層理解」這個敘事在以下情境會失準、需要另外的路徑：</p>
<table>
  <thead>
      <tr>
          <th>情境</th>
          <th>該往哪去</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>想學 LLM 推論的內部機制（attention 實作、kernel）</td>
          <td>直接讀 llama.cpp 原始碼、本章只給定位、不教 internal</td>
      </tr>
      <tr>
          <td>把 llama.cpp embed 進 mobile / 嵌入式 app</td>
          <td>本章不涵蓋、見 llama.cpp 的 README 與 build flag 文件</td>
      </tr>
      <tr>
          <td>用 Windows / Linux + 獨立 GPU 跑</td>
          <td>模組五 <a href="/blog/llm/05-discrete-gpu/vram-ram-budget/" data-link-title="5.0 VRAM &#43; RAM 分層預算" data-link-desc="PC 獨立 GPU 場景的記憶體預算判讀：VRAM 是快的世界、RAM 是大的世界、PCIe 把兩個世界連起來">VRAM + RAM 分層預算</a>、本章假設 Apple Silicon</td>
      </tr>
      <tr>
          <td>需要 vLLM / TGI 等資料中心級 inference server</td>
          <td>不在本指南範圍、需找專門資料中心 inference 教材</td>
      </tr>
      <tr>
          <td>想自己訓練 / fine-tune</td>
          <td>模組三 <a href="/blog/llm/03-theoretical-foundations/training-pipeline/" data-link-title="3.4 訓練流程：pre-train → SFT → RLHF" data-link-desc="LLM 的三階段訓練：預訓練、指令微調、人類反饋強化學習；各階段目標與最新替代方案">訓練流程</a>、推論伺服器不負責訓練</td>
      </tr>
  </tbody>
</table>
<h2 id="下一章">下一章</h2>
<p>下一章：<a href="/blog/llm/01-local-llm-services/vscode-continue-integration/" data-link-title="1.3 VS Code &#43; Continue.dev 整合" data-link-desc="安裝 Continue 擴充套件、config.json 設定、Cmd&#43;L 對話 / Cmd&#43;I 行內編輯快捷鍵">1.3 VS Code + Continue.dev 整合</a>，把伺服器接到日常編輯器，這才是寫 code 的真正起點。</p>
]]></content:encoded></item><item><title>1.0 Ollama：主流推論伺服器</title><link>https://tarrragon.github.io/blog/llm/01-local-llm-services/ollama/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/01-local-llm-services/ollama/</guid><description>&lt;p>Ollama 是本地 LLM 生態的&lt;strong>主流推論伺服器&lt;/strong>、承擔三個責任：模型管理（拉、存、列、刪）、推論執行（呼叫 &lt;a href="https://tarrragon.github.io/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">llama.cpp&lt;/a> backend）、API 暴露（預設 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/port-and-localhost/" data-link-title="Port 與 Localhost" data-link-desc="TCP port 與 listen address 如何決定 API server 的對外暴露範圍">&lt;code>localhost:11434&lt;/code>&lt;/a> 上的 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/openai-compatible-api/" data-link-title="OpenAI 相容 API" data-link-desc="本地推論伺服器跟雲端 OpenAI 共用的 API 形狀標準">OpenAI 相容 API&lt;/a> 與原生 API）。它的設計取捨偏向「拿來就跑」、把 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF 格式&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化&lt;/a>、&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache&lt;/a> 等底層細節都包進 CLI、使用者面對的只有 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/model-tag/" data-link-title="Model Tag" data-link-desc="Ollama 等推論伺服器用來定位特定模型版本的命名規則">model tag&lt;/a> 跟幾個指令。&lt;/p>
&lt;p>對「在 VS Code 接本地 LLM 寫 code」這條最短路徑、Ollama 多半是唯一需要的伺服器層。本章先給 5 分鐘可跑通的最短路徑、再展開日常使用所需的模型管理跟 API 細節、最後才進階主題（背景常駐、MTP 加速、安全暴露、版本升級）。已經把 Ollama 跑起來的讀者可以直接跳到&lt;a href="#%e6%97%a5%e5%b8%b8%e4%bd%bf%e7%94%a8%e6%a8%a1%e5%9e%8b%e7%ae%a1%e7%90%86%e8%88%87-api-%e5%bd%a2%e7%8b%80">日常使用&lt;/a>或&lt;a href="#%e6%8e%92%e9%8c%af%e5%bf%ab%e9%80%9f%e5%88%a4%e8%ae%80">排錯&lt;/a>。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後、你應該能：&lt;/p>
&lt;ol>
&lt;li>裝好 Ollama 並驗證它正在跑。&lt;/li>
&lt;li>用 CLI 拉一個模型並開始對話。&lt;/li>
&lt;li>用 curl 驗證 OpenAI 相容 API 在 11434 正常回應。&lt;/li>
&lt;li>看懂 model tag 命名規則、選對 Gemma 4 MTP 版本。&lt;/li>
&lt;li>排查 port 撞、記憶體不足、模型載入慢、cache 過大等情境。&lt;/li>
&lt;/ol>
&lt;h2 id="最短路徑5-分鐘把-ollama-跑起來">最短路徑：5 分鐘把 Ollama 跑起來&lt;/h2>
&lt;p>最短路徑的設計目標是「裝、跑、驗證三步、其他細節留到日常使用段」。三個指令用到的 macOS 工具分別是 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/homebrew/" data-link-title="Homebrew" data-link-desc="macOS 上社群維護的套件管理器、用一行指令安裝 CLI 工具與背景服務">Homebrew 套件管理器&lt;/a>（&lt;code>brew install&lt;/code>）跟 &lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/shell-background-process/" data-link-title="Shell 背景 Process" data-link-desc="終端機 process 的前景 / 背景生命週期、訊號控制、找出佔用 port 的 process">shell 前景 process&lt;/a>（&lt;code>ollama serve&lt;/code> 預設前景跑、&lt;code>Ctrl+C&lt;/code> 結束）。&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="c1"># 1. 安裝&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">brew install ollama
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="c1"># 2. 啟動 server（前景跑、Ctrl+C 結束）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">ollama serve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">7&lt;/span>&lt;span class="cl">&lt;span class="c1"># 3. 在另一個 terminal 拉一個小模型驗證&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">8&lt;/span>&lt;span class="cl">ollama run gemma3:1b&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>第三步首次執行會下載權重（約 815 MB、頻寬足夠的話 1 ~ 3 分鐘）、下載完自動進入 REPL：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&amp;gt;&amp;gt;&amp;gt; 寫一個 Python function 計算 fibonacci
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">def fibonacci(n):
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl"> if n &amp;lt;= 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl"> return n
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl"> return fibonacci(n - 1) + fibonacci(n - 2)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">6&lt;/span>&lt;span class="cl">&amp;gt;&amp;gt;&amp;gt; /bye&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>驗證 server 正常聽 11434：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">curl http://localhost:11434/api/version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl">&lt;span class="c1"># 回 {&amp;#34;version&amp;#34;:&amp;#34;0.23.x&amp;#34;}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>驗證 OpenAI 相容 API 可以做 chat completion：&lt;/p></description><content:encoded><![CDATA[<p>Ollama 是本地 LLM 生態的<strong>主流推論伺服器</strong>、承擔三個責任：模型管理（拉、存、列、刪）、推論執行（呼叫 <a href="/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">llama.cpp</a> backend）、API 暴露（預設 <a href="/blog/llm/knowledge-cards/port-and-localhost/" data-link-title="Port 與 Localhost" data-link-desc="TCP port 與 listen address 如何決定 API server 的對外暴露範圍"><code>localhost:11434</code></a> 上的 <a href="/blog/llm/knowledge-cards/openai-compatible-api/" data-link-title="OpenAI 相容 API" data-link-desc="本地推論伺服器跟雲端 OpenAI 共用的 API 形狀標準">OpenAI 相容 API</a> 與原生 API）。它的設計取捨偏向「拿來就跑」、把 <a href="/blog/llm/knowledge-cards/gguf/" data-link-title="GGUF" data-link-desc="llama.cpp 生態定義的模型權重格式：把權重、tokenizer、metadata 打包成單一檔案">GGUF 格式</a>、<a href="/blog/llm/knowledge-cards/quantization/" data-link-title="Quantization" data-link-desc="用較少 bits 表示模型權重：壓縮記憶體佔用、加快生字速度，代價是少量品質衰減">量化</a>、<a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a> 等底層細節都包進 CLI、使用者面對的只有 <a href="/blog/llm/knowledge-cards/model-tag/" data-link-title="Model Tag" data-link-desc="Ollama 等推論伺服器用來定位特定模型版本的命名規則">model tag</a> 跟幾個指令。</p>
<p>對「在 VS Code 接本地 LLM 寫 code」這條最短路徑、Ollama 多半是唯一需要的伺服器層。本章先給 5 分鐘可跑通的最短路徑、再展開日常使用所需的模型管理跟 API 細節、最後才進階主題（背景常駐、MTP 加速、安全暴露、版本升級）。已經把 Ollama 跑起來的讀者可以直接跳到<a href="#%e6%97%a5%e5%b8%b8%e4%bd%bf%e7%94%a8%e6%a8%a1%e5%9e%8b%e7%ae%a1%e7%90%86%e8%88%87-api-%e5%bd%a2%e7%8b%80">日常使用</a>或<a href="#%e6%8e%92%e9%8c%af%e5%bf%ab%e9%80%9f%e5%88%a4%e8%ae%80">排錯</a>。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後、你應該能：</p>
<ol>
<li>裝好 Ollama 並驗證它正在跑。</li>
<li>用 CLI 拉一個模型並開始對話。</li>
<li>用 curl 驗證 OpenAI 相容 API 在 11434 正常回應。</li>
<li>看懂 model tag 命名規則、選對 Gemma 4 MTP 版本。</li>
<li>排查 port 撞、記憶體不足、模型載入慢、cache 過大等情境。</li>
</ol>
<h2 id="最短路徑5-分鐘把-ollama-跑起來">最短路徑：5 分鐘把 Ollama 跑起來</h2>
<p>最短路徑的設計目標是「裝、跑、驗證三步、其他細節留到日常使用段」。三個指令用到的 macOS 工具分別是 <a href="/blog/llm/knowledge-cards/homebrew/" data-link-title="Homebrew" data-link-desc="macOS 上社群維護的套件管理器、用一行指令安裝 CLI 工具與背景服務">Homebrew 套件管理器</a>（<code>brew install</code>）跟 <a href="/blog/llm/knowledge-cards/shell-background-process/" data-link-title="Shell 背景 Process" data-link-desc="終端機 process 的前景 / 背景生命週期、訊號控制、找出佔用 port 的 process">shell 前景 process</a>（<code>ollama serve</code> 預設前景跑、<code>Ctrl+C</code> 結束）。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1"># 1. 安裝</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">brew install ollama
</span></span><span class="line"><span class="ln">3</span><span class="cl">
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"># 2. 啟動 server（前景跑、Ctrl+C 結束）</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">ollama serve
</span></span><span class="line"><span class="ln">6</span><span class="cl">
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="c1"># 3. 在另一個 terminal 拉一個小模型驗證</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">ollama run gemma3:1b</span></span></code></pre></div><p>第三步首次執行會下載權重（約 815 MB、頻寬足夠的話 1 ~ 3 分鐘）、下載完自動進入 REPL：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">&gt;&gt;&gt; 寫一個 Python function 計算 fibonacci
</span></span><span class="line"><span class="ln">2</span><span class="cl">def fibonacci(n):
</span></span><span class="line"><span class="ln">3</span><span class="cl">    if n &lt;= 1:
</span></span><span class="line"><span class="ln">4</span><span class="cl">        return n
</span></span><span class="line"><span class="ln">5</span><span class="cl">    return fibonacci(n - 1) + fibonacci(n - 2)
</span></span><span class="line"><span class="ln">6</span><span class="cl">&gt;&gt;&gt; /bye</span></span></code></pre></div><p>驗證 server 正常聽 11434：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">curl http://localhost:11434/api/version
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># 回 {&#34;version&#34;:&#34;0.23.x&#34;}</span></span></span></code></pre></div><p>驗證 OpenAI 相容 API 可以做 chat completion：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">curl http://localhost:11434/v1/chat/completions <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="s1">    &#34;model&#34;: &#34;gemma3:1b&#34;,
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="s1">    &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;Hello&#34;}],
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="s1">    &#34;stream&#34;: false
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="s1">  }&#39;</span></span></span></code></pre></div><p>回應 JSON 包含 <code>choices[0].message.content</code>、最短路徑就完成。實際寫 code 用的模型大小通常是 14B / 31B 級、選型詳見 <a href="/blog/llm/01-local-llm-services/model-selection-priority/" data-link-title="1.4 寫 code 場景的模型選型優先順序" data-link-desc="Gemma 4 31B MTP → Qwen3-Coder 30B → Qwen3 14B → gpt-oss 20B 的取捨與適用情境">1.4 模型選型優先順序</a>；完整安裝紀錄含 <a href="/blog/llm/knowledge-cards/launchd-service/" data-link-title="launchd Service" data-link-desc="macOS 原生的服務管理機制、把 process 註冊成自動啟動的 daemon 或 agent">launchd service</a> 設定見 <a href="/blog/llm/01-local-llm-services/hands-on/ollama-setup/" data-link-title="Hands-on：安裝 Ollama &#43; 拉第一個 Gemma 模型" data-link-desc="brew install ollama、launchd service、ollama pull、curl 驗證 OpenAI 相容 API">Hands-on：Ollama 安裝</a>。</p>
<h2 id="日常使用模型管理與-api-形狀">日常使用：模型管理與 API 形狀</h2>
<h3 id="模型管理指令">模型管理指令</h3>
<p>Ollama 用四個指令覆蓋日常模型管理。每個指令承擔一個語意責任：</p>
<table>
  <thead>
      <tr>
          <th>指令</th>
          <th>責任</th>
          <th>何時使用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>ollama pull &lt;tag&gt;</code></td>
          <td>只下載權重、不啟動對話</td>
          <td>CI / 自動化、先下載再離線使用</td>
      </tr>
      <tr>
          <td><code>ollama run &lt;tag&gt;</code></td>
          <td>下載（若還沒）+ 啟動對話 REPL</td>
          <td>互動驗證、快速試模型</td>
      </tr>
      <tr>
          <td><code>ollama list</code></td>
          <td>列出已下載模型與大小</td>
          <td>檢查磁碟用量、確認模型存在</td>
      </tr>
      <tr>
          <td><code>ollama rm &lt;tag&gt;</code></td>
          <td>刪除模型權重與 registry metadata</td>
          <td>釋出 SSD 空間</td>
      </tr>
  </tbody>
</table>
<p>模型權重存在 <code>~/.ollama/models/</code>、單一大模型（30B+）可能佔 18 ~ 30 GB、累積超過 100 GB 很常見。清理路徑統一用 <code>ollama rm</code>、Ollama 會同步更新 registry metadata、後續 <code>ollama list</code> 與 <code>ollama pull</code> 才能正確判斷既存模型狀態。</p>
<h3 id="model-tag-命名規則">Model tag 命名規則</h3>
<p><a href="/blog/llm/knowledge-cards/model-tag/" data-link-title="Model Tag" data-link-desc="Ollama 等推論伺服器用來定位特定模型版本的命名規則">Model tag</a> 是 Ollama 的模型定位符、形式為 <code>family:size-variant-quantization</code>。同一個 model family 可能有十幾個 tag、對應不同參數量、訓練變體跟量化等級。</p>
<table>
  <thead>
      <tr>
          <th>範例</th>
          <th>拆解</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>gemma4:e4b</code></td>
          <td>Gemma 4、E4B（edge dense）、預設量化</td>
      </tr>
      <tr>
          <td><code>gemma4:31b-instruct-q5_K_M</code></td>
          <td>Gemma 4、31B、instruct-tuned、Q5_K_M 量化</td>
      </tr>
      <tr>
          <td><code>gemma4:31b-coding-mtp-bf16</code></td>
          <td>Gemma 4、31B、coding 特化、含 MTP drafter、bf16</td>
      </tr>
      <tr>
          <td><code>qwen3-coder:30b</code></td>
          <td>Qwen3-Coder、30B 參數、預設量化</td>
      </tr>
      <tr>
          <td><code>llama3.3:70b-instruct-q4_K_M</code></td>
          <td>Llama 3.3、70B、instruct、Q4_K_M</td>
      </tr>
  </tbody>
</table>
<p>選 tag 時的兩個判讀重點：variant（<code>instruct</code> / <code>coding</code> 等用途特化、影響回應風格）、quantization（量化等級、影響記憶體佔用與品質、見 <a href="/blog/llm/01-local-llm-services/llama-cpp/#gguf-%e6%a0%bc%e5%bc%8f%e8%88%87%e9%87%8f%e5%8c%96%e6%a8%99%e7%b1%a4" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">1.2 llama.cpp 的量化標籤對照</a>）。完整 tag 清單在 <a href="https://ollama.com/library">ollama.com/library</a>。寫 code 場景的推薦選擇詳見 <a href="/blog/llm/01-local-llm-services/model-selection-priority/" data-link-title="1.4 寫 code 場景的模型選型優先順序" data-link-desc="Gemma 4 31B MTP → Qwen3-Coder 30B → Qwen3 14B → gpt-oss 20B 的取捨與適用情境">1.4 模型選型</a>。</p>
<h3 id="兩套-api選哪一套">兩套 API：選哪一套</h3>
<p>Ollama 在 11434 同時提供兩套 API、用途互補：</p>
<table>
  <thead>
      <tr>
          <th>路徑前綴</th>
          <th>目的</th>
          <th>適合誰</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>/v1/…</code></td>
          <td>OpenAI 相容、用 <code>messages</code> 結構</td>
          <td>IDE plugin（Continue.dev 等）、CLI 工具、想無痛切換 cloud / local</td>
      </tr>
      <tr>
          <td><code>/api/…</code></td>
          <td>Ollama 原生、支援模型管理</td>
          <td>想動態切換模型、寫 model 管理腳本</td>
      </tr>
  </tbody>
</table>
<p>寫 code 場景多半用 <code>/v1/…</code>、因為 IDE plugin 預設講這套形狀。詳細協定背景見 <a href="/blog/llm/00-foundations/openai-compatible-api/" data-link-title="0.3 OpenAI 相容 API" data-link-desc="為什麼幾乎所有本地 LLM 工具不用改就能切到本地：背後是同一套 API 形狀">0.3 OpenAI 相容 API</a>。</p>
<p>驗證 streaming 回應：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">curl http://localhost:11434/v1/chat/completions <span class="se">\
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="se"></span>  -H <span class="s2">&#34;Content-Type: application/json&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="se"></span>  -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="s1">    &#34;model&#34;: &#34;gemma3:1b&#34;,
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="s1">    &#34;messages&#34;: [{&#34;role&#34;: &#34;user&#34;, &#34;content&#34;: &#34;Count 1 to 5&#34;}],
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="s1">    &#34;stream&#34;: true
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="s1">  }&#39;</span></span></span></code></pre></div><p>Streaming 回應是一連串 <code>data: {...}</code> 行、每行一個 token chunk。Ollama 原生 <code>/api/generate</code> 還支援 <code>num_predict</code>、<code>temperature</code>、<code>stop</code> 等細項、IDE plugin 內部會自行轉換、終端使用者通常用不到。</p>
<h2 id="進階主題按需閱讀">進階主題（按需閱讀）</h2>
<p>進階段的特色是「沒有它最短路徑仍能跑、但搞懂後體驗大幅提升」。最短路徑只想跑通的讀者可以先跳到<a href="#%e6%8e%92%e9%8c%af%e5%bf%ab%e9%80%9f%e5%88%a4%e8%ae%80">排錯</a>、需要時再回來。</p>
<h3 id="背景常駐launchd-service">背景常駐：launchd service</h3>
<p><code>ollama serve</code> 預設<a href="/blog/llm/knowledge-cards/shell-background-process/" data-link-title="Shell 背景 Process" data-link-desc="終端機 process 的前景 / 背景生命週期、訊號控制、找出佔用 port 的 process">在前景跑</a>、terminal 關掉就停。日常使用建議讓 Ollama 開機自動啟動、用 macOS 的 <a href="/blog/llm/knowledge-cards/launchd-service/" data-link-title="launchd Service" data-link-desc="macOS 原生的服務管理機制、把 process 註冊成自動啟動的 daemon 或 agent">launchd service</a> 機制：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">brew services start ollama</span></span></code></pre></div><p>這個指令做兩件事、決定 Ollama 之後的行為：</p>
<ol>
<li>寫一個 launchd plist 到 <code>~/Library/LaunchAgents/homebrew.mxcl.ollama.plist</code></li>
<li>立刻啟動 ollama serve、之後重開機自動拉起</li>
</ol>
<p>launchd 是 macOS 原生的服務管理機制、把 process 註冊成 daemon / agent、由系統負責生命週期。<code>brew services</code> 是 <a href="/blog/llm/knowledge-cards/homebrew/" data-link-title="Homebrew" data-link-desc="macOS 上社群維護的套件管理器、用一行指令安裝 CLI 工具與背景服務">Homebrew</a> 對 launchd 的封裝、把 plist 模板跟啟動指令簡化成一行。Log 統一寫到 <code>/opt/homebrew/var/log/ollama.log</code>（Apple Silicon Mac）、出問題第一步先看這個檔。</p>
<p>對應的服務管理指令：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">brew services stop ollama      <span class="c1"># 停掉、保留 plist</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">brew services restart ollama   <span class="c1"># 升級後重啟</span></span></span></code></pre></div><p>完整 plist 內容與 log 範例見 <a href="/blog/llm/01-local-llm-services/hands-on/ollama-setup/" data-link-title="Hands-on：安裝 Ollama &#43; 拉第一個 Gemma 模型" data-link-desc="brew install ollama、launchd service、ollama pull、curl 驗證 OpenAI 相容 API">Hands-on：Ollama 安裝</a>。</p>
<h3 id="gemma-4-mtp-一鍵加速">Gemma 4 MTP 一鍵加速</h3>
<p><a href="/blog/llm/knowledge-cards/mtp/" data-link-title="Multi-Token Prediction (MTP)" data-link-desc="Google 為 Gemma 系列釋出的 speculative decoding 工程化實作">Multi-Token Prediction（MTP）</a> 是 <a href="/blog/llm/knowledge-cards/speculative-decoding/" data-link-title="Speculative Decoding" data-link-desc="用小模型猜未來 token、大模型並行驗證的加速技巧">speculative decoding</a> 的具體實作、用一個小 <a href="/blog/llm/knowledge-cards/drafter-model/" data-link-title="Drafter Model" data-link-desc="speculative decoding 中用來快速猜未來 token 的小模型">drafter</a> 預測多個 token、再由 target model 驗證、coding 任務有 2 ~ 3 倍加速。Ollama v0.23.1（2026/5/7 釋出）內建 Gemma 4 的 MTP 一鍵支援、啟用方式只需要 pull 對應 model tag：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ollama run gemma4:31b-coding-mtp-bf16</span></span></code></pre></div><p>這個 tag 內含 target model（31B）跟 drafter（Google 釋出的官方小模型）、Ollama 自動把兩個 model 載入記憶體、推論時並行驗證。記憶體佔用約 18 GB（drafter 約 1 GB、其餘為 target）、適合 32GB+ Mac。詳細原理見 <a href="/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">0.4 MLX / MTP / oMLX</a>。</p>
<p>判讀 MTP tag 時的三個重點：</p>
<ol>
<li><strong>Tag 裡的 <code>bf16</code> 描述的是 drafter 精度</strong>。Target model 內部已套用量化、實際佔用約 18 GB、跟「整個 31B 用 bf16 跑、要 60+ GB」是兩件事。</li>
<li><strong>加速幅度跟任務 pattern 預測度成正比</strong>。Coding（pattern 強）2 ~ 3 倍、純創意寫作或隨機字串生成大約 1.5 倍。</li>
<li><strong>品質由 target model 保證</strong>。Drafter 猜錯時 target 會拒絕該預測、最終輸出跟「直接由 target 生成」一致、drafter 只影響速度。</li>
</ol>
<h3 id="模型常駐keep_alive">模型常駐：keep_alive</h3>
<p><code>ollama run</code> 第一次跑某個 model 時、需要 30 ~ 60 秒把權重從 SSD 載入記憶體；後續對話則用 cached 權重、快得多。Ollama 預設把載入的 model 留在記憶體 5 分鐘（<code>keep_alive</code> 預設值）、長時間不用會被 unload 釋放記憶體。</p>
<p>長時間穩定使用的場景可以延長 keep_alive：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nv">OLLAMA_KEEP_ALIVE</span><span class="o">=</span>-1 ollama serve     <span class="c1"># 永久保留</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nv">OLLAMA_KEEP_ALIVE</span><span class="o">=</span>2h ollama serve     <span class="c1"># 保留 2 小時</span></span></span></code></pre></div><p><code>-1</code> 設定會持續佔用記憶體、適合「整天頻繁用」的工作流；偶爾用一次的場景保持預設、讓系統自動釋放更省記憶體。</p>
<h3 id="對外暴露與信任邊界">對外暴露與信任邊界</h3>
<p>預設 Ollama 只聽 <a href="/blog/llm/knowledge-cards/port-and-localhost/" data-link-title="Port 與 Localhost" data-link-desc="TCP port 與 listen address 如何決定 API server 的對外暴露範圍"><code>127.0.0.1</code></a>、外部裝置連不上。讓 LAN 內其他機器（例如桌機跑 server、筆電當 client）能用、把 listen address 改成 <code>0.0.0.0</code>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nv">OLLAMA_HOST</span><span class="o">=</span>0.0.0.0:11434 ollama serve</span></span></code></pre></div><p>這個設定把 Ollama 暴露在整個區網、任何同網路裝置都能呼叫 API。信任邊界的三種典型情境：</p>
<ul>
<li><strong>家用 / 信任的辦公網路</strong>：風險低、可以直接開</li>
<li><strong>公共 Wi-Fi、共用網路</strong>：透過 SSH tunnel 把 11434 隧道到遠端、或加防火牆規則限制 source IP</li>
<li><strong>暴露到 Internet</strong>：需要 reverse proxy 加 auth、Ollama 本身沒有內建身分認證</li>
</ul>
<p>完整資料流判讀見 <a href="/blog/llm/00-foundations/privacy-data-flow/" data-link-title="0.7 隱私 / 資安的資料流原理" data-link-desc="從「位置」到「資料流」的思考升級：信任邊界、合約模型、零信任原則套用到 LLM 工作流">0.7 隱私 / 資安資料流</a>、綁定模式（loopback / LAN / reverse proxy + auth）跟誤開放後的具體後果見 <a href="/blog/llm/06-security/inference-server-binding/" data-link-title="6.1 推論伺服器的綁定與暴露範圍" data-link-desc="個人 dev 場景下 llama-server / Ollama / LM Studio 的 bind address 判讀：127.0.0.1 vs LAN vs 反代、預設安全、誤開放給內網的後果">6.1 推論伺服器的綁定與暴露範圍</a>。</p>
<h3 id="版本管理">版本管理</h3>
<p>Ollama 釋出節奏快、每兩三週可能加新功能或修嚴重 bug。升級流程：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">brew upgrade ollama
</span></span><span class="line"><span class="ln">2</span><span class="cl">brew services restart ollama   <span class="c1"># 若用 launchd service 跑</span></span></span></code></pre></div><p>升級前先看 <a href="https://github.com/ollama/ollama/releases">release notes</a>、確認三件事：</p>
<ol>
<li>是否引入 breaking API change（IDE plugin 可能要對應更新）</li>
<li>是否棄用舊 model tag（拉新 tag 取代）</li>
<li>是否帶來想要的新功能（例如新模型支援、加速優化）</li>
</ol>
<h2 id="排錯快速判讀">排錯快速判讀</h2>
<p>排錯段的設計是「先給操作原則、再列觸發條件」、讓讀者快速定位現象屬於哪一類。</p>
<h3 id="port-11434-已被佔用">Port 11434 已被佔用</h3>
<p>操作原則：先檢查是不是舊 Ollama 還在跑、再決定 kill 或換 port。<a href="/blog/llm/knowledge-cards/shell-background-process/" data-link-title="Shell 背景 Process" data-link-desc="終端機 process 的前景 / 背景生命週期、訊號控制、找出佔用 port 的 process"><code>lsof</code> / <code>pkill</code> 的角色</a>是找出佔用方並送終止訊號。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">lsof -i :11434          <span class="c1"># 看誰佔 11434</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">pkill -f <span class="s2">&#34;ollama serve&#34;</span> <span class="c1"># 確認是舊 Ollama 才 kill</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">ollama serve <span class="p">&amp;</span>          <span class="c1"># 重啟、&amp; 是把 process 丟背景</span></span></span></code></pre></div><p>需要兩個 Ollama 並存的場景、改 port 啟動：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nv">OLLAMA_HOST</span><span class="o">=</span>127.0.0.1:11435 ollama serve</span></span></code></pre></div><p>IDE plugin 的 <code>apiBase</code> 也要對應改成 11435。</p>
<h3 id="記憶體不足模型崩潰">記憶體不足、模型崩潰</h3>
<p>操作原則：先用 <code>ollama ps</code> 看實際載入了什麼、再對照 <a href="/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">0.5 記憶體預算</a> 決定降級。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ollama ps
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"># NAME           ID      SIZE     PROCESSOR    UNTIL</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1"># gemma4:31b...  abc123  18 GB    100% GPU     5 minutes from now</span></span></span></code></pre></div><p>模型大小超過 Mac 記憶體預算時的可選路徑：</p>
<ul>
<li>換較小 model（例如 31B → 14B）</li>
<li>換較激進量化（例如 Q5_K_M → Q4_K_M）</li>
<li>縮短 context window（在 IDE plugin 端設定）</li>
</ul>
<h3 id="模型載入很慢">模型載入很慢</h3>
<p>操作原則：第一次載入慢屬於正常、後續呼叫如果還是慢、檢查 keep_alive 設定。</p>
<p>第一次載入 18 GB 權重需要 30 ~ 60 秒、屬於 SSD → RAM 的真實 I/O 時間。如果發現「每次第一個請求都慢」、表示 keep_alive 太短、模型每次被 unload 又重新載入。延長 keep_alive 解決：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl"><span class="nv">OLLAMA_KEEP_ALIVE</span><span class="o">=</span>1h ollama serve</span></span></code></pre></div><p>代價是模型常駐記憶體、其他應用可用記憶體變少。</p>
<h3 id="model-cache-過大佔滿-ssd">Model cache 過大佔滿 SSD</h3>
<p>操作原則：清理用 <code>ollama rm &lt;tag&gt;</code>、Ollama 才會同步更新 registry metadata。</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">ollama list             <span class="c1"># 看哪些 model 佔空間</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">ollama rm &lt;tag&gt;         <span class="c1"># 刪除單一 model</span></span></span></code></pre></div><p>手動 <code>rm -rf ~/.ollama/models/</code> 會留下 registry metadata 不一致、後續 <code>ollama list</code> 出錯、<code>ollama pull</code> 也可能誤判已存在。需要完全重置的場景、用：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">brew services stop ollama
</span></span><span class="line"><span class="ln">2</span><span class="cl">rm -rf ~/.ollama
</span></span><span class="line"><span class="ln">3</span><span class="cl">brew services start ollama</span></span></code></pre></div><p>這會清掉所有 model 跟設定、重新從零開始。</p>
<h2 id="跟其他伺服器並存">跟其他伺服器並存</h2>
<p>Ollama 設計上可以跟 LM Studio、llama.cpp 同時在一台 Mac 跑、預設 port 不同：</p>
<table>
  <thead>
      <tr>
          <th>伺服器</th>
          <th>預設 port</th>
          <th>適合主力場景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Ollama</td>
          <td>11434</td>
          <td>日常寫 code、CLI 工作流</td>
      </tr>
      <tr>
          <td>LM Studio</td>
          <td>1234</td>
          <td>GUI 探索新模型、視覺化參數</td>
      </tr>
      <tr>
          <td>llama.cpp</td>
          <td>8080</td>
          <td>底層研究、自訂量化</td>
      </tr>
      <tr>
          <td>oMLX</td>
          <td>8000</td>
          <td>特化 MLX 場景</td>
      </tr>
  </tbody>
</table>
<p>並存的好處是「主力穩定跑 Ollama、實驗模型用 LM Studio」、Continue.dev 等介面層可以同時設多個 model、UI 上下拉切換。並存設定範例見 <a href="/blog/llm/01-local-llm-services/lm-studio/#%e8%88%87-ollama-%e4%b8%a6%e5%ad%98" data-link-title="1.1 LM Studio：GUI 探索模型" data-link-desc="GUI 取向的本地推論伺服器：內建模型瀏覽器、speculative decoding 設定面板、適合探索新模型">1.1 LM Studio</a>。</p>
<h2 id="下一章">下一章</h2>
<p>下一章可選擇：</p>
<ul>
<li>想對比 GUI 派的選擇：<a href="/blog/llm/01-local-llm-services/lm-studio/" data-link-title="1.1 LM Studio：GUI 探索模型" data-link-desc="GUI 取向的本地推論伺服器：內建模型瀏覽器、speculative decoding 設定面板、適合探索新模型">1.1 LM Studio</a></li>
<li>想了解底層 / Ollama 跟 llama.cpp 的關係：<a href="/blog/llm/01-local-llm-services/llama-cpp/" data-link-title="1.2 llama.cpp：底層推論引擎" data-link-desc="GGUF 格式、量化、MTP 仍 beta；多數讀者不需要直接接觸，Ollama 已經包好">1.2 llama.cpp</a></li>
<li>直接進入 VS Code 整合：<a href="/blog/llm/01-local-llm-services/vscode-continue-integration/" data-link-title="1.3 VS Code &#43; Continue.dev 整合" data-link-desc="安裝 Continue 擴充套件、config.json 設定、Cmd&#43;L 對話 / Cmd&#43;I 行內編輯快捷鍵">1.3 VS Code + Continue.dev</a></li>
</ul>
]]></content:encoded></item></channel></rss>