<?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>Comparison on Tarragon</title><link>https://tarrragon.github.io/blog/tags/comparison/</link><description>Recent content in Comparison on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Fri, 19 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/comparison/index.xml" rel="self" type="application/rss+xml"/><item><title>自架 vs 商業的判斷決策表</title><link>https://tarrragon.github.io/blog/monitoring/06-commercial-comparison/self-hosted-vs-commercial/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/06-commercial-comparison/self-hosted-vs-commercial/</guid><description>&lt;p>自架監控和商業方案之間的選擇取決於四個維度的組合。每個維度有明確的閾值 — 超過閾值時自架的成本開始高於商業方案的訂閱費。&lt;/p>
&lt;h2 id="四個判斷維度">四個判斷維度&lt;/h2>
&lt;h3 id="使用者數">使用者數&lt;/h3>
&lt;p>自架方案的成本和使用者數幾乎無關（JSONL + grep 處理 1 個和 100 個使用者的成本差異很小）。商業方案按事件量或使用者數計費，使用者數增長直接推高費用。&lt;/p>
&lt;p>&lt;strong>經驗估算&lt;/strong>：使用者數在百人以下時，自架的總成本（開發 + 維護 + 硬體）通常低於商業方案的年費（以典型商業方案年費 $300-$600 和自架的開發維護時間估算）。使用者數在千人以上時，自架需要投入的基礎設施維護（高可用、擴容、備份）成本上升，商業方案的規模經濟開始有優勢。具體的交叉點取決於選用的 vendor 定價（Sentry Developer plan 免費額度 5000 events/月、PostHog 免費到 1M events/月）和自架的維護時間成本。&lt;/p>
&lt;p>兩者之間是灰色地帶 — 取決於功能需求和團隊能力。&lt;/p>
&lt;h3 id="網路範圍">網路範圍&lt;/h3>
&lt;p>使用者和 collector 是否在同一個網路內。&lt;/p>
&lt;p>&lt;strong>同一網路&lt;/strong>（自用工具、內部工具）：自架方案直接 HTTP POST 到本機或內網 endpoint，不需要 DNS、TLS 憑證、CDN。成本極低。&lt;/p>
&lt;p>&lt;strong>外部網路&lt;/strong>（公開 app、SaaS）：自架方案需要處理公網暴露、DDoS 防護、TLS 憑證管理、高可用（多區域部署）。商業方案把這些基礎設施問題內化了。&lt;/p>
&lt;h3 id="功能需求">功能需求&lt;/h3>
&lt;p>自架方案的功能上限是開發者願意投入的工程量。grep + jq 能做基礎查詢和 funnel 分析（&lt;a href="https://tarrragon.github.io/blog/monitoring/08-business-analytics/" data-link-title="模組八：行為資料的商業利用" data-link-desc="Funnel / Cohort / Attribution / A/B test / 推薦系統 / RFM — 從 debug 工具到商業資產的翻轉">模組八 自架 funnel&lt;/a>）。Dashboard、告警、session replay、A/B test 分群每個功能都是數週到數月的開發量。&lt;/p>
&lt;p>商業方案的功能開箱即用。如果需求包含 session replay、A/B test dashboard、自動 issue 分群，商業方案的功能完成度遠高於自架。&lt;/p>
&lt;h3 id="合規要求">合規要求&lt;/h3>
&lt;p>資料必須存放在特定地區（GDPR data residency）或不能離開公司網路（金融、醫療）。&lt;/p>
&lt;p>&lt;strong>自架&lt;/strong>：資料完全在自己的基礎設施上，資料位置由自己控制。適合最嚴格的合規要求。&lt;/p>
&lt;p>&lt;strong>商業方案&lt;/strong>：資料存放在 vendor 的基礎設施上。部分 vendor 提供 data residency 選項（Sentry 的 EU hosting、Datadog 的 EU region），但仍然是第三方持有資料。&lt;/p>
&lt;h2 id="決策表">決策表&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>自架有利&lt;/th>
 &lt;th>商業方案有利&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>使用者數&lt;/td>
 &lt;td>&amp;lt; 100&lt;/td>
 &lt;td>&amp;gt; 1000&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>網路範圍&lt;/td>
 &lt;td>同一網路&lt;/td>
 &lt;td>外部網路&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>功能需求&lt;/td>
 &lt;td>查詢 + 基礎分析&lt;/td>
 &lt;td>Dashboard + 告警 + replay&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>合規要求&lt;/td>
 &lt;td>資料不能離開自有設施&lt;/td>
 &lt;td>無特殊限制&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>四個維度中三個以上指向同一方向 → 選那個方向。兩兩對半 → 從自架開始（成本低、可逆），需求增長後再評估切換。&lt;/p>
&lt;p>決策表指向商業方案後，&lt;a href="https://tarrragon.github.io/blog/monitoring/06-commercial-comparison/sentry-deep-dive/" data-link-title="Sentry 深入" data-link-desc="Error tracking &amp;#43; performance monitoring &amp;#43; session replay 的架構 — Sentry 從 error-first 出發如何擴展到全面可觀測性">Sentry 深入&lt;/a>和 &lt;a href="https://tarrragon.github.io/blog/monitoring/06-commercial-comparison/firebase-suite/" data-link-title="Firebase 套件" data-link-desc="Crashlytics &amp;#43; Analytics &amp;#43; Remote Config 的整合 — Firebase 把 error tracking 和行為分析拆成獨立產品的設計取捨">Firebase 套件&lt;/a>分別展開兩個主流方案的架構和能力邊界。決策表指向自架時，&lt;a href="https://tarrragon.github.io/blog/monitoring/04-collector/" data-link-title="模組四：Collector 設計" data-link-desc="收 → 驗 → 存 → 查 → 觸發的完整鏈路 — Go 單一 binary、可插拔 Storage Backend、rule engine">模組四 Collector 設計&lt;/a>提供從 HTTP endpoint 到 rule engine 的完整實作藍圖。Server-side 的可觀測性（OTLP、Prometheus、Grafana）見 &lt;a href="https://tarrragon.github.io/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">Backend 模組四 可觀測性&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>自架監控和商業方案之間的選擇取決於四個維度的組合。每個維度有明確的閾值 — 超過閾值時自架的成本開始高於商業方案的訂閱費。</p>
<h2 id="四個判斷維度">四個判斷維度</h2>
<h3 id="使用者數">使用者數</h3>
<p>自架方案的成本和使用者數幾乎無關（JSONL + grep 處理 1 個和 100 個使用者的成本差異很小）。商業方案按事件量或使用者數計費，使用者數增長直接推高費用。</p>
<p><strong>經驗估算</strong>：使用者數在百人以下時，自架的總成本（開發 + 維護 + 硬體）通常低於商業方案的年費（以典型商業方案年費 $300-$600 和自架的開發維護時間估算）。使用者數在千人以上時，自架需要投入的基礎設施維護（高可用、擴容、備份）成本上升，商業方案的規模經濟開始有優勢。具體的交叉點取決於選用的 vendor 定價（Sentry Developer plan 免費額度 5000 events/月、PostHog 免費到 1M events/月）和自架的維護時間成本。</p>
<p>兩者之間是灰色地帶 — 取決於功能需求和團隊能力。</p>
<h3 id="網路範圍">網路範圍</h3>
<p>使用者和 collector 是否在同一個網路內。</p>
<p><strong>同一網路</strong>（自用工具、內部工具）：自架方案直接 HTTP POST 到本機或內網 endpoint，不需要 DNS、TLS 憑證、CDN。成本極低。</p>
<p><strong>外部網路</strong>（公開 app、SaaS）：自架方案需要處理公網暴露、DDoS 防護、TLS 憑證管理、高可用（多區域部署）。商業方案把這些基礎設施問題內化了。</p>
<h3 id="功能需求">功能需求</h3>
<p>自架方案的功能上限是開發者願意投入的工程量。grep + jq 能做基礎查詢和 funnel 分析（<a href="/blog/monitoring/08-business-analytics/" data-link-title="模組八：行為資料的商業利用" data-link-desc="Funnel / Cohort / Attribution / A/B test / 推薦系統 / RFM — 從 debug 工具到商業資產的翻轉">模組八 自架 funnel</a>）。Dashboard、告警、session replay、A/B test 分群每個功能都是數週到數月的開發量。</p>
<p>商業方案的功能開箱即用。如果需求包含 session replay、A/B test dashboard、自動 issue 分群，商業方案的功能完成度遠高於自架。</p>
<h3 id="合規要求">合規要求</h3>
<p>資料必須存放在特定地區（GDPR data residency）或不能離開公司網路（金融、醫療）。</p>
<p><strong>自架</strong>：資料完全在自己的基礎設施上，資料位置由自己控制。適合最嚴格的合規要求。</p>
<p><strong>商業方案</strong>：資料存放在 vendor 的基礎設施上。部分 vendor 提供 data residency 選項（Sentry 的 EU hosting、Datadog 的 EU region），但仍然是第三方持有資料。</p>
<h2 id="決策表">決策表</h2>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>自架有利</th>
          <th>商業方案有利</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>使用者數</td>
          <td>&lt; 100</td>
          <td>&gt; 1000</td>
      </tr>
      <tr>
          <td>網路範圍</td>
          <td>同一網路</td>
          <td>外部網路</td>
      </tr>
      <tr>
          <td>功能需求</td>
          <td>查詢 + 基礎分析</td>
          <td>Dashboard + 告警 + replay</td>
      </tr>
      <tr>
          <td>合規要求</td>
          <td>資料不能離開自有設施</td>
          <td>無特殊限制</td>
      </tr>
  </tbody>
</table>
<p>四個維度中三個以上指向同一方向 → 選那個方向。兩兩對半 → 從自架開始（成本低、可逆），需求增長後再評估切換。</p>
<p>決策表指向商業方案後，<a href="/blog/monitoring/06-commercial-comparison/sentry-deep-dive/" data-link-title="Sentry 深入" data-link-desc="Error tracking &#43; performance monitoring &#43; session replay 的架構 — Sentry 從 error-first 出發如何擴展到全面可觀測性">Sentry 深入</a>和 <a href="/blog/monitoring/06-commercial-comparison/firebase-suite/" data-link-title="Firebase 套件" data-link-desc="Crashlytics &#43; Analytics &#43; Remote Config 的整合 — Firebase 把 error tracking 和行為分析拆成獨立產品的設計取捨">Firebase 套件</a>分別展開兩個主流方案的架構和能力邊界。決策表指向自架時，<a href="/blog/monitoring/04-collector/" data-link-title="模組四：Collector 設計" data-link-desc="收 → 驗 → 存 → 查 → 觸發的完整鏈路 — Go 單一 binary、可插拔 Storage Backend、rule engine">模組四 Collector 設計</a>提供從 HTTP endpoint 到 rule engine 的完整實作藍圖。Server-side 的可觀測性（OTLP、Prometheus、Grafana）見 <a href="/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">Backend 模組四 可觀測性</a>。</p>
<h2 id="中間路線">中間路線</h2>
<p>上表是「完全自架 vs 專業監控 SaaS」的兩端。中間還有兩條路徑 — 用 BaaS（Supabase + Vercel）搭出託管版 collector，或用 PaaS（Railway / Fly.io）跑自架 collector 原始碼但不管 server。APP 上線初期用免費方案零成本起步、保留自訂 schema 彈性是常見的起步策略。完整的四條路徑比較、架構差異、免費方案限額和遷移路線見<a href="/blog/monitoring/06-commercial-comparison/deployment-spectrum/" data-link-title="部署光譜：從 BaaS 到自架的四條路徑" data-link-desc="監控方案的部署選擇不是二元的 — BaaS &#43; Serverless 和 PaaS 是完全自架和商業 SaaS 之間兩條常被忽略的中間路徑">部署光譜</a>。</p>
]]></content:encoded></item><item><title>跟 OpenTelemetry 的 schema 差異對照</title><link>https://tarrragon.github.io/blog/monitoring/02-log-schema/otel-comparison/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/monitoring/02-log-schema/otel-comparison/</guid><description>&lt;p>OpenTelemetry（OTLP）是 server-side 可觀測性的業界標準，定義了 traces、metrics、logs 三種 signal 的資料格式和傳輸協定。自架的 event schema 和 OTLP 在設計目標、複雜度和適用場景上有明確差異。&lt;/p>
&lt;h2 id="設計目標差異">設計目標差異&lt;/h2>
&lt;h3 id="otlp">OTLP&lt;/h3>
&lt;p>OTLP 的設計目標是「跨語言、跨框架、跨 vendor 的統一可觀測性標準」。它支援分散式追蹤（trace context propagation）、多維度 metric（histogram、summary、exponential histogram）、結構化 log。&lt;/p>
&lt;p>OTLP 的資料模型假設 server-side 的基礎設施：collector（如 OTel Collector）做資料路由和轉換，backend（如 Jaeger、Prometheus、Grafana）做儲存和視覺化。&lt;/p>
&lt;h3 id="自架-event-schema">自架 event schema&lt;/h3>
&lt;p>自架 schema 的設計目標是「client-side 監控的最小可用結構」。它假設的基礎設施是一個 HTTP endpoint + JSONL 檔案 + grep。不需要分散式追蹤（client 端通常是單一服務），不需要多維度 metric（counter 和 gauge 用 event 的 data 欄位表示即可）。&lt;/p>
&lt;h2 id="具體差異">具體差異&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>OTLP&lt;/th>
 &lt;th>自架 event schema&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Signal 類型&lt;/td>
 &lt;td>Trace / Metric / Log 三種獨立 signal&lt;/td>
 &lt;td>統一的 event 格式 + type 欄位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>傳輸格式&lt;/td>
 &lt;td>Protobuf（HTTP/gRPC）&lt;/td>
 &lt;td>JSON（HTTP POST）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Trace context&lt;/td>
 &lt;td>SpanID / TraceID / ParentSpanID&lt;/td>
 &lt;td>Session ID（無分散式追蹤）&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Metric 模型&lt;/td>
 &lt;td>Sum / Gauge / Histogram / Summary&lt;/td>
 &lt;td>data 欄位中的數值&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Resource&lt;/td>
 &lt;td>結構化的 resource attributes&lt;/td>
 &lt;td>source 欄位&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Schema 複雜度&lt;/td>
 &lt;td>高（完整的 Protobuf 定義）&lt;/td>
 &lt;td>低（JSON Schema，核心 6 欄位）&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="自架-schema-簡化了什麼">自架 schema 簡化了什麼&lt;/h2>
&lt;h3 id="不做分散式追蹤">不做分散式追蹤&lt;/h3>
&lt;p>OTLP 的 trace signal 用 TraceID 和 SpanID 把跨服務的請求關聯起來。Client-side 監控通常不需要這個能力 — app 是單一服務，不存在跨服務的請求鏈路。&lt;/p>
&lt;p>自架 schema 用 session ID 關聯同一次使用中的事件，滿足「使用者在這次操作中做了什麼」的分析需求。&lt;/p>
&lt;h3 id="不用-protobuf">不用 Protobuf&lt;/h3>
&lt;p>OTLP 用 Protobuf 編碼資料，效率高（binary 格式、schema 驗證在編譯期）。但 Protobuf 需要 schema 檔案（.proto）、程式碼生成、和 SDK 語言的 Protobuf 套件。&lt;/p>
&lt;p>自架 schema 用 JSON，人類可讀、grep 友好、不需要額外工具。JSON 的效率比 Protobuf 低（文字格式、體積較大），但在 client-side 監控的事件量下（每分鐘數十到數百筆），效率差異不構成瓶頸。&lt;/p>
&lt;h3 id="簡化-metric-模型">簡化 metric 模型&lt;/h3>
&lt;p>OTLP 的 metric signal 支援 histogram（分桶分佈）、summary（百分位）、exponential histogram（自適應分桶）。這些模型在 server-side 的高頻度 metric 收集中有意義。&lt;/p>
&lt;p>自架 schema 把 metric 記錄為 event 的 data 欄位中的數值（&lt;code>{&amp;quot;type&amp;quot;: &amp;quot;metric&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;connect.duration&amp;quot;, &amp;quot;data&amp;quot;: {&amp;quot;value_ms&amp;quot;: 320}}&lt;/code>）。統計分析在 collector 端用查詢完成，不在 schema 層做聚合。&lt;/p>
&lt;h2 id="什麼時候切換到-otlp">什麼時候切換到 OTLP&lt;/h2>
&lt;p>以下訊號出現時，自架 schema 的簡化可能成為限制：&lt;/p></description><content:encoded><![CDATA[<p>OpenTelemetry（OTLP）是 server-side 可觀測性的業界標準，定義了 traces、metrics、logs 三種 signal 的資料格式和傳輸協定。自架的 event schema 和 OTLP 在設計目標、複雜度和適用場景上有明確差異。</p>
<h2 id="設計目標差異">設計目標差異</h2>
<h3 id="otlp">OTLP</h3>
<p>OTLP 的設計目標是「跨語言、跨框架、跨 vendor 的統一可觀測性標準」。它支援分散式追蹤（trace context propagation）、多維度 metric（histogram、summary、exponential histogram）、結構化 log。</p>
<p>OTLP 的資料模型假設 server-side 的基礎設施：collector（如 OTel Collector）做資料路由和轉換，backend（如 Jaeger、Prometheus、Grafana）做儲存和視覺化。</p>
<h3 id="自架-event-schema">自架 event schema</h3>
<p>自架 schema 的設計目標是「client-side 監控的最小可用結構」。它假設的基礎設施是一個 HTTP endpoint + JSONL 檔案 + grep。不需要分散式追蹤（client 端通常是單一服務），不需要多維度 metric（counter 和 gauge 用 event 的 data 欄位表示即可）。</p>
<h2 id="具體差異">具體差異</h2>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>OTLP</th>
          <th>自架 event schema</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Signal 類型</td>
          <td>Trace / Metric / Log 三種獨立 signal</td>
          <td>統一的 event 格式 + type 欄位</td>
      </tr>
      <tr>
          <td>傳輸格式</td>
          <td>Protobuf（HTTP/gRPC）</td>
          <td>JSON（HTTP POST）</td>
      </tr>
      <tr>
          <td>Trace context</td>
          <td>SpanID / TraceID / ParentSpanID</td>
          <td>Session ID（無分散式追蹤）</td>
      </tr>
      <tr>
          <td>Metric 模型</td>
          <td>Sum / Gauge / Histogram / Summary</td>
          <td>data 欄位中的數值</td>
      </tr>
      <tr>
          <td>Resource</td>
          <td>結構化的 resource attributes</td>
          <td>source 欄位</td>
      </tr>
      <tr>
          <td>Schema 複雜度</td>
          <td>高（完整的 Protobuf 定義）</td>
          <td>低（JSON Schema，核心 6 欄位）</td>
      </tr>
  </tbody>
</table>
<h2 id="自架-schema-簡化了什麼">自架 schema 簡化了什麼</h2>
<h3 id="不做分散式追蹤">不做分散式追蹤</h3>
<p>OTLP 的 trace signal 用 TraceID 和 SpanID 把跨服務的請求關聯起來。Client-side 監控通常不需要這個能力 — app 是單一服務，不存在跨服務的請求鏈路。</p>
<p>自架 schema 用 session ID 關聯同一次使用中的事件，滿足「使用者在這次操作中做了什麼」的分析需求。</p>
<h3 id="不用-protobuf">不用 Protobuf</h3>
<p>OTLP 用 Protobuf 編碼資料，效率高（binary 格式、schema 驗證在編譯期）。但 Protobuf 需要 schema 檔案（.proto）、程式碼生成、和 SDK 語言的 Protobuf 套件。</p>
<p>自架 schema 用 JSON，人類可讀、grep 友好、不需要額外工具。JSON 的效率比 Protobuf 低（文字格式、體積較大），但在 client-side 監控的事件量下（每分鐘數十到數百筆），效率差異不構成瓶頸。</p>
<h3 id="簡化-metric-模型">簡化 metric 模型</h3>
<p>OTLP 的 metric signal 支援 histogram（分桶分佈）、summary（百分位）、exponential histogram（自適應分桶）。這些模型在 server-side 的高頻度 metric 收集中有意義。</p>
<p>自架 schema 把 metric 記錄為 event 的 data 欄位中的數值（<code>{&quot;type&quot;: &quot;metric&quot;, &quot;name&quot;: &quot;connect.duration&quot;, &quot;data&quot;: {&quot;value_ms&quot;: 320}}</code>）。統計分析在 collector 端用查詢完成，不在 schema 層做聚合。</p>
<h2 id="什麼時候切換到-otlp">什麼時候切換到 OTLP</h2>
<p>以下訊號出現時，自架 schema 的簡化可能成為限制：</p>
<p><strong>需要和 server-side 追蹤關聯</strong>：Client 端的操作要關聯到 server 端的 trace（「使用者點擊按鈕到 database query 的完整路徑」）。需要 OTLP 的 trace context propagation。</p>
<p><strong>事件量超過 JSONL 的處理能力</strong>：每秒數千筆事件時，JSON 的解析和 JSONL 的 grep 查詢成為瓶頸。OTLP + OTel Collector + 時間序列 DB 的管線能處理更高的吞吐量。</p>
<p><strong>需要接入多個 backend</strong>：同時送資料到 Prometheus（metric）、Jaeger（trace）、Elasticsearch（log）。OTel Collector 原生支援多 backend 路由，自架方案需要自己實作。</p>
<p>切換策略：SDK 層的 API 不變（init / event / error / metric），只改底層的傳輸和編碼。從 JSON POST 改成 OTLP export，SDK 的使用者不需要改程式碼。</p>
<h2 id="下一步路由">下一步路由</h2>
<ul>
<li>自架 schema 的完整定義 → <a href="/blog/monitoring/02-log-schema/event-schema-fields/" data-link-title="event.schema.json 完整欄位解說" data-link-desc="監控事件的 JSON Schema 定義 — 每個欄位的語意、必填/選填、資料型別和設計理由">event.schema.json 完整欄位解說</a></li>
<li>Server-side 的可觀測性 → <a href="/blog/backend/04-observability/" data-link-title="模組四：可觀測性平台" data-link-desc="整理 log、metric、trace、dashboard 與 alert 的後端操作實務">backend 04 可觀測性</a></li>
<li>Collector 的設計 → <a href="/blog/monitoring/04-collector/" data-link-title="模組四：Collector 設計" data-link-desc="收 → 驗 → 存 → 查 → 觸發的完整鏈路 — Go 單一 binary、可插拔 Storage Backend、rule engine">模組四 Collector 設計</a></li>
</ul>
]]></content:encoded></item><item><title>0.0 本地 vs 雲端 LLM</title><link>https://tarrragon.github.io/blog/llm/00-foundations/local-vs-cloud/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/llm/00-foundations/local-vs-cloud/</guid><description>&lt;p>本地 LLM 與雲端 LLM 的核心差異是「模型權重在哪台機器上跑、誰能看到對話內容」。把模型權重載到自己 Mac 的記憶體裡、用本機算力跑&lt;a href="https://tarrragon.github.io/blog/llm/knowledge-cards/inference-server/" data-link-title="Inference Server" data-link-desc="載入模型權重、處理 prompt、產生 token 的常駐 process">推論&lt;/a>，就是本地；把 prompt 透過 HTTPS 送到 Anthropic、OpenAI、Google 的伺服器，再把結果回傳，就是雲端。&lt;/p>
&lt;p>這個差異一拆，後續所有取捨都會自然展開：隱私、成本、速度、能力四個維度在本地與雲端的權衡方向都不一樣。本章的責任是把這四個維度先攤開，後續章節再分別處理「速度為何慢」「記憶體為何決定能力」等具體問題。&lt;/p>
&lt;h2 id="本章目標">本章目標&lt;/h2>
&lt;p>讀完本章後，你應該能回答：&lt;/p>
&lt;ol>
&lt;li>哪些情境下花時間在本地跑 LLM 比直接用雲端旗艦划算？&lt;/li>
&lt;li>本地 LLM 的「免費」實際成本怎麼算？&lt;/li>
&lt;li>本地 LLM 的速度跟雲端比、在不同任務上的差距如何？&lt;/li>
&lt;li>本地 LLM 在哪些任務上能跟 Claude / GPT-5 並肩、哪些任務改用雲端更划算？&lt;/li>
&lt;/ol>
&lt;h2 id="四個維度的差異">四個維度的差異&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>維度&lt;/th>
 &lt;th>本地 LLM&lt;/th>
 &lt;th>雲端 LLM&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>隱私&lt;/td>
 &lt;td>prompt、code、檔案完全不離開本機&lt;/td>
 &lt;td>內容會送到第三方伺服器，受其資料保留與訓練政策約束&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>成本&lt;/td>
 &lt;td>一次性硬體投資（Mac 的記憶體），無 API 費用&lt;/td>
 &lt;td>按 token 計費，重度使用每月可達數百美元&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>速度&lt;/td>
 &lt;td>受本機算力與記憶體頻寬限制，首字延遲與生字速度都低於雲端旗艦模型&lt;/td>
 &lt;td>旗艦模型在資料中心級 GPU（NVIDIA H100 等）或 TPU 上跑，首字延遲低、生字速度快&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>能力&lt;/td>
 &lt;td>受模型大小與量化等級限制，2026 年 5 月可在 Mac 上跑的最強模型約等於 GPT-4 mini / Claude Haiku 等級&lt;/td>
 &lt;td>Claude Sonnet 4.6、Opus 4.7、GPT-5 等旗艦模型，能力斷崖式領先&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>這張表是後續所有章節的判讀基底。下面四個小節分別把每一格展開到「實際使用情境下會怎麼影響決策」。&lt;/p>
&lt;h2 id="隱私維度prompt-出境邊界">隱私維度：prompt 出境邊界&lt;/h2>
&lt;p>本地 LLM 在隱私維度的核心承諾是 prompt 內容不離開本機。對寫 code 來說這影響的是兩件事：手上的 code 會不會進入訓練資料、客戶 NDA 或公司資安政策能否接受 code 出境。&lt;/p>
&lt;p>接近真實的情境：&lt;/p>
&lt;ul>
&lt;li>接受 NDA 的外包專案，客戶明示不得把 code 上傳第三方 AI 服務。&lt;/li>
&lt;li>公司內部 monorepo 包含未公開的商業邏輯，資安政策禁止流向 OpenAI 或 Anthropic。&lt;/li>
&lt;li>個人 side project 沒有合規壓力，但仍想避免將 prompt 變成廣告或推薦演算法的訓練資料。&lt;/li>
&lt;/ul>
&lt;p>陷阱是把「本地 = 絕對私密」當成自動成立的事實。本地 LLM 的隱私保證僅在於 prompt 不離開機器；若同時開啟雲端同步、把對話紀錄存到 Notion、或用 IDE 的雲端 plugin 同時送 prompt 給其他服務，隱私邊界仍會被穿透。隱私是一條鏈，本地推論伺服器只是其中一環。&lt;/p>
&lt;p>雲端旗艦模型如 Claude 與 GPT 都提供 zero-retention 與不訓練選項（企業方案、API 預設等），合規上多數場景仍能滿足。隱私是訴求，不是非選本地不可的唯一理由。&lt;/p>
&lt;h2 id="成本維度一次性投資-vs-按-token-計費">成本維度：一次性投資 vs 按 token 計費&lt;/h2>
&lt;p>本地 LLM 的成本特性是「先付硬體錢，後續推論免費」。雲端 LLM 反過來：硬體完全不用管，但每個 prompt 都按 token 收費。&lt;/p>
&lt;p>接近真實的情境：&lt;/p>
&lt;ul>
&lt;li>一台 32GB Mac mini M4 約 NT$45,000，能持續跑 Gemma 4 31B 等中型模型。如果原本每月雲端 API 花費超過 NT$3,000，硬體成本約 15 個月攤平。&lt;/li>
&lt;li>偶爾使用者（每月 API 花費 NT$200 以下）若為了「省錢」買新 Mac，是負投資；只有重度使用者才會真正攤平。&lt;/li>
&lt;li>用 Claude Code 寫 code 的工程師，月費約 USD 200，一年 USD 2,400；硬體攤平的數學就要重算，特別是考慮到雲端能力斷崖式領先時，省下的時間成本通常超過 API 費用。&lt;/li>
&lt;/ul>
&lt;p>陷阱是把硬體成本當成沉沒成本、把雲端按月看成「持續流血」。實際上 Mac 本來就要買，邊際成本是「為了跑 LLM 多買 16GB 記憶體」這一段，這個邊際成本通常只有 NT$5,000 ~ 10,000，比看起來低很多。但這個邊際成本買到的是「不太強的模型」，能力差距見下一節。&lt;/p>
&lt;p>電費跟風扇噪音是被忽略的隱性成本。32GB Mac 跑大型模型時持續滿載，風扇可能整天轉、機殼會熱；fanless 機種（Air）會降頻，速度進一步下降。&lt;/p></description><content:encoded><![CDATA[<p>本地 LLM 與雲端 LLM 的核心差異是「模型權重在哪台機器上跑、誰能看到對話內容」。把模型權重載到自己 Mac 的記憶體裡、用本機算力跑<a href="/blog/llm/knowledge-cards/inference-server/" data-link-title="Inference Server" data-link-desc="載入模型權重、處理 prompt、產生 token 的常駐 process">推論</a>，就是本地；把 prompt 透過 HTTPS 送到 Anthropic、OpenAI、Google 的伺服器，再把結果回傳，就是雲端。</p>
<p>這個差異一拆，後續所有取捨都會自然展開：隱私、成本、速度、能力四個維度在本地與雲端的權衡方向都不一樣。本章的責任是把這四個維度先攤開，後續章節再分別處理「速度為何慢」「記憶體為何決定能力」等具體問題。</p>
<h2 id="本章目標">本章目標</h2>
<p>讀完本章後，你應該能回答：</p>
<ol>
<li>哪些情境下花時間在本地跑 LLM 比直接用雲端旗艦划算？</li>
<li>本地 LLM 的「免費」實際成本怎麼算？</li>
<li>本地 LLM 的速度跟雲端比、在不同任務上的差距如何？</li>
<li>本地 LLM 在哪些任務上能跟 Claude / GPT-5 並肩、哪些任務改用雲端更划算？</li>
</ol>
<h2 id="四個維度的差異">四個維度的差異</h2>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>本地 LLM</th>
          <th>雲端 LLM</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>隱私</td>
          <td>prompt、code、檔案完全不離開本機</td>
          <td>內容會送到第三方伺服器，受其資料保留與訓練政策約束</td>
      </tr>
      <tr>
          <td>成本</td>
          <td>一次性硬體投資（Mac 的記憶體），無 API 費用</td>
          <td>按 token 計費，重度使用每月可達數百美元</td>
      </tr>
      <tr>
          <td>速度</td>
          <td>受本機算力與記憶體頻寬限制，首字延遲與生字速度都低於雲端旗艦模型</td>
          <td>旗艦模型在資料中心級 GPU（NVIDIA H100 等）或 TPU 上跑，首字延遲低、生字速度快</td>
      </tr>
      <tr>
          <td>能力</td>
          <td>受模型大小與量化等級限制，2026 年 5 月可在 Mac 上跑的最強模型約等於 GPT-4 mini / Claude Haiku 等級</td>
          <td>Claude Sonnet 4.6、Opus 4.7、GPT-5 等旗艦模型，能力斷崖式領先</td>
      </tr>
  </tbody>
</table>
<p>這張表是後續所有章節的判讀基底。下面四個小節分別把每一格展開到「實際使用情境下會怎麼影響決策」。</p>
<h2 id="隱私維度prompt-出境邊界">隱私維度：prompt 出境邊界</h2>
<p>本地 LLM 在隱私維度的核心承諾是 prompt 內容不離開本機。對寫 code 來說這影響的是兩件事：手上的 code 會不會進入訓練資料、客戶 NDA 或公司資安政策能否接受 code 出境。</p>
<p>接近真實的情境：</p>
<ul>
<li>接受 NDA 的外包專案，客戶明示不得把 code 上傳第三方 AI 服務。</li>
<li>公司內部 monorepo 包含未公開的商業邏輯，資安政策禁止流向 OpenAI 或 Anthropic。</li>
<li>個人 side project 沒有合規壓力，但仍想避免將 prompt 變成廣告或推薦演算法的訓練資料。</li>
</ul>
<p>陷阱是把「本地 = 絕對私密」當成自動成立的事實。本地 LLM 的隱私保證僅在於 prompt 不離開機器；若同時開啟雲端同步、把對話紀錄存到 Notion、或用 IDE 的雲端 plugin 同時送 prompt 給其他服務，隱私邊界仍會被穿透。隱私是一條鏈，本地推論伺服器只是其中一環。</p>
<p>雲端旗艦模型如 Claude 與 GPT 都提供 zero-retention 與不訓練選項（企業方案、API 預設等），合規上多數場景仍能滿足。隱私是訴求，不是非選本地不可的唯一理由。</p>
<h2 id="成本維度一次性投資-vs-按-token-計費">成本維度：一次性投資 vs 按 token 計費</h2>
<p>本地 LLM 的成本特性是「先付硬體錢，後續推論免費」。雲端 LLM 反過來：硬體完全不用管，但每個 prompt 都按 token 收費。</p>
<p>接近真實的情境：</p>
<ul>
<li>一台 32GB Mac mini M4 約 NT$45,000，能持續跑 Gemma 4 31B 等中型模型。如果原本每月雲端 API 花費超過 NT$3,000，硬體成本約 15 個月攤平。</li>
<li>偶爾使用者（每月 API 花費 NT$200 以下）若為了「省錢」買新 Mac，是負投資；只有重度使用者才會真正攤平。</li>
<li>用 Claude Code 寫 code 的工程師，月費約 USD 200，一年 USD 2,400；硬體攤平的數學就要重算，特別是考慮到雲端能力斷崖式領先時，省下的時間成本通常超過 API 費用。</li>
</ul>
<p>陷阱是把硬體成本當成沉沒成本、把雲端按月看成「持續流血」。實際上 Mac 本來就要買，邊際成本是「為了跑 LLM 多買 16GB 記憶體」這一段，這個邊際成本通常只有 NT$5,000 ~ 10,000，比看起來低很多。但這個邊際成本買到的是「不太強的模型」，能力差距見下一節。</p>
<p>電費跟風扇噪音是被忽略的隱性成本。32GB Mac 跑大型模型時持續滿載，風扇可能整天轉、機殼會熱；fanless 機種（Air）會降頻，速度進一步下降。</p>
<h2 id="速度維度首字延遲與生字速度">速度維度：首字延遲與生字速度</h2>
<p>本地 LLM 的速度有兩個獨立指標：<strong><a href="/blog/llm/knowledge-cards/ttft/" data-link-title="TTFT" data-link-desc="Time To First Token：送出 prompt 到第一個 token 出現的等待時間">首字延遲</a></strong>（Time To First Token, TTFT，從送出 prompt 到第一個 token 出現）跟**<a href="/blog/llm/knowledge-cards/tokens-per-second/" data-link-title="Tokens Per Second" data-link-desc="LLM 每秒能生成幾個 token：生字速度的標準量化指標">生字速度</a>**（tokens per second, tok/s，後續每秒能吐幾個字）。雲端跟本地在這兩個指標上的差距很不對稱。</p>
<p>接近真實的數字（2026 年 5 月、僅供量級參考、不是 benchmark）：</p>
<table>
  <thead>
      <tr>
          <th>模型 / 硬體</th>
          <th>TTFT</th>
          <th>生字速度（tok/s）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Claude Sonnet 4.6 雲端</td>
          <td>0.5 ~ 1 秒</td>
          <td>80 ~ 120</td>
      </tr>
      <tr>
          <td>GPT-5 雲端</td>
          <td>0.5 ~ 1 秒</td>
          <td>70 ~ 100</td>
      </tr>
      <tr>
          <td>Gemma 4 31B <a href="/blog/llm/knowledge-cards/mtp/" data-link-title="Multi-Token Prediction (MTP)" data-link-desc="Google 為 Gemma 系列釋出的 speculative decoding 工程化實作">MTP</a> / M4 Max 32GB</td>
          <td>1 ~ 3 秒</td>
          <td>25 ~ 40</td>
      </tr>
      <tr>
          <td>Qwen3-Coder 30B / M2 Pro 32GB</td>
          <td>2 ~ 4 秒</td>
          <td>15 ~ 25</td>
      </tr>
      <tr>
          <td>長 context（10K+ tokens）本地</td>
          <td>30 ~ 90 秒</td>
          <td>與短 context 相近</td>
      </tr>
  </tbody>
</table>
<p>讀這張表時要注意三件事：</p>
<ol>
<li>雲端的 TTFT 是「請求送到資料中心 + 模型開始推論 + 第一個 token 回傳」的總和；網路 RTT 通常佔 100 ~ 300ms。本地 TTFT 是純推論成本。</li>
<li>本地生字速度受 Apple Silicon 的<a href="/blog/llm/knowledge-cards/memory-bandwidth/" data-link-title="Memory Bandwidth" data-link-desc="記憶體每秒能讀寫多少 bytes：決定本地 LLM 生字速度的真正瓶頸">記憶體頻寬</a>限制、而不是算力。詳見 <a href="/blog/llm/00-foundations/why-llm-feels-slow/" data-link-title="0.1 為什麼 LLM 生字慢" data-link-desc="自回歸架構與記憶體頻寬瓶頸：為何即使 Mac 算力很強，本地 LLM 仍一個字一個字吐">0.1 為什麼 LLM 生字慢</a>。</li>
<li>長 context 的首字延遲是本地 LLM 最大的痛點、瓶頸落在 <a href="/blog/llm/knowledge-cards/prefill/" data-link-title="Prefill" data-link-desc="Prompt 首次處理時的計算階段：把整段輸入跑過模型、產生 KV cache">prefill</a> 階段把整個 prompt 灌進 <a href="/blog/llm/knowledge-cards/kv-cache/" data-link-title="KV Cache" data-link-desc="已處理 token 的 attention 中間結果暫存：避免重算、加速後續生成">KV cache</a>。coding agent 場景塞了整個專案進 prompt 時、本地可能等 30 ~ 90 秒才開始吐字；這是為什麼後來出現 <a href="/blog/llm/00-foundations/mlx-mtp-omlx/" data-link-title="0.4 MLX / MTP / oMLX 的區別" data-link-desc="三個常被混為一談的術語：framework、加速技巧、特化 server，疊加而非互斥">oMLX 這種特化伺服器</a> 來解 KV cache 問題。</li>
</ol>
<p>簡單的 chat 跟短 prompt 的 code completion，本地速度體感堪用。複雜的多檔案重構、塞大量 context 的 agent 場景，本地速度落差會被放大到難以忍受。</p>
<h2 id="能力維度本地模型能做到哪裡">能力維度：本地模型能做到哪裡</h2>
<p>能力是本地 LLM 最被誇大、也最容易讓人失望的維度。實話實說：2026 年 5 月在 Mac 上能跑的最強本地模型（如 Gemma 4 31B、Qwen3-Coder 30B、gpt-oss 20B），能力大約在 GPT-4 mini / Claude Haiku 4.5 這個層級。比雲端旗艦模型（Claude Sonnet 4.6、Opus 4.7、GPT-5）差一個明顯的品質差距。</p>
<p>接近真實的判讀：</p>
<ul>
<li>簡單 function 寫作、單檔重構、加 type annotation、補 unit test、寫 docstring：本地堪用，速度差不多。</li>
<li>中等難度的 debug、解讀錯誤訊息、提建議：本地能給方向，但常需要追問才會收斂。</li>
<li>跨檔案重構、設計新架構、評估技術選型、寫長篇技術文件：雲端旗艦深度領先、改交給雲端更划算。</li>
<li>規劃 multi-step plan、把模糊需求拆成可執行步驟、做 deep debugging：規劃能力是雲端旗艦的明顯強項、現階段交給雲端是合理選擇。</li>
</ul>
<p>陷阱是把網路上 cherry-picked 的成功案例當成普遍能力。「Gemma 4 31B 解出某個 leetcode 題」這類截圖無法代表它在你日常工作流的表現。判讀方法是直接用自己一週內實際處理過的 5 ~ 10 個任務當 benchmark、跑本地模型看通過率。</p>
<h2 id="本地反而領先雲端的情境">本地反而領先雲端的情境</h2>
<p>雲端在「絕對能力」上領先、但本地在三類情境會反過來成為更好的選擇：</p>
<ol>
<li><strong>離線或網路受限環境</strong>：出差、保密廠房、機上工作、行動網路不穩、雲端 API 連不上的場景。本地是唯一可用選項、能力差距不再是判讀重點。</li>
<li><strong>極低延遲容忍度的高頻互動</strong>：短 prompt 的 inline code completion、即時補 type annotation 等場景。本地省去 100 ~ 300ms 的網路 RTT、體感比雲端跳字流暢、適合「打字打到一半 IDE 自動補完」這類工作流。</li>
<li><strong>短 context 但隱私嚴格</strong>：金融、醫療、法務工作流的單檔處理。Prompt 短到不會放大本地速度劣勢、隱私要求又排除雲端、加上若是有 NDA 限制、本地的合規性優勢直接覆蓋能力差距。</li>
</ol>
<p>這三類不是「本地通用領先」、而是「在這些限制下本地的劣勢被中和、優勢被放大」。除此之外的場景仍是雲端旗艦領先。</p>
<h2 id="混用是現階段的正確心態">混用是現階段的正確心態</h2>
<p>本地與雲端不是二選一。寫 code 場景下比較穩定的分工是：</p>
<ol>
<li>高頻、重複、隱私敏感、不需要極致品質的任務交給本地（補 type、寫測試、解釋 code、簡單重構）。</li>
<li>低頻、複雜、需要深度思考的任務交給雲端旗艦（設計、規劃、深度 debug、跨檔案重構）。</li>
<li>一台中型 Mac（<a href="/blog/llm/00-foundations/hardware-memory-budget/" data-link-title="0.5 Apple Silicon 記憶體預算" data-link-desc="記憶體決定能跑什麼，Q4 量化下的可運作模型對照與系統保留">24GB ~ 32GB 記憶體預算</a>） + 雲端旗艦訂閱（Claude Code / GPT-5）的組合、現階段是大多數工程師的甜蜜點。</li>
</ol>
<p>把本地 LLM 當成「免費的初階 pair programmer」而不是「Claude 替代品」，期望管理就會對齊現實。後續章節會回到這個心態，特別是 <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 的取捨與適用情境">模型選型</a> 與 <a href="/blog/llm/01-local-llm-services/expectation-management/" data-link-title="1.5 期望管理：本地 LLM 的擅長領域與分工" data-link-desc="本地 LLM 是免費的初階 pair programmer：辨識它的擅長領域、跟雲端旗艦做結構性分工">期望管理</a>。</p>
<h2 id="下一章">下一章</h2>
<p>下一章：<a href="/blog/llm/00-foundations/why-llm-feels-slow/" data-link-title="0.1 為什麼 LLM 生字慢" data-link-desc="自回歸架構與記憶體頻寬瓶頸：為何即使 Mac 算力很強，本地 LLM 仍一個字一個字吐">0.1 為什麼 LLM 生字慢</a>，解釋為什麼即使你的 Mac 看起來算力很強，生字速度仍受記憶體頻寬限制。</p>
]]></content:encoded></item></channel></rss>