Day 07:LLM 原理速成——token 經濟與成本的真相
今天只聚焦在 Token 怎麼計價、生成怎麼進行、模型怎麼選這三件事,會直接影響你系統設計與帳單,也可能導致容易做出錯誤架構決策的部分。
本篇不會重講 Transformer 的數學(網路上已有太多好文章)。加上前兩天說明了「工程」與「ML」,今天說明「LLM」進行打底。
今天要解決的問題
一個假設但真實的對話:
主管:「我們的 AI 客服上個月花了多少?」 工程師:「大概……三萬多?」 主管:「為什麼比上個月多一倍,使用量只多了 20%?」 工程師:「……我查一下。」
查出來的原因通常是這幾個之一:有人把整份 FAQ 塞進系統提示、對話歷史沒有裁剪所以越滾越長、或是模型輸出沒有設上限,某些請求生成了兩千字的長篇大論。
這三個原因,都源自不理解 token 經濟。
📊 職缺訊號
「生成式 AI 部署與 LLMOps」出現在 38.7% 的生成式 AI 職缺中,而成本控制是其中最常被寫進 JD 的具體職責之一。原因很現實:LLM 應用的邊際成本不是零——這跟傳統軟體「寫完就幾乎免費複製」的直覺完全相反,也是最多團隊在 PoC 成功後、規模化時踩到的牆。
一、現象:帳單的兩個真相

圖 7-1:token 經濟的兩個真相(依常見計價結構與單 token 產生時間推算的示範值)。左圖:一次請求的 token 組成,最貴的常是固定前綴與輸出。右圖:延遲結構中 prefill 幾乎固定、decode 隨輸出長度線性成長。
真相一:輸出比輸入貴,通常是 4~5 倍左右。 所以一段 400 token 的回答,成本相當於 2,000 token 的輸入。這代表「請用三句話回答」不只是體驗優化,也是成本優化。
真相二:你以為免費的固定前綴,是最大的支出。 上圖中 5,000 token 的系 統提示與 few-shot 範例,每一次請求都要付一次錢。每天 5 萬次請求,就是 2.5 億 token——這通常比使用者實際輸入的部分貴上幾十倍。
好消息是:這一段正好是最容易優化的(Day 26 會談 prompt caching,可省下約 55%)。
二、原理:三個你必須有感覺的概念
2.1 Token 不是字
Token 是模型的最小處理單位,透過 BPE(Byte Pair Encoding)之類的演算法切出來。粗略的直覺:
| 語言 | 大約換算 | 意義 |
|---|---|---|
| 英文 | 1 token ≈ 4 字元 ≈ 0.75 個單詞 | 最省 |
| 繁體中文 | 1 個字 ≈ 0.6–1.5 token(依模型而異) | 中文通常比英文貴 |
| 程式碼 | 縮排、符號都吃 token | 比想像中貴 |
| JSON | 大量括號與引號 | 結構化輸出的隱藏成本 |
這對台灣的實務有直接影響:同樣一份文件,中文版的 token 數常常比英文版多。做成本估算時,別直接套用英文的換算比例。
2.2 生成分兩個階段:prefill 與 decode

圖 7-2:LLM 推論的兩階段結構(示意流程)。Prefill 決定「等多久才看到第一個字」,Decode 決定「字出得快不快」。
這個區分很重要,因為它解釋了兩件事:
- 為什麼串流(streaming)能大幅改善體驗:使用者在首字延遲時間 (TTFT) 之後就開始看到字,不用等整段生成完。實際總時間沒變,但感受完全不同(Day 17 會實作)。
- 為什麼長輸入不太影響「速度」但影響「等待」:prefill 是平行的、算得快;decode 是序列的、慢。所以「輸入 8,000 token、輸出 100 token」比「輸入 500 token、輸出 1,000 token」快得多。
2.3 KV cache:為什麼併發上不去
Decode 時每產生一個 token 都要參考前面所有 token,為了不重算,模型把中間狀態存起來,這就是 KV cache。它的大小是:
KV cache = 2 × 層數 × KV head 數 × head_dim × 位元組數 × 序列長度 × 批次大小
以 8B 級模型(32 層、8 個 KV head、head_dim 128、fp16)計算,每個 token 每條序列約 128 KiB。看起來很小,但乘上長度與併發就很可觀:批次 16、序列 8,192,KV cache 就要約 17 GB——加上 16 GB 的權重,一張 80GB 的卡也只是剛好夠用。
這就是「為什麼我的 GPU 明明還有記憶體,併發卻上不去」的答案。Day 26 會完整處理。
三、動手:算出你自己的帳單結構
與其看別人的估算,不如算你自己的。這段程式碼不需要 GPU:
"""估算 LLM 應用的成本結構——把假設攤開來,才知道要優化哪裡。"""
# 以「每百萬 token」為單位的相對單價(用相對值,避免綁定特定供應商報價)
PRICE_IN, PRICE_OUT, PRICE_CACHED = 1.0, 5.0, 0.1
req = {
"系統提示+few-shot": 5000, # 固定前綴,每次都送
"檢索脈絡": 3000, # RAG 取回的內容
"對話歷史": 1500,
"使用者輸入": 100,
}
output_tokens = 400
daily_requests = 50_000
in_tokens = sum(req.values())
cost_in = in_tokens * daily_requests / 1e6 * PRICE_IN
cost_out = output_tokens * daily_requests / 1e6 * PRICE_OUT
print(f"每日輸入成本:{cost_in:>8.1f}({in_tokens} token/次)")
print(f"每日輸出成本:{cost_out:>8.1f}({output_tokens} token/次)")
# 優化一:固定前綴命中 prompt caching
cached = req["系統提示+few-shot"]
cost_in_cached = ((in_tokens - cached) * PRICE_IN + cached * PRICE_CACHED) \
* daily_requests / 1e6
print(f"啟用前綴快取後:{cost_in_cached:>6.1f}"
f"(省 {(1 - cost_in_cached / cost_in):.1%})")
# 優化二:輸出長度砍半
print(f"輸出減半後:{cost_out / 2:>10.1f}(省 {cost_out / 2:.1f})")
執行結果會告訴你一件事:在多數 RAG 應用中,「固定前綴」與「輸出長度」這兩個旋鈕的效果,遠大於換一個便宜模型。 先轉這兩個旋鈕,再考慮換模型。
四、取捨:模型選型的四個維度
2026 年的模型地景大致分兩個陣營,選擇時看四個維度:
| 維度 | 閉源 API(如 Claude、GPT、Gemini) | 開放權重自建(如 Llama、Qwen、Mistral) |
|---|---|---|
| 起步成本 | 幾乎為零,當天就能上線 | 需要 GPU 與工程投入 |
| 邊際成本 | 隨用量線性成長 | 前期固定成本高,量大後單位成本低 |
